diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index e24547a6abff8..dc0eb465b77dd 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -164,8 +164,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 @@ -222,12 +224,10 @@ enabled: - x-pack/test/cases_api_integration/spaces_only/config.ts - x-pack/test/cloud_security_posture_functional/config.ts - x-pack/test/cloud_security_posture_api/config.ts + - x-pack/test/dataset_quality_api_integration/basic/config.ts - x-pack/test/detection_engine_api_integration/basic/config.ts - x-pack/test/detection_engine_api_integration/security_and_spaces/group1/config.ts - - x-pack/test/detection_engine_api_integration/security_and_spaces/group4/config.ts - - x-pack/test/detection_engine_api_integration/security_and_spaces/group5/config.ts - x-pack/test/detection_engine_api_integration/security_and_spaces/group10/config.ts - - x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/config.ts - x-pack/test/disable_ems/config.ts - x-pack/test/encrypted_saved_objects_api_integration/config.ts - x-pack/test/examples/config.ts @@ -411,6 +411,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 @@ -419,6 +421,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 @@ -426,6 +430,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 @@ -445,7 +451,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 @@ -474,3 +479,9 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/configs/serverless.config.ts + - 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 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/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/.github/CODEOWNERS b/.github/CODEOWNERS index 00ef6f2dd857d..bb0e639ea4a28 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -39,8 +39,8 @@ packages/analytics/shippers/gainsight @elastic/kibana-core packages/kbn-apm-config-loader @elastic/kibana-core @vigneshshanmugam x-pack/plugins/apm_data_access @elastic/obs-knowledge-team @elastic/obs-ux-infra_services-team x-pack/plugins/apm @elastic/obs-ux-infra_services-team -packages/kbn-apm-synthtrace @elastic/obs-ux-infra_services-team -packages/kbn-apm-synthtrace-client @elastic/obs-ux-infra_services-team +packages/kbn-apm-synthtrace @elastic/obs-ux-infra_services-team @elastic/obs-ux-logs-team +packages/kbn-apm-synthtrace-client @elastic/obs-ux-infra_services-team @elastic/obs-ux-logs-team packages/kbn-apm-utils @elastic/obs-ux-infra_services-team test/plugin_functional/plugins/app_link_test @elastic/kibana-core x-pack/test/usage_collection/plugins/application_usage_test @elastic/kibana-core @@ -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 @@ -882,6 +885,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 +895,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 @@ -1386,6 +1393,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/rule_creation @elastic/security-detection-engine 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/plugins/security_solution/server/lib/detection_engine/scripts/roles_users @elastic/security-detection-engine ## Security Threat Intelligence - Under Security Platform @@ -1409,7 +1417,7 @@ x-pack/test/security_solution_api_integration/test_suites/detections_response/de /x-pack/plugins/security_solution/server/routes @elastic/security-detections-response @elastic/security-threat-hunting /x-pack/plugins/security_solution/server/utils @elastic/security-detections-response @elastic/security-threat-hunting x-pack/test/security_solution_api_integration/test_suites/detections_response/utils @elastic/security-detections-response - +x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry @elastic/security-detections-response ## Security Solution sub teams - security-defend-workflows /x-pack/plugins/security_solution/public/management/ @elastic/security-defend-workflows diff --git a/.github/workflows/create-deploy-tag.yml b/.github/workflows/create-deploy-tag.yml index 7ce79f2bd1c07..67fa6ca6216a3 100644 --- a/.github/workflows/create-deploy-tag.yml +++ b/.github/workflows/create-deploy-tag.yml @@ -22,7 +22,7 @@ concurrency: jobs: create-deploy-tag: # Temporary, we need a way to limit this to a GitHub team instead of specific users - if: contains('["watson","clintandrewhall","kobelb","lukeelmers","thomasneirynck","jbudz","mistic","delanni","Ikuni17","pheyos","dmlemeshko"]', github.triggering_actor) + if: contains('["watson","clintandrewhall","kobelb","lukeelmers","thomasneirynck","jbudz","mistic","delanni","Ikuni17","pheyos","dmlemeshko","mikecote"]', github.triggering_actor) runs-on: ubuntu-latest permissions: contents: write diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 354dd1e102cc6..d6d3c563a67c6 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-15 +date: 2023-11-19 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 de69f71820de5..afb67aa52f367 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 3157e3dac1fd3..982de600a4cb3 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 5ac8f8d41a3f0..9505e1de3807c 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -2728,7 +2728,7 @@ "label": "actions", "description": [], "signature": [ - "Readonly<{ frequency?: Readonly<{} & { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; }> | undefined; alertsFilter?: Readonly<{ query?: Readonly<{ dsl?: string | undefined; } & { kql: string; filters: Readonly<{ query?: Record | undefined; state$?: Readonly<{} & { store: string; }> | undefined; } & { meta: Record; }>[]; }> | undefined; timeframe?: Readonly<{} & { days: (2 | 7 | 6 | 5 | 4 | 3 | 1)[]; hours: Readonly<{} & { start: string; end: string; }>; timezone: string; }> | undefined; } & {}> | undefined; uuid?: string | undefined; useAlertDataForTemplate?: boolean | undefined; } & { id: string; params: Record; actionTypeId: string; group: string; }>[]" + "Readonly<{ frequency?: Readonly<{} & { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; }> | undefined; alertsFilter?: Readonly<{ query?: Readonly<{ dsl?: string | undefined; } & { kql: string; filters: Readonly<{ query?: Record | undefined; $state?: Readonly<{} & { store: \"appState\" | \"globalState\"; }> | undefined; } & { meta: Record; }>[]; }> | undefined; timeframe?: Readonly<{} & { days: (2 | 7 | 6 | 5 | 4 | 3 | 1)[]; hours: Readonly<{} & { start: string; end: string; }>; timezone: string; }> | undefined; } & {}> | undefined; uuid?: string | undefined; useAlertDataForTemplate?: boolean | undefined; } & { id: string; params: Record; actionTypeId: string; group: string; }>[]" ], "path": "x-pack/plugins/alerting/server/application/rule/types/rule.ts", "deprecated": false, diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index a187dcf8492be..6f0c34b07cca1 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index da8dc5a329b74..b36b5ec73d51c 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-15 +date: 2023-11-19 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 10131025a3a6d..dc7bc9f416859 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-15 +date: 2023-11-19 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 7265ee6c8b2ca..cde658412b626 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-15 +date: 2023-11-19 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 2450d0833944b..e711e744ff241 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-15 +date: 2023-11-19 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 be70dc19b3522..f719806004f60 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-15 +date: 2023-11-19 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 4ea31d61da8b6..3d6f38dc51e0c 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-15 +date: 2023-11-19 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 9d75388a03479..be028c262fc8c 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-15 +date: 2023-11-19 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 21047cef035cf..31f044cd43c20 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-15 +date: 2023-11-19 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 062bbf11060ff..5f3156ec28e64 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-15 +date: 2023-11-19 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 c798c85202676..6f5136e0128b1 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-15 +date: 2023-11-19 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 91f26aa719035..9626382646fc2 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-15 +date: 2023-11-19 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 b424a3292a395..00d145121b4b4 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-15 +date: 2023-11-19 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 de77f75ef33db..6f317f5a4c3d3 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-15 +date: 2023-11-19 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 8cfd317ff40dd..0cf268395f660 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-15 +date: 2023-11-19 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 c5fe7267b458a..b72abe38430de 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-15 +date: 2023-11-19 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 65bfd05a9e137..a0ecf54b26262 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-15 +date: 2023-11-19 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 24d2767456d38..988327b1f6afd 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-15 +date: 2023-11-19 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 44e268e97bed0..1e71b5e2af76a 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-15 +date: 2023-11-19 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 a84c0c89cce41..377a387a9ac73 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-15 +date: 2023-11-19 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 01b75d90d8745..95c29b81e939a 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-15 +date: 2023-11-19 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 1c90ed074110b..f7de54bc460e6 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-15 +date: 2023-11-19 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 bbf380a08f928..e929191289b6b 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; readonly state$: ", + "{ start: () => string; save: () => Promise; clear: () => void; destroy: () => void; readonly state$: ", "Observable", "<", { @@ -277,7 +277,7 @@ "section": "def-public.SearchSessionState", "text": "SearchSessionState" }, - ">; save: () => Promise; clear: () => void; destroy: () => void; readonly sessionMeta$: ", + ">; readonly sessionMeta$: ", "Observable", "<", "SessionMeta", @@ -723,7 +723,7 @@ "\nCurrent session management\n{@link ISessionService}" ], "signature": [ - "{ start: () => string; readonly state$: ", + "{ start: () => string; save: () => Promise; clear: () => void; destroy: () => void; readonly state$: ", "Observable", "<", { @@ -733,7 +733,7 @@ "section": "def-public.SearchSessionState", "text": "SearchSessionState" }, - ">; save: () => Promise; clear: () => void; destroy: () => void; readonly sessionMeta$: ", + ">; readonly sessionMeta$: ", "Observable", "<", "SessionMeta", @@ -1279,7 +1279,7 @@ "label": "ISessionService", "description": [], "signature": [ - "{ start: () => string; readonly state$: ", + "{ start: () => string; save: () => Promise; clear: () => void; destroy: () => void; readonly state$: ", "Observable", "<", { @@ -1289,7 +1289,7 @@ "section": "def-public.SearchSessionState", "text": "SearchSessionState" }, - ">; save: () => Promise; clear: () => void; destroy: () => void; readonly sessionMeta$: ", + ">; readonly sessionMeta$: ", "Observable", "<", "SessionMeta", @@ -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 83eaf7f93754e..6366762252bc5 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-15 +date: 2023-11-19 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 b306a1c80fa3f..1e71ba9f72dc0 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-15 +date: 2023-11-19 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 a81fdf61759e8..21f4e69dee8d9 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-15 +date: 2023-11-19 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 b491104cb65c1..0cbad35e8fffa 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-15 +date: 2023-11-19 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 b7c3e21c6b4c1..eff0e7c32d656 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-15 +date: 2023-11-19 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 5ab474445e29c..d40bb1bbfb10a 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-15 +date: 2023-11-19 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..5b46e39efe55a 100644 --- a/api_docs/dataset_quality.devdocs.json +++ b/api_docs/dataset_quality.devdocs.json @@ -63,7 +63,31 @@ } ], "enums": [], - "misc": [], + "misc": [ + { + "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 d66acc2d3734f..7bfcf9bd82c53 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-15 +date: 2023-11-19 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 | +| 4 | 0 | 4 | 0 | ## Client @@ -36,3 +36,6 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux ### Interfaces +### Consts, variables and types + + diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 3178fec29811d..30b15ba58efa8 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -123,6 +123,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | 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 | - | | | @kbn/content-management-table-list-view, filesManagement | - | | | enterpriseSearch | - | @@ -192,9 +194,6 @@ Safe to remove. | | lists | | | lists | | | reporting | -| | reporting | -| | reporting | -| | reporting | | | savedObjects | | | taskManager | | | @kbn/core-saved-objects-api-browser | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 4d017cc2bc2d8..75597e9fa3387 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -300,6 +300,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/reporting-export-types-pdf + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [printable_pdf.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-reporting/export_types/pdf/printable_pdf.ts#:~:text=JobParamsPDFDeprecated), [printable_pdf.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-reporting/export_types/pdf/printable_pdf.ts#:~:text=JobParamsPDFDeprecated), [printable_pdf.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-reporting/export_types/pdf/printable_pdf.ts#:~:text=JobParamsPDFDeprecated) | - | + + + ## @kbn/securitysolution-data-table | Deprecated API | Reference location(s) | Remove By | @@ -1076,8 +1084,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/maps_ems/server/index.ts#:~:text=license%24) | 8.8.0 | -| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/maps_ems/server/index.ts#:~:text=refresh) | 8.8.0 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/maps_ems/server/plugin.ts#:~:text=license%24) | 8.8.0 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/maps_ems/server/plugin.ts#:~:text=refresh) | 8.8.0 | @@ -1203,6 +1211,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [job_failure.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/job_failure.tsx#:~:text=toMountPoint), [job_failure.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/job_failure.tsx#:~:text=toMountPoint), [job_failure.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/job_failure.tsx#:~:text=toMountPoint), [general_error.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/general_error.tsx#:~:text=toMountPoint), [general_error.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/general_error.tsx#:~:text=toMountPoint), [job_success.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/job_success.tsx#:~:text=toMountPoint), [job_success.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/job_success.tsx#:~:text=toMountPoint), [job_success.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/job_success.tsx#:~:text=toMountPoint), [job_warning_formulas.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/job_warning_formulas.tsx#:~:text=toMountPoint), [job_warning_formulas.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/notifier/job_warning_formulas.tsx#:~:text=toMountPoint)+ 9 more | - | +| | [core.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/core.ts#:~:text=PdfV1ExportType), [core.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/core.ts#:~:text=PdfV1ExportType) | - | +| | [request_handler.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/common/generate/request_handler.test.ts#:~:text=JobParamsPDFDeprecated), [request_handler.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/common/generate/request_handler.test.ts#:~:text=JobParamsPDFDeprecated) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 1fd2fe0749b21..602e956dcaef8 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -52,8 +52,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Plugin | Deprecated API | Reference location(s) | Remove By | | --------|-------|-----------|-----------| -| mapsEms | | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/maps_ems/server/index.ts#:~:text=license%24) | 8.8.0 | -| mapsEms | | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/maps_ems/server/index.ts#:~:text=refresh) | 8.8.0 | +| mapsEms | | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/maps_ems/server/plugin.ts#:~:text=license%24) | 8.8.0 | +| mapsEms | | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/maps_ems/server/plugin.ts#:~:text=refresh) | 8.8.0 | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index f9c8a3f0a8992..af4682e754be6 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-15 +date: 2023-11-19 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 6eb7fd01815b2..3b9f39c82b70e 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index f830d252db1a7..b3a5f75e85d16 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-15 +date: 2023-11-19 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 50fba12da0e8c..8a620cbe2851e 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-15 +date: 2023-11-19 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 00f968131c598..de8f22ac309b7 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 46ee03a997abb..532ab1afc1a9b 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-15 +date: 2023-11-19 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 ea7e012f1a48d..63882f6dabbea 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-15 +date: 2023-11-19 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 2452a53c46f3d..ce6359df93e61 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-15 +date: 2023-11-19 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 232bf98f430cb..330caa2cde4eb 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-15 +date: 2023-11-19 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 8ac86b7444f73..6d6852e7de839 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-15 +date: 2023-11-19 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 27a45fda166a2..71413ee153731 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-15 +date: 2023-11-19 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 2ed889c7ad3f8..0c62b31be3d97 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-15 +date: 2023-11-19 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 8e2ce63291531..470ab03a0a40e 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-15 +date: 2023-11-19 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 e5c04eb2b151c..15eedd0b6b83d 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-15 +date: 2023-11-19 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 8e08ae45f432f..a8f0afdb8eda2 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-15 +date: 2023-11-19 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 a5a91c7b912f1..0c2866da04944 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-15 +date: 2023-11-19 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 1ac16a0b7eeb3..471e3c401a7fa 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-15 +date: 2023-11-19 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 1df7d61a01617..74f22551d9f21 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-15 +date: 2023-11-19 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 8b3ccdc936a9f..0b783d635993e 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-15 +date: 2023-11-19 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 dc5b6346158e0..44d058c6b0488 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-15 +date: 2023-11-19 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 02a5e749aeace..d767352a9743d 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-15 +date: 2023-11-19 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 09ebf0ac5272e..049a16783bc0c 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-15 +date: 2023-11-19 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 5db26d9cbadaf..7c01e86d19560 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-15 +date: 2023-11-19 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 34e296298cd6f..7be74c5bf2f42 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-15 +date: 2023-11-19 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 5e016dc8ccd2a..e8a6b343e879f 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-15 +date: 2023-11-19 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 f8328278a7610..a5de8b597ef09 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-15 +date: 2023-11-19 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 5d53b05d956db..f98b97573c187 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index d7982cd0b59d6..f46248686e871 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 0b103a0437784..a1074a9d941f1 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-15 +date: 2023-11-19 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 e8bf69cbce192..6102bbf61c378 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-15 +date: 2023-11-19 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 8d42934981bab..4ae24051597a2 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-15 +date: 2023-11-19 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 52ddb54bc5b11..a12fcc3712014 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-15 +date: 2023-11-19 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 ffe1aa434d302..e4e1eb8adc8a9 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 70d72df7dda0d..6aedc7943b644 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -4829,7 +4829,11 @@ "\nList agents" ], "signature": [ - "(options: Readonly<{ page?: number | undefined; perPage?: number | undefined; kuery?: any; sortField?: string | undefined; sortOrder?: \"asc\" | \"desc\" | undefined; showUpgradeable?: boolean | undefined; } & {}> & { showInactive: boolean; }) => Promise<{ agents: ", + "(options: Readonly<{ page?: number | undefined; perPage?: number | undefined; kuery?: any; sortField?: string | undefined; sortOrder?: \"asc\" | \"desc\" | undefined; showUpgradeable?: boolean | undefined; } & {}> & { showInactive: boolean; aggregations?: Record | undefined; searchAfter?: ", + "SortResults", + " | undefined; pitId?: string | undefined; getStatusSummary?: boolean | undefined; }) => Promise<{ agents: ", { "pluginId": "fleet", "scope": "common", @@ -4837,7 +4841,9 @@ "section": "def-common.Agent", "text": "Agent" }, - "[]; total: number; page: number; perPage: number; }>" + "[]; total: number; page: number; perPage: number; aggregations?: Record | undefined; }>" ], "path": "x-pack/plugins/fleet/server/services/agents/agent_service.ts", "deprecated": false, @@ -4851,7 +4857,11 @@ "label": "options", "description": [], "signature": [ - "Readonly<{ page?: number | undefined; perPage?: number | undefined; kuery?: any; sortField?: string | undefined; sortOrder?: \"asc\" | \"desc\" | undefined; showUpgradeable?: boolean | undefined; } & {}> & { showInactive: boolean; }" + "Readonly<{ page?: number | undefined; perPage?: number | undefined; kuery?: any; sortField?: string | undefined; sortOrder?: \"asc\" | \"desc\" | undefined; showUpgradeable?: boolean | undefined; } & {}> & { showInactive: boolean; aggregations?: Record | undefined; searchAfter?: ", + "SortResults", + " | undefined; pitId?: string | undefined; getStatusSummary?: boolean | undefined; }" ], "path": "x-pack/plugins/fleet/server/services/agents/agent_service.ts", "deprecated": false, @@ -22479,7 +22489,7 @@ "label": "owner", "description": [], "signature": [ - "{ github: string; }" + "{ github: string; type?: \"elastic\" | \"partner\" | \"community\" | undefined; }" ], "path": "x-pack/plugins/fleet/common/types/models/package_spec.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index c14120b5dc029..61da82ea13e5b 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-15 +date: 2023-11-19 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 0dfae36efac05..59bff63b64ac9 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-15 +date: 2023-11-19 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 0d936592b297f..d6c5ca4d91a31 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-15 +date: 2023-11-19 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 7ff82625c7435..c2b1da13e6302 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-15 +date: 2023-11-19 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 444615c8b291d..de3f83aa1768a 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-15 +date: 2023-11-19 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 9bc86146f739c..619a1c9734cae 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-15 +date: 2023-11-19 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 4a8bf21ad7f94..03528cc3a1b70 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-15 +date: 2023-11-19 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 6804eb22d1cf3..7772c7236a9fe 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-15 +date: 2023-11-19 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 9cc5c62333044..9ccb5b40fac7d 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-15 +date: 2023-11-19 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 04e7eb18aa47c..03df908305f42 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-15 +date: 2023-11-19 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 69072a8c78fb1..bbfd1822add4a 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-15 +date: 2023-11-19 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 faa0a3fb12260..426ac3047e126 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 590bd8e376a1d..268d3bb6ee2b9 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-15 +date: 2023-11-19 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 69d88d2fa14d8..dd207fa543eaa 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-15 +date: 2023-11-19 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 202ff9d0b4231..9fc9a8f8a7528 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-15 +date: 2023-11-19 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 360ad254a1ba9..272b8fb194595 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-15 +date: 2023-11-19 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 521e69ac71cf4..9eb797712141c 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-15 +date: 2023-11-19 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 d6cccadf6bd4a..464dd4038a8ce 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-15 +date: 2023-11-19 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..2fd0a65a4ff22 100644 --- a/api_docs/kbn_analytics_client.devdocs.json +++ b/api_docs/kbn_analytics_client.devdocs.json @@ -1360,6 +1360,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 +1396,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 342bb112e181b..335c0f7aa4af3 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-15 +date: 2023-11-19 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 2f53d51f03b0d..f949c6c084b01 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-15 +date: 2023-11-19 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 212c7bc5a7348..2e718d529ec19 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-15 +date: 2023-11-19 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 d7ec384c0daff..7beaedf6f6a67 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-15 +date: 2023-11-19 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 59990ec637b6c..ab98480d10cd3 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 6c9cbb2ca3e90..0ed9a7cc36cae 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index 62dc71196c789..07069d1903fb3 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-15 +date: 2023-11-19 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 34a1d64389aed..5dcbad69f5d40 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-15 +date: 2023-11-19 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 d11ac041964fb..efe6d8da66492 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-15 +date: 2023-11-19 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..46142d3de9ec8 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.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 8a55696b75cd0..00bcca0d9d5a6 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-15 +date: 2023-11-19 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 e744fdff14b36..1511853ef2cf1 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-15 +date: 2023-11-19 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 d4395898169ab..60f5c20a38ab9 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-15 +date: 2023-11-19 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..6b31762166ddd --- /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-19 +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 b7ee0d84d132b..4648cac4d6317 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 541edb64385ba..17bc9ac22003c 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index 26315dde82b4b..0d7f05de2ce21 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-15 +date: 2023-11-19 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 486ab6a6d1a16..6ce13870045ed 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-15 +date: 2023-11-19 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 67de8be72834c..973b15fa872fa 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-15 +date: 2023-11-19 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 ebd3aa1140db6..d4566c90137bf 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-15 +date: 2023-11-19 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 b8e2488581d71..f29eec4fe2fa0 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-15 +date: 2023-11-19 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 be61672e038c6..218644df9734c 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-15 +date: 2023-11-19 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 205002b4a47f9..d87a38e71b17c 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-15 +date: 2023-11-19 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 3c7bfacd0ff2d..0adb9eabc59ad 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-15 +date: 2023-11-19 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 e57c8a70753f5..5cd39a68aff2b 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 8d82b1853b33a..73a8f04091a03 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index b36c0c862b95e..b19c14d9c68a7 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index ed14d248757f7..ce26db94bea5c 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 8dac2dd9a6d75..e715079dd85c3 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 9ddb40518881d..75b90a52a059f 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 1609bd82ecdcc..24b344bc51329 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index c1884572e9806..3994eef019eb2 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index fc357a34e2ae1..183fc976968a6 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index a14d2ce53aed2..83615ddfde26d 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 1ef284ba1069d..85ecedfe082f1 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 1718013d43165..d6db287c60a87 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 485a313051b0f..e2aa08b435863 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 5ab00c64cd1f1..aad895901745c 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 667fdda38707e..eefcee653be1f 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 1bb162ae02f59..b2f1bc08d302c 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 30f644cd347c7..951857f2656fb 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 5938ac65076fe..3c991d270b019 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2023-11-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.devdocs.json b/api_docs/kbn_core_apps_browser_internal.devdocs.json index d8938c10403b5..6d8e18656bdf4 100644 --- a/api_docs/kbn_core_apps_browser_internal.devdocs.json +++ b/api_docs/kbn_core_apps_browser_internal.devdocs.json @@ -203,18 +203,22 @@ { "parentPluginId": "@kbn/core-apps-browser-internal", "id": "def-common.CoreAppsServiceSetupDeps.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, @@ -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 ef1292ef53554..1932dcde3a47d 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-15 +date: 2023-11-19 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 cf57c1df0597c..ca218c4bb3b46 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-15 +date: 2023-11-19 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 51f86481f9b43..94c00ca4bc4d8 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-15 +date: 2023-11-19 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 2bfc7af9a781e..436797aae1867 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-15 +date: 2023-11-19 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 0f313ff09499a..e2685cb32eeae 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-15 +date: 2023-11-19 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 15cd9d51f1b94..391403e8eaf21 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-15 +date: 2023-11-19 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 37bce876adb42..63bea1d19c0cd 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-15 +date: 2023-11-19 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 7182bbf89da5c..092bd2e6b022a 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-15 +date: 2023-11-19 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 1ea8f1b99628d..f720b9bc00c63 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-15 +date: 2023-11-19 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 f33801d2f94d8..bfb8dc7151ad1 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-15 +date: 2023-11-19 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 bb2a8e7305584..5eb95864800a1 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-15 +date: 2023-11-19 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 9f81e4a96ac00..ce1e91fcccef2 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-15 +date: 2023-11-19 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 526035e02d9ad..7405bd06d70b9 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-15 +date: 2023-11-19 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 553c4dc4b24af..fc2d5b967447c 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-15 +date: 2023-11-19 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 7962525802345..c7e24a0095dc9 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-15 +date: 2023-11-19 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 3a000c3cb850e..5623b0765bc44 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-15 +date: 2023-11-19 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 dc8b56b489309..59de9355d81cf 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-15 +date: 2023-11-19 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 1e988020f35d8..5c27f728491dd 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-15 +date: 2023-11-19 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 c65e5229cd18b..6aa4fe87e44cf 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-15 +date: 2023-11-19 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 6e68feaa304c0..a85f9ccdf1ea8 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-15 +date: 2023-11-19 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 7fcccca572198..f44d37a55e645 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-15 +date: 2023-11-19 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 ba59940c99fb3..91bd1367a3a5c 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-15 +date: 2023-11-19 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 7e122cf3aa029..f109d2aedc03e 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-15 +date: 2023-11-19 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 8bf42a224ac58..5a1c4769a1e9a 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-15 +date: 2023-11-19 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 8cf16a136126b..572d35a1c4528 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-15 +date: 2023-11-19 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 ef6ecaf8aa5f0..3cd81eb028685 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-15 +date: 2023-11-19 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 8187a5487bdaf..7fe96775f1c5b 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-15 +date: 2023-11-19 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 b4595189901ae..bfd8bdc08926f 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-15 +date: 2023-11-19 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 cf514f6a274d6..b64978c06220f 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-15 +date: 2023-11-19 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 2fb2bd6423b3b..52153034f0e71 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-15 +date: 2023-11-19 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 babaef5706577..1c4580d4c94c3 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-15 +date: 2023-11-19 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 9aa2bd4f69ea2..0fe07a269cc0f 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-15 +date: 2023-11-19 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 abe07006e537d..cbfb2eb65187d 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-15 +date: 2023-11-19 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 5d038541693dc..516218e676ee5 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-15 +date: 2023-11-19 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 556696f478161..1ec946214aa74 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-15 +date: 2023-11-19 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 2940e4b83827a..66df620a8d53b 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-15 +date: 2023-11-19 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 56e8d3444f8ac..4c0e475c56952 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-15 +date: 2023-11-19 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 7612b74ab4053..44289fcc521c9 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-15 +date: 2023-11-19 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 588b2cda77fc2..a3e2cb3702508 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-15 +date: 2023-11-19 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 3dc561ddf7632..61bf94316f850 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-15 +date: 2023-11-19 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 2dcf42a7b45fb..e9386fa60e618 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-15 +date: 2023-11-19 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 c9c85b904afac..0a762ea6b382c 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-15 +date: 2023-11-19 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 864f69129b8e8..f841aaca7b8c5 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-15 +date: 2023-11-19 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 e679f763ed104..519491e41a628 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-15 +date: 2023-11-19 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 bb913a154090a..650ad2380c1c2 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-15 +date: 2023-11-19 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 64a4d60e59ceb..0f70f7d50282e 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-15 +date: 2023-11-19 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 a17155ee31d37..a0b31df8b4f46 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-15 +date: 2023-11-19 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 77301df173740..3933183c765d2 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-15 +date: 2023-11-19 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 e58dde4da5986..3819da2c492c9 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-15 +date: 2023-11-19 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 8b76947d9a979..413472b0d6f64 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-15 +date: 2023-11-19 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 cadb942a15861..b44a7b09308e0 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-15 +date: 2023-11-19 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 34ef5e77e4b18..089e389431685 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-15 +date: 2023-11-19 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 049c8bf4d5d36..1f839e51297f4 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-15 +date: 2023-11-19 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 67cd79b90709c..8335df4c3e1bc 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-15 +date: 2023-11-19 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 a79dae19c0940..c458757937705 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-15 +date: 2023-11-19 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 a92903b2a761a..86ffe0267a952 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-15 +date: 2023-11-19 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 e0cf265e241f8..1c1935c575384 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-15 +date: 2023-11-19 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 6d45eb5105021..2624d8d35c719 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-15 +date: 2023-11-19 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 77746673bb691..6429b4c5b1194 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-15 +date: 2023-11-19 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 bf27ff2ff013f..2fe742baa1d7b 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", @@ -5806,6 +5850,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 +9687,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", @@ -13183,6 +13281,10 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/management.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_config.ts" @@ -13195,10 +13297,6 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_last_reported.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "metricsDataAccess", "path": "x-pack/plugins/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -13621,27 +13719,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", @@ -13918,6 +14016,10 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/anomaly_detectors.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_user_has_seen_notice.ts" @@ -13926,10 +14028,6 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_last_reported.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "metricsDataAccess", "path": "x-pack/plugins/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -14016,7 +14114,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", @@ -14513,6 +14611,10 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/alerting.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_opt_in_stats.ts" @@ -14525,10 +14627,6 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_usage_stats.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "metricsDataAccess", "path": "x-pack/plugins/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -14871,39 +14969,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 167410ddc1f2f..16147e901d331 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-15 +date: 2023-11-19 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.mdx b/api_docs/kbn_core_http_server_internal.mdx index a5c8fa82a5616..9c97b619c4dde 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-15 +date: 2023-11-19 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 | +| 59 | 0 | 53 | 8 | ## 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 375f2902f1d6b..21eca4d004303 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-15 +date: 2023-11-19 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 fba8203881d2d..1b011b4bf8b99 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-15 +date: 2023-11-19 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 97815533124fc..63d52c29615ae 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-15 +date: 2023-11-19 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 bcaa904e987e0..15580dfceacf3 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-15 +date: 2023-11-19 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 27d6de47d695a..f3e37142260bf 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-15 +date: 2023-11-19 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 144a985b608ad..37db763743379 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-15 +date: 2023-11-19 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 57797c750de59..035a064c56fa8 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-15 +date: 2023-11-19 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 b1115d9e9fac2..4f3fc548fcd71 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-15 +date: 2023-11-19 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 6ed6d1c4df47e..e9bcd5ae93044 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-15 +date: 2023-11-19 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 a0b32267e533f..e69d95e45ec7e 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-15 +date: 2023-11-19 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 3f07b5dbb95b4..977d5fe2f7e07 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-15 +date: 2023-11-19 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 83d140770c653..f1cd30a7d508c 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-15 +date: 2023-11-19 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 c864e5b258961..dbab3f8fa361e 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-15 +date: 2023-11-19 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 7f0bf5cf3f2b1..fd19626a61c4f 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-15 +date: 2023-11-19 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 c843a8f3bc783..17ac15852ee0f 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-15 +date: 2023-11-19 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 f22513c882a41..184c5c95e838b 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-15 +date: 2023-11-19 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 c0904d5ab8e11..1951dfe89d3df 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-15 +date: 2023-11-19 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 882438eee1c16..9fe71518912ab 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-15 +date: 2023-11-19 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 e52a294b4a1da..1fda18ce8b405 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-15 +date: 2023-11-19 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 bfbc7f36921fc..8323f1459dafa 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-15 +date: 2023-11-19 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 349d722259092..b9dad74738ed7 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-15 +date: 2023-11-19 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 b904abbf76e99..ee79e4012eddc 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-15 +date: 2023-11-19 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 f0b2c946d8c3a..c1002fcc6107f 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-15 +date: 2023-11-19 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 a881c083fca9c..a2a6a99812573 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-15 +date: 2023-11-19 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 408c5f43e742d..7e3ae64377268 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-15 +date: 2023-11-19 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 54ffd0b34e1fc..b65b6c125b01e 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-15 +date: 2023-11-19 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 0851569dddac8..876c93f78e574 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-15 +date: 2023-11-19 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 9c1e5f5c66abb..c4ed79a951dbe 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-15 +date: 2023-11-19 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 a78596587cca6..57946f420f7e7 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-15 +date: 2023-11-19 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 91357a7108bc1..ebbff5ba5ade1 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-15 +date: 2023-11-19 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 810c655f1725b..99f04fefa235b 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-15 +date: 2023-11-19 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 80ca6d8cfb958..ff70e0182cbcb 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-15 +date: 2023-11-19 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 ca5b8c5796ce7..662c77c6abe44 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-15 +date: 2023-11-19 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 fb095cd302f6e..5979e283376dc 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-15 +date: 2023-11-19 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 19379c9c7be57..d96fdc72f4b3b 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-15 +date: 2023-11-19 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 b9932a5a6e11a..2a11d8a6073c3 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-15 +date: 2023-11-19 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 01cdb214524d1..7cfe98b1ed376 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-15 +date: 2023-11-19 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.devdocs.json b/api_docs/kbn_core_plugins_server.devdocs.json index 6de41df4a25aa..4a254538d5052 100644 --- a/api_docs/kbn_core_plugins_server.devdocs.json +++ b/api_docs/kbn_core_plugins_server.devdocs.json @@ -1222,7 +1222,7 @@ "section": "def-common.PluginInitializerContext", "text": "PluginInitializerContext" }, - ") => ", + ") => Promise<", { "pluginId": "@kbn/core-plugins-server", "scope": "common", @@ -1246,7 +1246,7 @@ "section": "def-common.AsyncPlugin", "text": "AsyncPlugin" }, - "" + ">" ], "path": "packages/core/plugins/core-plugins-server/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 7edbe137d5c58..889f0522e0400 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-15 +date: 2023-11-19 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 eb3086fa8e795..97e33bc936cec 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-15 +date: 2023-11-19 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 7774eaa0e18cc..e513b39f126ed 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-15 +date: 2023-11-19 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 b43ca5eebb66b..12546fe2a56d4 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-15 +date: 2023-11-19 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 293bca1c6a0fd..563d0db07b30a 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-15 +date: 2023-11-19 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 522268c913a6c..bcdd352aac65c 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-15 +date: 2023-11-19 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 9c01fd5e52e22..ab5f69f88b93d 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-15 +date: 2023-11-19 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 2ef8dcbe0554e..b5bbabf8f3423 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-15 +date: 2023-11-19 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 3cc8e1388d5ac..58c712e564af4 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-15 +date: 2023-11-19 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 9b7e3c00bd370..5fb942ed47236 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-15 +date: 2023-11-19 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 de96188a44d58..406f10dae499b 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-15 +date: 2023-11-19 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 93f8de290183d..c4b2ca14982af 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-15 +date: 2023-11-19 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 c30c07d55e392..7a29e63f74d16 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-15 +date: 2023-11-19 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 2f57f42b50f09..c2c86eb57d244 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-15 +date: 2023-11-19 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 f7e693207b6aa..37ab3eb5291dd 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-15 +date: 2023-11-19 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 d0248d426d4fe..c4e77d0cee727 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-15 +date: 2023-11-19 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 6f3faf62b8c03..cd3afbd8d6383 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-15 +date: 2023-11-19 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 ad3bd9967f7e5..71eec5a7d3ff5 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-15 +date: 2023-11-19 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 299ffebd02abb..af87b1132b7e7 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-15 +date: 2023-11-19 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 f7056fcad419f..f55eb471f2a0c 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-15 +date: 2023-11-19 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 85e59f3855d36..e90b50e35b84d 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-15 +date: 2023-11-19 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 736d4fa61e94d..f196daef24be6 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-15 +date: 2023-11-19 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 08c2b206f5772..3a5b03b96f4ab 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-15 +date: 2023-11-19 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 c4b4edc60382c..f28d90043de7a 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-15 +date: 2023-11-19 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 808b45b749352..2271152bd2377 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-15 +date: 2023-11-19 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 70a2815dd3175..b3fade43c15de 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-15 +date: 2023-11-19 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 586cdd97e164a..8b3151af99b47 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-15 +date: 2023-11-19 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 9e53e8baaedbf..d0539dd404aaa 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-15 +date: 2023-11-19 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 6abc43b8804c8..48715d5eeb8ea 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-15 +date: 2023-11-19 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 8f05ec814c82a..efbd3cb294ef1 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-15 +date: 2023-11-19 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 8de6bc5090133..d968791fb9e74 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-15 +date: 2023-11-19 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 14bbcfbeef365..019fc8605f430 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-15 +date: 2023-11-19 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 211f0474a4fd1..48fd816e0abe5 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-15 +date: 2023-11-19 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 667f00375a222..3ee5efc4d0206 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-15 +date: 2023-11-19 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 c1daa0c4eb905..da2e80f87aee1 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-15 +date: 2023-11-19 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 1816b0fd95db7..ad542b8cdf9e9 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-15 +date: 2023-11-19 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 e531562ea6c5e..e751a0e3cb66b 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-15 +date: 2023-11-19 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 518b6ff333e24..85356ea918ed5 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-15 +date: 2023-11-19 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 77bf4818496d6..0bff09a952c68 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-15 +date: 2023-11-19 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 9190ff4c3dece..c290b67a0afd9 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-15 +date: 2023-11-19 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 8c9cf839dbf07..207f5f09b5731 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-15 +date: 2023-11-19 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 357641cb88245..dcf575e18d9d0 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-15 +date: 2023-11-19 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 5046fea54d44b..c72e821a69cb2 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-15 +date: 2023-11-19 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 19855ba86e66a..6854e76caa848 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-15 +date: 2023-11-19 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 796c4a00511bc..51578ddccb0b6 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-15 +date: 2023-11-19 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 b55a2c862b9e4..58a59ec16dd77 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-15 +date: 2023-11-19 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 07731c0ff69f2..4a51584904e11 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-15 +date: 2023-11-19 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 8a9344b29b108..a534d73700276 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-15 +date: 2023-11-19 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 c174524d5c221..023788dc0f44c 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-15 +date: 2023-11-19 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 213d765c651f7..26e6458d9235b 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-15 +date: 2023-11-19 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 61738dab7c794..ebdb1898b7850 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-15 +date: 2023-11-19 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 82575521dfd31..639da3133c3ce 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-15 +date: 2023-11-19 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 d1b4386b4b1c6..4d4135de0f95b 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 3d0254a1607e0..c3c7c644cd278 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-15 +date: 2023-11-19 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 bf4bfac857dd1..304998f5c9c11 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-15 +date: 2023-11-19 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 54b2ffad051c3..388323bc9ece9 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-15 +date: 2023-11-19 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 016b8b4e96617..cf65b93346710 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-15 +date: 2023-11-19 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 7817629f22068..9080a68a684b9 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-15 +date: 2023-11-19 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 c3a3c1160b265..876a2df8cc463 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-15 +date: 2023-11-19 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 e264796013e6f..ea36f9e117afe 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-15 +date: 2023-11-19 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 03e1cd8b67907..3dd9655e9669f 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-15 +date: 2023-11-19 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 a63ec68801835..19cf9dad9f037 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-15 +date: 2023-11-19 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 1431d5e2ab216..1b277e87400b1 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-15 +date: 2023-11-19 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 ef807b3cc8775..12e1c3280a7ad 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-15 +date: 2023-11-19 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 3e9a8a1c0fb1b..f1d81655b3704 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-15 +date: 2023-11-19 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 d02424c525af9..33504be87501e 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-15 +date: 2023-11-19 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 8f242fa91e1f2..ebec5cdc14960 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-15 +date: 2023-11-19 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 5ebe60af45161..c8271e54876aa 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-15 +date: 2023-11-19 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 1e756d575f140..a6af1ccf172b1 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-15 +date: 2023-11-19 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 34ec7e0afb183..b722416e72a9d 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-15 +date: 2023-11-19 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 c1c893141879d..fb5abfbcd4bc7 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-15 +date: 2023-11-19 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 57f2fac3f8e65..b183ceac81252 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-15 +date: 2023-11-19 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..d79272c54bcfa 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; }" ], "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 c655ccb653f7f..eacc20b47b547 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-15 +date: 2023-11-19 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 bcf4bc23c16a1..4737b7a9e492b 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-15 +date: 2023-11-19 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 6d400570393a7..f2466feb2a991 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-15 +date: 2023-11-19 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 b7f878c0f4a55..4d72ee3a6c036 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-15 +date: 2023-11-19 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 2f3c11d9a9adc..fe8f5d0158155 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-15 +date: 2023-11-19 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 157bcfd106766..240972bce5505 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-15 +date: 2023-11-19 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_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 5af4ef1ee9897..9ce911bff0af9 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-15 +date: 2023-11-19 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 71bd2a7788ce3..749ea1a1b5d47 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-15 +date: 2023-11-19 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 a881c57626dbf..72ba16224bc4f 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-15 +date: 2023-11-19 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 c1d75a49cb313..0c6f036478105 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-15 +date: 2023-11-19 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 7a11a670da929..205e6b94f5be8 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-15 +date: 2023-11-19 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 dccfe9f0a65a1..87fcda9328624 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-15 +date: 2023-11-19 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 c7897ed1684ef..fd5c9e7896f26 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-15 +date: 2023-11-19 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 8365c5a253962..9ab57542c3d09 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-15 +date: 2023-11-19 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 925d60eb9ce15..e8561d3a8eab5 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-15 +date: 2023-11-19 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 87557d8a259d6..ce9fc06b3d66c 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-15 +date: 2023-11-19 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 77125a94d7827..84b348eb81b18 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-15 +date: 2023-11-19 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 ce1b3b388743c..d3659ef9c61d8 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-15 +date: 2023-11-19 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 1f6366c24e158..3977d256fa8d0 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-15 +date: 2023-11-19 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 db9124f96f8c8..84b6cd33c8589 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-15 +date: 2023-11-19 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 59fc330826b0d..eefb6f1eb4bc2 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-15 +date: 2023-11-19 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 ff602c857bf62..f3e34b74500a1 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-15 +date: 2023-11-19 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.devdocs.json b/api_docs/kbn_generate_csv.devdocs.json index 2b04c8389060c..f776c97bdf55c 100644 --- a/api_docs/kbn_generate_csv.devdocs.json +++ b/api_docs/kbn_generate_csv.devdocs.json @@ -9,18 +9,10 @@ "objects": [] }, "server": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "common": { "classes": [ { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator", + "id": "def-server.CsvGenerator", "type": "Class", "tags": [], "label": "CsvGenerator", @@ -31,7 +23,7 @@ "children": [ { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator.Unnamed", + "id": "def-server.CsvGenerator.Unnamed", "type": "Function", "tags": [], "label": "Constructor", @@ -45,20 +37,14 @@ "children": [ { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator.Unnamed.$1", + "id": "def-server.CsvGenerator.Unnamed.$1", "type": "Object", "tags": [], "label": "job", "description": [], "signature": [ "Omit<", - { - "pluginId": "@kbn/generate-csv-types", - "scope": "common", - "docId": "kibKbnGenerateCsvTypesPluginApi", - "section": "def-common.JobParams", - "text": "JobParams" - }, + "JobParamsCSV", ", \"version\">" ], "path": "packages/kbn-generate-csv/src/generate_csv.ts", @@ -68,19 +54,21 @@ }, { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator.Unnamed.$2", + "id": "def-server.CsvGenerator.Unnamed.$2", "type": "Object", "tags": [], "label": "config", "description": [], "signature": [ + "Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", { - "pluginId": "@kbn/generate-csv-types", + "pluginId": "@kbn/config-schema", "scope": "common", - "docId": "kibKbnGenerateCsvTypesPluginApi", - "section": "def-common.CsvConfig", - "text": "CsvConfig" - } + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>" ], "path": "packages/kbn-generate-csv/src/generate_csv.ts", "deprecated": false, @@ -89,7 +77,7 @@ }, { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator.Unnamed.$3", + "id": "def-server.CsvGenerator.Unnamed.$3", "type": "Object", "tags": [], "label": "clients", @@ -104,7 +92,7 @@ }, { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator.Unnamed.$4", + "id": "def-server.CsvGenerator.Unnamed.$4", "type": "Object", "tags": [], "label": "dependencies", @@ -119,7 +107,7 @@ }, { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator.Unnamed.$5", + "id": "def-server.CsvGenerator.Unnamed.$5", "type": "Object", "tags": [], "label": "cancellationToken", @@ -140,7 +128,7 @@ }, { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator.Unnamed.$6", + "id": "def-server.CsvGenerator.Unnamed.$6", "type": "Object", "tags": [], "label": "logger", @@ -161,7 +149,7 @@ }, { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator.Unnamed.$7", + "id": "def-server.CsvGenerator.Unnamed.$7", "type": "Object", "tags": [], "label": "stream", @@ -179,20 +167,14 @@ }, { "parentPluginId": "@kbn/generate-csv", - "id": "def-common.CsvGenerator.generateData", + "id": "def-server.CsvGenerator.generateData", "type": "Function", "tags": [], "label": "generateData", "description": [], "signature": [ "() => Promise<", - { - "pluginId": "@kbn/reporting-common", - "scope": "common", - "docId": "kibKbnReportingCommonPluginApi", - "section": "def-common.TaskRunResult", - "text": "TaskRunResult" - }, + "TaskRunResult", ">" ], "path": "packages/kbn-generate-csv/src/generate_csv.ts", @@ -210,5 +192,13 @@ "enums": [], "misc": [], "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] } } \ No newline at end of file diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index aacf5b0690af7..322451148e7af 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; @@ -21,10 +21,10 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 10 | 0 | 10 | 0 | +| 10 | 0 | 10 | 1 | -## Common +## Server ### Classes - + diff --git a/api_docs/kbn_generate_csv_types.devdocs.json b/api_docs/kbn_generate_csv_types.devdocs.json deleted file mode 100644 index c816650afc29a..0000000000000 --- a/api_docs/kbn_generate_csv_types.devdocs.json +++ /dev/null @@ -1,244 +0,0 @@ -{ - "id": "@kbn/generate-csv-types", - "client": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "server": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "common": { - "classes": [], - "functions": [], - "interfaces": [ - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.CsvConfig", - "type": "Interface", - "tags": [], - "label": "CsvConfig", - "description": [], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.CsvConfig.checkForFormulas", - "type": "boolean", - "tags": [], - "label": "checkForFormulas", - "description": [], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.CsvConfig.escapeFormulaValues", - "type": "boolean", - "tags": [], - "label": "escapeFormulaValues", - "description": [], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.CsvConfig.maxSizeBytes", - "type": "CompoundType", - "tags": [], - "label": "maxSizeBytes", - "description": [], - "signature": [ - "number | ", - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.ByteSizeValue", - "text": "ByteSizeValue" - } - ], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.CsvConfig.useByteOrderMarkEncoding", - "type": "boolean", - "tags": [], - "label": "useByteOrderMarkEncoding", - "description": [], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.CsvConfig.scroll", - "type": "Object", - "tags": [], - "label": "scroll", - "description": [], - "signature": [ - "{ duration: string; size: number; }" - ], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.JobParams", - "type": "Interface", - "tags": [], - "label": "JobParams", - "description": [], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.JobParams.searchSource", - "type": "Object", - "tags": [], - "label": "searchSource", - "description": [], - "signature": [ - "{ type?: string | undefined; query?: ", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Query", - "text": "Query" - }, - " | ", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.AggregateQuery", - "text": "AggregateQuery" - }, - " | undefined; filter?: ", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - "[] | undefined; sort?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.EsQuerySortValue", - "text": "EsQuerySortValue" - }, - "[] | undefined; highlight?: ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.SerializableRecord", - "text": "SerializableRecord" - }, - " | undefined; highlightAll?: boolean | undefined; trackTotalHits?: number | boolean | undefined; aggs?: { type: string; enabled?: boolean | undefined; id?: string | undefined; params?: {} | ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.SerializableRecord", - "text": "SerializableRecord" - }, - " | undefined; schema?: string | undefined; }[] | undefined; from?: number | undefined; size?: number | undefined; source?: boolean | ", - "Fields", - " | undefined; version?: boolean | undefined; fields?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.SearchFieldValue", - "text": "SearchFieldValue" - }, - "[] | undefined; fieldsFromSource?: ", - "Fields", - " | undefined; index?: string | ", - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataViewSpec", - "text": "DataViewSpec" - }, - " | undefined; searchAfter?: ", - "SortResults", - " | undefined; timeout?: string | undefined; terminate_after?: number | undefined; parent?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.SerializedSearchSourceFields", - "text": "SerializedSearchSourceFields" - }, - " | undefined; }" - ], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.JobParams.columns", - "type": "Array", - "tags": [], - "label": "columns", - "description": [], - "signature": [ - "string[] | undefined" - ], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/generate-csv-types", - "id": "def-common.JobParams.browserTimezone", - "type": "string", - "tags": [], - "label": "browserTimezone", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "packages/kbn-generate-csv-types/index.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - } - ], - "enums": [], - "misc": [], - "objects": [] - } -} \ No newline at end of file diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 3122ffc6a1f51..5bbbde441b496 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-15 +date: 2023-11-19 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 7ef8e85bc81aa..e502bf7fea858 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-15 +date: 2023-11-19 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 9f29590a2e53b..69c8a5ed80852 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-15 +date: 2023-11-19 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 d0d86db64c8fe..4cb4807942d71 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-15 +date: 2023-11-19 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 75faa26233681..1e7bc20bee922 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-15 +date: 2023-11-19 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 9be07301669a7..19625a1647e5a 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-15 +date: 2023-11-19 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 e7dfc6373501b..a4421c2754cd9 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-15 +date: 2023-11-19 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 b82ebc1b75f7a..2ca86d88fe650 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-15 +date: 2023-11-19 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 9905cfc58cef2..eab957c10a6ea 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-15 +date: 2023-11-19 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 a8f614ff7cc5b..b789f4168f4b7 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-15 +date: 2023-11-19 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 9df6823ed46b4..f075f141ebcaf 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-15 +date: 2023-11-19 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 85d6c871957aa..7129be0fd704a 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-15 +date: 2023-11-19 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 509501186afa3..e2848e17aed92 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-15 +date: 2023-11-19 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 479d8f21a4c92..5c2a9c465de87 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-15 +date: 2023-11-19 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 60d7ebb60843a..fc7d536e75aca 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-15 +date: 2023-11-19 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 8a8328991d390..5b02bbd1e04fd 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-15 +date: 2023-11-19 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 dd0ce52a9e1f5..14e79731584a4 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-15 +date: 2023-11-19 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 aa8aa82ab5c2b..8542ef5cb08f4 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-15 +date: 2023-11-19 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 3dc9d99049a25..b444df2b6a9c2 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-15 +date: 2023-11-19 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 2fe99556f1f74..745eb2bf99761 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-15 +date: 2023-11-19 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 30294e5be634f..6809746912d95 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-15 +date: 2023-11-19 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 63b0bacf6d037..6f2cf4db750b5 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-15 +date: 2023-11-19 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 84cd3c75daba4..4345bf89fb98c 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-15 +date: 2023-11-19 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 3bce63af5743e..b4e54d84a14a8 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-15 +date: 2023-11-19 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 9549266743460..cb85f07953dca 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-15 +date: 2023-11-19 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 87eabef6dc37b..684ec37283db6 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-15 +date: 2023-11-19 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 1c1459ada11cf..34f55e74b1e1e 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-15 +date: 2023-11-19 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 348eb78f86c8b..b252069868ee7 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-15 +date: 2023-11-19 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 fbab05a59de82..c9e121e75e660 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-15 +date: 2023-11-19 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 194881c7699ed..dd7da237a2d7a 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-15 +date: 2023-11-19 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 7e7457c256e62..87a355c6e83d9 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-15 +date: 2023-11-19 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 ec093b5792d96..9663d51d3aa74 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-15 +date: 2023-11-19 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 1665c8c6e320d..3bb13dbf52449 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-15 +date: 2023-11-19 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 2009b68575c3f..314b750419325 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-15 +date: 2023-11-19 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 9505d0f680625..2d2df16e28df5 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-15 +date: 2023-11-19 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 26751a611c551..e605980193eef 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-15 +date: 2023-11-19 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 1ecd0223b7d7d..9f606e5bd3d2b 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-15 +date: 2023-11-19 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 b1a8a722818af..925711cc06700 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-15 +date: 2023-11-19 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 a25a4a845160e..33e332f902fb2 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-15 +date: 2023-11-19 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 e46dd66a02fc0..a57239d4cb4da 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 8f55aeab66fa0..9f05470dfa086 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-15 +date: 2023-11-19 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 0f36289a68bac..d76cfdee18c9d 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-15 +date: 2023-11-19 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 64cd34dcc258b..84487050900b6 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-15 +date: 2023-11-19 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 093d7711b53a6..1905e5604f7b8 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-15 +date: 2023-11-19 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 f3460bd244bf9..b6c9697fe95a4 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-15 +date: 2023-11-19 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 d9700e869f904..3fb69c30356fd 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-15 +date: 2023-11-19 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 fdfcfa9393df4..db376f8b5ca1c 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-15 +date: 2023-11-19 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 0159bbae75b46..eb26c32b7df24 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-15 +date: 2023-11-19 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 dd5eb5bb71af8..8a106162e07fb 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-15 +date: 2023-11-19 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 b99727b478234..d9a1736e42fe7 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-15 +date: 2023-11-19 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 3a5ce1cef20fe..39e6f11391016 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-15 +date: 2023-11-19 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 545d567761afa..8d92f762cfd0c 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-15 +date: 2023-11-19 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 17fdb991f86a7..3db2fed551ae0 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-15 +date: 2023-11-19 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 f9066ea68612c..92a17bfbabf1d 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-15 +date: 2023-11-19 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 5486e95631f18..c138ae7f5edd9 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-15 +date: 2023-11-19 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 efa5c27fc0f0f..e045c7a25011c 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-15 +date: 2023-11-19 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 b601a92ab6ce6..ffa0b2bb05515 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-15 +date: 2023-11-19 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_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 7915f62bfc23e..7544033d6531c 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-15 +date: 2023-11-19 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 d9b09d7b46bf5..4407957a552bd 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-15 +date: 2023-11-19 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 864075b0c30f5..24fbadbfc9283 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-15 +date: 2023-11-19 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 5667c8a6fbdbb..e70139d098ccf 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 94ee87748cb9b..d1aa83e90351b 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-15 +date: 2023-11-19 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 9f59453c096e0..21ada11c9811e 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-15 +date: 2023-11-19 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 c6fbed55d530f..c46d59560bbc8 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-15 +date: 2023-11-19 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 ee070718abc39..95c9d13161b4c 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-15 +date: 2023-11-19 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.devdocs.json b/api_docs/kbn_osquery_io_ts_types.devdocs.json index 65501b5031659..4fd8870da6eaf 100644 --- a/api_docs/kbn_osquery_io_ts_types.devdocs.json +++ b/api_docs/kbn_osquery_io_ts_types.devdocs.json @@ -457,6 +457,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/osquery-io-ts-types", + "id": "def-common.Timeout", + "type": "Type", + "tags": [], + "label": "Timeout", + "description": [], + "signature": [ + "number" + ], + "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/osquery-io-ts-types", + "id": "def-common.TimeoutOrUndefined", + "type": "Type", + "tags": [], + "label": "TimeoutOrUndefined", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/osquery-io-ts-types", "id": "def-common.Version", @@ -1352,6 +1382,42 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/osquery-io-ts-types", + "id": "def-common.timeout", + "type": "Object", + "tags": [], + "label": "timeout", + "description": [], + "signature": [ + "Type", + "" + ], + "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/osquery-io-ts-types", + "id": "def-common.timeoutOrUndefined", + "type": "Object", + "tags": [], + "label": "timeoutOrUndefined", + "description": [], + "signature": [ + "UnionC", + "<[", + "Type", + ", ", + "UndefinedC", + "]>" + ], + "path": "packages/kbn-osquery-io-ts-types/src/live_query/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/osquery-io-ts-types", "id": "def-common.version", diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 5535a5290c472..b31e3a567bbf0 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-asset-management](https://github.com/orgs/elastic/tea | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 62 | 0 | 62 | 0 | +| 66 | 0 | 66 | 0 | ## Common diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index ff3fb8c230c71..883421bd75b7d 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-15 +date: 2023-11-19 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 c42f731d9e919..f7f3056a4ad1e 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-15 +date: 2023-11-19 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 9984c09ce6af0..db9e258cd2452 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index ebe66a5133ad6..69d69300bf78e 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 15cf645b4d2c2..ca81fbb704e2b 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-15 +date: 2023-11-19 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 c3f7734cc2a91..880cb9fd3a203 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-15 +date: 2023-11-19 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 72c1ca60c6bf7..640cc3b9e3450 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-15 +date: 2023-11-19 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 0cbebdba46e51..fb225a2857feb 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-15 +date: 2023-11-19 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 3fe1b34146fc4..306da5ba62a10 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-15 +date: 2023-11-19 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 36fa3b35062c7..5ac8bdce24ac2 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-15 +date: 2023-11-19 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 2994ef383b004..14da79a5e8315 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-15 +date: 2023-11-19 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 ed36ec696b1e8..1278197c1132f 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-15 +date: 2023-11-19 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 cbb710d45fb22..d6c36854a11bf 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-15 +date: 2023-11-19 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 ca6cfd762d4c9..8b8aac66746fa 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-15 +date: 2023-11-19 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 e90db214367d8..dc0cb750746a7 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-15 +date: 2023-11-19 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 9c0337bf6dc50..bd768dbed4d96 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-15 +date: 2023-11-19 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.devdocs.json b/api_docs/kbn_reporting_common.devdocs.json index bb90486c2546c..68cf96719cd61 100644 --- a/api_docs/kbn_reporting_common.devdocs.json +++ b/api_docs/kbn_reporting_common.devdocs.json @@ -892,6 +892,39 @@ } ], "functions": [ + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.buildKibanaPath", + "type": "Function", + "tags": [], + "label": "buildKibanaPath", + "description": [], + "signature": [ + "({ basePath, appPath, spaceId }: Args) => string" + ], + "path": "packages/kbn-reporting/common/build_kibana_path.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.buildKibanaPath.$1", + "type": "Object", + "tags": [], + "label": "{ basePath, appPath, spaceId }", + "description": [], + "signature": [ + "Args" + ], + "path": "packages/kbn-reporting/common/build_kibana_path.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/reporting-common", "id": "def-common.byteSizeValueToNumber", @@ -973,6 +1006,25 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.getRedirectAppPath", + "type": "Function", + "tags": [], + "label": "getRedirectAppPath", + "description": [ + "\nA way to get the client side route for the reporting redirect app.\n\nTODO: Add a job ID and a locator to use so that we can redirect without expecting state to\nbe injected to the page" + ], + "signature": [ + "() => string" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/reporting-common", "id": "def-common.numberToDuration", @@ -1008,31 +1060,6 @@ } ], "interfaces": [ - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.CsvMetrics", - "type": "Interface", - "tags": [], - "label": "CsvMetrics", - "description": [], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.CsvMetrics.rows", - "type": "number", - "tags": [], - "label": "rows", - "description": [], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/reporting-common", "id": "def-common.ReportingError", @@ -1064,191 +1091,257 @@ } ], "initialIsOpen": false + } + ], + "enums": [ + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.JOB_STATUS", + "type": "Enum", + "tags": [], + "label": "JOB_STATUS", + "description": [], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "misc": [ + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.ALLOWED_JOB_CONTENT_TYPES", + "type": "Array", + "tags": [], + "label": "ALLOWED_JOB_CONTENT_TYPES", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false }, { "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunMetrics", - "type": "Interface", + "id": "def-common.API_USAGE_COUNTER_TYPE", + "type": "string", "tags": [], - "label": "TaskRunMetrics", + "label": "API_USAGE_COUNTER_TYPE", "description": [], - "path": "packages/kbn-reporting/common/metrics.ts", + "signature": [ + "\"reportingApi\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunMetrics.csv", - "type": "Object", - "tags": [], - "label": "csv", - "description": [], - "signature": [ - { - "pluginId": "@kbn/reporting-common", - "scope": "common", - "docId": "kibKbnReportingCommonPluginApi", - "section": "def-common.CsvMetrics", - "text": "CsvMetrics" - }, - " | undefined" - ], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunMetrics.png", - "type": "Object", - "tags": [], - "label": "png", - "description": [], - "signature": [ - "PerformanceMetrics", - " | undefined" - ], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunMetrics.pdf", - "type": "Object", - "tags": [], - "label": "pdf", - "description": [], - "signature": [ - "PdfScreenshotMetrics", - " | undefined" - ], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - } + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.API_USAGE_ERROR_TYPE", + "type": "string", + "tags": [], + "label": "API_USAGE_ERROR_TYPE", + "description": [], + "signature": [ + "\"reportingApiError\"" ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunResult", - "type": "Interface", + "id": "def-common.ILM_POLICY_NAME", + "type": "string", "tags": [], - "label": "TaskRunResult", + "label": "ILM_POLICY_NAME", "description": [], - "path": "packages/kbn-reporting/common/metrics.ts", + "signature": [ + "\"kibana-reporting\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunResult.content_type", - "type": "CompoundType", - "tags": [], - "label": "content_type", - "description": [], - "signature": [ - "string | null" - ], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunResult.csv_contains_formulas", - "type": "CompoundType", - "tags": [], - "label": "csv_contains_formulas", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunResult.max_size_reached", - "type": "CompoundType", - "tags": [], - "label": "max_size_reached", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunResult.warnings", - "type": "Array", - "tags": [], - "label": "warnings", - "description": [], - "signature": [ - "string[] | undefined" - ], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunResult.metrics", - "type": "Object", - "tags": [], - "label": "metrics", - "description": [], - "signature": [ - { - "pluginId": "@kbn/reporting-common", - "scope": "common", - "docId": "kibKbnReportingCommonPluginApi", - "section": "def-common.TaskRunMetrics", - "text": "TaskRunMetrics" - }, - " | undefined" - ], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/reporting-common", - "id": "def-common.TaskRunResult.error_code", - "type": "string", - "tags": [], - "label": "error_code", - "description": [ - "\nWhen running a report task we may finish with warnings that were triggered\nby an error. We can pass the error code via the task run result to the\ntask runner so that it can be recorded for telemetry.\n\nAlternatively, this field can be populated in the event that the task does\nnot complete in the task runner's error handler." - ], - "signature": [ - "string | undefined" - ], - "path": "packages/kbn-reporting/common/metrics.ts", - "deprecated": false, - "trackAdoption": false - } + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY", + "type": "string", + "tags": [], + "label": "JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY", + "description": [], + "signature": [ + "\"xpack.reporting.jobCompletionNotifications\"" ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, "initialIsOpen": false - } - ], - "enums": [], - "misc": [ + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.LICENSE_TYPE_BASIC", + "type": "string", + "tags": [], + "label": "LICENSE_TYPE_BASIC", + "description": [], + "signature": [ + "\"basic\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.LICENSE_TYPE_CLOUD_STANDARD", + "type": "string", + "tags": [], + "label": "LICENSE_TYPE_CLOUD_STANDARD", + "description": [], + "signature": [ + "\"standard\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.LICENSE_TYPE_ENTERPRISE", + "type": "string", + "tags": [], + "label": "LICENSE_TYPE_ENTERPRISE", + "description": [], + "signature": [ + "\"enterprise\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.LICENSE_TYPE_GOLD", + "type": "string", + "tags": [], + "label": "LICENSE_TYPE_GOLD", + "description": [], + "signature": [ + "\"gold\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.LICENSE_TYPE_PLATINUM", + "type": "string", + "tags": [], + "label": "LICENSE_TYPE_PLATINUM", + "description": [], + "signature": [ + "\"platinum\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.LICENSE_TYPE_TRIAL", + "type": "string", + "tags": [], + "label": "LICENSE_TYPE_TRIAL", + "description": [], + "signature": [ + "\"trial\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.PLUGIN_ID", + "type": "string", + "tags": [], + "label": "PLUGIN_ID", + "description": [], + "signature": [ + "\"reporting\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.REPORTING_MANAGEMENT_HOME", + "type": "string", + "tags": [], + "label": "REPORTING_MANAGEMENT_HOME", + "description": [], + "signature": [ + "\"/app/management/insightsAndAlerting/reporting\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.REPORTING_REDIRECT_LOCATOR_STORE_KEY", + "type": "string", + "tags": [], + "label": "REPORTING_REDIRECT_LOCATOR_STORE_KEY", + "description": [], + "signature": [ + "\"__REPORTING_REDIRECT_LOCATOR_STORE_KEY__\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/reporting-common", - "id": "def-common.CSV_REPORTING_ACTION", + "id": "def-common.REPORTING_SYSTEM_INDEX", "type": "string", "tags": [], - "label": "CSV_REPORTING_ACTION", + "label": "REPORTING_SYSTEM_INDEX", "description": [], "signature": [ - "\"downloadCsvReport\"" + "\".reporting\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.REPORTING_TRANSACTION_TYPE", + "type": "string", + "tags": [], + "label": "REPORTING_TRANSACTION_TYPE", + "description": [], + "signature": [ + "\"reporting\"" ], "path": "packages/kbn-reporting/common/constants.ts", "deprecated": false, @@ -1299,6 +1392,21 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.UNVERSIONED_VERSION", + "type": "string", + "tags": [], + "label": "UNVERSIONED_VERSION", + "description": [], + "signature": [ + "\"7.14.0\"" + ], + "path": "packages/kbn-reporting/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 82a3d09107ae3..1945bb42bb996 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.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 | |-------------------|-----------|------------------------|-----------------| -| 73 | 0 | 65 | 0 | +| 80 | 0 | 72 | 7 | ## Common @@ -34,6 +34,9 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh ### Interfaces +### Enums + + ### Consts, variables and types diff --git a/api_docs/kbn_reporting_export_types_csv.devdocs.json b/api_docs/kbn_reporting_export_types_csv.devdocs.json new file mode 100644 index 0000000000000..60f6311b05b9c --- /dev/null +++ b/api_docs/kbn_reporting_export_types_csv.devdocs.json @@ -0,0 +1,1171 @@ +{ + "id": "@kbn/reporting-export-types-csv", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType", + "type": "Class", + "tags": [], + "label": "CsvSearchSourceExportType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-csv", + "scope": "server", + "docId": "kibKbnReportingExportTypesCsvPluginApi", + "section": "def-server.CsvSearchSourceExportType", + "text": "CsvSearchSourceExportType" + }, + " extends ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ExportType", + "text": "ExportType" + }, + "<", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.JobParamsCSV", + "text": "JobParamsCSV" + }, + ", ", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.TaskPayloadCSV", + "text": "TaskPayloadCSV" + }, + ", ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.BaseExportTypeSetupDeps", + "text": "BaseExportTypeSetupDeps" + }, + ", CsvSearchSourceExportTypeStartDeps>" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.jobType", + "type": "string", + "tags": [], + "label": "jobType", + "description": [], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.jobContentEncoding", + "type": "string", + "tags": [], + "label": "jobContentEncoding", + "description": [], + "signature": [ + "\"base64\"" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.jobContentExtension", + "type": "string", + "tags": [], + "label": "jobContentExtension", + "description": [], + "signature": [ + "\"csv\"" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.validLicenses", + "type": "Array", + "tags": [], + "label": "validLicenses", + "description": [], + "signature": [ + "(\"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\")[]" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "[core: ", + { + "pluginId": "@kbn/core-lifecycle-server", + "scope": "common", + "docId": "kibKbnCoreLifecycleServerPluginApi", + "section": "def-common.CoreSetup", + "text": "CoreSetup" + }, + ", config: Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>, logger: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ", context: ", + { + "pluginId": "@kbn/core-plugins-server", + "scope": "common", + "docId": "kibKbnCorePluginsServerPluginApi", + "section": "def-common.PluginInitializerContext", + "text": "PluginInitializerContext" + }, + "; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>>]" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.createJob", + "type": "Function", + "tags": [], + "label": "createJob", + "description": [], + "signature": [ + "(jobParams: ", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.JobParamsCSV", + "text": "JobParamsCSV" + }, + ") => Promise<{ searchSource: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SerializedSearchSourceFields", + "text": "SerializedSearchSourceFields" + }, + "; columns?: string[] | undefined; layout?: { id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; } | undefined; objectType: string; title: string; browserTimezone: string; version: string; }>" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.createJob.$1", + "type": "CompoundType", + "tags": [], + "label": "jobParams", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.JobParamsCSV", + "text": "JobParamsCSV" + } + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.runTask", + "type": "Function", + "tags": [], + "label": "runTask", + "description": [], + "signature": [ + "(jobId: string, job: ", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.TaskPayloadCSV", + "text": "TaskPayloadCSV" + }, + ", cancellationToken: ", + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + }, + ", stream: ", + "Writable", + ") => Promise<", + "TaskRunResult", + ">" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.runTask.$1", + "type": "string", + "tags": [], + "label": "jobId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.runTask.$2", + "type": "CompoundType", + "tags": [], + "label": "job", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.TaskPayloadCSV", + "text": "TaskPayloadCSV" + } + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.runTask.$3", + "type": "Object", + "tags": [], + "label": "cancellationToken", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + } + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceExportType.runTask.$4", + "type": "Object", + "tags": [], + "label": "stream", + "description": [], + "signature": [ + "Writable" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType", + "type": "Class", + "tags": [], + "label": "CsvSearchSourceImmediateExportType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-csv", + "scope": "server", + "docId": "kibKbnReportingExportTypesCsvPluginApi", + "section": "def-server.CsvSearchSourceImmediateExportType", + "text": "CsvSearchSourceImmediateExportType" + }, + " extends ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ExportType", + "text": "ExportType" + }, + "<", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.JobParamsDownloadCSV", + "text": "JobParamsDownloadCSV" + }, + ", ", + "ImmediateExecuteFn", + ", ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.BaseExportTypeSetupDeps", + "text": "BaseExportTypeSetupDeps" + }, + ", CsvSearchSourceImmediateExportTypeStartDeps>" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.jobType", + "type": "string", + "tags": [], + "label": "jobType", + "description": [], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.jobContentEncoding", + "type": "string", + "tags": [], + "label": "jobContentEncoding", + "description": [], + "signature": [ + "\"base64\"" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.jobContentExtension", + "type": "string", + "tags": [], + "label": "jobContentExtension", + "description": [], + "signature": [ + "\"csv\"" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.validLicenses", + "type": "Array", + "tags": [], + "label": "validLicenses", + "description": [], + "signature": [ + "(\"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\")[]" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "[core: ", + { + "pluginId": "@kbn/core-lifecycle-server", + "scope": "common", + "docId": "kibKbnCoreLifecycleServerPluginApi", + "section": "def-common.CoreSetup", + "text": "CoreSetup" + }, + ", config: Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>, logger: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ", context: ", + { + "pluginId": "@kbn/core-plugins-server", + "scope": "common", + "docId": "kibKbnCorePluginsServerPluginApi", + "section": "def-common.PluginInitializerContext", + "text": "PluginInitializerContext" + }, + "; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>>]" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.createJob", + "type": "Function", + "tags": [], + "label": "createJob", + "description": [], + "signature": [ + "() => Promise" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.runTask", + "type": "Function", + "tags": [], + "label": "runTask", + "description": [], + "signature": [ + "(_jobId: string | null, immediateJobParams: ", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.JobParamsDownloadCSV", + "text": "JobParamsDownloadCSV" + }, + ", context: ", + "ReportingRequestHandlerContext", + ", stream: ", + "Writable", + ", req: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ") => Promise<", + "TaskRunResult", + ">" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.runTask.$1", + "type": "CompoundType", + "tags": [], + "label": "_jobId", + "description": [], + "signature": [ + "string | null" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.runTask.$2", + "type": "Object", + "tags": [], + "label": "immediateJobParams", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.JobParamsDownloadCSV", + "text": "JobParamsDownloadCSV" + } + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.runTask.$3", + "type": "CompoundType", + "tags": [], + "label": "context", + "description": [], + "signature": [ + "ReportingRequestHandlerContext" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.runTask.$4", + "type": "Object", + "tags": [], + "label": "stream", + "description": [], + "signature": [ + "Writable" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvSearchSourceImmediateExportType.runTask.$5", + "type": "Object", + "tags": [], + "label": "req", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_searchsource_immediate.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType", + "type": "Class", + "tags": [], + "label": "CsvV2ExportType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-csv", + "scope": "server", + "docId": "kibKbnReportingExportTypesCsvPluginApi", + "section": "def-server.CsvV2ExportType", + "text": "CsvV2ExportType" + }, + " extends ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ExportType", + "text": "ExportType" + }, + "<", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.JobParamsCsvFromSavedObject", + "text": "JobParamsCsvFromSavedObject" + }, + ", ", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.TaskPayloadCsvFromSavedObject", + "text": "TaskPayloadCsvFromSavedObject" + }, + ", ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.BaseExportTypeSetupDeps", + "text": "BaseExportTypeSetupDeps" + }, + ", ", + "CsvV2ExportTypeStartDeps", + ">" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.jobType", + "type": "string", + "tags": [], + "label": "jobType", + "description": [], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.jobContentEncoding", + "type": "string", + "tags": [], + "label": "jobContentEncoding", + "description": [], + "signature": [ + "\"base64\"" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.jobContentExtension", + "type": "string", + "tags": [], + "label": "jobContentExtension", + "description": [], + "signature": [ + "\"csv\"" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.validLicenses", + "type": "Array", + "tags": [], + "label": "validLicenses", + "description": [], + "signature": [ + "(\"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\")[]" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "[core: ", + { + "pluginId": "@kbn/core-lifecycle-server", + "scope": "common", + "docId": "kibKbnCoreLifecycleServerPluginApi", + "section": "def-common.CoreSetup", + "text": "CoreSetup" + }, + ", config: Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>, logger: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ", context: ", + { + "pluginId": "@kbn/core-plugins-server", + "scope": "common", + "docId": "kibKbnCorePluginsServerPluginApi", + "section": "def-common.PluginInitializerContext", + "text": "PluginInitializerContext" + }, + "; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>>]" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.createJob", + "type": "Function", + "tags": [], + "label": "createJob", + "description": [], + "signature": [ + "(jobParams: ", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.JobParamsCsvFromSavedObject", + "text": "JobParamsCsvFromSavedObject" + }, + ", _context: ", + "ReportingRequestHandlerContext", + ", req: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ") => Promise<{ title: string; objectType: string; isDeprecated: boolean; version: string; layout?: { id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; } | undefined; locatorParams: ", + "LocatorParams", + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">[]; browserTimezone: string; }>" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.createJob.$1", + "type": "CompoundType", + "tags": [], + "label": "jobParams", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.JobParamsCsvFromSavedObject", + "text": "JobParamsCsvFromSavedObject" + } + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.createJob.$2", + "type": "CompoundType", + "tags": [], + "label": "_context", + "description": [], + "signature": [ + "ReportingRequestHandlerContext" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.createJob.$3", + "type": "Object", + "tags": [], + "label": "req", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.runTask", + "type": "Function", + "tags": [], + "label": "runTask", + "description": [], + "signature": [ + "(jobId: string, job: ", + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.TaskPayloadCsvFromSavedObject", + "text": "TaskPayloadCsvFromSavedObject" + }, + ", cancellationToken: ", + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + }, + ", stream: ", + "Writable", + ") => Promise<", + "TaskRunResult", + ">" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.runTask.$1", + "type": "string", + "tags": [], + "label": "jobId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.runTask.$2", + "type": "CompoundType", + "tags": [], + "label": "job", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-csv-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesCsvCommonPluginApi", + "section": "def-common.TaskPayloadCsvFromSavedObject", + "text": "TaskPayloadCsvFromSavedObject" + } + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.runTask.$3", + "type": "Object", + "tags": [], + "label": "cancellationToken", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + } + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv", + "id": "def-server.CsvV2ExportType.runTask.$4", + "type": "Object", + "tags": [], + "label": "stream", + "description": [], + "signature": [ + "Writable" + ], + "path": "packages/kbn-reporting/export_types/csv/csv_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx new file mode 100644 index 0000000000000..f64d7a52b7c1f --- /dev/null +++ b/api_docs/kbn_reporting_export_types_csv.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: kibKbnReportingExportTypesCsvPluginApi +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-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] +--- +import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 50 | 0 | 50 | 3 | + +## Server + +### Classes + + diff --git a/api_docs/kbn_reporting_export_types_csv_common.devdocs.json b/api_docs/kbn_reporting_export_types_csv_common.devdocs.json new file mode 100644 index 0000000000000..4e6ff0c91e22c --- /dev/null +++ b/api_docs/kbn_reporting_export_types_csv_common.devdocs.json @@ -0,0 +1,358 @@ +{ + "id": "@kbn/reporting-export-types-csv-common", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.JobParamsDownloadCSV", + "type": "Interface", + "tags": [], + "label": "JobParamsDownloadCSV", + "description": [], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.JobParamsDownloadCSV.browserTimezone", + "type": "string", + "tags": [], + "label": "browserTimezone", + "description": [], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.JobParamsDownloadCSV.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.JobParamsDownloadCSV.searchSource", + "type": "Object", + "tags": [], + "label": "searchSource", + "description": [], + "signature": [ + "{ type?: string | undefined; query?: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined; filter?: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined; sort?: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EsQuerySortValue", + "text": "EsQuerySortValue" + }, + "[] | undefined; highlight?: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + " | undefined; highlightAll?: boolean | undefined; trackTotalHits?: number | boolean | undefined; aggs?: { type: string; enabled?: boolean | undefined; id?: string | undefined; params?: {} | ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + " | undefined; schema?: string | undefined; }[] | undefined; from?: number | undefined; size?: number | undefined; source?: boolean | ", + "Fields", + " | undefined; version?: boolean | undefined; fields?: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SearchFieldValue", + "text": "SearchFieldValue" + }, + "[] | undefined; fieldsFromSource?: ", + "Fields", + " | undefined; index?: string | ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewSpec", + "text": "DataViewSpec" + }, + " | undefined; searchAfter?: ", + "SortResults", + " | undefined; timeout?: string | undefined; terminate_after?: number | undefined; parent?: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SerializedSearchSourceFields", + "text": "SerializedSearchSourceFields" + }, + " | undefined; }" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.JobParamsDownloadCSV.columns", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.CSV_JOB_TYPE", + "type": "string", + "tags": [], + "label": "CSV_JOB_TYPE", + "description": [], + "signature": [ + "\"csv_searchsource\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.CSV_JOB_TYPE_DEPRECATED", + "type": "string", + "tags": [], + "label": "CSV_JOB_TYPE_DEPRECATED", + "description": [], + "signature": [ + "\"csv\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.CSV_JOB_TYPE_V2", + "type": "string", + "tags": [], + "label": "CSV_JOB_TYPE_V2", + "description": [], + "signature": [ + "\"csv_v2\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.CSV_REPORT_TYPE", + "type": "string", + "tags": [], + "label": "CSV_REPORT_TYPE", + "description": [], + "signature": [ + "\"csv_searchsource\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.CSV_REPORT_TYPE_DEPRECATED", + "type": "string", + "tags": [], + "label": "CSV_REPORT_TYPE_DEPRECATED", + "description": [], + "signature": [ + "\"CSV\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.CSV_REPORT_TYPE_V2", + "type": "string", + "tags": [], + "label": "CSV_REPORT_TYPE_V2", + "description": [], + "signature": [ + "\"csv_v2\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.CSV_REPORTING_ACTION", + "type": "string", + "tags": [], + "label": "CSV_REPORTING_ACTION", + "description": [], + "signature": [ + "\"downloadCsvReport\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.CSV_SEARCHSOURCE_IMMEDIATE_TYPE", + "type": "string", + "tags": [], + "label": "CSV_SEARCHSOURCE_IMMEDIATE_TYPE", + "description": [], + "signature": [ + "\"csv_searchsource_immediate\"" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.JobParamsCSV", + "type": "Type", + "tags": [], + "label": "JobParamsCSV", + "description": [], + "signature": [ + "BaseParamsCSV & ", + "BaseParams" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.JobParamsCsvFromSavedObject", + "type": "Type", + "tags": [], + "label": "JobParamsCsvFromSavedObject", + "description": [ + "\nMakes title optional, as it can be derived from the saved search object" + ], + "signature": [ + "CsvFromSavedObjectBase & Omit<", + "BaseParamsV2", + ", \"title\"> & { title?: string | undefined; }" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.TaskPayloadCSV", + "type": "Type", + "tags": [], + "label": "TaskPayloadCSV", + "description": [], + "signature": [ + "BaseParamsCSV & ", + "BasePayload" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-csv-common", + "id": "def-common.TaskPayloadCsvFromSavedObject", + "type": "Type", + "tags": [], + "label": "TaskPayloadCsvFromSavedObject", + "description": [], + "signature": [ + "CsvFromSavedObjectBase & ", + "BasePayloadV2" + ], + "path": "packages/kbn-reporting/export_types/csv_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx new file mode 100644 index 0000000000000..58b0f5727afcb --- /dev/null +++ b/api_docs/kbn_reporting_export_types_csv_common.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: kibKbnReportingExportTypesCsvCommonPluginApi +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-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] +--- +import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 17 | 0 | 16 | 0 | + +## Common + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_reporting_export_types_pdf.devdocs.json b/api_docs/kbn_reporting_export_types_pdf.devdocs.json new file mode 100644 index 0000000000000..48dfb839ff109 --- /dev/null +++ b/api_docs/kbn_reporting_export_types_pdf.devdocs.json @@ -0,0 +1,806 @@ +{ + "id": "@kbn/reporting-export-types-pdf", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType", + "type": "Class", + "tags": [], + "label": "PdfExportType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-pdf", + "scope": "server", + "docId": "kibKbnReportingExportTypesPdfPluginApi", + "section": "def-server.PdfExportType", + "text": "PdfExportType" + }, + " extends ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ExportType", + "text": "ExportType" + }, + "<", + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.JobParamsPDFV2", + "text": "JobParamsPDFV2" + }, + ", ", + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.TaskPayloadPDFV2", + "text": "TaskPayloadPDFV2" + }, + ", ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.BaseExportTypeSetupDeps", + "text": "BaseExportTypeSetupDeps" + }, + ", ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.BaseExportTypeStartDeps", + "text": "BaseExportTypeStartDeps" + }, + ">" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.jobType", + "type": "string", + "tags": [], + "label": "jobType", + "description": [], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.jobContentEncoding", + "type": "string", + "tags": [], + "label": "jobContentEncoding", + "description": [], + "signature": [ + "\"base64\"" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.jobContentExtension", + "type": "string", + "tags": [], + "label": "jobContentExtension", + "description": [], + "signature": [ + "\"pdf\"" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.validLicenses", + "type": "Array", + "tags": [], + "label": "validLicenses", + "description": [], + "signature": [ + "(\"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\")[]" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "[core: ", + { + "pluginId": "@kbn/core-lifecycle-server", + "scope": "common", + "docId": "kibKbnCoreLifecycleServerPluginApi", + "section": "def-common.CoreSetup", + "text": "CoreSetup" + }, + ", config: Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>, logger: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ", context: ", + { + "pluginId": "@kbn/core-plugins-server", + "scope": "common", + "docId": "kibKbnCorePluginsServerPluginApi", + "section": "def-common.PluginInitializerContext", + "text": "PluginInitializerContext" + }, + "; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>>]" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.createJob", + "type": "Function", + "tags": [], + "label": "createJob", + "description": [], + "signature": [ + "({ locatorParams, ...jobParams }: ", + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.JobParamsPDFV2", + "text": "JobParamsPDFV2" + }, + ") => Promise<{ locatorParams: ", + "LocatorParams", + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">[]; isDeprecated: boolean; browserTimezone: string; forceNow: string; layout: { id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }; objectType: string; title: string; version: string; }>" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.createJob.$1", + "type": "CompoundType", + "tags": [], + "label": "{ locatorParams, ...jobParams }", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.JobParamsPDFV2", + "text": "JobParamsPDFV2" + } + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [ + "jobParams" + ] + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.runTask", + "type": "Function", + "tags": [], + "label": "runTask", + "description": [ + "\n" + ], + "signature": [ + "(jobId: string, payload: ", + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.TaskPayloadPDFV2", + "text": "TaskPayloadPDFV2" + }, + ", cancellationToken: ", + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + }, + ", stream: ", + "Writable", + ") => Promise<", + "TaskRunResult", + ">" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.runTask.$1", + "type": "string", + "tags": [], + "label": "jobId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.runTask.$2", + "type": "Object", + "tags": [], + "label": "payload", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.TaskPayloadPDFV2", + "text": "TaskPayloadPDFV2" + } + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.runTask.$3", + "type": "Object", + "tags": [], + "label": "cancellationToken", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + } + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfExportType.runTask.$4", + "type": "Object", + "tags": [], + "label": "stream", + "description": [], + "signature": [ + "Writable" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType", + "type": "Class", + "tags": [ + "deprecated" + ], + "label": "PdfV1ExportType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-pdf", + "scope": "server", + "docId": "kibKbnReportingExportTypesPdfPluginApi", + "section": "def-server.PdfV1ExportType", + "text": "PdfV1ExportType" + }, + " extends ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ExportType", + "text": "ExportType" + }, + "<", + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.JobParamsPDFDeprecated", + "text": "JobParamsPDFDeprecated" + }, + ", ", + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.TaskPayloadPDF", + "text": "TaskPayloadPDF" + }, + ", ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.BaseExportTypeSetupDeps", + "text": "BaseExportTypeSetupDeps" + }, + ", ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.BaseExportTypeStartDeps", + "text": "BaseExportTypeStartDeps" + }, + ">" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "reporting", + "path": "x-pack/plugins/reporting/server/core.ts" + }, + { + "plugin": "reporting", + "path": "x-pack/plugins/reporting/server/core.ts" + } + ], + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.jobType", + "type": "string", + "tags": [], + "label": "jobType", + "description": [], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.jobContentEncoding", + "type": "string", + "tags": [], + "label": "jobContentEncoding", + "description": [], + "signature": [ + "\"base64\" | undefined" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.jobContentExtension", + "type": "string", + "tags": [], + "label": "jobContentExtension", + "description": [], + "signature": [ + "\"pdf\"" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.validLicenses", + "type": "Array", + "tags": [], + "label": "validLicenses", + "description": [], + "signature": [ + "(\"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\")[]" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "[core: ", + { + "pluginId": "@kbn/core-lifecycle-server", + "scope": "common", + "docId": "kibKbnCoreLifecycleServerPluginApi", + "section": "def-common.CoreSetup", + "text": "CoreSetup" + }, + ", config: Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>, logger: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ", context: ", + { + "pluginId": "@kbn/core-plugins-server", + "scope": "common", + "docId": "kibKbnCorePluginsServerPluginApi", + "section": "def-common.PluginInitializerContext", + "text": "PluginInitializerContext" + }, + "; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>>]" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.createJob", + "type": "Function", + "tags": [], + "label": "createJob", + "description": [], + "signature": [ + "({ relativeUrls, ...jobParams }: ", + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.JobParamsPDFDeprecated", + "text": "JobParamsPDFDeprecated" + }, + ") => Promise<{ isDeprecated: boolean; forceNow: string; objects: { relativeUrl: string; }[]; layout: { id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }; objectType: string; title: string; browserTimezone: string; version: string; }>" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.createJob.$1", + "type": "CompoundType", + "tags": [], + "label": "{ relativeUrls, ...jobParams }", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.JobParamsPDFDeprecated", + "text": "JobParamsPDFDeprecated" + } + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.runTask", + "type": "Function", + "tags": [], + "label": "runTask", + "description": [], + "signature": [ + "(jobId: string, job: ", + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.TaskPayloadPDF", + "text": "TaskPayloadPDF" + }, + ", cancellationToken: ", + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + }, + ", stream: ", + "Writable", + ") => Promise<", + "TaskRunResult", + ">" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.runTask.$1", + "type": "string", + "tags": [], + "label": "jobId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.runTask.$2", + "type": "Object", + "tags": [], + "label": "job", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.TaskPayloadPDF", + "text": "TaskPayloadPDF" + } + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.runTask.$3", + "type": "Object", + "tags": [], + "label": "cancellationToken", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + } + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf", + "id": "def-server.PdfV1ExportType.runTask.$4", + "type": "Object", + "tags": [], + "label": "stream", + "description": [], + "signature": [ + "Writable" + ], + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx new file mode 100644 index 0000000000000..d7b6516a641d6 --- /dev/null +++ b/api_docs/kbn_reporting_export_types_pdf.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: kibKbnReportingExportTypesPdfPluginApi +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-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] +--- +import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 32 | 0 | 31 | 0 | + +## Server + +### Classes + + diff --git a/api_docs/kbn_reporting_export_types_pdf_common.devdocs.json b/api_docs/kbn_reporting_export_types_pdf_common.devdocs.json new file mode 100644 index 0000000000000..335e4e24dbd67 --- /dev/null +++ b/api_docs/kbn_reporting_export_types_pdf_common.devdocs.json @@ -0,0 +1,324 @@ +{ + "id": "@kbn/reporting-export-types-pdf-common", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.TaskPayloadPDF", + "type": "Interface", + "tags": [], + "label": "TaskPayloadPDF", + "description": [ + "\nStructure of stored job data provided by create_job" + ], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.TaskPayloadPDF", + "text": "TaskPayloadPDF" + }, + " extends ", + "BasePayload" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.TaskPayloadPDF.layout", + "type": "Object", + "tags": [], + "label": "layout", + "description": [], + "signature": [ + "{ id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.TaskPayloadPDF.forceNow", + "type": "string", + "tags": [], + "label": "forceNow", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.TaskPayloadPDF.objects", + "type": "Array", + "tags": [], + "label": "objects", + "description": [], + "signature": [ + "{ relativeUrl: string; }[]" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.TaskPayloadPDFV2", + "type": "Interface", + "tags": [], + "label": "TaskPayloadPDFV2", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-pdf-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPdfCommonPluginApi", + "section": "def-common.TaskPayloadPDFV2", + "text": "TaskPayloadPDFV2" + }, + " extends ", + "BasePayload", + ",BaseParamsPDFV2" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.TaskPayloadPDFV2.layout", + "type": "Object", + "tags": [], + "label": "layout", + "description": [], + "signature": [ + "{ id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.TaskPayloadPDFV2.forceNow", + "type": "string", + "tags": [], + "label": "forceNow", + "description": [ + "\nThe value of forceNow is injected server-side every time a given report is generated." + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.JobAppParamsPDFV2", + "type": "Type", + "tags": [], + "label": "JobAppParamsPDFV2", + "description": [ + "\nPublic-facing interface\nApps should use this interface to build job params.\nbrowserTimezone and version is provided by Reporting" + ], + "signature": [ + "{ title: string; layout: { id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }; locatorParams: ", + "LocatorParams", + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">[]; objectType: string; }" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.JobParamsPDFDeprecated", + "type": "Type", + "tags": [ + "deprecated" + ], + "label": "JobParamsPDFDeprecated", + "description": [], + "signature": [ + "BaseParamsPDF & ", + "BaseParams" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "@kbn/reporting-export-types-pdf", + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts" + }, + { + "plugin": "@kbn/reporting-export-types-pdf", + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts" + }, + { + "plugin": "@kbn/reporting-export-types-pdf", + "path": "packages/kbn-reporting/export_types/pdf/printable_pdf.ts" + }, + { + "plugin": "reporting", + "path": "x-pack/plugins/reporting/server/routes/common/generate/request_handler.test.ts" + }, + { + "plugin": "reporting", + "path": "x-pack/plugins/reporting/server/routes/common/generate/request_handler.test.ts" + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.JobParamsPDFV2", + "type": "Type", + "tags": [], + "label": "JobParamsPDFV2", + "description": [], + "signature": [ + "BaseParamsPDFV2 & ", + "BaseParams" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.PDF_JOB_TYPE", + "type": "string", + "tags": [], + "label": "PDF_JOB_TYPE", + "description": [], + "signature": [ + "\"printable_pdf\"" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.PDF_JOB_TYPE_V2", + "type": "string", + "tags": [], + "label": "PDF_JOB_TYPE_V2", + "description": [], + "signature": [ + "\"printable_pdf_v2\"" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.PDF_REPORT_TYPE", + "type": "string", + "tags": [], + "label": "PDF_REPORT_TYPE", + "description": [], + "signature": [ + "\"printablePdf\"" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-pdf-common", + "id": "def-common.PDF_REPORT_TYPE_V2", + "type": "string", + "tags": [], + "label": "PDF_REPORT_TYPE_V2", + "description": [], + "signature": [ + "\"printablePdfV2\"" + ], + "path": "packages/kbn-reporting/export_types/pdf_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx new file mode 100644 index 0000000000000..bba796202fedf --- /dev/null +++ b/api_docs/kbn_reporting_export_types_pdf_common.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: kibKbnReportingExportTypesPdfCommonPluginApi +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-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] +--- +import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 14 | 0 | 11 | 0 | + +## Common + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_reporting_export_types_png.devdocs.json b/api_docs/kbn_reporting_export_types_png.devdocs.json new file mode 100644 index 0000000000000..176277a8cf6ec --- /dev/null +++ b/api_docs/kbn_reporting_export_types_png.devdocs.json @@ -0,0 +1,420 @@ +{ + "id": "@kbn/reporting-export-types-png", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [ + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType", + "type": "Class", + "tags": [], + "label": "PngExportType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-png", + "scope": "server", + "docId": "kibKbnReportingExportTypesPngPluginApi", + "section": "def-server.PngExportType", + "text": "PngExportType" + }, + " extends ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ExportType", + "text": "ExportType" + }, + "<", + { + "pluginId": "@kbn/reporting-export-types-png-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPngCommonPluginApi", + "section": "def-common.JobParamsPNGV2", + "text": "JobParamsPNGV2" + }, + ", ", + { + "pluginId": "@kbn/reporting-export-types-png-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPngCommonPluginApi", + "section": "def-common.TaskPayloadPNGV2", + "text": "TaskPayloadPNGV2" + }, + ", ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.BaseExportTypeSetupDeps", + "text": "BaseExportTypeSetupDeps" + }, + ", ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.BaseExportTypeStartDeps", + "text": "BaseExportTypeStartDeps" + }, + ">" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.jobType", + "type": "string", + "tags": [], + "label": "jobType", + "description": [], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.jobContentEncoding", + "type": "string", + "tags": [], + "label": "jobContentEncoding", + "description": [], + "signature": [ + "\"base64\"" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.jobContentExtension", + "type": "string", + "tags": [], + "label": "jobContentExtension", + "description": [], + "signature": [ + "\"png\"" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.validLicenses", + "type": "Array", + "tags": [], + "label": "validLicenses", + "description": [], + "signature": [ + "(\"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\")[]" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "[core: ", + { + "pluginId": "@kbn/core-lifecycle-server", + "scope": "common", + "docId": "kibKbnCoreLifecycleServerPluginApi", + "section": "def-common.CoreSetup", + "text": "CoreSetup" + }, + ", config: Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>, logger: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ", context: ", + { + "pluginId": "@kbn/core-plugins-server", + "scope": "common", + "docId": "kibKbnCorePluginsServerPluginApi", + "section": "def-common.PluginInitializerContext", + "text": "PluginInitializerContext" + }, + "; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>>]" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.createJob", + "type": "Function", + "tags": [ + "params" + ], + "label": "createJob", + "description": [], + "signature": [ + "({ locatorParams, ...jobParams }: ", + { + "pluginId": "@kbn/reporting-export-types-png-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPngCommonPluginApi", + "section": "def-common.JobParamsPNGV2", + "text": "JobParamsPNGV2" + }, + ") => Promise<{ locatorParams: ", + "LocatorParams", + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">[]; isDeprecated: boolean; browserTimezone: string; forceNow: string; layout: { id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }; objectType: string; title: string; version: string; }>" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.createJob.$1", + "type": "Object", + "tags": [], + "label": "{ locatorParams, ...jobParams }", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-png-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPngCommonPluginApi", + "section": "def-common.JobParamsPNGV2", + "text": "JobParamsPNGV2" + } + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [ + "jobParams" + ] + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.runTask", + "type": "Function", + "tags": [], + "label": "runTask", + "description": [ + "\n" + ], + "signature": [ + "(jobId: string, payload: ", + { + "pluginId": "@kbn/reporting-export-types-png-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPngCommonPluginApi", + "section": "def-common.TaskPayloadPNGV2", + "text": "TaskPayloadPNGV2" + }, + ", cancellationToken: ", + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + }, + ", stream: ", + "Writable", + ") => Promise<", + "TaskRunResult", + ">" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.runTask.$1", + "type": "string", + "tags": [], + "label": "jobId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.runTask.$2", + "type": "Object", + "tags": [], + "label": "payload", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-png-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPngCommonPluginApi", + "section": "def-common.TaskPayloadPNGV2", + "text": "TaskPayloadPNGV2" + } + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.runTask.$3", + "type": "Object", + "tags": [], + "label": "cancellationToken", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + } + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-export-types-png", + "id": "def-server.PngExportType.runTask.$4", + "type": "Object", + "tags": [], + "label": "stream", + "description": [], + "signature": [ + "Writable" + ], + "path": "packages/kbn-reporting/export_types/png/png_v2.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx new file mode 100644 index 0000000000000..ff7eeb447e82a --- /dev/null +++ b/api_docs/kbn_reporting_export_types_png.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: kibKbnReportingExportTypesPngPluginApi +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-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] +--- +import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 16 | 0 | 15 | 0 | + +## Server + +### Classes + + diff --git a/api_docs/kbn_reporting_export_types_png_common.devdocs.json b/api_docs/kbn_reporting_export_types_png_common.devdocs.json new file mode 100644 index 0000000000000..01af24bb97bc6 --- /dev/null +++ b/api_docs/kbn_reporting_export_types_png_common.devdocs.json @@ -0,0 +1,280 @@ +{ + "id": "@kbn/reporting-export-types-png-common", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.JobParamsPNGV2", + "type": "Interface", + "tags": [], + "label": "JobParamsPNGV2", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-png-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPngCommonPluginApi", + "section": "def-common.JobParamsPNGV2", + "text": "JobParamsPNGV2" + }, + " extends ", + "BaseParams" + ], + "path": "packages/kbn-reporting/export_types/png_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.JobParamsPNGV2.layout", + "type": "Object", + "tags": [], + "label": "layout", + "description": [], + "signature": [ + "{ id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }" + ], + "path": "packages/kbn-reporting/export_types/png_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.JobParamsPNGV2.locatorParams", + "type": "Object", + "tags": [], + "label": "locatorParams", + "description": [ + "\nThis value is used to re-create the same visual state as when the report was requested as well as navigate to the correct page." + ], + "signature": [ + "LocatorParams", + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">" + ], + "path": "packages/kbn-reporting/export_types/png_common/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.TaskPayloadPNGV2", + "type": "Interface", + "tags": [], + "label": "TaskPayloadPNGV2", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-export-types-png-common", + "scope": "common", + "docId": "kibKbnReportingExportTypesPngCommonPluginApi", + "section": "def-common.TaskPayloadPNGV2", + "text": "TaskPayloadPNGV2" + }, + " extends ", + "BasePayload" + ], + "path": "packages/kbn-reporting/export_types/png_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.TaskPayloadPNGV2.layout", + "type": "Object", + "tags": [], + "label": "layout", + "description": [], + "signature": [ + "{ id?: ", + { + "pluginId": "screenshotting", + "scope": "common", + "docId": "kibScreenshottingPluginApi", + "section": "def-common.LayoutType", + "text": "LayoutType" + }, + " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", + "LayoutSelectorDictionary", + "> | undefined; zoom?: number | undefined; }" + ], + "path": "packages/kbn-reporting/export_types/png_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.TaskPayloadPNGV2.forceNow", + "type": "string", + "tags": [], + "label": "forceNow", + "description": [], + "path": "packages/kbn-reporting/export_types/png_common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.TaskPayloadPNGV2.locatorParams", + "type": "Array", + "tags": [], + "label": "locatorParams", + "description": [ + "\nEven though we only ever handle one locator for a PNG, we store it as an array for consistency with how PDFs are stored" + ], + "signature": [ + "LocatorParams", + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">[]" + ], + "path": "packages/kbn-reporting/export_types/png_common/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.JobParamsPNGDeprecated", + "type": "Type", + "tags": [], + "label": "JobParamsPNGDeprecated", + "description": [], + "signature": [ + "BaseParamsPNG & ", + "BaseParams" + ], + "path": "packages/kbn-reporting/export_types/png_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.PNG_JOB_TYPE", + "type": "string", + "tags": [], + "label": "PNG_JOB_TYPE", + "description": [], + "signature": [ + "\"PNG\"" + ], + "path": "packages/kbn-reporting/export_types/png_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.PNG_JOB_TYPE_V2", + "type": "string", + "tags": [], + "label": "PNG_JOB_TYPE_V2", + "description": [], + "signature": [ + "\"PNGV2\"" + ], + "path": "packages/kbn-reporting/export_types/png_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.PNG_REPORT_TYPE", + "type": "string", + "tags": [], + "label": "PNG_REPORT_TYPE", + "description": [], + "signature": [ + "\"PNG\"" + ], + "path": "packages/kbn-reporting/export_types/png_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.PNG_REPORT_TYPE_V2", + "type": "string", + "tags": [], + "label": "PNG_REPORT_TYPE_V2", + "description": [], + "signature": [ + "\"pngV2\"" + ], + "path": "packages/kbn-reporting/export_types/png_common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-export-types-png-common", + "id": "def-common.TaskPayloadPNG", + "type": "Type", + "tags": [], + "label": "TaskPayloadPNG", + "description": [], + "signature": [ + "BaseParamsPNG & ", + "BasePayload" + ], + "path": "packages/kbn-reporting/export_types/png_common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx new file mode 100644 index 0000000000000..6bb4fc802bab7 --- /dev/null +++ b/api_docs/kbn_reporting_export_types_png_common.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: kibKbnReportingExportTypesPngCommonPluginApi +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-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] +--- +import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 13 | 0 | 11 | 0 | + +## Common + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_reporting_mocks_server.devdocs.json b/api_docs/kbn_reporting_mocks_server.devdocs.json new file mode 100644 index 0000000000000..12ee6a35918a5 --- /dev/null +++ b/api_docs/kbn_reporting_mocks_server.devdocs.json @@ -0,0 +1,88 @@ +{ + "id": "@kbn/reporting-mocks-server", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/reporting-mocks-server", + "id": "def-common.createMockConfigSchema", + "type": "Function", + "tags": [], + "label": "createMockConfigSchema", + "description": [], + "signature": [ + "(overrides?: ", + "_DeepPartialObject", + "; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>>) => Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>" + ], + "path": "packages/kbn-reporting/mocks_server/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-mocks-server", + "id": "def-common.createMockConfigSchema.$1", + "type": "Object", + "tags": [], + "label": "overrides", + "description": [], + "signature": [ + "_DeepPartialObject", + "; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>>" + ], + "path": "packages/kbn-reporting/mocks_server/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx new file mode 100644 index 0000000000000..3fccf66f2c5ab --- /dev/null +++ b/api_docs/kbn_reporting_mocks_server.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: kibKbnReportingMocksServerPluginApi +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-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] +--- +import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 2 | 0 | 2 | 0 | + +## Common + +### Functions + + diff --git a/api_docs/kbn_reporting_public.devdocs.json b/api_docs/kbn_reporting_public.devdocs.json new file mode 100644 index 0000000000000..5acb381f4e2a3 --- /dev/null +++ b/api_docs/kbn_reporting_public.devdocs.json @@ -0,0 +1,98 @@ +{ + "id": "@kbn/reporting-public", + "client": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/reporting-public", + "id": "def-public.ClientConfigType", + "type": "Interface", + "tags": [], + "label": "ClientConfigType", + "description": [], + "path": "packages/kbn-reporting/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-public", + "id": "def-public.ClientConfigType.poll", + "type": "Object", + "tags": [], + "label": "poll", + "description": [], + "signature": [ + "{ jobsRefresh: { interval: number; intervalErrorMultiplier: number; }; }" + ], + "path": "packages/kbn-reporting/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-public", + "id": "def-public.ClientConfigType.roles", + "type": "Object", + "tags": [], + "label": "roles", + "description": [], + "signature": [ + "{ enabled: boolean; }" + ], + "path": "packages/kbn-reporting/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-public", + "id": "def-public.ClientConfigType.export_types", + "type": "Object", + "tags": [], + "label": "export_types", + "description": [], + "signature": [ + "{ pdf: { enabled: boolean; }; png: { enabled: boolean; }; csv: { enabled: boolean; }; }" + ], + "path": "packages/kbn-reporting/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-public", + "id": "def-public.ClientConfigType.statefulSettings", + "type": "Object", + "tags": [], + "label": "statefulSettings", + "description": [], + "signature": [ + "{ enabled: boolean; }" + ], + "path": "packages/kbn-reporting/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_generate_csv_types.mdx b/api_docs/kbn_reporting_public.mdx similarity index 55% rename from api_docs/kbn_generate_csv_types.mdx rename to api_docs/kbn_reporting_public.mdx index 5ab42c3c4e965..3cff1a40af947 100644 --- a/api_docs/kbn_generate_csv_types.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -3,15 +3,15 @@ #### 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: kibKbnGenerateCsvTypesPluginApi -slug: /kibana-dev-docs/api/kbn-generate-csv-types -title: "@kbn/generate-csv-types" +id: kibKbnReportingPublicPluginApi +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/generate-csv-types plugin -date: 2023-11-15 -tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv-types'] +description: API docs for the @kbn/reporting-public plugin +date: 2023-11-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- -import kbnGenerateCsvTypesObj from './kbn_generate_csv_types.devdocs.json'; +import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; @@ -21,10 +21,10 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 10 | 0 | 10 | 0 | +| 5 | 0 | 5 | 0 | -## Common +## Client ### Interfaces - + diff --git a/api_docs/kbn_reporting_server.devdocs.json b/api_docs/kbn_reporting_server.devdocs.json new file mode 100644 index 0000000000000..f2c2ef84cfa8c --- /dev/null +++ b/api_docs/kbn_reporting_server.devdocs.json @@ -0,0 +1,1972 @@ +{ + "id": "@kbn/reporting-server", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType", + "type": "Class", + "tags": [], + "label": "ExportType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ExportType", + "text": "ExportType" + }, + "" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.jobType", + "type": "string", + "tags": [], + "label": "jobType", + "description": [], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.jobContentEncoding", + "type": "CompoundType", + "tags": [], + "label": "jobContentEncoding", + "description": [], + "signature": [ + "\"base64\" | \"csv\" | undefined" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.jobContentExtension", + "type": "CompoundType", + "tags": [], + "label": "jobContentExtension", + "description": [], + "signature": [ + "\"csv\" | \"png\" | \"pdf\"" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.createJob", + "type": "Function", + "tags": [], + "label": "createJob", + "description": [], + "signature": [ + "(jobParams: JobParamsType, context: ", + { + "pluginId": "@kbn/core-http-request-handler-context-server", + "scope": "common", + "docId": "kibKbnCoreHttpRequestHandlerContextServerPluginApi", + "section": "def-common.CustomRequestHandlerContext", + "text": "CustomRequestHandlerContext" + }, + "<{ reporting: ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ReportingServerPluginSetup", + "text": "ReportingServerPluginSetup" + }, + " | null; }>, req: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ") => Promise>" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.createJob.$1", + "type": "Uncategorized", + "tags": [], + "label": "jobParams", + "description": [], + "signature": [ + "JobParamsType" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.createJob.$2", + "type": "CompoundType", + "tags": [], + "label": "context", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-request-handler-context-server", + "scope": "common", + "docId": "kibKbnCoreHttpRequestHandlerContextServerPluginApi", + "section": "def-common.RequestHandlerContext", + "text": "RequestHandlerContext" + }, + " & { reporting: Promise<", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ReportingServerPluginSetup", + "text": "ReportingServerPluginSetup" + }, + " | null>; }" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.createJob.$3", + "type": "Object", + "tags": [], + "label": "req", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.runTask", + "type": "Function", + "tags": [], + "label": "runTask", + "description": [], + "signature": [ + "(jobId: string, payload: TaskPayloadType, cancellationToken: ", + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + }, + ", stream: ", + "Writable", + ") => Promise<", + "TaskRunResult", + ">" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.runTask.$1", + "type": "string", + "tags": [], + "label": "jobId", + "description": [], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.runTask.$2", + "type": "Uncategorized", + "tags": [], + "label": "payload", + "description": [], + "signature": [ + "TaskPayloadType" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.runTask.$3", + "type": "Object", + "tags": [], + "label": "cancellationToken", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + } + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.runTask.$4", + "type": "Object", + "tags": [], + "label": "stream", + "description": [], + "signature": [ + "Writable" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.validLicenses", + "type": "Array", + "tags": [], + "label": "validLicenses", + "description": [], + "signature": [ + "(\"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\")[]" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.setupDeps", + "type": "Uncategorized", + "tags": [], + "label": "setupDeps", + "description": [], + "signature": [ + "SetupDepsType" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.startDeps", + "type": "Uncategorized", + "tags": [], + "label": "startDeps", + "description": [], + "signature": [ + "StartDepsType" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.http", + "type": "Object", + "tags": [], + "label": "http", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.HttpServiceSetup", + "text": "HttpServiceSetup" + }, + "<", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.RequestHandlerContextBase", + "text": "RequestHandlerContextBase" + }, + ">" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "core", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-lifecycle-server", + "scope": "common", + "docId": "kibKbnCoreLifecycleServerPluginApi", + "section": "def-common.CoreSetup", + "text": "CoreSetup" + }, + "" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.Unnamed.$2", + "type": "Object", + "tags": [], + "label": "config", + "description": [], + "signature": [ + "Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.Unnamed.$3", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + } + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.Unnamed.$4", + "type": "Object", + "tags": [], + "label": "context", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-plugins-server", + "scope": "common", + "docId": "kibKbnCorePluginsServerPluginApi", + "section": "def-common.PluginInitializerContext", + "text": "PluginInitializerContext" + }, + "; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>>" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.setup", + "type": "Function", + "tags": [], + "label": "setup", + "description": [], + "signature": [ + "(setupDeps: SetupDepsType) => void" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.setup.$1", + "type": "Uncategorized", + "tags": [], + "label": "setupDeps", + "description": [], + "signature": [ + "SetupDepsType" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.start", + "type": "Function", + "tags": [], + "label": "start", + "description": [], + "signature": [ + "(startDeps: StartDepsType) => void" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.start.$1", + "type": "Uncategorized", + "tags": [], + "label": "startDeps", + "description": [], + "signature": [ + "StartDepsType" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getUiSettingsServiceFactory", + "type": "Function", + "tags": [], + "label": "getUiSettingsServiceFactory", + "description": [], + "signature": [ + "(savedObjectsClient: ", + { + "pluginId": "@kbn/core-saved-objects-api-server", + "scope": "common", + "docId": "kibKbnCoreSavedObjectsApiServerPluginApi", + "section": "def-common.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + }, + ") => ", + { + "pluginId": "@kbn/core-ui-settings-server", + "scope": "common", + "docId": "kibKbnCoreUiSettingsServerPluginApi", + "section": "def-common.IUiSettingsClient", + "text": "IUiSettingsClient" + } + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getUiSettingsServiceFactory.$1", + "type": "Object", + "tags": [], + "label": "savedObjectsClient", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-saved-objects-api-server", + "scope": "common", + "docId": "kibKbnCoreSavedObjectsApiServerPluginApi", + "section": "def-common.SavedObjectsClientContract", + "text": "SavedObjectsClientContract" + } + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getUiSettingsClient", + "type": "Function", + "tags": [], + "label": "getUiSettingsClient", + "description": [], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", logger?: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-ui-settings-server", + "scope": "common", + "docId": "kibKbnCoreUiSettingsServerPluginApi", + "section": "def-common.IUiSettingsClient", + "text": "IUiSettingsClient" + }, + ">" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getUiSettingsClient.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getUiSettingsClient.$2", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + } + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getFakeRequest", + "type": "Function", + "tags": [], + "label": "getFakeRequest", + "description": [], + "signature": [ + "(headers: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.Headers", + "text": "Headers" + }, + ", spaceId: string | undefined, logger?: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ") => ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getFakeRequest.$1", + "type": "CompoundType", + "tags": [], + "label": "headers", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.Headers", + "text": "Headers" + } + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getFakeRequest.$2", + "type": "string", + "tags": [], + "label": "spaceId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getFakeRequest.$3", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + } + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ExportType.getServerInfo", + "type": "Function", + "tags": [], + "label": "getServerInfo", + "description": [], + "signature": [ + "() => ", + "ReportingServerInfo" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.cryptoFactory", + "type": "Function", + "tags": [], + "label": "cryptoFactory", + "description": [], + "signature": [ + "(encryptionKey: string | undefined) => ", + "Crypto" + ], + "path": "packages/kbn-reporting/server/crypto.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.cryptoFactory.$1", + "type": "string", + "tags": [], + "label": "encryptionKey", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-reporting/server/crypto.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.decryptJobHeaders", + "type": "Function", + "tags": [], + "label": "decryptJobHeaders", + "description": [], + "signature": [ + "(encryptionKey: string | undefined, headers: string, logger: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ") => Promise>" + ], + "path": "packages/kbn-reporting/server/decrypt_job_headers.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.decryptJobHeaders.$1", + "type": "string", + "tags": [], + "label": "encryptionKey", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-reporting/server/decrypt_job_headers.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.decryptJobHeaders.$2", + "type": "string", + "tags": [], + "label": "headers", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-reporting/server/decrypt_job_headers.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.decryptJobHeaders.$3", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + } + ], + "path": "packages/kbn-reporting/server/decrypt_job_headers.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.getFieldFormats", + "type": "Function", + "tags": [], + "label": "getFieldFormats", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "fieldFormats", + "scope": "server", + "docId": "kibFieldFormatsPluginApi", + "section": "def-server.FieldFormatsStart", + "text": "FieldFormatsStart" + } + ], + "path": "packages/kbn-reporting/server/services.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.getFullRedirectAppUrl", + "type": "Function", + "tags": [], + "label": "getFullRedirectAppUrl", + "description": [], + "signature": [ + "(config: Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>, serverInfo: ", + "ReportingServerInfo", + ", spaceId: string | undefined, forceNow: string | undefined) => string" + ], + "path": "packages/kbn-reporting/server/get_full_redirect_app_url.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.getFullRedirectAppUrl.$1", + "type": "Object", + "tags": [], + "label": "config", + "description": [], + "signature": [ + "Readonly<{ encryptionKey?: string | undefined; } & { enabled: boolean; capture: Readonly<{} & { maxAttempts: number; }>; kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; statefulSettings: Readonly<{} & { enabled: boolean; }>; }>" + ], + "path": "packages/kbn-reporting/server/get_full_redirect_app_url.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.getFullRedirectAppUrl.$2", + "type": "Object", + "tags": [], + "label": "serverInfo", + "description": [], + "signature": [ + "ReportingServerInfo" + ], + "path": "packages/kbn-reporting/server/get_full_redirect_app_url.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.getFullRedirectAppUrl.$3", + "type": "string", + "tags": [], + "label": "spaceId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-reporting/server/get_full_redirect_app_url.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.getFullRedirectAppUrl.$4", + "type": "string", + "tags": [], + "label": "forceNow", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-reporting/server/get_full_redirect_app_url.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.setFieldFormats", + "type": "Function", + "tags": [], + "label": "setFieldFormats", + "description": [], + "signature": [ + "(value: ", + { + "pluginId": "fieldFormats", + "scope": "server", + "docId": "kibFieldFormatsPluginApi", + "section": "def-server.FieldFormatsStart", + "text": "FieldFormatsStart" + }, + ") => void" + ], + "path": "packages/kbn-reporting/server/services.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.setFieldFormats.$1", + "type": "Uncategorized", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "T" + ], + "path": "src/plugins/kibana_utils/common/create_getter_setter.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.BaseExportTypeSetupDeps", + "type": "Interface", + "tags": [], + "label": "BaseExportTypeSetupDeps", + "description": [], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.BaseExportTypeSetupDeps.basePath", + "type": "Object", + "tags": [], + "label": "basePath", + "description": [], + "signature": [ + "{ set: (request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", requestSpecificBasePath: string) => void; }" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.BaseExportTypeSetupDeps.spaces", + "type": "Object", + "tags": [], + "label": "spaces", + "description": [], + "signature": [ + { + "pluginId": "spaces", + "scope": "server", + "docId": "kibSpacesPluginApi", + "section": "def-server.SpacesPluginSetup", + "text": "SpacesPluginSetup" + }, + " | undefined" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.BaseExportTypeStartDeps", + "type": "Interface", + "tags": [], + "label": "BaseExportTypeStartDeps", + "description": [], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.BaseExportTypeStartDeps.savedObjects", + "type": "Object", + "tags": [], + "label": "savedObjects", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-saved-objects-server", + "scope": "common", + "docId": "kibKbnCoreSavedObjectsServerPluginApi", + "section": "def-common.SavedObjectsServiceStart", + "text": "SavedObjectsServiceStart" + } + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.BaseExportTypeStartDeps.uiSettings", + "type": "Object", + "tags": [], + "label": "uiSettings", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-ui-settings-server", + "scope": "common", + "docId": "kibKbnCoreUiSettingsServerPluginApi", + "section": "def-common.UiSettingsServiceStart", + "text": "UiSettingsServiceStart" + } + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.BaseExportTypeStartDeps.esClient", + "type": "Object", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-elasticsearch-server", + "scope": "common", + "docId": "kibKbnCoreElasticsearchServerPluginApi", + "section": "def-common.IClusterClient", + "text": "IClusterClient" + } + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.BaseExportTypeStartDeps.screenshotting", + "type": "Object", + "tags": [], + "label": "screenshotting", + "description": [], + "signature": [ + { + "pluginId": "screenshotting", + "scope": "server", + "docId": "kibScreenshottingPluginApi", + "section": "def-server.ScreenshottingStart", + "text": "ScreenshottingStart" + }, + " | undefined" + ], + "path": "packages/kbn-reporting/server/export_type.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ReportingServerPluginSetup", + "type": "Interface", + "tags": [], + "label": "ReportingServerPluginSetup", + "description": [], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ReportingServerPluginSetup.registerExportTypes", + "type": "Function", + "tags": [], + "label": "registerExportTypes", + "description": [], + "signature": [ + "(item: ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ExportType", + "text": "ExportType" + }, + ") => void" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ReportingServerPluginSetup.registerExportTypes.$1", + "type": "Object", + "tags": [], + "label": "item", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ExportType", + "text": "ExportType" + }, + "" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ReportingServerPluginSetup.usesUiCapabilities", + "type": "Function", + "tags": [], + "label": "usesUiCapabilities", + "description": [ + "\nUsed to inform plugins if Reporting config is compatible with UI Capabilities / Application Sub-Feature Controls" + ], + "signature": [ + "() => boolean" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.TimeRangeParams", + "type": "Interface", + "tags": [], + "label": "TimeRangeParams", + "description": [], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.TimeRangeParams.min", + "type": "CompoundType", + "tags": [], + "label": "min", + "description": [], + "signature": [ + "string | number | Date | null | undefined" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.TimeRangeParams.max", + "type": "CompoundType", + "tags": [], + "label": "max", + "description": [], + "signature": [ + "string | number | Date | null | undefined" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.CreateJobFn", + "type": "Type", + "tags": [], + "label": "CreateJobFn", + "description": [], + "signature": [ + "(jobParams: JobParamsType, context: ", + { + "pluginId": "@kbn/core-http-request-handler-context-server", + "scope": "common", + "docId": "kibKbnCoreHttpRequestHandlerContextServerPluginApi", + "section": "def-common.CustomRequestHandlerContext", + "text": "CustomRequestHandlerContext" + }, + "<{ reporting: ", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ReportingServerPluginSetup", + "text": "ReportingServerPluginSetup" + }, + " | null; }>, req: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ") => Promise>" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.CreateJobFn.$1", + "type": "Uncategorized", + "tags": [], + "label": "jobParams", + "description": [], + "signature": [ + "JobParamsType" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.CreateJobFn.$2", + "type": "CompoundType", + "tags": [], + "label": "context", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-request-handler-context-server", + "scope": "common", + "docId": "kibKbnCoreHttpRequestHandlerContextServerPluginApi", + "section": "def-common.RequestHandlerContext", + "text": "RequestHandlerContext" + }, + " & { reporting: Promise<", + { + "pluginId": "@kbn/reporting-server", + "scope": "server", + "docId": "kibKbnReportingServerPluginApi", + "section": "def-server.ReportingServerPluginSetup", + "text": "ReportingServerPluginSetup" + }, + " | null>; }" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.CreateJobFn.$3", + "type": "Object", + "tags": [], + "label": "req", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ReportingConfigType", + "type": "Type", + "tags": [], + "label": "ReportingConfigType", + "description": [], + "signature": [ + "{ readonly encryptionKey?: string | undefined; readonly enabled: boolean; readonly capture: Readonly<{} & { maxAttempts: number; }>; readonly kibanaServer: Readonly<{ hostname?: string | undefined; protocol?: string | undefined; port?: number | undefined; } & {}>; readonly queue: Readonly<{} & { timeout: number | moment.Duration; pollInterval: number | moment.Duration; indexInterval: string; pollEnabled: boolean; pollIntervalErrorMultiplier: number; }>; readonly csv: Readonly<{} & { scroll: Readonly<{} & { duration: string; size: number; }>; checkForFormulas: boolean; escapeFormulaValues: boolean; enablePanelActionDownload: boolean; maxSizeBytes: number | ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + "; useByteOrderMarkEncoding: boolean; }>; readonly roles: Readonly<{} & { enabled: boolean; allow: string[]; }>; readonly poll: Readonly<{} & { jobCompletionNotifier: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; jobsRefresh: Readonly<{} & { interval: number; intervalErrorMultiplier: number; }>; }>; readonly export_types: Readonly<{} & { csv: Readonly<{} & { enabled: boolean; }>; png: Readonly<{} & { enabled: boolean; }>; pdf: Readonly<{} & { enabled: boolean; }>; }>; readonly statefulSettings: Readonly<{} & { enabled: boolean; }>; }" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.RunTaskFn", + "type": "Type", + "tags": [], + "label": "RunTaskFn", + "description": [], + "signature": [ + "(jobId: string, payload: TaskPayloadType, cancellationToken: ", + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + }, + ", stream: ", + "Writable", + ") => Promise<", + "TaskRunResult", + ">" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.RunTaskFn.$1", + "type": "string", + "tags": [], + "label": "jobId", + "description": [], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.RunTaskFn.$2", + "type": "Uncategorized", + "tags": [], + "label": "payload", + "description": [], + "signature": [ + "TaskPayloadType" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.RunTaskFn.$3", + "type": "Object", + "tags": [], + "label": "cancellationToken", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.CancellationToken", + "text": "CancellationToken" + } + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.RunTaskFn.$4", + "type": "Object", + "tags": [], + "label": "stream", + "description": [], + "signature": [ + "Writable" + ], + "path": "packages/kbn-reporting/server/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "objects": [ + { + "parentPluginId": "@kbn/reporting-server", + "id": "def-server.ConfigSchema", + "type": "Object", + "tags": [], + "label": "ConfigSchema", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ enabled: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; kibanaServer: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ hostname: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; port: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; protocol: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; }>; queue: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ indexInterval: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; pollEnabled: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; pollInterval: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; pollIntervalErrorMultiplier: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; timeout: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; }>; capture: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ maxAttempts: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ConditionalType", + "text": "ConditionalType" + }, + "; }>; csv: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ checkForFormulas: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; escapeFormulaValues: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; enablePanelActionDownload: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; maxSizeBytes: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; useByteOrderMarkEncoding: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; scroll: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ duration: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; size: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; }>; }>; encryptionKey: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ConditionalType", + "text": "ConditionalType" + }, + "; roles: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ enabled: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ConditionalType", + "text": "ConditionalType" + }, + "; allow: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ConditionalType", + "text": "ConditionalType" + }, + "; }>; poll: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ jobCompletionNotifier: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ interval: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; intervalErrorMultiplier: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; }>; jobsRefresh: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ interval: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; intervalErrorMultiplier: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; }>; }>; export_types: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ csv: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ enabled: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; }>; png: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ enabled: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ConditionalType", + "text": "ConditionalType" + }, + "; }>; pdf: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ enabled: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ConditionalType", + "text": "ConditionalType" + }, + "; }>; }>; statefulSettings: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ enabled: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ConditionalType", + "text": "ConditionalType" + }, + "; }>; }>" + ], + "path": "packages/kbn-reporting/server/config_schema.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx new file mode 100644 index 0000000000000..81112abbcf50c --- /dev/null +++ b/api_docs/kbn_reporting_server.mdx @@ -0,0 +1,42 @@ +--- +#### +#### 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: kibKbnReportingServerPluginApi +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-19 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] +--- +import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 78 | 0 | 77 | 0 | + +## Server + +### Objects + + +### Functions + + +### Classes + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 7c8c4e0781a89..dce63f8d3e5c3 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-15 +date: 2023-11-19 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 05cf844d58953..5e7a54903e567 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-15 +date: 2023-11-19 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 a67cfc9833d17..e16a02b56a146 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-15 +date: 2023-11-19 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 83e54fba24aa4..e91e7911d0a0a 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-15 +date: 2023-11-19 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 84a55ffec774d..f2cc0e2e21ebb 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 8fd1ae3de33fb..f39f0eaa16ea5 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 68c058f8b813a..d27360310fe64 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-15 +date: 2023-11-19 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 86131fd660d29..108d62860e004 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-15 +date: 2023-11-19 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 58fa491c4a4a3..6383494f24202 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-15 +date: 2023-11-19 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 23ef9b94f8cb0..5166a693d9dc4 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-15 +date: 2023-11-19 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 032c6bf50ff01..79f604c8f6dbe 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-15 +date: 2023-11-19 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 064a74091f6f1..503de2ba0297d 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-15 +date: 2023-11-19 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 44bfc8135cb87..c425308c91058 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 6c511d7fdfe12..f28dbfc8b97dc 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-15 +date: 2023-11-19 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 eb6a1beee8740..b48b058c0b825 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-15 +date: 2023-11-19 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 4fb129ef74848..13ab264ef2d75 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-15 +date: 2023-11-19 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 7b2b3fc44fc9d..97fcdc6481e83 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-15 +date: 2023-11-19 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 3de2b6a1be4c8..341a4c0723609 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-15 +date: 2023-11-19 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 d9e48235e8258..65163c71c87be 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-15 +date: 2023-11-19 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 f1e3f55a63dcb..22d4c1f38baab 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-15 +date: 2023-11-19 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 58fe3a9140ccf..dd413403d45b4 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-15 +date: 2023-11-19 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 200641180abd0..b91247199d7c5 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-15 +date: 2023-11-19 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 5b3b14bf5a908..ac59698afcc0e 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-15 +date: 2023-11-19 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 2635c5306b775..07aa091f750f1 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-15 +date: 2023-11-19 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 f20bddab4e77b..e112792cd8230 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-15 +date: 2023-11-19 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 eb51841c692d7..f4936f013f7a2 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-15 +date: 2023-11-19 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 5f4cf1158a3bf..bab08ecc17f48 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-15 +date: 2023-11-19 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 487cdf9c6287d..39e6d8edaa151 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-15 +date: 2023-11-19 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 1075ff3a348dc..dde606c2c9020 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-15 +date: 2023-11-19 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 6bd3356e57977..5c20a029f908d 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 5a98a26dc8e8f..d77278df77251 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 18d3cdbc95004..c6eb315e59a05 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-15 +date: 2023-11-19 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 3a8d00ac825a6..71bd5a34b3771 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-15 +date: 2023-11-19 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 0fdcaf6d014f3..077249f5781ab 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-15 +date: 2023-11-19 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 684def648a81a..0a57ea5465b62 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-15 +date: 2023-11-19 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 549ba1c594fa6..7ef6f41d68135 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-15 +date: 2023-11-19 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 761509da292fa..702cc3e752bef 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-15 +date: 2023-11-19 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 26f5c374e8bfa..4d77efff4504d 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-15 +date: 2023-11-19 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 25501e2221b90..a9795587045a4 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-15 +date: 2023-11-19 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 9441d5dc36ccd..d28e6c7d1393e 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-15 +date: 2023-11-19 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 be4113f97a9e0..306eba3e85d3a 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-15 +date: 2023-11-19 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.devdocs.json b/api_docs/kbn_shared_ux_button_toolbar.devdocs.json index 612b861b36f38..3c4e59e38b544 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.devdocs.json +++ b/api_docs/kbn_shared_ux_button_toolbar.devdocs.json @@ -176,7 +176,7 @@ "label": "ToolbarButton", "description": [], "signature": [ - "({ label, type, iconSide, size, isDisabled, ...rest }: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/shared-ux-button-toolbar", "scope": "common", @@ -184,7 +184,7 @@ "section": "def-common.Props", "text": "Props" }, - ">) => JSX.Element" + ") => JSX.Element" ], "path": "packages/shared-ux/button_toolbar/src/buttons/toolbar_button/toolbar_button.tsx", "deprecated": false, @@ -193,12 +193,11 @@ { "parentPluginId": "@kbn/shared-ux-button-toolbar", "id": "def-common.ToolbarButton.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], - "label": "{\n label,\n type = 'empty',\n iconSide = 'left',\n size = 'm',\n isDisabled,\n ...rest\n}", + "label": "props", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/shared-ux-button-toolbar", "scope": "common", @@ -206,7 +205,7 @@ "section": "def-common.Props", "text": "Props" }, - ">" + "" ], "path": "packages/shared-ux/button_toolbar/src/buttons/toolbar_button/toolbar_button.tsx", "deprecated": false, @@ -431,59 +430,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/shared-ux-button-toolbar", - "id": "def-common.Props", - "type": "Interface", - "tags": [], - "label": "Props", - "description": [ - "\nProps for `PrimaryButton`." - ], - "signature": [ - { - "pluginId": "@kbn/shared-ux-button-toolbar", - "scope": "common", - "docId": "kibKbnSharedUxButtonToolbarPluginApi", - "section": "def-common.Props", - "text": "Props" - }, - " extends Pick<", - "EuiButtonPropsForButton", - ", \"onClick\" | \"data-test-subj\" | \"isDisabled\" | \"iconType\" | \"size\" | \"iconSide\">" - ], - "path": "packages/shared-ux/button_toolbar/src/buttons/toolbar_button/toolbar_button.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/shared-ux-button-toolbar", - "id": "def-common.Props.label", - "type": "string", - "tags": [], - "label": "label", - "description": [], - "path": "packages/shared-ux/button_toolbar/src/buttons/toolbar_button/toolbar_button.tsx", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/shared-ux-button-toolbar", - "id": "def-common.Props.type", - "type": "CompoundType", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "ToolbarButtonTypes | undefined" - ], - "path": "packages/shared-ux/button_toolbar/src/buttons/toolbar_button/toolbar_button.tsx", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/shared-ux-button-toolbar", "id": "def-common.Props", @@ -525,15 +471,32 @@ "label": "Props", "description": [], "signature": [ - "{ onClick?: React.MouseEventHandler | undefined; 'data-test-subj'?: string | undefined; isDisabled?: boolean | undefined; size?: \"m\" | \"s\" | undefined; iconSide?: ", + "{ fullWidth?: boolean | undefined; onClick?: React.MouseEventHandler | undefined; 'data-test-subj'?: string | undefined; isDisabled?: boolean | undefined; isLoading?: boolean | undefined; size?: \"m\" | \"s\" | undefined; as?: \"standard\" | undefined; fontWeight?: ToolbarButtonFontWeights | undefined; iconSide?: ", "ButtonContentIconSide", - "; }" + "; groupPosition?: ButtonPositions | undefined; hasArrow?: boolean | undefined; }" ], "path": "packages/shared-ux/button_toolbar/src/buttons/add_from_library/add_from_library.tsx", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/shared-ux-button-toolbar", + "id": "def-common.Props", + "type": "Type", + "tags": [], + "label": "Props", + "description": [ + "\nProps for `PrimaryButton`." + ], + "signature": [ + "T extends \"iconButton\" ? ToolbarIconButton : ToolbarStandardButton" + ], + "path": "packages/shared-ux/button_toolbar/src/buttons/toolbar_button/toolbar_button.tsx", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/shared-ux-button-toolbar", "id": "def-common.Props", @@ -544,7 +507,7 @@ "\nProps for `ToolbarPopover`." ], "signature": [ - "AllowedButtonProps & AllowedPopoverProps & { children: (arg: { closePopover: () => void; }) => React.ReactNode; }" + "AllowedButtonProps & AllowedPopoverProps & { children: (arg: { closePopover: () => void; }) => React.ReactNode; label: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal; }" ], "path": "packages/shared-ux/button_toolbar/src/popover/popover.tsx", "deprecated": false, @@ -561,7 +524,7 @@ "type for cases with both button or a popover could be used" ], "signature": [ - "React.FunctionComponent<", + "((props: ", { "pluginId": "@kbn/shared-ux-button-toolbar", "scope": "common", @@ -569,7 +532,7 @@ "section": "def-common.Props", "text": "Props" }, - "> | (({ type, label, iconType, size, children, isDisabled, ...popover }: ", + ") => JSX.Element) | (({ type, label, iconType, size, children, isDisabled, ...popover }: ", { "pluginId": "@kbn/shared-ux-button-toolbar", "scope": "common", diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index d1aece3e5c845..d71d9bcb3107e 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.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 | |-------------------|-----------|------------------------|-----------------| -| 28 | 0 | 10 | 0 | +| 26 | 0 | 8 | 0 | ## Common diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index b6a9fdb953f7f..e4be7a54f41e3 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-15 +date: 2023-11-19 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 3c45ab71ead72..173a9a006010c 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-15 +date: 2023-11-19 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 fda08234ba6bd..005d42eff160b 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-15 +date: 2023-11-19 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 075cd68c034f9..8e76d3f3dfdbf 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-15 +date: 2023-11-19 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 e7fa7e48f15ac..2a8d1e0f178b3 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-15 +date: 2023-11-19 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 fa4272a358369..dab3c73e2adc2 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-15 +date: 2023-11-19 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 83873747a8484..a68f16a663fe1 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-15 +date: 2023-11-19 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 83b37944fa28e..40757b0e653d0 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-15 +date: 2023-11-19 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 480caa9170736..cfb8052084cb8 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-15 +date: 2023-11-19 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 6cb2f6b58e03e..8aefae217ea7b 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-15 +date: 2023-11-19 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 f2ef45f1f80a2..9efdd47b3c393 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-15 +date: 2023-11-19 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 64c1355c3c3af..7a80792a66949 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 7e2018374b17a..92ed2d2ca18b4 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-15 +date: 2023-11-19 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 149beb0817862..eed013888cb07 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-15 +date: 2023-11-19 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 1d98ddb9d29dd..59624d87fde61 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-15 +date: 2023-11-19 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 097f9e4b3894f..630748863d624 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-15 +date: 2023-11-19 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 9d41e85790e2d..d3fa09d279fe6 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-15 +date: 2023-11-19 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 78bb4ed296c65..a4930b7abb3a8 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-15 +date: 2023-11-19 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 8790cd5f6413c..8409ac2e0a0fa 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-15 +date: 2023-11-19 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 55b9fcd80072d..906772d9b71e2 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-15 +date: 2023-11-19 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 c1ef9f0b39586..8e736f8116cd6 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-15 +date: 2023-11-19 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 33ec6f98c2173..22da3c5651f05 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-15 +date: 2023-11-19 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 0c23ebf46ec33..a1c2a6a062620 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-15 +date: 2023-11-19 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 c5f79e942c1a1..330d50e8d736a 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-15 +date: 2023-11-19 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 48a6b0bdbd29a..9564bf9190bb2 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-15 +date: 2023-11-19 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 22ca30db17120..b745305f3074c 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-15 +date: 2023-11-19 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 8e1467f52cc25..655966d942729 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-15 +date: 2023-11-19 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 54a79e3b5c434..5615e1cacfa68 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-15 +date: 2023-11-19 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 615ee58c01971..34c23bb26bcfb 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-15 +date: 2023-11-19 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 f4048824bebe2..bfe4807624007 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-15 +date: 2023-11-19 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 914b8fc910da4..3596a552630d3 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-15 +date: 2023-11-19 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 2fa5d4a3efcce..c6ef7549138c4 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-15 +date: 2023-11-19 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 0c077604d9451..2601645d2fee0 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-15 +date: 2023-11-19 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 c701a6f33ae11..0bdde4dcc1235 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-15 +date: 2023-11-19 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 59017ed3c7286..1d62af94bad1a 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-15 +date: 2023-11-19 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 c782633b8fb9b..4e8b55b423af0 100644 --- a/api_docs/kbn_slo_schema.devdocs.json +++ b/api_docs/kbn_slo_schema.devdocs.json @@ -676,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, @@ -691,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, @@ -3306,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, @@ -3323,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, @@ -4861,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, diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 405ac0555e45e..8c0bc12623adf 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 1a6095c093bbc..22e00965205ce 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-15 +date: 2023-11-19 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 88642fd3f7921..cc500bab1058b 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-15 +date: 2023-11-19 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 aa5bbe7fe0c46..b77cbff0f2536 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-15 +date: 2023-11-19 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 6c4c59fbc5c57..96695e7c309c4 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_subscription_tracking.mdx b/api_docs/kbn_subscription_tracking.mdx index 8797225265c6e..83406d2ad24c0 100644 --- a/api_docs/kbn_subscription_tracking.mdx +++ b/api_docs/kbn_subscription_tracking.mdx @@ -8,7 +8,7 @@ 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/subscription-tracking'] --- import kbnSubscriptionTrackingObj from './kbn_subscription_tracking.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index e0a1a61516e1c..00d271549b447 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 63fb593542a9e..94a5f0eb91262 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-15 +date: 2023-11-19 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 847ee79082804..a6d112f6c80fe 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-15 +date: 2023-11-19 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 e42382aa3159b..58c007f855cdb 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 966e10f7899a3..f81914c4d777b 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 80b9023603b47..4cb58a9db3668 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-15 +date: 2023-11-19 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 26c53edfa047c..e8ae01d01d94a 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-15 +date: 2023-11-19 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 9d05578977e8d..7cdfb5a4c62e7 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index fd5d8cfc71ad4..4c2dc2ceedef6 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index b09279fb4ccd2..13dddb0cce149 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-15 +date: 2023-11-19 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 cde55e8296b48..253b48ee825fd 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-15 +date: 2023-11-19 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 35d2b0a8949b5..e61ac0ce5d086 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-15 +date: 2023-11-19 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 939da33b6b154..157706fb19548 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 5fa7c06719766..c235b7e033469 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-15 +date: 2023-11-19 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 9d7147ad4d03d..e8c462182d4ab 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-15 +date: 2023-11-19 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 56ea2f9d987a2..fe8be4c272111 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-15 +date: 2023-11-19 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 57dece81feb1b..4432df8e63121 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.devdocs.json b/api_docs/kbn_user_profile_components.devdocs.json index 8a2a61616e98d..e3e6876539109 100644 --- a/api_docs/kbn_user_profile_components.devdocs.json +++ b/api_docs/kbn_user_profile_components.devdocs.json @@ -560,7 +560,7 @@ }, " extends Omit<", "EuiAvatarProps", - ", \"type\" | \"name\" | \"color\" | \"iconType\" | \"iconColor\" | \"iconSize\" | \"initials\" | \"initialsLength\" | \"imageUrl\">" + ", \"type\" | \"name\" | \"color\" | \"iconType\" | \"iconColor\" | \"initials\" | \"initialsLength\" | \"imageUrl\" | \"iconSize\">" ], "path": "packages/kbn-user-profile-components/src/user_avatar.tsx", "deprecated": false, diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 92f7070fc2ed6..f4d254baa34bc 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-15 +date: 2023-11-19 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 a5472ab77f5d4..3bb6217fc3e00 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-15 +date: 2023-11-19 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 bb43dae455961..989ad206f40dd 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-15 +date: 2023-11-19 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 bc29416b5af90..6fa7d9782c3bf 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.devdocs.json b/api_docs/kbn_visualization_ui_components.devdocs.json index 80a90a0b589f6..bd1f417ecd328 100644 --- a/api_docs/kbn_visualization_ui_components.devdocs.json +++ b/api_docs/kbn_visualization_ui_components.devdocs.json @@ -1978,38 +1978,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/visualization-ui-components", - "id": "def-public.TruncatedLabel", - "type": "Function", - "tags": [], - "label": "TruncatedLabel", - "description": [], - "signature": [ - "React.NamedExoticComponent<{ label: string; search: string; width: number; font: string; }>" - ], - "path": "packages/kbn-visualization-ui-components/components/field_picker/truncated_label.tsx", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "@kbn/visualization-ui-components", - "id": "def-public.TruncatedLabel.$1", - "type": "Uncategorized", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "P" - ], - "path": "node_modules/@types/react/index.d.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/visualization-ui-components", "id": "def-public.useDebouncedValue", diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 4ac0a74061b05..1984ebefe744f 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.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 | |-------------------|-----------|------------------------|-----------------| -| 156 | 0 | 152 | 3 | +| 154 | 0 | 151 | 3 | ## Client diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 95db25b882d28..8b55918f23917 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-15 +date: 2023-11-19 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 a9c9380bba44d..98e63d31c4aae 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-15 +date: 2023-11-19 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 b1131d8d3a7ba..71fa1067ab242 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-15 +date: 2023-11-19 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 ab7d26104a3f9..b5f41ffa89552 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index c094cb1138f47..4cc2a07f5bad4 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -3538,55 +3538,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "kibanaReact", - "id": "def-public.ToolbarButton", - "type": "Function", - "tags": [], - "label": "ToolbarButton", - "description": [], - "signature": [ - "({ children, className, fontWeight, size, hasArrow, groupPosition, dataTestSubj, ...rest }: React.PropsWithChildren<", - { - "pluginId": "kibanaReact", - "scope": "public", - "docId": "kibKibanaReactPluginApi", - "section": "def-public.ToolbarButtonProps", - "text": "ToolbarButtonProps" - }, - ">) => JSX.Element" - ], - "path": "src/plugins/kibana_react/public/toolbar_button/toolbar_button.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "kibanaReact", - "id": "def-public.ToolbarButton.$1", - "type": "CompoundType", - "tags": [], - "label": "{\n children,\n className,\n fontWeight = 'normal',\n size = 'm',\n hasArrow = true,\n groupPosition = 'none',\n dataTestSubj = '',\n ...rest\n}", - "description": [], - "signature": [ - "React.PropsWithChildren<", - { - "pluginId": "kibanaReact", - "scope": "public", - "docId": "kibKibanaReactPluginApi", - "section": "def-public.ToolbarButtonProps", - "text": "ToolbarButtonProps" - }, - ">" - ], - "path": "src/plugins/kibana_react/public/toolbar_button/toolbar_button.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "kibanaReact", "id": "def-public.UrlTemplateEditor", @@ -5336,67 +5287,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "kibanaReact", - "id": "def-public.POSITIONS", - "type": "Array", - "tags": [], - "label": "POSITIONS", - "description": [], - "signature": [ - "(\"none\" | \"right\" | \"left\" | \"center\")[]" - ], - "path": "src/plugins/kibana_react/public/toolbar_button/toolbar_button.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "kibanaReact", - "id": "def-public.TOOLBAR_BUTTON_SIZES", - "type": "Array", - "tags": [], - "label": "TOOLBAR_BUTTON_SIZES", - "description": [], - "signature": [ - "(\"m\" | \"s\" | undefined)[]" - ], - "path": "src/plugins/kibana_react/public/toolbar_button/toolbar_button.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "kibanaReact", - "id": "def-public.ToolbarButtonProps", - "type": "Type", - "tags": [], - "label": "ToolbarButtonProps", - "description": [], - "signature": [ - "((", - "DisambiguateSet", - "<", - "EuiButtonPropsForAnchor", - ", ", - "EuiButtonPropsForButton", - "> & ", - "EuiButtonProps", - " & { onClick?: React.MouseEventHandler | undefined; } & React.ButtonHTMLAttributes & { buttonRef?: React.Ref | undefined; }) | (", - "DisambiguateSet", - "<", - "EuiButtonPropsForButton", - ", ", - "EuiButtonPropsForAnchor", - "> & ", - "EuiButtonProps", - " & { href?: string | undefined; onClick?: React.MouseEventHandler | undefined; } & React.AnchorHTMLAttributes & { buttonRef?: React.Ref | undefined; })) & { fontWeight?: Weights | undefined; size?: \"m\" | \"s\" | undefined; hasArrow?: boolean | undefined; groupPosition?: \"none\" | \"right\" | \"left\" | \"center\" | undefined; dataTestSubj?: string | undefined; }" - ], - "path": "src/plugins/kibana_react/public/toolbar_button/toolbar_button.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "kibanaReact", "id": "def-public.Value", @@ -5411,21 +5301,6 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false - }, - { - "parentPluginId": "kibanaReact", - "id": "def-public.WEIGHTS", - "type": "Array", - "tags": [], - "label": "WEIGHTS", - "description": [], - "signature": [ - "Weights[]" - ], - "path": "src/plugins/kibana_react/public/toolbar_button/toolbar_button.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false } ], "objects": [ diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 68a905fbe16eb..99e81172badb6 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 167 | 0 | 133 | 3 | +| 161 | 0 | 127 | 3 | ## Client diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 003c24c475c6e..350d863b3b12c 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-15 +date: 2023-11-19 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 ef742f09d96cf..c531e986e7364 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 0c7714a2e5dc4..a2d155256e3eb 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 78e4824a6489f..62b4915b83072 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-15 +date: 2023-11-19 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 0df0b7775555e..e9fae7c3ab322 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.devdocs.json b/api_docs/licensing.devdocs.json index 2d2924491b936..2fa21b35baeb7 100644 --- a/api_docs/licensing.devdocs.json +++ b/api_docs/licensing.devdocs.json @@ -2208,7 +2208,7 @@ }, { "plugin": "mapsEms", - "path": "src/plugins/maps_ems/server/index.ts" + "path": "src/plugins/maps_ems/server/plugin.ts" }, { "plugin": "osquery", @@ -2295,7 +2295,7 @@ "references": [ { "plugin": "mapsEms", - "path": "src/plugins/maps_ems/server/index.ts" + "path": "src/plugins/maps_ems/server/plugin.ts" } ], "children": [], diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 8ec94b988fe91..d82fcfb98255f 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 508ead1e3d09e..3b659afb2850e 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 902aff0d008a0..f66ec9449dc67 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-15 +date: 2023-11-19 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 9ccbeb875c711..625af016378c2 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 7c14a69f8e368..41c09bbbb0d2e 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-15 +date: 2023-11-19 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 65197118deef8..576f29cd6247b 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-15 +date: 2023-11-19 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 563bcde12801e..7f4be7989c117 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-15 +date: 2023-11-19 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.devdocs.json b/api_docs/maps_ems.devdocs.json index 697a5dd4c1c2f..2c555e52a83bc 100644 --- a/api_docs/maps_ems.devdocs.json +++ b/api_docs/maps_ems.devdocs.json @@ -416,251 +416,65 @@ } ], "initialIsOpen": false - }, - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPlugin", - "type": "Class", - "tags": [], - "label": "MapsEmsPlugin", - "description": [], - "signature": [ - { - "pluginId": "mapsEms", - "scope": "server", - "docId": "kibMapsEmsPluginApi", - "section": "def-server.MapsEmsPlugin", - "text": "MapsEmsPlugin" - }, - " implements ", - { - "pluginId": "@kbn/core-plugins-server", - "scope": "common", - "docId": "kibKbnCorePluginsServerPluginApi", - "section": "def-common.Plugin", - "text": "Plugin" - }, - "<", - { - "pluginId": "mapsEms", - "scope": "server", - "docId": "kibMapsEmsPluginApi", - "section": "def-server.MapsEmsPluginServerSetup", - "text": "MapsEmsPluginServerSetup" - }, - ", void, object, object>" - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPlugin._initializerContext", - "type": "Object", - "tags": [], - "label": "_initializerContext", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-plugins-server", - "scope": "common", - "docId": "kibKbnCorePluginsServerPluginApi", - "section": "def-common.PluginInitializerContext", - "text": "PluginInitializerContext" - }, - "; }>; includeElasticMapsService: boolean; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { dark: string; bright: string; desaturated: string; }>; }>>" - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPlugin.Unnamed", - "type": "Function", - "tags": [], - "label": "Constructor", - "description": [], - "signature": [ - "any" - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPlugin.Unnamed.$1", - "type": "Object", - "tags": [], - "label": "initializerContext", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-plugins-server", - "scope": "common", - "docId": "kibKbnCorePluginsServerPluginApi", - "section": "def-common.PluginInitializerContext", - "text": "PluginInitializerContext" - }, - "; }>; includeElasticMapsService: boolean; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { dark: string; bright: string; desaturated: string; }>; }>>" - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPlugin.setup", - "type": "Function", - "tags": [], - "label": "setup", - "description": [], - "signature": [ - "(core: ", - { - "pluginId": "@kbn/core-lifecycle-server", - "scope": "common", - "docId": "kibKbnCoreLifecycleServerPluginApi", - "section": "def-common.CoreSetup", - "text": "CoreSetup" - }, - ", plugins: MapsEmsSetupServerDependencies) => { config: Readonly<{} & { tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; includeElasticMapsService: boolean; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { dark: string; bright: string; desaturated: string; }>; }>; createEMSSettings: () => ", - { - "pluginId": "mapsEms", - "scope": "common", - "docId": "kibMapsEmsPluginApi", - "section": "def-common.EMSSettings", - "text": "EMSSettings" - }, - "; }" - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPlugin.setup.$1", - "type": "Object", - "tags": [], - "label": "core", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-lifecycle-server", - "scope": "common", - "docId": "kibKbnCoreLifecycleServerPluginApi", - "section": "def-common.CoreSetup", - "text": "CoreSetup" - }, - "" - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPlugin.setup.$2", - "type": "Object", - "tags": [], - "label": "plugins", - "description": [], - "signature": [ - "MapsEmsSetupServerDependencies" - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPlugin.start", - "type": "Function", - "tags": [], - "label": "start", - "description": [], - "signature": [ - "() => void" - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false } ], "functions": [], - "interfaces": [ - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPluginServerSetup", - "type": "Interface", - "tags": [], - "label": "MapsEmsPluginServerSetup", - "description": [], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPluginServerSetup.config", - "type": "Object", - "tags": [], - "label": "config", - "description": [], - "signature": [ - "{ readonly tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; readonly includeElasticMapsService: boolean; readonly emsUrl: string; readonly emsFileApiUrl: string; readonly emsTileApiUrl: string; readonly emsLandingPageUrl: string; readonly emsFontLibraryUrl: string; readonly emsTileLayerId: Readonly<{} & { dark: string; bright: string; desaturated: string; }>; }" - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "mapsEms", - "id": "def-server.MapsEmsPluginServerSetup.createEMSSettings", - "type": "Function", - "tags": [], - "label": "createEMSSettings", - "description": [], - "signature": [ - "() => ", - { - "pluginId": "mapsEms", - "scope": "common", - "docId": "kibMapsEmsPluginApi", - "section": "def-common.EMSSettings", - "text": "EMSSettings" - } - ], - "path": "src/plugins/maps_ems/server/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - } - ], + "interfaces": [], "enums": [], "misc": [], - "objects": [] + "objects": [], + "setup": { + "parentPluginId": "mapsEms", + "id": "def-server.MapsEmsPluginServerSetup", + "type": "Interface", + "tags": [], + "label": "MapsEmsPluginServerSetup", + "description": [], + "path": "src/plugins/maps_ems/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "mapsEms", + "id": "def-server.MapsEmsPluginServerSetup.config", + "type": "Object", + "tags": [], + "label": "config", + "description": [], + "signature": [ + "{ readonly tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; readonly includeElasticMapsService: boolean; readonly emsUrl: string; readonly emsFileApiUrl: string; readonly emsTileApiUrl: string; readonly emsLandingPageUrl: string; readonly emsFontLibraryUrl: string; readonly emsTileLayerId: Readonly<{} & { dark: string; bright: string; desaturated: string; }>; }" + ], + "path": "src/plugins/maps_ems/server/plugin.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "mapsEms", + "id": "def-server.MapsEmsPluginServerSetup.createEMSSettings", + "type": "Function", + "tags": [], + "label": "createEMSSettings", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "mapsEms", + "scope": "common", + "docId": "kibMapsEmsPluginApi", + "section": "def-common.EMSSettings", + "text": "EMSSettings" + } + ], + "path": "src/plugins/maps_ems/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "lifecycle": "setup", + "initialIsOpen": true + } }, "common": { "classes": [ diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index f8961befa4569..2634faac7c375 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.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 | |-------------------|-----------|------------------------|-----------------| -| 68 | 0 | 68 | 0 | +| 60 | 0 | 60 | 0 | ## Client @@ -39,12 +39,12 @@ Contact [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) ## Server +### Setup + + ### Classes -### Interfaces - - ## Common ### Classes diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 23b14e5e590fc..5b9186f6c33e2 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 8db5d04eebdfd..e3c44fc59ef05 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 2b40b25c39868..56a4f06c4dda1 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-15 +date: 2023-11-19 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 4e454438c21bb..4b470da8c04f6 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-15 +date: 2023-11-19 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 606efcf8f6e7e..bf5144f7ed192 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-15 +date: 2023-11-19 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 8e6ed239cc431..4fd3487924211 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-15 +date: 2023-11-19 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 43ae3a7f19f23..bbecb8303b537 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-15 +date: 2023-11-19 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 c91164262fa9b..3440fa9c6c881 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-15 +date: 2023-11-19 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 d4143485d24c2..c05a0a49927fd 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -8512,7 +8512,13 @@ "PartialC", "<{ filter: ", "StringC", - "; }>]>; }>]>; }>; }> | undefined; handler: ({}: ", + "; }>]>; }>]>; range: ", + "TypeC", + "<{ start: ", + "NumberC", + "; end: ", + "NumberC", + "; }>; }>; }> | undefined; handler: ({}: ", { "pluginId": "observability", "scope": "server", @@ -8520,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", @@ -10216,7 +10222,13 @@ "PartialC", "<{ filter: ", "StringC", - "; }>]>; }>]>; }>; }> | undefined; handler: ({}: ", + "; }>]>; }>]>; range: ", + "TypeC", + "<{ start: ", + "NumberC", + "; end: ", + "NumberC", + "; }>; }>; }> | undefined; handler: ({}: ", { "pluginId": "observability", "scope": "server", @@ -10224,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", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index a256c347524c0..fc5ddbd9f8224 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index c4ae6d6f85afe..ab91a05f671fe 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-15 +date: 2023-11-19 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 16aa8d17813ef..a3f7012161494 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-15 +date: 2023-11-19 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 cbc4f0e5f9285..5f72d59c3218c 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 63c5aad9082be..583059a659000 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.devdocs.json b/api_docs/osquery.devdocs.json index 5c5ee6d4f988c..f03a3b873a0ca 100644 --- a/api_docs/osquery.devdocs.json +++ b/api_docs/osquery.devdocs.json @@ -301,7 +301,7 @@ "label": "createActionService", "description": [], "signature": [ - "{ create: (params: { agent_ids?: string[] | undefined; agent_all?: boolean | undefined; agent_platforms?: string[] | undefined; agent_policy_ids?: string[] | undefined; query?: string | undefined; queries?: { id: string; query: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }[] | undefined; saved_query_id?: string | undefined; ecs_mapping?: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; pack_id?: string | undefined; alert_ids?: string[] | undefined; case_ids?: string[] | undefined; event_ids?: string[] | undefined; metadata?: object | undefined; }, alertData?: OutputOf> | undefined) => Promise<{ response: { action_id: string; '@timestamp': string; expiration: string; type: string; input_type: string; alert_ids: string[] | undefined; event_ids: string[] | undefined; case_ids: string[] | undefined; agent_ids: string[] | undefined; agent_all: boolean | undefined; agent_platforms: string[] | undefined; agent_policy_ids: string[] | undefined; agents: string[]; user_id: string | undefined; metadata: object | undefined; pack_id: string | undefined; pack_name: string | undefined; pack_prebuilt: boolean | undefined; queries: ", + "{ create: (params: { agent_ids?: string[] | undefined; agent_all?: boolean | undefined; agent_platforms?: string[] | undefined; agent_policy_ids?: string[] | undefined; query?: string | undefined; queries?: { id: string; query: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }[] | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; ecs_mapping?: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; pack_id?: string | undefined; alert_ids?: string[] | undefined; case_ids?: string[] | undefined; event_ids?: string[] | undefined; metadata?: object | undefined; }, alertData?: OutputOf> | undefined) => Promise<{ response: { action_id: string; '@timestamp': string; expiration: string; type: string; input_type: string; alert_ids: string[] | undefined; event_ids: string[] | undefined; case_ids: string[] | undefined; agent_ids: string[] | undefined; agent_all: boolean | undefined; agent_platforms: string[] | undefined; agent_policy_ids: string[] | undefined; agents: string[]; user_id: string | undefined; metadata: object | undefined; pack_id: string | undefined; pack_name: string | undefined; pack_prebuilt: boolean | undefined; queries: ", "Dictionary", "[]; }; fleetActionsCount: number; }>; stop: () => void; }" ], diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 8a39312579df3..ce16f8c4e521d 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-15 +date: 2023-11-19 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 cff077fc59b4d..8a3a0ab634b1a 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-15 +date: 2023-11-19 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 6c4e337994fb7..6140c6378d6ff 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-15 +date: 2023-11-19 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 | |--------------|----------|------------------------| -| 703 | 595 | 40 | +| 712 | 604 | 40 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 76135 | 233 | 65090 | 1598 | +| 76393 | 235 | 65329 | 1606 | ## Plugin Directory @@ -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. | 4 | 0 | 4 | 0 | | | [@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 | @@ -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 | @@ -114,7 +114,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 123 | 2 | 96 | 4 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides UI and APIs for the interactive setup mode. | 28 | 0 | 18 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 167 | 0 | 133 | 3 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 161 | 0 | 127 | 3 | | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 610 | 3 | 417 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | @@ -128,8 +128,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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) | - | 68 | 0 | 68 | 0 | +| | [@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/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 15 | 3 | 13 | 1 | @@ -149,7 +149,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 16 | 1 | 16 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 22 | 0 | 22 | 7 | | | [@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. | 42 | 0 | 22 | 5 | +| | [@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/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 24 | 0 | 19 | 2 | @@ -160,7 +160,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 104 | 0 | 56 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the definition and helper methods around saved searches, used by discover and visualizations. | 75 | 0 | 74 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 13 | 0 | -| | [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 27 | 0 | 8 | 5 | +| | [@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 | @@ -176,7 +176,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 23 | 0 | 23 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 4 | 0 | 4 | 1 | | synthetics | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 96 | 0 | 53 | 6 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 105 | 0 | 62 | 5 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 45 | 0 | 1 | 0 | | | [@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 | @@ -234,10 +234,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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) | - | 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/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 14 | 0 | 10 | 0 | @@ -314,8 +315,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 +326,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) | - | 59 | 0 | 53 | 8 | | | [@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 +403,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 | @@ -458,8 +459,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 29 | 0 | 29 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 0 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 1 | 0 | 1 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 10 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 10 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 10 | 1 | | | [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) | - | 54 | 0 | 52 | 3 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 33 | 3 | 24 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 3 | 0 | 3 | 0 | @@ -477,14 +477,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 | @@ -525,7 +525,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 45 | 0 | 45 | 10 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 51 | 5 | 34 | 0 | -| | [@elastic/security-asset-management](https://github.com/orgs/elastic/teams/security-asset-management) | - | 62 | 0 | 62 | 0 | +| | [@elastic/security-asset-management](https://github.com/orgs/elastic/teams/security-asset-management) | - | 66 | 0 | 66 | 0 | | | [@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 | @@ -542,7 +542,16 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 40 | 0 | 38 | 5 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 0 | 9 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 6 | 0 | 6 | 1 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 73 | 0 | 65 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 80 | 0 | 72 | 7 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 50 | 0 | 50 | 3 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 17 | 0 | 16 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 31 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 14 | 0 | 11 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 16 | 0 | 15 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 13 | 0 | 11 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 5 | 0 | 5 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 78 | 0 | 77 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | A component for creating resizable layouts containing a fixed width panel and a flexible panel, with support for horizontal and vertical layouts. | 18 | 0 | 5 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 2 | 8 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 16 | 0 | 16 | 1 | @@ -550,7 +559,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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) | - | 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 | @@ -584,7 +593,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 4 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 2 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 2 | 1 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 28 | 0 | 10 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 26 | 0 | 8 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 28 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 60 | 0 | 49 | 5 | @@ -647,7 +656,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 37 | 0 | 16 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 24 | 0 | 14 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 156 | 0 | 152 | 3 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 154 | 0 | 151 | 3 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 12 | 0 | 12 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 6 | 0 | 2 | 0 | | | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 18 | 0 | 9 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 1a1e365a5673e..631f92388b1b1 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-15 +date: 2023-11-19 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 98174fb03bfb4..349689887af9b 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-15 +date: 2023-11-19 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 dfd973d0c71bc..a17655192d09f 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-15 +date: 2023-11-19 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 2997d0038cce0..8e2e975660535 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.devdocs.json b/api_docs/reporting.devdocs.json index 9b536c3ca2f5e..f0f02df91a6e9 100644 --- a/api_docs/reporting.devdocs.json +++ b/api_docs/reporting.devdocs.json @@ -27,17 +27,9 @@ "\nA function that Reporting calls to get the sharing data from the application." ], "signature": [ - "(forShareUrl?: boolean | undefined) => Omit<{ layout?: { id?: ", - { - "pluginId": "screenshotting", - "scope": "common", - "docId": "kibScreenshottingPluginApi", - "section": "def-common.LayoutType", - "text": "LayoutType" - }, - " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", - "LayoutSelectorDictionary", - "> | undefined; zoom?: number | undefined; } | undefined; objectType: string; title: string; browserTimezone: string; version: string; }, \"version\" | \"browserTimezone\">" + "(forShareUrl?: boolean | undefined) => Omit<", + "BaseParams", + ", \"version\" | \"browserTimezone\">" ], "path": "x-pack/plugins/reporting/public/shared/get_shared_components.tsx", "deprecated": false, @@ -340,363 +332,9 @@ "common": { "classes": [], "functions": [], - "interfaces": [ - { - "parentPluginId": "reporting", - "id": "def-common.BasePayload", - "type": "Interface", - "tags": [ - "deprecated" - ], - "label": "BasePayload", - "description": [], - "signature": [ - { - "pluginId": "reporting", - "scope": "common", - "docId": "kibReportingPluginApi", - "section": "def-common.BasePayload", - "text": "BasePayload" - }, - " extends { layout?: { id?: ", - { - "pluginId": "screenshotting", - "scope": "common", - "docId": "kibScreenshottingPluginApi", - "section": "def-common.LayoutType", - "text": "LayoutType" - }, - " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", - "LayoutSelectorDictionary", - "> | undefined; zoom?: number | undefined; } | undefined; objectType: string; title: string; browserTimezone: string; version: string; }" - ], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": true, - "trackAdoption": false, - "references": [], - "children": [ - { - "parentPluginId": "reporting", - "id": "def-common.BasePayload.headers", - "type": "string", - "tags": [], - "label": "headers", - "description": [], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.BasePayload.spaceId", - "type": "string", - "tags": [], - "label": "spaceId", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.BasePayload.isDeprecated", - "type": "CompoundType", - "tags": [], - "label": "isDeprecated", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.BasePayloadV2", - "type": "Interface", - "tags": [], - "label": "BasePayloadV2", - "description": [ - "\nReport job parameters, after they are processed in the request handler." - ], - "signature": [ - { - "pluginId": "reporting", - "scope": "common", - "docId": "kibReportingPluginApi", - "section": "def-common.BasePayloadV2", - "text": "BasePayloadV2" - }, - " extends ", - { - "pluginId": "reporting", - "scope": "common", - "docId": "kibReportingPluginApi", - "section": "def-common.BaseParamsV2", - "text": "BaseParamsV2" - } - ], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "reporting", - "id": "def-common.BasePayloadV2.headers", - "type": "string", - "tags": [], - "label": "headers", - "description": [], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.BasePayloadV2.spaceId", - "type": "string", - "tags": [], - "label": "spaceId", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.BasePayloadV2.isDeprecated", - "type": "CompoundType", - "tags": [], - "label": "isDeprecated", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.LocatorParams", - "type": "Interface", - "tags": [], - "label": "LocatorParams", - "description": [], - "signature": [ - { - "pluginId": "reporting", - "scope": "common", - "docId": "kibReportingPluginApi", - "section": "def-common.LocatorParams", - "text": "LocatorParams" - }, - "

" - ], - "path": "x-pack/plugins/reporting/common/types/url.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "reporting", - "id": "def-common.LocatorParams.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "x-pack/plugins/reporting/common/types/url.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.LocatorParams.version", - "type": "string", - "tags": [], - "label": "version", - "description": [ - "\nKibana version used to create the params" - ], - "path": "x-pack/plugins/reporting/common/types/url.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.LocatorParams.params", - "type": "Uncategorized", - "tags": [], - "label": "params", - "description": [ - "\nData to recreate the user's state in the application" - ], - "signature": [ - "P" - ], - "path": "x-pack/plugins/reporting/common/types/url.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - } - ], + "interfaces": [], "enums": [], - "misc": [ - { - "parentPluginId": "reporting", - "id": "def-common.BaseParams", - "type": "Type", - "tags": [ - "deprecated" - ], - "label": "BaseParams", - "description": [], - "signature": [ - "{ layout?: { id?: ", - { - "pluginId": "screenshotting", - "scope": "common", - "docId": "kibScreenshottingPluginApi", - "section": "def-common.LayoutType", - "text": "LayoutType" - }, - " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", - "LayoutSelectorDictionary", - "> | undefined; zoom?: number | undefined; } | undefined; objectType: string; title: string; browserTimezone: string; version: string; }" - ], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": true, - "trackAdoption": false, - "references": [], - "initialIsOpen": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.BaseParamsV2", - "type": "Type", - "tags": [], - "label": "BaseParamsV2", - "description": [ - "\nReport job parameters that an application must return from its\ngetSharingData function." - ], - "signature": [ - "{ layout?: { id?: ", - { - "pluginId": "screenshotting", - "scope": "common", - "docId": "kibScreenshottingPluginApi", - "section": "def-common.LayoutType", - "text": "LayoutType" - }, - " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", - "LayoutSelectorDictionary", - "> | undefined; zoom?: number | undefined; } | undefined; objectType: string; title: string; browserTimezone: string; version: string; } & { locatorParams: ", - { - "pluginId": "reporting", - "scope": "common", - "docId": "kibReportingPluginApi", - "section": "def-common.LocatorParams", - "text": "LocatorParams" - }, - "<", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.SerializableRecord", - "text": "SerializableRecord" - }, - ">[]; }" - ], - "path": "x-pack/plugins/reporting/common/types/base.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.JobAppParamsPDF", - "type": "Type", - "tags": [ - "deprecated" - ], - "label": "JobAppParamsPDF", - "description": [], - "signature": [ - "{ isDeprecated?: boolean | undefined; title: string; layout: { id?: ", - { - "pluginId": "screenshotting", - "scope": "common", - "docId": "kibScreenshottingPluginApi", - "section": "def-common.LayoutType", - "text": "LayoutType" - }, - " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", - "LayoutSelectorDictionary", - "> | undefined; zoom?: number | undefined; }; objectType: string; relativeUrls: string[]; }" - ], - "path": "x-pack/plugins/reporting/common/types/export_types/printable_pdf.ts", - "deprecated": true, - "trackAdoption": false, - "references": [], - "initialIsOpen": false - }, - { - "parentPluginId": "reporting", - "id": "def-common.JobAppParamsPDFV2", - "type": "Type", - "tags": [], - "label": "JobAppParamsPDFV2", - "description": [], - "signature": [ - "{ title: string; layout: { id?: ", - { - "pluginId": "screenshotting", - "scope": "common", - "docId": "kibScreenshottingPluginApi", - "section": "def-common.LayoutType", - "text": "LayoutType" - }, - " | undefined; dimensions?: { width: number; height: number; } | undefined; selectors?: Partial<", - "LayoutSelectorDictionary", - "> | undefined; zoom?: number | undefined; }; locatorParams: ", - { - "pluginId": "reporting", - "scope": "common", - "docId": "kibReportingPluginApi", - "section": "def-common.LocatorParams", - "text": "LocatorParams" - }, - "<", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.SerializableRecord", - "text": "SerializableRecord" - }, - ">[]; objectType: string; }" - ], - "path": "x-pack/plugins/reporting/common/types/export_types/printable_pdf_v2.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - } - ], + "misc": [], "objects": [] } } \ No newline at end of file diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 3519eba333f49..558ccd7f542d5 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.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 | |-------------------|-----------|------------------------|-----------------| -| 42 | 0 | 22 | 5 | +| 22 | 0 | 6 | 0 | ## Client @@ -36,11 +36,3 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh ### Start -## Common - -### Interfaces - - -### Consts, variables and types - - diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index c212b77ffde3d..202f6d8e192b8 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 2e63cfa5680b8..864629c2ef496 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 3497264993a3e..04f0ebda952cd 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-15 +date: 2023-11-19 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 37e0b2e6ee5cb..e767a5df11f07 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-15 +date: 2023-11-19 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 a55f372d9ab22..99e88dc965a62 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-15 +date: 2023-11-19 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 10cd5884c2dee..38eaa0410ff18 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-15 +date: 2023-11-19 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 bc96fb39e6018..0af43a80f8805 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-15 +date: 2023-11-19 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 c99deefd7bec3..dcc3a4d44e957 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-15 +date: 2023-11-19 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 6b8560077ee36..6a107eb290dab 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-15 +date: 2023-11-19 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 0fb6337d61099..f0ac1b842f8ef 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.devdocs.json b/api_docs/screenshotting.devdocs.json index 64c08e6ab7e51..a28a526b04998 100644 --- a/api_docs/screenshotting.devdocs.json +++ b/api_docs/screenshotting.devdocs.json @@ -488,7 +488,88 @@ "common": { "classes": [], "functions": [], - "interfaces": [], + "interfaces": [ + { + "parentPluginId": "screenshotting", + "id": "def-common.PerformanceMetrics", + "type": "Interface", + "tags": [], + "label": "PerformanceMetrics", + "description": [ + "\nCollected performance metrics during a screenshotting session." + ], + "path": "x-pack/plugins/screenshotting/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "screenshotting", + "id": "def-common.PerformanceMetrics.cpu", + "type": "number", + "tags": [], + "label": "cpu", + "description": [ + "\nThe percentage of CPU time spent by the browser divided by number or cores." + ], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/screenshotting/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "screenshotting", + "id": "def-common.PerformanceMetrics.cpuInPercentage", + "type": "number", + "tags": [], + "label": "cpuInPercentage", + "description": [ + "\nThe percentage of CPU in percent untis." + ], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/screenshotting/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "screenshotting", + "id": "def-common.PerformanceMetrics.memory", + "type": "number", + "tags": [], + "label": "memory", + "description": [ + "\nThe total amount of memory used by the browser." + ], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/screenshotting/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "screenshotting", + "id": "def-common.PerformanceMetrics.memoryInMegabytes", + "type": "number", + "tags": [], + "label": "memoryInMegabytes", + "description": [ + "\nThe total amount of memory used by the browser in megabytes." + ], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/screenshotting/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], "enums": [], "misc": [ { @@ -538,7 +619,7 @@ "\nSupported layout types." ], "signature": [ - "\"canvas\" | \"preserve_layout\" | \"print\"" + "\"canvas\" | \"print\" | \"preserve_layout\"" ], "path": "x-pack/plugins/screenshotting/common/layout.ts", "deprecated": false, diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index a09ddf0ab1ea5..f5e32ae5a372c 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/tea | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 27 | 0 | 8 | 5 | +| 32 | 0 | 8 | 4 | ## Client @@ -41,6 +41,9 @@ Contact [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/tea ## Common +### Interfaces + + ### Consts, variables and types diff --git a/api_docs/security.mdx b/api_docs/security.mdx index eea42f6105c84..aab98ee9a12ff 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-15 +date: 2023-11-19 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..1fa3537631f7b 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -2818,7 +2818,7 @@ "label": "ConfigType", "description": [], "signature": [ - "Omit; }>, \"offeringSettings\"> & { experimentalFeatures: ", + "Omit; }>, \"offeringSettings\"> & { experimentalFeatures: ", { "pluginId": "securitySolution", "scope": "common", @@ -2828,7 +2828,7 @@ }, "; settings: ", "ConfigSettings", - "; }" + "; enableUiSettingsValidations: boolean; }" ], "path": "x-pack/plugins/security_solution/server/config.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index e98138a99fe93..6b70eca76a8ac 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index d4572461c4ffc..5f10c1639302e 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-15 +date: 2023-11-19 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 1206736614c02..ea9372868fa04 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-15 +date: 2023-11-19 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 82d995a561adc..d24185bdb147e 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-15 +date: 2023-11-19 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 36d67fcd936b8..47727bf0dd7e8 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-15 +date: 2023-11-19 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 28dfb0241ad87..83b4720142b22 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-15 +date: 2023-11-19 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 47adb4d4ee260..0c26f7ba80c72 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-15 +date: 2023-11-19 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 38a66d2a8990b..3def4bd9bd274 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-15 +date: 2023-11-19 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 8cdd8b84e5684..cc111008227a6 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-15 +date: 2023-11-19 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 b50003b3598a9..7fe4340f7825e 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-15 +date: 2023-11-19 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 625fdd88155c2..5780e55925fd8 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-15 +date: 2023-11-19 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 330fae8acc62f..f0f55a32f801e 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.devdocs.json b/api_docs/task_manager.devdocs.json index 620d48af005c2..2bc531bde5295 100644 --- a/api_docs/task_manager.devdocs.json +++ b/api_docs/task_manager.devdocs.json @@ -345,7 +345,13 @@ "description": [], "signature": [ "(error: Error) => ", - "DecoratedError" + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.DecoratedError", + "text": "DecoratedError" + } ], "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", "deprecated": false, @@ -370,6 +376,75 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "taskManager", + "id": "def-server.createTaskRunError", + "type": "Function", + "tags": [], + "label": "createTaskRunError", + "description": [], + "signature": [ + "(error: Error, errorSource: ", + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.TaskErrorSource", + "text": "TaskErrorSource" + }, + ") => ", + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.DecoratedError", + "text": "DecoratedError" + } + ], + "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "taskManager", + "id": "def-server.createTaskRunError.$1", + "type": "Object", + "tags": [], + "label": "error", + "description": [], + "signature": [ + "Error" + ], + "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "taskManager", + "id": "def-server.createTaskRunError.$2", + "type": "Enum", + "tags": [], + "label": "errorSource", + "description": [], + "signature": [ + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.TaskErrorSource", + "text": "TaskErrorSource" + } + ], + "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "taskManager", "id": "def-server.isEphemeralTaskRejectedDueToCapacityError", @@ -415,7 +490,13 @@ "description": [], "signature": [ "(error: Error | ", - "DecoratedError", + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.DecoratedError", + "text": "DecoratedError" + }, ") => boolean" ], "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", @@ -431,7 +512,13 @@ "description": [], "signature": [ "Error | ", - "DecoratedError" + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.DecoratedError", + "text": "DecoratedError" + } ], "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", "deprecated": false, @@ -451,7 +538,13 @@ "description": [], "signature": [ "(error: Error | ", - "DecoratedError", + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.DecoratedError", + "text": "DecoratedError" + }, ") => boolean" ], "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", @@ -467,7 +560,13 @@ "description": [], "signature": [ "Error | ", - "DecoratedError" + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.DecoratedError", + "text": "DecoratedError" + } ], "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", "deprecated": false, @@ -534,7 +633,15 @@ "label": "throwUnrecoverableError", "description": [], "signature": [ - "(error: Error) => void" + "(error: Error, errorSource: ", + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.TaskErrorSource", + "text": "TaskErrorSource" + }, + ") => void" ], "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", "deprecated": false, @@ -554,6 +661,27 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "taskManager", + "id": "def-server.throwUnrecoverableError.$2", + "type": "Enum", + "tags": [], + "label": "errorSource", + "description": [], + "signature": [ + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.TaskErrorSource", + "text": "TaskErrorSource" + } + ], + "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true } ], "returnComment": [], @@ -834,6 +962,79 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "taskManager", + "id": "def-server.DecoratedError", + "type": "Interface", + "tags": [], + "label": "DecoratedError", + "description": [], + "signature": [ + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.DecoratedError", + "text": "DecoratedError" + }, + " extends Error" + ], + "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "taskManager", + "id": "def-server.DecoratedError.code", + "type": "string", + "tags": [], + "label": "[code]", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "taskManager", + "id": "def-server.DecoratedError.retry", + "type": "CompoundType", + "tags": [], + "label": "[retry]", + "description": [], + "signature": [ + "boolean | Date | undefined" + ], + "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "taskManager", + "id": "def-server.DecoratedError.source", + "type": "CompoundType", + "tags": [], + "label": "[source]", + "description": [], + "signature": [ + { + "pluginId": "taskManager", + "scope": "server", + "docId": "kibTaskManagerPluginApi", + "section": "def-server.TaskErrorSource", + "text": "TaskErrorSource" + }, + " | undefined" + ], + "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "taskManager", "id": "def-server.IntervalSchedule", @@ -1429,6 +1630,18 @@ } ], "enums": [ + { + "parentPluginId": "taskManager", + "id": "def-server.TaskErrorSource", + "type": "Enum", + "tags": [], + "label": "TaskErrorSource", + "description": [], + "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "taskManager", "id": "def-server.TaskStatus", diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 0fc91ac8d0275..a39bf979554b6 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.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 | |-------------------|-----------|------------------------|-----------------| -| 96 | 0 | 53 | 6 | +| 105 | 0 | 62 | 5 | ## Server diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 1f3865413e07b..afba5f81a4b3c 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-15 +date: 2023-11-19 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 8e6c58379191f..4ace48af9f2c0 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-15 +date: 2023-11-19 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 d50557113c5f0..6c4c611f8ccf2 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-15 +date: 2023-11-19 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 52648d535c1a6..1998ddcad8241 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index eff7aaef8c9dd..a7d570013407b 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 47b2c78ba471a..aac037def1de7 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-15 +date: 2023-11-19 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 99d4fd9cf33af..3d8282b9285a6 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-15 +date: 2023-11-19 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 7ff746e2df1d9..826edf1115d2d 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-15 +date: 2023-11-19 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 fbb4f127eae9b..e23129996be5b 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index ca3dd6d089576..1c3f811e0765e 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 3ac797666aecb..c6c9084eac6d4 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-15 +date: 2023-11-19 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 baa89455bf372..e78492dd5784f 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index b5b907ed17d6a..e56b5aa1af727 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 0ed03c4b8ea94..086aae0e7335f 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-15 +date: 2023-11-19 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 5303c6b15f603..39b680d93e755 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-15 +date: 2023-11-19 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 87d401118e0d0..7bed2e8d487f3 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-15 +date: 2023-11-19 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 f0705ce0544a4..42ba2d0662543 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-15 +date: 2023-11-19 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 1de083670d22d..248b414085ee3 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-15 +date: 2023-11-19 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 6ce67d8012ad2..30752ad5ebae2 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-15 +date: 2023-11-19 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 87fdcadfd3224..4c49e27edacc0 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-15 +date: 2023-11-19 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 c8b5647db336e..e29a4b98355f1 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-15 +date: 2023-11-19 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 4739219500d00..50a08bccf19ba 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-15 +date: 2023-11-19 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 6536dcd3a2a05..4597d3787cda6 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-15 +date: 2023-11-19 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 53166a32347ae..8766e94d7e203 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-15 +date: 2023-11-19 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 4911b3d1bf806..d8fcc74b363ec 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-15 +date: 2023-11-19 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 e0042d8c68963..a0d783bce4b67 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-15 +date: 2023-11-19 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 8fda69cc97f22..8e897b1af30dd 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-15 +date: 2023-11-19 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 d63f19ad7e667..4a0ff7e403efa 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-15 +date: 2023-11-19 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 28fc677039878..40ebbe2c78bdd 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 4921349f301c6..f17cba637e7c4 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-15 +date: 2023-11-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/catalog-info.yaml b/catalog-info.yaml index e7aa120004486..96b4c146590a6 100644 --- a/catalog-info.yaml +++ b/catalog-info.yaml @@ -54,6 +54,8 @@ spec: provider_settings: trigger_mode: none teams: + kibana-release-operators: + access_level: MANAGE_BUILD_AND_READ kibana-operations: access_level: MANAGE_BUILD_AND_READ appex-qa: diff --git a/config/serverless.es.yml b/config/serverless.es.yml index 8a81fbe5f48ae..e724eb5207ede 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -9,10 +9,7 @@ xpack.observabilityLogExplorer.enabled: false xpack.observability.enabled: false xpack.securitySolution.enabled: false xpack.serverless.observability.enabled: false -xpack.uptime.enabled: false -xpack.legacy_uptime.enabled: false enterpriseSearch.enabled: false -monitoring.ui.enabled: false xpack.fleet.enabled: false ## Cloud settings diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index 68f340fb64c05..86b3aabadbe5e 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -5,8 +5,6 @@ enterpriseSearch.enabled: false xpack.cloudSecurityPosture.enabled: false xpack.infra.enabled: true xpack.securitySolution.enabled: false -xpack.uptime.enabled: false -xpack.legacy_uptime.enabled: false ## Cloud settings xpack.cloud.serverless.project_type: observability diff --git a/config/serverless.security.yml b/config/serverless.security.yml index 7f749afc7626d..f47d3b02a1bf0 100644 --- a/config/serverless.security.yml +++ b/config/serverless.security.yml @@ -6,8 +6,6 @@ xpack.apm.enabled: false xpack.infra.enabled: false xpack.observabilityLogExplorer.enabled: false xpack.observability.enabled: false -xpack.uptime.enabled: false -xpack.legacy_uptime.enabled: false ## Cloud settings xpack.cloud.serverless.project_type: security diff --git a/config/serverless.yml b/config/serverless.yml index a6aba80736f2d..30aa06ab8f05b 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -127,7 +127,7 @@ xpack.alerting.rules.run.actions.max: 3000 xpack.alerting.rules.run.timeout: 1m xpack.alerting.rules.run.ruleTypeOverrides: - id: siem.indicatorRule - timeout: 1m + timeout: 10m xpack.alerting.rules.minimumScheduleInterval.enforce: true xpack.alerting.rules.maxScheduledPerMinute: 400 xpack.actions.run.maxAttempts: 10 @@ -150,6 +150,14 @@ xpack.reporting.queue.pollInterval: 3m xpack.reporting.roles.enabled: false xpack.reporting.statefulSettings.enabled: false - # Disabled Observability plugins xpack.ux.enabled: false +xpack.monitoring.enabled: false +xpack.uptime.enabled: false +xpack.legacy_uptime.enabled: false +monitoring.ui.enabled: false + +## Enable uiSettings validations +xpack.securitySolution.enableUiSettingsValidations: true +data.enableUiSettingsValidations: true +discover.enableUiSettingsValidations: true 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/package.json b/package.json index a14a06c2e1881..0f8260566b536 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", @@ -841,6 +844,8 @@ "@opentelemetry/semantic-conventions": "^1.4.0", "@reduxjs/toolkit": "1.7.2", "@slack/webhook": "^5.0.4", + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/util-utf8": "^2.0.0", "@tanstack/react-query": "^4.29.12", "@tanstack/react-query-devtools": "^4.29.12", "@turf/along": "6.0.1", @@ -919,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", diff --git a/packages/core/application/core-application-browser-internal/src/application_service.tsx b/packages/core/application/core-application-browser-internal/src/application_service.tsx index d54b71b91f119..8e5f2643929e7 100644 --- a/packages/core/application/core-application-browser-internal/src/application_service.tsx +++ b/packages/core/application/core-application-browser-internal/src/application_service.tsx @@ -13,7 +13,7 @@ import { createBrowserHistory, History } from 'history'; import type { PluginOpaqueId } from '@kbn/core-base-common'; import type { ThemeServiceStart } from '@kbn/core-theme-browser'; -import type { HttpSetup, HttpStart } from '@kbn/core-http-browser'; +import type { InternalHttpSetup, InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { Capabilities } from '@kbn/core-capabilities-common'; import type { MountPoint } from '@kbn/core-mount-utils-browser'; import type { OverlayStart } from '@kbn/core-overlays-browser'; @@ -46,7 +46,7 @@ import { import { registerAnalyticsContextProvider } from './register_analytics_context_provider'; export interface SetupDeps { - http: HttpSetup; + http: InternalHttpSetup; analytics: AnalyticsServiceSetup; history?: History; /** Used to redirect to external urls */ @@ -54,7 +54,7 @@ export interface SetupDeps { } export interface StartDeps { - http: HttpStart; + http: InternalHttpStart; analytics: AnalyticsServiceStart; theme: ThemeServiceStart; overlays: OverlayStart; diff --git a/packages/core/application/core-application-browser-internal/src/utils/parse_app_url.test.ts b/packages/core/application/core-application-browser-internal/src/utils/parse_app_url.test.ts index 7bc5752a72b13..0126acd36e453 100644 --- a/packages/core/application/core-application-browser-internal/src/utils/parse_app_url.test.ts +++ b/packages/core/application/core-application-browser-internal/src/utils/parse_app_url.test.ts @@ -30,7 +30,7 @@ describe('parseAppUrl', () => { beforeEach(() => { apps = new Map(); - basePath = new BasePath('/base-path'); + basePath = new BasePath({ basePath: '/base-path' }); createApp({ id: 'foo', diff --git a/packages/core/apps/core-apps-browser-internal/src/core_app.ts b/packages/core/apps/core-apps-browser-internal/src/core_app.ts index e8a61de40bea2..c6a8583a14930 100644 --- a/packages/core/apps/core-apps-browser-internal/src/core_app.ts +++ b/packages/core/apps/core-apps-browser-internal/src/core_app.ts @@ -10,7 +10,7 @@ import type { UnregisterCallback } from 'history'; import type { CoreContext } from '@kbn/core-base-browser-internal'; import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; import type { DocLinksStart } from '@kbn/core-doc-links-browser'; -import type { HttpSetup, HttpStart } from '@kbn/core-http-browser'; +import type { InternalHttpSetup, InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import type { NotificationsSetup, NotificationsStart } from '@kbn/core-notifications-browser'; import { AppNavLinkStatus, type AppMountParameters } from '@kbn/core-application-browser'; @@ -27,7 +27,7 @@ import { renderApp as renderStatusApp } from './status'; export interface CoreAppsServiceSetupDeps { application: InternalApplicationSetup; - http: HttpSetup; + http: InternalHttpSetup; injectedMetadata: InternalInjectedMetadataSetup; notifications: NotificationsSetup; } @@ -35,7 +35,7 @@ export interface CoreAppsServiceSetupDeps { export interface CoreAppsServiceStartDeps { application: InternalApplicationStart; docLinks: DocLinksStart; - http: HttpStart; + http: InternalHttpStart; notifications: NotificationsStart; uiSettings: IUiSettingsClient; } diff --git a/packages/core/apps/core-apps-browser-internal/src/errors/error_application.test.ts b/packages/core/apps/core-apps-browser-internal/src/errors/error_application.test.ts index 5ca92bc3904f4..65f7a437631b1 100644 --- a/packages/core/apps/core-apps-browser-internal/src/errors/error_application.test.ts +++ b/packages/core/apps/core-apps-browser-internal/src/errors/error_application.test.ts @@ -22,7 +22,7 @@ describe('renderApp', () => { let unmount: () => void; beforeEach(() => { - basePath = new BasePath(); + basePath = new BasePath({ basePath: '' }); element = document.createElement('div'); history = createMemoryHistory(); unmount = renderApp( diff --git a/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.tsx b/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.tsx index 0d2e678963d8b..f125d03239802 100644 --- a/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.tsx +++ b/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.tsx @@ -12,7 +12,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import type { DocLinksStart } from '@kbn/core-doc-links-browser'; -import type { HttpStart } from '@kbn/core-http-browser'; +import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { NotificationsStart } from '@kbn/core-notifications-browser'; import { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; @@ -21,7 +21,7 @@ export const MISSING_CONFIG_STORAGE_KEY = `core.warnings.publicBaseUrlMissingDis interface Deps { docLinks: DocLinksStart; - http: HttpStart; + http: InternalHttpStart; notifications: NotificationsStart; // Exposed for easier testing storage?: Storage; diff --git a/packages/core/apps/core-apps-browser-internal/src/errors/url_overflow.test.ts b/packages/core/apps/core-apps-browser-internal/src/errors/url_overflow.test.ts index bdf8bdf0abc6a..dae718c75afce 100644 --- a/packages/core/apps/core-apps-browser-internal/src/errors/url_overflow.test.ts +++ b/packages/core/apps/core-apps-browser-internal/src/errors/url_overflow.test.ts @@ -27,7 +27,7 @@ describe('url overflow detection', () => { let unlisten: any; beforeEach(() => { - basePath = new BasePath('/test-123'); + basePath = new BasePath({ basePath: '/test-123' }); history = createMemoryHistory(); toasts = notificationServiceMock.createStartContract().toasts; uiSettings = uiSettingsServiceMock.createStartContract(); diff --git a/packages/core/apps/core-apps-browser-internal/src/status/lib/load_status.ts b/packages/core/apps/core-apps-browser-internal/src/status/lib/load_status.ts index 6672786c72a10..7338db04716c0 100644 --- a/packages/core/apps/core-apps-browser-internal/src/status/lib/load_status.ts +++ b/packages/core/apps/core-apps-browser-internal/src/status/lib/load_status.ts @@ -189,7 +189,7 @@ export async function loadStatus({ http, notifications, }: { - http: HttpSetup; + http: Pick; notifications: NotificationsSetup; }) { let response: StatusResponse; diff --git a/packages/core/apps/core-apps-browser-internal/src/status/render_app.tsx b/packages/core/apps/core-apps-browser-internal/src/status/render_app.tsx index 4578ff0f347d6..a2af773a239ad 100644 --- a/packages/core/apps/core-apps-browser-internal/src/status/render_app.tsx +++ b/packages/core/apps/core-apps-browser-internal/src/status/render_app.tsx @@ -10,13 +10,13 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { I18nProvider } from '@kbn/i18n-react'; import { CoreThemeProvider } from '@kbn/core-theme-browser-internal'; -import type { HttpSetup } from '@kbn/core-http-browser'; +import type { InternalHttpSetup } from '@kbn/core-http-browser-internal'; import type { NotificationsSetup } from '@kbn/core-notifications-browser'; import type { AppMountParameters } from '@kbn/core-application-browser'; import { StatusApp } from './status_app'; interface Deps { - http: HttpSetup; + http: InternalHttpSetup; notifications: NotificationsSetup; } diff --git a/packages/core/apps/core-apps-browser-internal/src/status/status_app.tsx b/packages/core/apps/core-apps-browser-internal/src/status/status_app.tsx index 43e388ad170a8..88ae96bd33596 100644 --- a/packages/core/apps/core-apps-browser-internal/src/status/status_app.tsx +++ b/packages/core/apps/core-apps-browser-internal/src/status/status_app.tsx @@ -10,13 +10,13 @@ import React, { Component } from 'react'; import { EuiLoadingSpinner, EuiText, EuiPage, EuiPageBody, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; -import type { HttpSetup } from '@kbn/core-http-browser'; +import type { InternalHttpSetup } from '@kbn/core-http-browser-internal'; import type { NotificationsSetup } from '@kbn/core-notifications-browser'; import { loadStatus, type ProcessedServerResponse } from './lib'; import { MetricTiles, ServerStatus, StatusSection, VersionHeader } from './components'; interface StatusAppProps { - http: HttpSetup; + http: InternalHttpSetup; notifications: NotificationsSetup; } diff --git a/packages/core/capabilities/core-capabilities-browser-internal/src/capabilities_service.tsx b/packages/core/capabilities/core-capabilities-browser-internal/src/capabilities_service.tsx index 746911117e5ab..0751225af5311 100644 --- a/packages/core/capabilities/core-capabilities-browser-internal/src/capabilities_service.tsx +++ b/packages/core/capabilities/core-capabilities-browser-internal/src/capabilities_service.tsx @@ -8,12 +8,12 @@ import type { RecursiveReadonly } from '@kbn/utility-types'; import { deepFreeze } from '@kbn/std'; -import type { HttpStart } from '@kbn/core-http-browser'; +import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { Capabilities } from '@kbn/core-capabilities-common'; interface StartDeps { appIds: string[]; - http: HttpStart; + http: InternalHttpStart; } /** @internal */ diff --git a/packages/core/capabilities/core-capabilities-browser-internal/tsconfig.json b/packages/core/capabilities/core-capabilities-browser-internal/tsconfig.json index 258f96a51d15b..ca9379c024865 100644 --- a/packages/core/capabilities/core-capabilities-browser-internal/tsconfig.json +++ b/packages/core/capabilities/core-capabilities-browser-internal/tsconfig.json @@ -14,9 +14,9 @@ "kbn_references": [ "@kbn/utility-types", "@kbn/std", - "@kbn/core-http-browser", "@kbn/core-http-browser-mocks", - "@kbn/core-capabilities-common" + "@kbn/core-capabilities-common", + "@kbn/core-http-browser-internal" ], "exclude": [ "target/**/*", diff --git a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx index eaa30238cde89..e7f1ecbd29acc 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx @@ -16,7 +16,7 @@ import useObservable from 'react-use/lib/useObservable'; import type { InternalInjectedMetadataStart } from '@kbn/core-injected-metadata-browser-internal'; import type { AnalyticsServiceSetup } from '@kbn/core-analytics-browser'; import { type DocLinksStart } from '@kbn/core-doc-links-browser'; -import type { HttpStart } from '@kbn/core-http-browser'; +import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; import type { NotificationsStart } from '@kbn/core-notifications-browser'; import type { InternalApplicationStart } from '@kbn/core-application-browser-internal'; @@ -63,7 +63,7 @@ export interface SetupDeps { export interface StartDeps { application: InternalApplicationStart; docLinks: DocLinksStart; - http: HttpStart; + http: InternalHttpStart; injectedMetadata: InternalInjectedMetadataStart; notifications: NotificationsStart; customBranding: CustomBrandingStart; diff --git a/packages/core/chrome/core-chrome-browser-internal/src/nav_links/nav_links_service.ts b/packages/core/chrome/core-chrome-browser-internal/src/nav_links/nav_links_service.ts index e55e8cd0307a9..08466a1f35fb0 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/nav_links/nav_links_service.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/nav_links/nav_links_service.ts @@ -9,7 +9,8 @@ import { sortBy } from 'lodash'; import { BehaviorSubject, ReplaySubject } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; -import type { HttpStart, IBasePath } from '@kbn/core-http-browser'; +import type { IBasePath } from '@kbn/core-http-browser'; +import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { PublicAppDeepLinkInfo, PublicAppInfo } from '@kbn/core-application-browser'; import type { InternalApplicationStart } from '@kbn/core-application-browser-internal'; import type { ChromeNavLinks } from '@kbn/core-chrome-browser'; @@ -18,7 +19,7 @@ import { toNavLink } from './to_nav_link'; interface StartDeps { application: InternalApplicationStart; - http: HttpStart; + http: InternalHttpStart; } export class NavLinksService { diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts index 38766a026cdcc..7a8f5b89db653 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts @@ -16,7 +16,7 @@ import { ChromeSetProjectBreadcrumbsParams, ChromeProjectNavigationNode, } from '@kbn/core-chrome-browser'; -import type { HttpStart } from '@kbn/core-http-browser'; +import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import { BehaviorSubject, Observable, @@ -37,7 +37,7 @@ import { buildBreadcrumbs } from './breadcrumbs'; interface StartDeps { application: InternalApplicationStart; navLinks: ChromeNavLinks; - http: HttpStart; + http: InternalHttpStart; chromeBreadcrumbs$: Observable; } @@ -59,7 +59,7 @@ export class ProjectNavigationService { }>({ breadcrumbs: [], params: { absolute: false } }); private readonly stop$ = new ReplaySubject(1); private application?: InternalApplicationStart; - private http?: HttpStart; + private http?: InternalHttpStart; private unlistenHistory?: () => void; public start({ application, navLinks, http, chromeBreadcrumbs$ }: StartDeps) { diff --git a/packages/core/chrome/core-chrome-browser-internal/src/recently_accessed/recently_accessed_service.ts b/packages/core/chrome/core-chrome-browser-internal/src/recently_accessed/recently_accessed_service.ts index 414f0c796d1bd..ec9a04ab5551c 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/recently_accessed/recently_accessed_service.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/recently_accessed/recently_accessed_service.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { HttpSetup } from '@kbn/core-http-browser'; +import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { ChromeRecentlyAccessed, ChromeRecentlyAccessedHistoryItem, @@ -15,7 +15,7 @@ import { PersistedLog } from './persisted_log'; import { createLogKey } from './create_log_key'; interface StartDeps { - http: HttpSetup; + http: InternalHttpStart; } /** @internal */ diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/header/__snapshots__/collapsible_nav.test.tsx.snap b/packages/core/chrome/core-chrome-browser-internal/src/ui/header/__snapshots__/collapsible_nav.test.tsx.snap index c5c82c88c8521..416ce39bbf9ba 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/header/__snapshots__/collapsible_nav.test.tsx.snap +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/header/__snapshots__/collapsible_nav.test.tsx.snap @@ -733,6 +733,7 @@ exports[`CollapsibleNav renders the default nav 1`] = ` } basePath={ BasePath { + "assetsHrefBase": "/test", "basePath": "/test", "get": [Function], "prepend": [Function], @@ -918,6 +919,7 @@ exports[`CollapsibleNav renders the default nav 2`] = ` } basePath={ BasePath { + "assetsHrefBase": "/test", "basePath": "/test", "get": [Function], "prepend": [Function], diff --git a/packages/core/chrome/core-chrome-browser-internal/tsconfig.json b/packages/core/chrome/core-chrome-browser-internal/tsconfig.json index 020324c1f67bc..ed460a1965667 100644 --- a/packages/core/chrome/core-chrome-browser-internal/tsconfig.json +++ b/packages/core/chrome/core-chrome-browser-internal/tsconfig.json @@ -43,6 +43,7 @@ "@kbn/core-analytics-browser", "@kbn/shared-ux-router", "@kbn/shared-ux-link-redirect-app", + "@kbn/core-http-browser-internal", ], "exclude": [ "target/**/*", diff --git a/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_service.ts b/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_service.ts index edaf5f7f27be0..6dd78c8525f5d 100644 --- a/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_service.ts +++ b/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_service.ts @@ -8,13 +8,13 @@ import type { CoreService } from '@kbn/core-base-browser-internal'; import type { DeprecationsServiceStart } from '@kbn/core-deprecations-browser'; -import type { HttpStart } from '@kbn/core-http-browser'; +import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import { DeprecationsClient } from './deprecations_client'; export class DeprecationsService implements CoreService { public setup(): void {} - public start({ http }: { http: HttpStart }): DeprecationsServiceStart { + public start({ http }: { http: InternalHttpStart }): DeprecationsServiceStart { const deprecationsClient = new DeprecationsClient({ http }); return { diff --git a/packages/core/deprecations/core-deprecations-browser-internal/tsconfig.json b/packages/core/deprecations/core-deprecations-browser-internal/tsconfig.json index 8c7dde1c84e07..38fda3fdccf44 100644 --- a/packages/core/deprecations/core-deprecations-browser-internal/tsconfig.json +++ b/packages/core/deprecations/core-deprecations-browser-internal/tsconfig.json @@ -16,7 +16,8 @@ "@kbn/core-http-browser", "@kbn/core-http-browser-mocks", "@kbn/core-deprecations-common", - "@kbn/core-deprecations-browser" + "@kbn/core-deprecations-browser", + "@kbn/core-http-browser-internal" ], "exclude": [ "target/**/*", diff --git a/packages/core/http/core-http-browser-internal/index.ts b/packages/core/http/core-http-browser-internal/index.ts index 3baa45b8bcdf1..0b747b6261eb9 100644 --- a/packages/core/http/core-http-browser-internal/index.ts +++ b/packages/core/http/core-http-browser-internal/index.ts @@ -8,3 +8,4 @@ export { BasePath } from './src/base_path'; export { HttpService } from './src/http_service'; +export type { InternalHttpSetup, InternalHttpStart } from './src/types'; diff --git a/packages/core/http/core-http-browser-internal/src/anonymous_paths_service.test.ts b/packages/core/http/core-http-browser-internal/src/anonymous_paths_service.test.ts index dff9c4719fef4..181641700d4d6 100644 --- a/packages/core/http/core-http-browser-internal/src/anonymous_paths_service.test.ts +++ b/packages/core/http/core-http-browser-internal/src/anonymous_paths_service.test.ts @@ -12,13 +12,13 @@ import { BasePath } from './base_path'; describe('#setup()', () => { describe('#register', () => { it(`allows paths that don't start with /`, () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('bar'); }); it(`allows paths that end with '/'`, () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/bar/'); }); @@ -26,70 +26,70 @@ describe('#setup()', () => { describe('#isAnonymous', () => { it('returns true for registered paths', () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/bar'); expect(anonymousPaths.isAnonymous('/foo/bar')).toBe(true); }); it('returns true for paths registered with a trailing slash, but call "isAnonymous" with no trailing slash', () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/bar/'); expect(anonymousPaths.isAnonymous('/foo/bar')).toBe(true); }); it('returns true for paths registered without a trailing slash, but call "isAnonymous" with a trailing slash', () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/bar'); expect(anonymousPaths.isAnonymous('/foo/bar/')).toBe(true); }); it('returns true for paths registered without a starting slash', () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('bar'); expect(anonymousPaths.isAnonymous('/foo/bar')).toBe(true); }); it('returns true for paths registered with a starting slash', () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/bar'); expect(anonymousPaths.isAnonymous('/foo/bar')).toBe(true); }); it('when there is no basePath and calling "isAnonymous" without a starting slash, returns true for paths registered with a starting slash', () => { - const basePath = new BasePath('/'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/bar'); expect(anonymousPaths.isAnonymous('bar')).toBe(true); }); it('when there is no basePath and calling "isAnonymous" with a starting slash, returns true for paths registered with a starting slash', () => { - const basePath = new BasePath('/'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/bar'); expect(anonymousPaths.isAnonymous('/bar')).toBe(true); }); it('returns true for paths whose capitalization is different', () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/BAR'); expect(anonymousPaths.isAnonymous('/foo/bar')).toBe(true); }); it('returns false for other paths', () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/bar'); expect(anonymousPaths.isAnonymous('/foo/foo')).toBe(false); }); it('returns false for sub-paths of registered paths', () => { - const basePath = new BasePath('/foo'); + const basePath = new BasePath({ basePath: '/foo' }); const anonymousPaths = new AnonymousPathsService().setup({ basePath }); anonymousPaths.register('/bar'); expect(anonymousPaths.isAnonymous('/foo/bar/baz')).toBe(false); diff --git a/packages/core/http/core-http-browser-internal/src/base_path.test.ts b/packages/core/http/core-http-browser-internal/src/base_path.test.ts index cfca537c0f5b4..ebf70c48d79c3 100644 --- a/packages/core/http/core-http-browser-internal/src/base_path.test.ts +++ b/packages/core/http/core-http-browser-internal/src/base_path.test.ts @@ -10,35 +10,31 @@ import { BasePath } from './base_path'; describe('BasePath', () => { describe('#get()', () => { - it('returns an empty string if no basePath not provided', () => { - expect(new BasePath().get()).toBe(''); - }); - it('returns basePath value if provided', () => { - expect(new BasePath('/foo').get()).toBe('/foo'); + expect(new BasePath({ basePath: '/foo' }).get()).toBe('/foo'); }); describe('#prepend()', () => { it('adds the base path to the path if it is relative and starts with a slash', () => { - const basePath = new BasePath('/foo/bar'); + const basePath = new BasePath({ basePath: '/foo/bar' }); expect(basePath.prepend('/a/b')).toBe('/foo/bar/a/b'); }); it('leaves the query string and hash of path unchanged', () => { - const basePath = new BasePath('/foo/bar'); + const basePath = new BasePath({ basePath: '/foo/bar' }); expect(basePath.prepend('/a/b?x=y#c/d/e')).toBe('/foo/bar/a/b?x=y#c/d/e'); }); it('returns the path unchanged if it does not start with a slash', () => { - const basePath = new BasePath('/foo/bar'); + const basePath = new BasePath({ basePath: '/foo/bar' }); expect(basePath.prepend('a/b')).toBe('a/b'); }); it('returns the path unchanged it it has a hostname', () => { - const basePath = new BasePath('/foo/bar'); + const basePath = new BasePath({ basePath: '/foo/bar' }); expect(basePath.prepend('http://localhost:5601/a/b')).toBe('http://localhost:5601/a/b'); }); @@ -46,19 +42,19 @@ describe('BasePath', () => { describe('#remove()', () => { it('removes the basePath if relative path starts with it', () => { - const basePath = new BasePath('/foo/bar'); + const basePath = new BasePath({ basePath: '/foo/bar' }); expect(basePath.remove('/foo/bar/a/b')).toBe('/a/b'); }); it('leaves query string and hash intact', () => { - const basePath = new BasePath('/foo/bar'); + const basePath = new BasePath({ basePath: '/foo/bar' }); expect(basePath.remove('/foo/bar/a/b?c=y#1234')).toBe('/a/b?c=y#1234'); }); it('ignores urls with hostnames', () => { - const basePath = new BasePath('/foo/bar'); + const basePath = new BasePath({ basePath: '/foo/bar' }); expect(basePath.remove('http://localhost:5601/foo/bar/a/b')).toBe( 'http://localhost:5601/foo/bar/a/b' @@ -66,13 +62,13 @@ describe('BasePath', () => { }); it('returns slash if path is just basePath', () => { - const basePath = new BasePath('/foo/bar'); + const basePath = new BasePath({ basePath: '/foo/bar' }); expect(basePath.remove('/foo/bar')).toBe('/'); }); it('returns full path if basePath is not its own segment', () => { - const basePath = new BasePath('/foo/bar'); + const basePath = new BasePath({ basePath: '/foo/bar' }); expect(basePath.remove('/foo/barhop')).toBe('/foo/barhop'); }); @@ -81,20 +77,39 @@ describe('BasePath', () => { describe('serverBasePath', () => { it('defaults to basePath', () => { - expect(new BasePath('/foo/bar').serverBasePath).toEqual('/foo/bar'); + expect(new BasePath({ basePath: '/foo/bar' }).serverBasePath).toEqual('/foo/bar'); }); it('returns value when passed into constructor', () => { - expect(new BasePath('/foo/bar', '/foo').serverBasePath).toEqual('/foo'); + expect(new BasePath({ basePath: '/foo/bar', serverBasePath: '/foo' }).serverBasePath).toEqual( + '/foo' + ); }); }); describe('publicBaseUrl', () => { it('returns value passed into construtor', () => { - expect(new BasePath('/foo/bar', '/foo').publicBaseUrl).toEqual(undefined); - expect(new BasePath('/foo/bar', '/foo', 'http://myhost.com/foo').publicBaseUrl).toEqual( - 'http://myhost.com/foo' + expect(new BasePath({ basePath: '/foo/bar' }).publicBaseUrl).toEqual(undefined); + expect( + new BasePath({ basePath: '/foo/bar', publicBaseUrl: 'http://myhost.com/foo' }).publicBaseUrl + ).toEqual('http://myhost.com/foo'); + }); + }); + + describe('assetsHrefBase', () => { + it('default to the serverBasePath if unspecified', () => { + expect(new BasePath({ basePath: '/foo/bar', serverBasePath: '/foo' }).assetsHrefBase).toEqual( + '/foo' ); }); + it('returns the correct value when explicitly set', () => { + expect( + new BasePath({ + basePath: '/foo/bar', + serverBasePath: '/foo', + assetsHrefBase: 'http://cdn/foo', + }).assetsHrefBase + ).toEqual('http://cdn/foo'); + }); }); }); diff --git a/packages/core/http/core-http-browser-internal/src/base_path.ts b/packages/core/http/core-http-browser-internal/src/base_path.ts index 63fb8917421e0..4eaa71f8290d9 100644 --- a/packages/core/http/core-http-browser-internal/src/base_path.ts +++ b/packages/core/http/core-http-browser-internal/src/base_path.ts @@ -10,18 +10,36 @@ import { IBasePath } from '@kbn/core-http-browser'; import { modifyUrl } from '@kbn/std'; export class BasePath implements IBasePath { - constructor( - private readonly basePath: string = '', - public readonly serverBasePath: string = basePath, - public readonly publicBaseUrl?: string - ) {} + private readonly basePath: string; + public readonly serverBasePath: string; + public readonly assetsHrefBase: string; + public readonly publicBaseUrl?: string; + + constructor({ + basePath, + serverBasePath, + assetsHrefBase, + publicBaseUrl, + }: { + basePath: string; + serverBasePath?: string; + assetsHrefBase?: string; + publicBaseUrl?: string; + }) { + this.basePath = basePath; + this.serverBasePath = serverBasePath ?? this.basePath; + this.assetsHrefBase = assetsHrefBase ?? this.serverBasePath; + this.publicBaseUrl = publicBaseUrl; + } public get = () => { return this.basePath; }; public prepend = (path: string): string => { - if (!this.basePath) return path; + if (!this.basePath) { + return path; + } return modifyUrl(path, (parts) => { if (!parts.hostname && parts.pathname && parts.pathname.startsWith('/')) { parts.pathname = `${this.basePath}${parts.pathname}`; diff --git a/packages/core/http/core-http-browser-internal/src/fetch.test.ts b/packages/core/http/core-http-browser-internal/src/fetch.test.ts index b46a34f768b66..d4f37a6601b69 100644 --- a/packages/core/http/core-http-browser-internal/src/fetch.test.ts +++ b/packages/core/http/core-http-browser-internal/src/fetch.test.ts @@ -27,7 +27,7 @@ const BASE_PATH = 'http://localhost/myBase'; describe('Fetch', () => { const executionContextMock = executionContextServiceMock.createSetupContract(); const fetchInstance = new Fetch({ - basePath: new BasePath(BASE_PATH), + basePath: new BasePath({ basePath: BASE_PATH }), kibanaVersion: 'VERSION', buildNumber: 1234, executionContext: executionContextMock, diff --git a/packages/core/http/core-http-browser-internal/src/http_service.ts b/packages/core/http/core-http-browser-internal/src/http_service.ts index d097dc7a14c9a..a054ca3a7c11c 100644 --- a/packages/core/http/core-http-browser-internal/src/http_service.ts +++ b/packages/core/http/core-http-browser-internal/src/http_service.ts @@ -10,8 +10,9 @@ import type { CoreService } from '@kbn/core-base-browser-internal'; import type { ExecutionContextSetup } from '@kbn/core-execution-context-browser'; import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; import type { FatalErrorsSetup } from '@kbn/core-fatal-errors-browser'; -import type { HttpSetup, HttpStart } from '@kbn/core-http-browser'; +import type { InternalHttpSetup, InternalHttpStart } from './types'; import { BasePath } from './base_path'; +import { StaticAssets } from './static_assets'; import { AnonymousPathsService } from './anonymous_paths_service'; import { LoadingCountService } from './loading_count_service'; import { Fetch } from './fetch'; @@ -24,19 +25,23 @@ interface HttpDeps { } /** @internal */ -export class HttpService implements CoreService { +export class HttpService implements CoreService { private readonly anonymousPaths = new AnonymousPathsService(); private readonly loadingCount = new LoadingCountService(); - private service?: HttpSetup; + private service?: InternalHttpSetup; - public setup({ injectedMetadata, fatalErrors, executionContext }: HttpDeps): HttpSetup { + public setup({ injectedMetadata, fatalErrors, executionContext }: HttpDeps): InternalHttpSetup { const kibanaVersion = injectedMetadata.getKibanaVersion(); const buildNumber = injectedMetadata.getKibanaBuildNumber(); - const basePath = new BasePath( - injectedMetadata.getBasePath(), - injectedMetadata.getServerBasePath(), - injectedMetadata.getPublicBaseUrl() - ); + const basePath = new BasePath({ + basePath: injectedMetadata.getBasePath(), + serverBasePath: injectedMetadata.getServerBasePath(), + publicBaseUrl: injectedMetadata.getPublicBaseUrl(), + assetsHrefBase: injectedMetadata.getAssetsHrefBase(), + }); + const staticAssets = new StaticAssets({ + assetsHrefBase: injectedMetadata.getAssetsHrefBase(), + }); const fetchService = new Fetch({ basePath, kibanaVersion, buildNumber, executionContext }); const loadingCount = this.loadingCount.setup({ fatalErrors }); @@ -44,6 +49,7 @@ export class HttpService implements CoreService { this.service = { basePath, + staticAssets, anonymousPaths: this.anonymousPaths.setup({ basePath }), externalUrl: new ExternalUrlService().setup({ injectedMetadata, location: window.location }), intercept: fetchService.intercept.bind(fetchService), diff --git a/packages/core/http/core-http-browser-internal/src/static_assets.test.ts b/packages/core/http/core-http-browser-internal/src/static_assets.test.ts new file mode 100644 index 0000000000000..c9083e2fd0177 --- /dev/null +++ b/packages/core/http/core-http-browser-internal/src/static_assets.test.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 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 { StaticAssets } from './static_assets'; + +describe('StaticAssets', () => { + describe('#getPluginAssetHref()', () => { + it('returns the expected value when the base is a path', () => { + const staticAssets = new StaticAssets({ assetsHrefBase: '/base-path' }); + expect(staticAssets.getPluginAssetHref('foo', 'path/to/img.gif')).toEqual( + '/base-path/plugins/foo/assets/path/to/img.gif' + ); + }); + + it('returns the expected value when the base is a full url', () => { + const staticAssets = new StaticAssets({ assetsHrefBase: 'http://cdn/cdn-base-path' }); + expect(staticAssets.getPluginAssetHref('bar', 'path/to/img.gif')).toEqual( + 'http://cdn/cdn-base-path/plugins/bar/assets/path/to/img.gif' + ); + }); + + it('removes leading slash from the', () => { + const staticAssets = new StaticAssets({ assetsHrefBase: '/base-path' }); + expect(staticAssets.getPluginAssetHref('dolly', '/path/for/something.svg')).toEqual( + '/base-path/plugins/dolly/assets/path/for/something.svg' + ); + }); + }); +}); diff --git a/packages/core/http/core-http-browser-internal/src/static_assets.ts b/packages/core/http/core-http-browser-internal/src/static_assets.ts new file mode 100644 index 0000000000000..02218e3d375d6 --- /dev/null +++ b/packages/core/http/core-http-browser-internal/src/static_assets.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 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 { InternalStaticAssets } from './types'; + +export class StaticAssets implements InternalStaticAssets { + public readonly assetsHrefBase: string; + + constructor({ assetsHrefBase }: { assetsHrefBase: string }) { + this.assetsHrefBase = assetsHrefBase.endsWith('/') + ? assetsHrefBase.slice(0, -1) + : assetsHrefBase; + } + + getPluginAssetHref(pluginName: string, assetPath: string): string { + if (assetPath.startsWith('/')) { + assetPath = assetPath.slice(1); + } + return `${this.assetsHrefBase}/plugins/${pluginName}/assets/${assetPath}`; + } +} diff --git a/packages/core/http/core-http-browser-internal/src/types.ts b/packages/core/http/core-http-browser-internal/src/types.ts new file mode 100644 index 0000000000000..83e47ff0b7262 --- /dev/null +++ b/packages/core/http/core-http-browser-internal/src/types.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { HttpSetup, HttpStart } from '@kbn/core-http-browser'; + +export type InternalHttpSetup = Omit & { + staticAssets: InternalStaticAssets; +}; + +export type InternalHttpStart = Omit & { + staticAssets: InternalStaticAssets; +}; + +export interface InternalStaticAssets { + getPluginAssetHref(pluginId: string, assetPath: string): string; +} diff --git a/packages/core/http/core-http-browser-mocks/src/base_path.mock.ts b/packages/core/http/core-http-browser-mocks/src/base_path.mock.ts index 9d36d4e33c106..ad27677dd41ff 100644 --- a/packages/core/http/core-http-browser-mocks/src/base_path.mock.ts +++ b/packages/core/http/core-http-browser-mocks/src/base_path.mock.ts @@ -11,13 +11,15 @@ import type { IBasePath } from '@kbn/core-http-browser'; const createBasePathMock = ({ publicBaseUrl = '/', serverBasePath = '/', -}: { publicBaseUrl?: string; serverBasePath?: string } = {}) => { + assetsHrefBase = '/', +}: { publicBaseUrl?: string; serverBasePath?: string; assetsHrefBase?: string } = {}) => { const mock: jest.Mocked = { prepend: jest.fn(), get: jest.fn(), remove: jest.fn(), publicBaseUrl, serverBasePath, + assetsHrefBase, }; return mock; diff --git a/packages/core/http/core-http-browser-mocks/src/http_service.mock.ts b/packages/core/http/core-http-browser-mocks/src/http_service.mock.ts index 553e09875ae9e..45b445b39fad4 100644 --- a/packages/core/http/core-http-browser-mocks/src/http_service.mock.ts +++ b/packages/core/http/core-http-browser-mocks/src/http_service.mock.ts @@ -29,7 +29,10 @@ const createServiceMock = ({ patch: jest.fn(), delete: jest.fn(), options: jest.fn(), - basePath: new BasePath(basePath, undefined, publicBaseUrl), + basePath: new BasePath({ + basePath, + publicBaseUrl, + }), anonymousPaths: { register: jest.fn(), isAnonymous: jest.fn(), @@ -38,6 +41,9 @@ const createServiceMock = ({ isInternalUrl: jest.fn(), validateUrl: jest.fn(), }, + staticAssets: { + getPluginAssetHref: jest.fn(), + }, addLoadingCountSource: jest.fn(), getLoadingCount$: jest.fn().mockReturnValue(new BehaviorSubject(0)), intercept: jest.fn(), diff --git a/packages/core/http/core-http-browser/index.ts b/packages/core/http/core-http-browser/index.ts index 5f733d720c17d..de1e201132d3d 100644 --- a/packages/core/http/core-http-browser/index.ts +++ b/packages/core/http/core-http-browser/index.ts @@ -12,6 +12,7 @@ export type { IBasePath, IExternalUrl, IAnonymousPaths, + IStaticAssets, HttpHeadersInit, HttpRequestInit, HttpFetchQuery, diff --git a/packages/core/http/core-http-browser/src/types.ts b/packages/core/http/core-http-browser/src/types.ts index e9b3d2ecdd660..5d270d77afc2e 100644 --- a/packages/core/http/core-http-browser/src/types.ts +++ b/packages/core/http/core-http-browser/src/types.ts @@ -19,6 +19,12 @@ export interface HttpSetup { */ basePath: IBasePath; + /** + * APIs for creating hrefs to static assets. + * See {@link IStaticAssets} + */ + staticAssets: IStaticAssets; + /** * APIs for denoting certain paths for not requiring authentication */ @@ -96,6 +102,12 @@ export interface IBasePath { */ readonly serverBasePath: string; + /** + * Href (hypertext reference) intended to be used as the base for constructing + * other hrefs to static assets. + */ + readonly assetsHrefBase: string; + /** * The server's publicly exposed base URL, if configured. Includes protocol, host, port (optional) and the * {@link IBasePath.serverBasePath}. @@ -105,6 +117,7 @@ export interface IBasePath { */ readonly publicBaseUrl?: string; } + /** * APIs for working with external URLs. * @@ -130,6 +143,25 @@ export interface IExternalUrl { validateUrl(relativeOrAbsoluteUrl: string): URL | null; } +/** + * APIs for creating hrefs to static assets. + * + * @public + */ +export interface IStaticAssets { + /** + * Gets the full href to the current plugin's asset, + * given its path relative to the plugin's `public/assets` folder. + * + * @example + * ```ts + * // I want to retrieve the href for the asset stored under `my_plugin/public/assets/some_folder/asset.png`: + * const assetHref = core.http.statisAssets.getPluginAssetHref('some_folder/asset.png'); + * ``` + */ + getPluginAssetHref(assetPath: string): string; +} + /** * APIs for denoting paths as not requiring authentication */ @@ -318,10 +350,13 @@ export interface HttpHandler { path: string, options: HttpFetchOptions & { asResponse: true } ): Promise>; + (options: HttpFetchOptionsWithPath & { asResponse: true }): Promise< HttpResponse >; + (path: string, options?: HttpFetchOptions): Promise; + (options: HttpFetchOptionsWithPath): Promise; } @@ -368,6 +403,7 @@ export interface HttpInterceptorResponseError extends HttpResponse { request: Readonly; error: Error | IHttpFetchError; } + /** @public */ export interface HttpInterceptorRequestError { fetchOptions: Readonly; @@ -429,6 +465,7 @@ export interface HttpInterceptor { export interface IHttpInterceptController { /** Whether or not this chain has been halted. */ halted: boolean; + /** Halt the request Promise chain and do not process further interceptors or response handlers. */ halt(): void; } 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 f188d7a06552e..f70b035c5f22f 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 @@ -82,6 +82,7 @@ beforeEach(() => { cors: { enabled: false, }, + cdn: {}, shutdownTimeout: moment.duration(500, 'ms'), } as any; 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 c8a6f55e0a55e..fb776f5d29eb6 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 @@ -58,7 +58,7 @@ import { AuthStateStorage } from './auth_state_storage'; import { AuthHeadersStorage } from './auth_headers_storage'; import { BasePath } from './base_path_service'; import { getEcsResponseLog } from './logging'; -import { StaticAssets, type IStaticAssets } from './static_assets'; +import { StaticAssets, type InternalStaticAssets } from './static_assets'; /** * Adds ELU timings for the executed function to the current's context transaction @@ -136,7 +136,7 @@ export interface HttpServerSetup { * @note Static assets may be served over CDN */ registerStaticDir: (path: string, dirPath: string) => void; - staticAssets: IStaticAssets; + staticAssets: InternalStaticAssets; basePath: HttpServiceSetup['basePath']; csp: HttpServiceSetup['csp']; createCookieSessionStorageFactory: HttpServiceSetup['createCookieSessionStorageFactory']; 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 96e9c8a85ba89..99d286b26f83f 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 @@ -199,7 +199,7 @@ export class HttpService // the `plugin` and `legacy` services. public getStartContract(): InternalHttpServiceStart { return { - ...pick(this.internalSetup!, ['auth', 'basePath', 'getServerInfo']), + ...pick(this.internalSetup!, ['auth', 'basePath', 'getServerInfo', 'staticAssets']), isListening: () => this.httpServer.isListening(), }; } diff --git a/packages/core/http/core-http-server-internal/src/static_assets.test.ts b/packages/core/http/core-http-server-internal/src/static_assets.test.ts index d80ec6aaf6ed8..0b1acd4e73fd9 100644 --- a/packages/core/http/core-http-server-internal/src/static_assets.test.ts +++ b/packages/core/http/core-http-server-internal/src/static_assets.test.ts @@ -14,18 +14,48 @@ describe('StaticAssets', () => { let basePath: BasePath; let cdnConfig: CdnConfig; let staticAssets: StaticAssets; + beforeEach(() => { - basePath = new BasePath('/test'); - cdnConfig = CdnConfig.from(); - staticAssets = new StaticAssets(basePath, cdnConfig); + basePath = new BasePath('/base-path'); }); - it('provides fallsback to server base path', () => { - expect(staticAssets.getHrefBase()).toEqual('/test'); + + describe('#getHrefBase()', () => { + it('provides fallback to server base path', () => { + cdnConfig = CdnConfig.from(); + staticAssets = new StaticAssets(basePath, cdnConfig); + expect(staticAssets.getHrefBase()).toEqual('/base-path'); + }); + + it('provides the correct HREF given a CDN is configured', () => { + cdnConfig = CdnConfig.from({ url: 'https://cdn.example.com/test' }); + staticAssets = new StaticAssets(basePath, cdnConfig); + expect(staticAssets.getHrefBase()).toEqual('https://cdn.example.com/test'); + }); }); - it('provides the correct HREF given a CDN is configured', () => { - cdnConfig = CdnConfig.from({ url: 'https://cdn.example.com/test' }); - staticAssets = new StaticAssets(basePath, cdnConfig); - expect(staticAssets.getHrefBase()).toEqual('https://cdn.example.com/test'); + describe('#getPluginAssetHref()', () => { + it('returns the expected value when CDN config is not set', () => { + cdnConfig = CdnConfig.from(); + staticAssets = new StaticAssets(basePath, cdnConfig); + expect(staticAssets.getPluginAssetHref('foo', 'path/to/img.gif')).toEqual( + '/base-path/plugins/foo/assets/path/to/img.gif' + ); + }); + + it('returns the expected value when CDN config is set', () => { + cdnConfig = CdnConfig.from({ url: 'https://cdn.example.com/test' }); + staticAssets = new StaticAssets(basePath, cdnConfig); + expect(staticAssets.getPluginAssetHref('bar', 'path/to/img.gif')).toEqual( + 'https://cdn.example.com/test/plugins/bar/assets/path/to/img.gif' + ); + }); + + it('removes leading slash from the', () => { + cdnConfig = CdnConfig.from(); + staticAssets = new StaticAssets(basePath, cdnConfig); + expect(staticAssets.getPluginAssetHref('dolly', '/path/for/something.svg')).toEqual( + '/base-path/plugins/dolly/assets/path/for/something.svg' + ); + }); }); }); diff --git a/packages/core/http/core-http-server-internal/src/static_assets.ts b/packages/core/http/core-http-server-internal/src/static_assets.ts index b4e7a529fe948..4dfe46d8d31a6 100644 --- a/packages/core/http/core-http-server-internal/src/static_assets.ts +++ b/packages/core/http/core-http-server-internal/src/static_assets.ts @@ -9,20 +9,31 @@ import type { BasePath } from './base_path_service'; import { CdnConfig } from './cdn'; -export interface IStaticAssets { +export interface InternalStaticAssets { getHrefBase(): string; + getPluginAssetHref(pluginName: string, assetPath: string): string; } -export class StaticAssets implements IStaticAssets { - constructor(private readonly basePath: BasePath, private readonly cdnConfig: CdnConfig) {} +export class StaticAssets implements InternalStaticAssets { + private readonly assetsHrefBase: string; + + constructor(basePath: BasePath, cdnConfig: CdnConfig) { + const hrefToUse = cdnConfig.baseHref ?? basePath.serverBasePath; + this.assetsHrefBase = hrefToUse.endsWith('/') ? hrefToUse.slice(0, -1) : hrefToUse; + } + /** * Returns a href (hypertext reference) intended to be used as the base for constructing * other hrefs to static assets. */ getHrefBase(): string { - if (this.cdnConfig.baseHref) { - return this.cdnConfig.baseHref; + return this.assetsHrefBase; + } + + getPluginAssetHref(pluginName: string, assetPath: string): string { + if (assetPath.startsWith('/')) { + assetPath = assetPath.slice(1); } - return this.basePath.serverBasePath; + return `${this.assetsHrefBase}/plugins/${pluginName}/assets/${assetPath}`; } } diff --git a/packages/core/http/core-http-server-internal/src/types.ts b/packages/core/http/core-http-server-internal/src/types.ts index 0acbb0d0508d6..72dde630e03db 100644 --- a/packages/core/http/core-http-server-internal/src/types.ts +++ b/packages/core/http/core-http-server-internal/src/types.ts @@ -16,8 +16,9 @@ import type { HttpServiceSetup, HttpServiceStart, } from '@kbn/core-http-server'; -import { HttpServerSetup } from './http_server'; -import { ExternalUrlConfig } from './external_url'; +import type { HttpServerSetup } from './http_server'; +import type { ExternalUrlConfig } from './external_url'; +import type { InternalStaticAssets } from './static_assets'; /** @internal */ export interface InternalHttpServicePreboot @@ -43,10 +44,10 @@ export interface InternalHttpServicePreboot /** @internal */ export interface InternalHttpServiceSetup - extends Omit { + extends Omit { auth: HttpServerSetup['auth']; server: HttpServerSetup['server']; - staticAssets: HttpServerSetup['staticAssets']; + staticAssets: InternalStaticAssets; externalUrl: ExternalUrlConfig; createRouter: ( path: string, @@ -66,7 +67,8 @@ export interface InternalHttpServiceSetup } /** @internal */ -export interface InternalHttpServiceStart extends HttpServiceStart { +export interface InternalHttpServiceStart extends Omit { + staticAssets: InternalStaticAssets; /** Indicates if the http server is listening on the configured port */ isListening: () => boolean; } diff --git a/packages/core/http/core-http-server-mocks/src/http_service.mock.ts b/packages/core/http/core-http-server-mocks/src/http_service.mock.ts index ad7e310f5a2d8..f8ecfadfeb87e 100644 --- a/packages/core/http/core-http-server-mocks/src/http_service.mock.ts +++ b/packages/core/http/core-http-server-mocks/src/http_service.mock.ts @@ -20,6 +20,7 @@ import type { HttpServicePreboot, HttpServiceSetup, HttpServiceStart, + IStaticAssets, } from '@kbn/core-http-server'; import { AuthStatus } from '@kbn/core-http-server'; import { mockRouter, RouterMock } from '@kbn/core-http-router-server-mocks'; @@ -34,17 +35,19 @@ import type { import { sessionStorageMock } from './cookie_session_storage.mocks'; type BasePathMocked = jest.Mocked; -type StaticAssetsMocked = jest.Mocked; +type InternalStaticAssetsMocked = jest.Mocked; +type StaticAssetsMocked = jest.Mocked; type AuthMocked = jest.Mocked; export type HttpServicePrebootMock = jest.Mocked; export type InternalHttpServicePrebootMock = jest.Mocked< Omit -> & { basePath: BasePathMocked; staticAssets: StaticAssetsMocked }; +> & { basePath: BasePathMocked; staticAssets: InternalStaticAssetsMocked }; export type HttpServiceSetupMock< ContextType extends RequestHandlerContextBase = RequestHandlerContextBase > = jest.Mocked, 'basePath' | 'createRouter'>> & { basePath: BasePathMocked; + staticAssets: StaticAssetsMocked; createRouter: jest.MockedFunction<() => RouterMock>; }; export type InternalHttpServiceSetupMock = jest.Mocked< @@ -55,15 +58,17 @@ export type InternalHttpServiceSetupMock = jest.Mocked< > & { auth: AuthMocked; basePath: BasePathMocked; - staticAssets: StaticAssetsMocked; + staticAssets: InternalStaticAssetsMocked; createRouter: jest.MockedFunction<(path: string) => RouterMock>; authRequestHeaders: jest.Mocked; }; export type HttpServiceStartMock = jest.Mocked & { basePath: BasePathMocked; + staticAssets: StaticAssetsMocked; }; export type InternalHttpServiceStartMock = jest.Mocked & { basePath: BasePathMocked; + staticAssets: InternalStaticAssetsMocked; }; const createBasePathMock = ( @@ -78,11 +83,12 @@ const createBasePathMock = ( remove: jest.fn(), }); -const createStaticAssetsMock = ( +const createInternalStaticAssetsMock = ( basePath: BasePathMocked, cdnUrl: undefined | string = undefined -): StaticAssetsMocked => ({ +): InternalStaticAssetsMocked => ({ getHrefBase: jest.fn(() => cdnUrl ?? basePath.serverBasePath), + getPluginAssetHref: jest.fn().mockReturnValue(cdnUrl ?? basePath.serverBasePath), }); const createAuthMock = () => { @@ -106,6 +112,7 @@ const createAuthHeaderStorageMock = () => { interface CreateMockArgs { cdnUrl?: string; } + const createInternalPrebootContractMock = (args: CreateMockArgs = {}) => { const basePath = createBasePathMock(); const mock: InternalHttpServicePrebootMock = { @@ -113,7 +120,7 @@ const createInternalPrebootContractMock = (args: CreateMockArgs = {}) => { registerRouteHandlerContext: jest.fn(), registerStaticDir: jest.fn(), basePath, - staticAssets: createStaticAssetsMock(basePath, args.cdnUrl), + staticAssets: createInternalStaticAssetsMock(basePath, args.cdnUrl), csp: CspConfig.DEFAULT, externalUrl: ExternalUrlConfig.DEFAULT, auth: createAuthMock(), @@ -144,6 +151,7 @@ const createPrebootContractMock = () => { }; const createInternalSetupContractMock = () => { + const basePath = createBasePathMock(); const mock: InternalHttpServiceSetupMock = { // we can mock other hapi server methods when we need it server: { @@ -164,9 +172,9 @@ const createInternalSetupContractMock = () => { registerOnPreResponse: jest.fn(), createRouter: jest.fn().mockImplementation(() => mockRouter.create({})), registerStaticDir: jest.fn(), - basePath: createBasePathMock(), + basePath, csp: CspConfig.DEFAULT, - staticAssets: { getHrefBase: jest.fn(() => mock.basePath.serverBasePath) }, + staticAssets: createInternalStaticAssetsMock(basePath), externalUrl: ExternalUrlConfig.DEFAULT, auth: createAuthMock(), authRequestHeaders: createAuthHeaderStorageMock(), @@ -202,6 +210,9 @@ const createSetupContractMock = < createRouter: jest.fn(), registerRouteHandlerContext: jest.fn(), getServerInfo: internalMock.getServerInfo, + staticAssets: { + getPluginAssetHref: jest.fn().mockImplementation((assetPath: string) => assetPath), + }, }; mock.createRouter.mockImplementation(() => internalMock.createRouter('')); @@ -214,14 +225,19 @@ const createStartContractMock = () => { auth: createAuthMock(), basePath: createBasePathMock(), getServerInfo: jest.fn(), + staticAssets: { + getPluginAssetHref: jest.fn().mockImplementation((assetPath: string) => assetPath), + }, }; return mock; }; const createInternalStartContractMock = () => { + const basePath = createBasePathMock(); const mock: InternalHttpServiceStartMock = { ...createStartContractMock(), + staticAssets: createInternalStaticAssetsMock(basePath), isListening: jest.fn(), }; diff --git a/packages/core/http/core-http-server/index.ts b/packages/core/http/core-http-server/index.ts index 94eefba610a44..9a28a7be5033e 100644 --- a/packages/core/http/core-http-server/index.ts +++ b/packages/core/http/core-http-server/index.ts @@ -142,3 +142,5 @@ export type { VersionedRouteRegistrar, VersionedRouter, } from './src/versioning'; + +export type { IStaticAssets } from './src/static_assets'; diff --git a/packages/core/http/core-http-server/src/http_contract.ts b/packages/core/http/core-http-server/src/http_contract.ts index 753b7b8cf0066..8ac34b26a386c 100644 --- a/packages/core/http/core-http-server/src/http_contract.ts +++ b/packages/core/http/core-http-server/src/http_contract.ts @@ -20,6 +20,7 @@ import type { OnPreRoutingHandler, } from './lifecycle'; import type { IBasePath } from './base_path'; +import type { IStaticAssets } from './static_assets'; import type { ICspConfig } from './csp'; import type { GetAuthState, IsAuthenticated } from './auth_state'; import type { SessionStorageCookieOptions, SessionStorageFactory } from './session_storage'; @@ -287,6 +288,12 @@ export interface HttpServiceSetup< */ basePath: IBasePath; + /** + * APIs for creating hrefs to static assets. + * See {@link IStaticAssets} + */ + staticAssets: IStaticAssets; + /** * The CSP config used for Kibana. */ @@ -361,6 +368,12 @@ export interface HttpServiceStart { */ basePath: IBasePath; + /** + * APIs for creating hrefs to static assets. + * See {@link IStaticAssets} + */ + staticAssets: IStaticAssets; + /** * Auth status. * See {@link HttpAuth} diff --git a/packages/core/http/core-http-server/src/static_assets.ts b/packages/core/http/core-http-server/src/static_assets.ts new file mode 100644 index 0000000000000..c0cc8597d1540 --- /dev/null +++ b/packages/core/http/core-http-server/src/static_assets.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 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. + */ + +/** + * APIs for creating hrefs to static assets. + * + * @public + */ +export interface IStaticAssets { + /** + * Gets the full href to the current plugin's asset, + * given its path relative to the plugin's `public/assets` folder. + * + * @example + * ```ts + * // I want to retrieve the href for the asset stored under `my_plugin/public/assets/some_folder/asset.png`: + * const assetHref = core.http.statisAssets.getPluginAssetHref('some_folder/asset.png'); + * ``` + */ + getPluginAssetHref(assetPath: string): string; +} diff --git a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.ts b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.ts index ca818f9f79dc7..a50de7ca3f5e7 100644 --- a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.ts +++ b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/injected_metadata_service.ts @@ -48,6 +48,10 @@ export class InjectedMetadataService { return this.state.publicBaseUrl; }, + getAssetsHrefBase: () => { + return this.state.assetsHrefBase; + }, + getAnonymousStatusPage: () => { return this.state.anonymousStatusPage; }, diff --git a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/types.ts b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/types.ts index 67c9c6ff4d665..3b996e68e50b3 100644 --- a/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/types.ts +++ b/packages/core/injected-metadata/core-injected-metadata-browser-internal/src/types.ts @@ -29,6 +29,7 @@ export interface InternalInjectedMetadataSetup { getBasePath: () => string; getServerBasePath: () => string; getPublicBaseUrl: () => string | undefined; + getAssetsHrefBase: () => string; getKibanaBuildNumber: () => number; getKibanaBranch: () => string; getKibanaVersion: () => string; diff --git a/packages/core/injected-metadata/core-injected-metadata-browser-mocks/src/injected_metadata_service.mock.ts b/packages/core/injected-metadata/core-injected-metadata-browser-mocks/src/injected_metadata_service.mock.ts index 98f1f8c65c37f..3d76d48cbdb9b 100644 --- a/packages/core/injected-metadata/core-injected-metadata-browser-mocks/src/injected_metadata_service.mock.ts +++ b/packages/core/injected-metadata/core-injected-metadata-browser-mocks/src/injected_metadata_service.mock.ts @@ -16,6 +16,7 @@ const createSetupContractMock = () => { const setupContract: jest.Mocked = { getBasePath: jest.fn(), getServerBasePath: jest.fn(), + getAssetsHrefBase: jest.fn(), getPublicBaseUrl: jest.fn(), getKibanaVersion: jest.fn(), getKibanaBranch: jest.fn(), @@ -31,6 +32,9 @@ const createSetupContractMock = () => { getKibanaBuildNumber: jest.fn(), getCustomBranding: jest.fn(), }; + setupContract.getBasePath.mockReturnValue('/base-path'); + setupContract.getServerBasePath.mockReturnValue('/server-base-path'); + setupContract.getAssetsHrefBase.mockReturnValue('/assets-base-path'); setupContract.getCspConfig.mockReturnValue({ warnLegacyBrowsers: true }); setupContract.getExternalUrlConfig.mockReturnValue({ policy: [] }); setupContract.getKibanaVersion.mockReturnValue('kibanaVersion'); diff --git a/packages/core/injected-metadata/core-injected-metadata-common-internal/src/types.ts b/packages/core/injected-metadata/core-injected-metadata-common-internal/src/types.ts index 944ec94554b25..dd9d6bced5c98 100644 --- a/packages/core/injected-metadata/core-injected-metadata-common-internal/src/types.ts +++ b/packages/core/injected-metadata/core-injected-metadata-common-internal/src/types.ts @@ -42,6 +42,7 @@ export interface InjectedMetadata { basePath: string; serverBasePath: string; publicBaseUrl?: string; + assetsHrefBase: string; clusterInfo: InjectedMetadataClusterInfo; env: { mode: EnvironmentMode; diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts index 9ef51b986458c..396c834082422 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts @@ -9,10 +9,12 @@ import type { CoreSetup } from '@kbn/core-lifecycle-browser'; import type { InternalApplicationSetup } from '@kbn/core-application-browser-internal'; import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; +import type { InternalHttpSetup } from '@kbn/core-http-browser-internal'; /** @internal */ export interface InternalCoreSetup - extends Omit { + extends Omit { application: InternalApplicationSetup; injectedMetadata: InternalInjectedMetadataSetup; + http: InternalHttpSetup; } diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts index f6b20626cd561..1806f52b8292d 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts @@ -9,9 +9,11 @@ import type { CoreStart } from '@kbn/core-lifecycle-browser'; import type { InternalApplicationStart } from '@kbn/core-application-browser-internal'; import type { InternalInjectedMetadataStart } from '@kbn/core-injected-metadata-browser-internal'; +import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; /** @internal */ -export interface InternalCoreStart extends Omit { +export interface InternalCoreStart extends Omit { application: InternalApplicationStart; injectedMetadata: InternalInjectedMetadataStart; + http: InternalHttpStart; } diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json index 5f6dcff8fd678..7d5c7fd5c06fd 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json @@ -14,7 +14,8 @@ "kbn_references": [ "@kbn/core-lifecycle-browser", "@kbn/core-application-browser-internal", - "@kbn/core-injected-metadata-browser-internal" + "@kbn/core-injected-metadata-browser-internal", + "@kbn/core-http-browser-internal" ], "exclude": [ "target/**/*", diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts index 604eb86093758..94ada11ac5b24 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugin_context.ts @@ -82,7 +82,13 @@ export function createPluginSetupContext< customBranding: deps.customBranding, fatalErrors: deps.fatalErrors, executionContext: deps.executionContext, - http: deps.http, + http: { + ...deps.http, + staticAssets: { + getPluginAssetHref: (assetPath: string) => + deps.http.staticAssets.getPluginAssetHref(plugin.name, assetPath), + }, + }, notifications: deps.notifications, uiSettings: deps.uiSettings, settings: deps.settings, @@ -133,7 +139,13 @@ export function createPluginStartContext< customBranding: deps.customBranding, docLinks: deps.docLinks, executionContext: deps.executionContext, - http: deps.http, + http: { + ...deps.http, + staticAssets: { + getPluginAssetHref: (assetPath: string) => + deps.http.staticAssets.getPluginAssetHref(plugin.name, assetPath), + }, + }, chrome: omit(deps.chrome, 'getComponent'), i18n: deps.i18n, notifications: deps.notifications, diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts index 00c056a20d87d..c1c612d387204 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts @@ -104,6 +104,10 @@ describe('PluginsService', () => { application: expect.any(Object), plugins: expect.any(Object), getStartServices: expect.any(Function), + http: { + ...mockSetupDeps.http, + staticAssets: expect.any(Object), + }, }; // @ts-expect-error this file was not being type checked properly in the past, error is legit mockStartDeps = { @@ -128,6 +132,10 @@ describe('PluginsService', () => { application: expect.any(Object), plugins: expect.any(Object), chrome: omit(mockStartDeps.chrome, 'getComponent'), + http: { + ...mockStartDeps.http, + staticAssets: expect.any(Object), + }, }; // Reset these for each test. diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts index 8d493e78aae8b..c3ed7f6a433b9 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts @@ -235,6 +235,10 @@ export function createPluginSetupContext({ registerOnPostAuth: deps.http.registerOnPostAuth, registerOnPreResponse: deps.http.registerOnPreResponse, basePath: deps.http.basePath, + staticAssets: { + getPluginAssetHref: (assetPath: string) => + deps.http.staticAssets.getPluginAssetHref(plugin.name, assetPath), + }, csp: deps.http.csp, getServerInfo: deps.http.getServerInfo, }, @@ -324,6 +328,10 @@ export function createPluginStartContext({ auth: deps.http.auth, basePath: deps.http.basePath, getServerInfo: deps.http.getServerInfo, + staticAssets: { + getPluginAssetHref: (assetPath: string) => + deps.http.staticAssets.getPluginAssetHref(plugin.name, assetPath), + }, }, savedObjects: { getScopedClient: deps.savedObjects.getScopedClient, diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugins_service.ts b/packages/core/plugins/core-plugins-server-internal/src/plugins_service.ts index bfa6b6ab5a222..03327b1d7be52 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugins_service.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugins_service.ts @@ -201,7 +201,7 @@ export class PluginsService this.log.debug('Stopping plugins service'); if (!this.arePrebootPluginsStopped) { - this.arePrebootPluginsStopped = false; + this.arePrebootPluginsStopped = true; await this.prebootPluginsSystem.stopPlugins(); } diff --git a/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap b/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap index d444959de3c9e..535624e4a8320 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap +++ b/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap @@ -3,6 +3,7 @@ exports[`RenderingService preboot() render() renders "core" CDN url injected 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "http://foo.bar:1773", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -70,6 +71,7 @@ Object { exports[`RenderingService preboot() render() renders "core" page 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -133,6 +135,7 @@ Object { exports[`RenderingService preboot() render() renders "core" page driven by settings 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -200,6 +203,7 @@ Object { exports[`RenderingService preboot() render() renders "core" page for blank basepath 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "", "branch": Any, "buildNumber": Any, @@ -263,6 +267,7 @@ Object { exports[`RenderingService preboot() render() renders "core" page for unauthenticated requests 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -326,6 +331,7 @@ Object { exports[`RenderingService preboot() render() renders "core" page with global settings 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -393,6 +399,7 @@ Object { exports[`RenderingService preboot() render() renders "core" with excluded global user settings 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -456,6 +463,7 @@ Object { exports[`RenderingService preboot() render() renders "core" with excluded user settings 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -519,6 +527,7 @@ Object { exports[`RenderingService setup() render() renders "core" CDN url injected 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -591,6 +600,7 @@ Object { exports[`RenderingService setup() render() renders "core" page 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -654,6 +664,7 @@ Object { exports[`RenderingService setup() render() renders "core" page driven by settings 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -726,6 +737,7 @@ Object { exports[`RenderingService setup() render() renders "core" page for blank basepath 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "", "branch": Any, "buildNumber": Any, @@ -794,6 +806,7 @@ Object { exports[`RenderingService setup() render() renders "core" page for unauthenticated requests 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -857,6 +870,7 @@ Object { exports[`RenderingService setup() render() renders "core" page with global settings 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -929,6 +943,7 @@ Object { exports[`RenderingService setup() render() renders "core" with excluded global user settings 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, @@ -997,6 +1012,7 @@ Object { exports[`RenderingService setup() render() renders "core" with excluded user settings 1`] = ` Object { "anonymousStatusPage": false, + "assetsHrefBase": "/mock-server-basepath", "basePath": "/mock-server-basepath", "branch": Any, "buildNumber": Any, diff --git a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx index 1791f55e563b6..f5bb1f5fa115f 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx +++ b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx @@ -209,6 +209,7 @@ export class RenderingService { basePath, serverBasePath, publicBaseUrl, + assetsHrefBase: staticAssetsHrefBase, env, clusterInfo, anonymousStatusPage: status?.isStatusPageAnonymous() ?? false, diff --git a/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts b/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts index 0493652b1192f..a5e112ca2aa74 100644 --- a/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts +++ b/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts @@ -7,7 +7,8 @@ */ import { pick, throttle, cloneDeep } from 'lodash'; -import type { HttpSetup, HttpFetchOptions } from '@kbn/core-http-browser'; +import type { HttpFetchOptions } from '@kbn/core-http-browser'; +import type { InternalHttpSetup } from '@kbn/core-http-browser-internal'; import type { SavedObject, SavedObjectTypeIdTuple } from '@kbn/core-saved-objects-common'; import type { SavedObjectsBulkResolveResponse as SavedObjectsBulkResolveResponseServer, @@ -106,7 +107,7 @@ const getObjectsToResolve = (queue: BatchResolveQueueEntry[]) => { * @deprecated See https://github.com/elastic/kibana/issues/149098 */ export class SavedObjectsClient implements SavedObjectsClientContract { - private http: HttpSetup; + private http: InternalHttpSetup; private batchGetQueue: BatchGetQueueEntry[]; private batchResolveQueue: BatchResolveQueueEntry[]; @@ -180,7 +181,7 @@ export class SavedObjectsClient implements SavedObjectsClientContract { ); /** @internal */ - constructor(http: HttpSetup) { + constructor(http: InternalHttpSetup) { this.http = http; this.batchGetQueue = []; this.batchResolveQueue = []; diff --git a/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts b/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts index 7cef8a1c39057..f806dc6b69ef0 100644 --- a/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts +++ b/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts @@ -7,7 +7,7 @@ */ import type { CoreService } from '@kbn/core-base-browser-internal'; -import type { HttpStart } from '@kbn/core-http-browser'; +import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { SavedObjectsStart } from '@kbn/core-saved-objects-browser'; import { SavedObjectsClient } from './saved_objects_client'; @@ -17,7 +17,7 @@ import { SavedObjectsClient } from './saved_objects_client'; export class SavedObjectsService implements CoreService { public async setup() {} - public async start({ http }: { http: HttpStart }): Promise { + public async start({ http }: { http: InternalHttpStart }): Promise { return { client: new SavedObjectsClient(http) }; } diff --git a/packages/core/saved-objects/core-saved-objects-browser-internal/tsconfig.json b/packages/core/saved-objects/core-saved-objects-browser-internal/tsconfig.json index a29dbf58b4117..d9b414c39220e 100644 --- a/packages/core/saved-objects/core-saved-objects-browser-internal/tsconfig.json +++ b/packages/core/saved-objects/core-saved-objects-browser-internal/tsconfig.json @@ -19,6 +19,7 @@ "@kbn/core-saved-objects-api-server", "@kbn/core-saved-objects-api-browser", "@kbn/core-http-browser-mocks", + "@kbn/core-http-browser-internal", ], "exclude": [ "target/**/*", diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/__snapshots__/ui_settings_api.test.ts.snap b/packages/core/ui-settings/core-ui-settings-browser-internal/src/__snapshots__/ui_settings_api.test.ts.snap index b80765e3536c9..eb5eb00c04ee3 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/__snapshots__/ui_settings_api.test.ts.snap +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/__snapshots__/ui_settings_api.test.ts.snap @@ -253,3 +253,26 @@ Array [ ], ] `; + +exports[`#validate rejects on 301 1`] = `"Moved Permanently"`; + +exports[`#validate rejects on 404 response 1`] = `"Request failed with status code: 404"`; + +exports[`#validate rejects on 500 1`] = `"Request failed with status code: 500"`; + +exports[`#validate sends a validation request: validation request 1`] = ` +Array [ + Array [ + "/foo/bar/internal/kibana/settings/foo/validate", + Object { + "headers": Object { + "accept": "application/json", + "content-type": "application/json", + "kbn-version": "kibanaVersion", + "x-elastic-internal-origin": "Kibana", + }, + "method": "POST", + }, + ], +] +`; diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/settings_service.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/settings_service.ts index edda603644fa2..202f8ceb1206d 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/settings_service.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/settings_service.ts @@ -9,14 +9,14 @@ import { Subject } from 'rxjs'; import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; -import type { HttpSetup } from '@kbn/core-http-browser'; +import type { InternalHttpSetup } from '@kbn/core-http-browser-internal'; import type { SettingsStart, SettingsSetup } from '@kbn/core-ui-settings-browser'; import { UiSettingsApi } from './ui_settings_api'; import { UiSettingsClient } from './ui_settings_client'; import { UiSettingsGlobalClient } from './ui_settings_global_client'; export interface SettingsServiceDeps { - http: HttpSetup; + http: InternalHttpSetup; injectedMetadata: InternalInjectedMetadataSetup; } diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.test.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.test.ts index 9fbbb4045583a..992e2230988de 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.test.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.test.ts @@ -345,3 +345,45 @@ describe('#stop', () => { await batchSetPromise; }); }); + +describe('#validate', () => { + it('sends a validation request', async () => { + fetchMock.mock('*', { + body: { errorMessage: 'Test validation error message.' }, + }); + + const { uiSettingsApi } = setup(); + await uiSettingsApi.validate('foo', 'bar'); + expect(fetchMock.calls()).toMatchSnapshot('validation request'); + }); + + it('rejects on 404 response', async () => { + fetchMock.mock('*', { + status: 404, + body: 'not found', + }); + + const { uiSettingsApi } = setup(); + await expect(uiSettingsApi.validate('foo', 'bar')).rejects.toThrowErrorMatchingSnapshot(); + }); + + it('rejects on 301', async () => { + fetchMock.mock('*', { + status: 301, + body: 'redirect', + }); + + const { uiSettingsApi } = setup(); + await expect(uiSettingsApi.validate('foo', 'bar')).rejects.toThrowErrorMatchingSnapshot(); + }); + + it('rejects on 500', async () => { + fetchMock.mock('*', { + status: 500, + body: 'redirect', + }); + + const { uiSettingsApi } = setup(); + await expect(uiSettingsApi.validate('foo', 'bar')).rejects.toThrowErrorMatchingSnapshot(); + }); +}); diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.ts index c96232b9f9b48..c26d2369d4e08 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.ts @@ -7,7 +7,7 @@ */ import { BehaviorSubject } from 'rxjs'; -import type { HttpSetup } from '@kbn/core-http-browser'; +import type { InternalHttpSetup } from '@kbn/core-http-browser-internal'; import type { UiSettingsState } from '@kbn/core-ui-settings-browser'; import { UiSettingsScope } from '@kbn/core-ui-settings-common'; @@ -16,6 +16,11 @@ export interface UiSettingsApiResponse { settings: UiSettingsState; } +export interface ValidationApiResponse { + valid: boolean; + errorMessage?: string; +} + interface Changes { values: { [key: string]: any; @@ -37,7 +42,7 @@ export class UiSettingsApi { private readonly loadingCount$ = new BehaviorSubject(0); - constructor(private readonly http: HttpSetup) {} + constructor(private readonly http: InternalHttpSetup) {} /** * Adds a key+value that will be sent to the server ASAP. If a request is @@ -94,6 +99,15 @@ export class UiSettingsApi { }); } + /** + * Sends a validation request to the server for the provided key+value pair. + */ + public async validate(key: string, value: any): Promise { + return await this.sendRequest('POST', `/internal/kibana/settings/${key}/validate`, { + value, + }); + } + /** * Gets an observable that notifies subscribers of the current number of active requests */ diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.test.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.test.ts index 8e8a4af6aa00c..58da98f91e105 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.test.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.test.ts @@ -10,6 +10,9 @@ import { Subject } from 'rxjs'; import { materialize, take, toArray } from 'rxjs/operators'; import { UiSettingsClient } from './ui_settings_client'; +import { ValidationApiResponse } from './ui_settings_api'; + +const TEST_VALIDATION_ERROR_MESSAGE = 'Test validation message.'; let done$: Subject; @@ -22,6 +25,12 @@ function setup(options: { defaults?: any; initialSettings?: any } = {}) { const batchSetGlobal = jest.fn(() => ({ settings: {}, })); + const validate = jest.fn( + (): ValidationApiResponse => ({ + valid: false, + errorMessage: TEST_VALIDATION_ERROR_MESSAGE, + }) + ); done$ = new Subject(); const client = new UiSettingsClient({ defaults, @@ -29,11 +38,12 @@ function setup(options: { defaults?: any; initialSettings?: any } = {}) { api: { batchSet, batchSetGlobal, + validate, } as any, done$, }); - return { client, batchSet, batchSetGlobal }; + return { client, batchSet, batchSetGlobal, validate }; } afterEach(() => { @@ -283,3 +293,27 @@ describe('#getUpdate$', () => { expect(onComplete).toHaveBeenCalled(); }); }); + +describe('#validateValue', () => { + it('resolves to a ValueValidation', async () => { + const { client } = setup(); + + await expect(client.validateValue('foo', 'bar')).resolves.toMatchObject({ + successfulValidation: true, + valid: false, + errorMessage: TEST_VALIDATION_ERROR_MESSAGE, + }); + }); + + it('resolves to a ValueValidation on failure', async () => { + const { client, validate } = setup(); + + validate.mockImplementation(() => { + throw new Error('Error in request'); + }); + + await expect(client.validateValue('foo', 'bar')).resolves.toMatchObject({ + successfulValidation: false, + }); + }); +}); diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client_common.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client_common.ts index 65a3c44861ed5..cccb0f85bb0d7 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client_common.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client_common.ts @@ -128,6 +128,19 @@ You can use \`IUiSettingsClient.get("${key}", defaultValue)\`, which will just r return this.updateErrors$.asObservable(); } + async validateValue(key: string, value: unknown) { + try { + const resp = await this.api.validate(key, value); + const isValid = resp.valid; + return isValid + ? { successfulValidation: true, valid: true } + : { successfulValidation: true, valid: false, errorMessage: resp.errorMessage }; + } catch (error) { + this.updateErrors$.next(error); + return { successfulValidation: false }; + } + } + protected assertUpdateAllowed(key: string) { if (this.isOverridden(key)) { throw new Error( diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_service.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_service.ts index c531d18aded13..5827919f21ad5 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_service.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_service.ts @@ -9,14 +9,14 @@ import { Subject } from 'rxjs'; import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; -import type { HttpSetup } from '@kbn/core-http-browser'; +import type { InternalHttpSetup } from '@kbn/core-http-browser-internal'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import { UiSettingsApi } from './ui_settings_api'; import { UiSettingsClient } from './ui_settings_client'; export interface UiSettingsServiceDeps { - http: HttpSetup; + http: InternalHttpSetup; injectedMetadata: InternalInjectedMetadataSetup; } diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/tsconfig.json b/packages/core/ui-settings/core-ui-settings-browser-internal/tsconfig.json index 0beed2d6ddfb0..bcedc9db9175e 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/tsconfig.json +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/tsconfig.json @@ -12,12 +12,12 @@ ], "kbn_references": [ "@kbn/core-test-helpers-http-setup-browser", - "@kbn/core-http-browser", "@kbn/core-ui-settings-browser", "@kbn/core-ui-settings-common", "@kbn/core-http-browser-mocks", "@kbn/core-injected-metadata-browser-mocks", "@kbn/core-injected-metadata-browser-internal", + "@kbn/core-http-browser-internal", ], "exclude": [ "target/**/*", diff --git a/packages/core/ui-settings/core-ui-settings-browser-mocks/src/client.mock.ts b/packages/core/ui-settings/core-ui-settings-browser-mocks/src/client.mock.ts index 0f7c9a6bd0ad5..93ca7d065b0fd 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-mocks/src/client.mock.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-mocks/src/client.mock.ts @@ -22,6 +22,7 @@ export const clientMock = () => { isOverridden: jest.fn(), getUpdate$: jest.fn(), getUpdateErrors$: jest.fn(), + validateValue: jest.fn(), }; mock.get$.mockReturnValue(new Subject()); mock.getUpdate$.mockReturnValue(new Subject()); diff --git a/packages/core/ui-settings/core-ui-settings-browser/src/types.ts b/packages/core/ui-settings/core-ui-settings-browser/src/types.ts index 1227df2309265..6927506a5338b 100644 --- a/packages/core/ui-settings/core-ui-settings-browser/src/types.ts +++ b/packages/core/ui-settings/core-ui-settings-browser/src/types.ts @@ -16,6 +16,12 @@ export interface UiSettingsState { [key: string]: PublicUiSettingsParams & UserProvidedValues; } +export interface ValueValidation { + successfulValidation: boolean; + valid?: boolean; + errorMessage?: string; +} + /** * Client-side client that provides access to the advanced settings stored in elasticsearch. * The settings provide control over the behavior of the Kibana application. @@ -100,6 +106,11 @@ export interface IUiSettingsClient { * the settings, containing the actual Error class. */ getUpdateErrors$: () => Observable; + + /** + * Validates a uiSettings value and returns a ValueValidation object. + */ + validateValue: (key: string, value: any) => Promise; } /** @public */ diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/clients/base_ui_settings_client.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/clients/base_ui_settings_client.ts index 2d6e2d93a4313..90205f8afa643 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/clients/base_ui_settings_client.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/clients/base_ui_settings_client.ts @@ -10,6 +10,7 @@ import { omit } from 'lodash'; import type { Logger } from '@kbn/logging'; import type { UiSettingsParams, UserProvidedValues } from '@kbn/core-ui-settings-common'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-server'; +import { ValidationBadValueError, ValidationSettingNotFoundError } from '../ui_settings_errors'; export interface BaseUiSettingsDefaultsClientOptions { overrides?: Record; @@ -72,6 +73,24 @@ export abstract class BaseUiSettingsClient implements IUiSettingsClient { return !!definition?.sensitive; } + async validate(key: string, value: unknown) { + if (!value) { + throw new ValidationBadValueError(); + } + const definition = this.defaults[key]; + if (!definition) { + throw new ValidationSettingNotFoundError(key); + } + if (definition.schema) { + try { + definition.schema.validate(value); + } catch (error) { + return { valid: false, errorMessage: error.message }; + } + } + return { valid: true }; + } + protected validateKey(key: string, value: unknown) { const definition = this.defaults[key]; if (value === null || definition === undefined) return; diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/clients/ui_settings_client.test.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/clients/ui_settings_client.test.ts index b00517d259a48..7baa7afad9b25 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/clients/ui_settings_client.test.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/clients/ui_settings_client.test.ts @@ -13,7 +13,11 @@ import { mockCreateOrUpgradeSavedConfig } from './ui_settings_client.test.mock'; import { SavedObjectsClient } from '@kbn/core-saved-objects-api-server-internal'; import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; import { UiSettingsClient } from './ui_settings_client'; -import { CannotOverrideError } from '../ui_settings_errors'; +import { + CannotOverrideError, + ValidationBadValueError, + ValidationSettingNotFoundError, +} from '../ui_settings_errors'; const logger = loggingSystemMock.create().get(); @@ -732,6 +736,48 @@ describe('ui settings', () => { }); }); + describe('#validate()', () => { + it('returns a correct validation response for an existing setting key and an invalid value', async () => { + const defaults = { foo: { schema: schema.number() } }; + const { uiSettings } = setup({ defaults }); + + expect(await uiSettings.validate('foo', 'testValue')).toMatchObject({ + valid: false, + errorMessage: 'expected value of type [number] but got [string]', + }); + }); + + it('returns a correct validation response for an existing setting key and a valid value', async () => { + const defaults = { foo: { schema: schema.number() } }; + const { uiSettings } = setup({ defaults }); + + expect(await uiSettings.validate('foo', 5)).toMatchObject({ valid: true }); + }); + + it('throws for a non-existing setting key', async () => { + const { uiSettings } = setup(); + + try { + await uiSettings.validate('bar', 5); + } catch (error) { + expect(error).toBeInstanceOf(ValidationSettingNotFoundError); + expect(error.message).toBe('Setting with a key [bar] does not exist.'); + } + }); + + it('throws for a null value', async () => { + const defaults = { foo: { schema: schema.number() } }; + const { uiSettings } = setup({ defaults }); + + try { + await uiSettings.validate('foo', null); + } catch (error) { + expect(error).toBeInstanceOf(ValidationBadValueError); + expect(error.message).toBe('No value was specified.'); + } + }); + }); + describe('caching', () => { describe('read operations cache user config', () => { beforeEach(() => { diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/index.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/index.ts index e15ded76ab6b8..dccadb6c02f68 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/index.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/index.ts @@ -11,10 +11,12 @@ import { registerInternalDeleteRoute } from './delete'; import { registerInternalGetRoute } from './get'; import { registerInternalSetManyRoute } from './set_many'; import { registerInternalSetRoute } from './set'; +import { registerInternalValidateRoute } from './validate'; export function registerInternalRoutes(router: InternalUiSettingsRouter) { registerInternalGetRoute(router); registerInternalDeleteRoute(router); registerInternalSetRoute(router); registerInternalSetManyRoute(router); + registerInternalValidateRoute(router); } diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/validate.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/validate.ts new file mode 100644 index 0000000000000..83f119c658a85 --- /dev/null +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/validate.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { schema } from '@kbn/config-schema'; +import { KibanaRequest, KibanaResponseFactory } from '@kbn/core-http-server'; +import { IUiSettingsClient } from '@kbn/core-ui-settings-server'; +import { ValidationBadValueError, ValidationSettingNotFoundError } from '../../ui_settings_errors'; +import type { + InternalUiSettingsRequestHandlerContext, + InternalUiSettingsRouter, +} from '../../internal_types'; + +export function registerInternalValidateRoute(router: InternalUiSettingsRouter) { + const validateFromRequest = async ( + uiSettingsClient: IUiSettingsClient, + context: InternalUiSettingsRequestHandlerContext, + request: KibanaRequest< + Readonly<{} & { key: string }>, + unknown, + Readonly<{ value?: any } & {}>, + 'post' + >, + response: KibanaResponseFactory + ) => { + try { + const { key } = request.params; + const { value } = request.body; + + const { valid, errorMessage } = await uiSettingsClient.validate(key, value); + + return response.ok({ + body: { + valid, + errorMessage, + }, + }); + } catch (error) { + if (error instanceof ValidationSettingNotFoundError) { + return response.notFound({ body: error }); + } + + if (error instanceof ValidationBadValueError) { + return response.badRequest({ body: error }); + } + + throw error; + } + }; + router.post( + { + path: '/internal/kibana/settings/{key}/validate', + validate: { + params: schema.object({ + key: schema.string(), + }), + body: schema.object({ + value: schema.any(), + }), + }, + options: { access: 'internal' }, + }, + async (context, request, response) => { + const uiSettingsClient = (await context.core).uiSettings.client; + return await validateFromRequest(uiSettingsClient, context, request, response); + } + ); +} diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_errors.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_errors.ts index 755ed6447c5ed..93cec94bc71ad 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_errors.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_errors.ts @@ -27,3 +27,15 @@ export class SettingNotRegisteredError extends Error { ); } } + +export class ValidationSettingNotFoundError extends Error { + constructor(key: string) { + super(`Setting with a key [${key}] does not exist.`); + } +} + +export class ValidationBadValueError extends Error { + constructor() { + super('No value was specified.'); + } +} diff --git a/packages/core/ui-settings/core-ui-settings-server-mocks/src/ui_settings_service.mock.ts b/packages/core/ui-settings/core-ui-settings-server-mocks/src/ui_settings_service.mock.ts index 280d75319a8bf..7149da0d517b6 100644 --- a/packages/core/ui-settings/core-ui-settings-server-mocks/src/ui_settings_service.mock.ts +++ b/packages/core/ui-settings/core-ui-settings-server-mocks/src/ui_settings_service.mock.ts @@ -27,6 +27,7 @@ const createClientMock = () => { removeMany: jest.fn(), isOverridden: jest.fn(), isSensitive: jest.fn(), + validate: jest.fn(), }; mocked.get.mockResolvedValue(false); mocked.getAll.mockResolvedValue({}); diff --git a/packages/core/ui-settings/core-ui-settings-server/src/ui_settings_client.ts b/packages/core/ui-settings/core-ui-settings-server/src/ui_settings_client.ts index 9a297109002de..d4b16ae6ffe1c 100644 --- a/packages/core/ui-settings/core-ui-settings-server/src/ui_settings_client.ts +++ b/packages/core/ui-settings/core-ui-settings-server/src/ui_settings_client.ts @@ -8,6 +8,11 @@ import type { UserProvidedValues, UiSettingsParams } from '@kbn/core-ui-settings-common'; +interface ValueValidation { + valid: boolean; + errorMessage?: string; +} + /** * Server-side client that provides access to the advanced settings stored in elasticsearch. * The settings provide control over the behavior of the Kibana application. @@ -57,4 +62,8 @@ export interface IUiSettingsClient { * Shows whether the uiSetting is a sensitive value. Used by telemetry to not send sensitive values. */ isSensitive: (key: string) => boolean; + /** + * Validates the uiSettings value and returns a ValueValidation object. + */ + validate: (key: string, value: unknown) => Promise; } diff --git a/packages/home/sample_data_card/src/sample_data_card.tsx b/packages/home/sample_data_card/src/sample_data_card.tsx index a8da0a7494da4..a952431c50971 100644 --- a/packages/home/sample_data_card/src/sample_data_card.tsx +++ b/packages/home/sample_data_card/src/sample_data_card.tsx @@ -6,11 +6,10 @@ * Side Public License, v 1. */ -import React, { useMemo } from 'react'; +import React from 'react'; import { useEuiTheme } from '@elastic/eui'; import type { SampleDataSet } from '@kbn/home-sample-data-types'; -import { useServices } from './services'; import { SampleDataCard as Component, Props as ComponentProps } from './sample_data_card.component'; /** @@ -27,12 +26,10 @@ export interface Props extends Pick { * function. */ export const SampleDataCard = ({ sampleDataSet, onStatusChange }: Props) => { - const { addBasePath } = useServices(); const { colorMode } = useEuiTheme(); const { darkPreviewImagePath, previewImagePath } = sampleDataSet; - const path = + const imagePath = colorMode === 'DARK' && darkPreviewImagePath ? darkPreviewImagePath : previewImagePath; - const imagePath = useMemo(() => addBasePath(path), [addBasePath, path]); return ; }; diff --git a/packages/kbn-apm-synthtrace-client/index.ts b/packages/kbn-apm-synthtrace-client/index.ts index 04bef11e3f657..c1f2bd25750c0 100644 --- a/packages/kbn-apm-synthtrace-client/index.ts +++ b/packages/kbn-apm-synthtrace-client/index.ts @@ -33,3 +33,4 @@ export { dedot } from './src/lib/utils/dedot'; export { generateLongId, generateShortId } from './src/lib/utils/generate_id'; export { appendHash, hashKeysOf } from './src/lib/utils/hash'; export type { ESDocumentWithOperation, SynthtraceESAction, SynthtraceGenerator } from './src/types'; +export { log, type LogDocument } from './src/lib/logs'; diff --git a/packages/kbn-apm-synthtrace-client/kibana.jsonc b/packages/kbn-apm-synthtrace-client/kibana.jsonc index 99055f3da4fe9..a50ec2be221d0 100644 --- a/packages/kbn-apm-synthtrace-client/kibana.jsonc +++ b/packages/kbn-apm-synthtrace-client/kibana.jsonc @@ -2,5 +2,5 @@ "type": "shared-common", "id": "@kbn/apm-synthtrace-client", "devOnly": true, - "owner": "@elastic/obs-ux-infra_services-team" + "owner": ["@elastic/obs-ux-infra_services-team", "@elastic/obs-ux-logs-team"] } diff --git a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts new file mode 100644 index 0000000000000..3453bee1d7369 --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Fields } from '../entity'; +import { Serializable } from '../serializable'; + +export type LogDocument = Fields & + Partial<{ + 'input.type': string; + 'log.file.path'?: string; + 'service.name'?: string; + 'data_stream.namespace': string; + 'data_stream.type': string; + 'data_stream.dataset': string; + message?: string; + 'event.dataset': string; + 'log.level'?: string; + 'host.name'?: string; + 'trace.id'?: string; + 'agent.id'?: string; + 'agent.name'?: string; + 'orchestrator.cluster.name'?: string; + 'orchestrator.cluster.id'?: string; + 'orchestrator.resource.id'?: string; + 'cloud.provider'?: string; + 'cloud.region'?: string; + 'cloud.availability_zone'?: string; + 'cloud.project.id'?: string; + 'cloud.instance.id'?: string; + }>; + +class Log extends Serializable { + service(name: string) { + this.fields['service.name'] = name; + return this; + } + + namespace(value: string) { + this.fields['data_stream.namespace'] = value; + return this; + } + + dataset(value: string) { + this.fields['data_stream.dataset'] = value; + this.fields['event.dataset'] = value; + return this; + } + + logLevel(level: string) { + this.fields['log.level'] = level; + return this; + } + + message(message: string) { + this.fields.message = message; + return this; + } +} + +function create(): Log { + return new Log({ + 'input.type': 'logs', + 'data_stream.namespace': 'default', + 'data_stream.type': 'logs', + 'data_stream.dataset': 'synth', + 'event.dataset': 'synth', + 'host.name': 'synth-host', + }); +} + +export const log = { + create, +}; diff --git a/packages/kbn-apm-synthtrace/README.md b/packages/kbn-apm-synthtrace/README.md index 6a6d0b726a5e4..6daad014ff0e5 100644 --- a/packages/kbn-apm-synthtrace/README.md +++ b/packages/kbn-apm-synthtrace/README.md @@ -21,6 +21,7 @@ This library can currently be used in two ways: - `Instance`: a single instance of a monitored service. E.g., the workload for a monitored service might be spread across multiple containers. An `Instance` object contains fields like `service.node.name` and `container.id`. - `Timerange`: an object that will return an array of timestamps based on an interval and a rate. These timestamps can be used to generate events/metricsets. - `Transaction`, `Span`, `APMError` and `Metricset`: events/metricsets that occur on an instance. For more background, see the [explanation of the APM data model](https://www.elastic.co/guide/en/apm/get-started/7.15/apm-data-model.html) +- `Log`: An instance of Log generating Service which supports additional helpers to customise fields like `messages`, `logLevel` #### Example @@ -109,12 +110,22 @@ node scripts/synthtrace simple_trace.ts --target=http://admin:changeme@localhost The script will try to automatically find bootstrapped APM indices. **If these indices do not exist, the script will exit with an error. It will not bootstrap the indices itself.** +### Understanding Scenario Files + +Scenario files accept 3 arguments, 2 of them optional and 1 mandatory + +| Arguments | Type | Description | +|-------------|:----------|------------------------------------------------------------------------------------------------------------------------------------------------------| +| `generate` | mandatory | This is the main function responsible for returning the events which will be indexed | +| `bootstrap` | optional | In case some setup needs to be done, before the data is generated, this function provides access to all available ES Clients to play with | +| `setClient` | optional | By default the apmEsClient used to generate data. If anyother client like logsEsClient needs to be used instead, this is where it should be returned | + The following options are supported: ### Connection options | Option | Type | Default | Description | -| ------------------- | -------- | :------ | ------------------------------------------------------------------------------------------ | +|---------------------|----------|:--------|--------------------------------------------------------------------------------------------| | `--target` | [string] | | Elasticsearch target | | `--kibana` | [string] | | Kibana target, used to bootstrap datastreams/mappings/templates/settings | | `--versionOverride` | [string] | | String to be used for `observer.version`. Defauls to the version of the installed package. | @@ -129,12 +140,11 @@ Note: ### Scenario options | Option | Type | Default | Description | -| ---------------- | --------- | :------ | ------------------------------------ | +|------------------|-----------|:--------|--------------------------------------| | `--from` | [date] | `now()` | The start of the time window | | `--to` | [date] | | The end of the time window | | `--live` | [boolean] | | Generate and index data continuously | | `--scenarioOpts` | | | Raw options specific to the scenario | - Note: - The default `--to` is `15m`. @@ -143,11 +153,12 @@ Note: ### Setup options -| Option | Type | Default | Description | -| ------------ | --------- | :------ | --------------------------------------- | -| `--clean` | [boolean] | `false` | Clean APM data before indexing new data | -| `--workers` | [number] | | Amount of Node.js worker threads | -| `--logLevel` | [enum] | `info` | Log level | +| Option | Type | Default | Description | +|--------------|-----------|:--------|-------------------------------------------------------------------------| +| `--clean` | [boolean] | `false` | Clean APM data before indexing new data | +| `--workers` | [number] | | Amount of Node.js worker threads | +| `--logLevel` | [enum] | `info` | Log level | +| `--type` | [string] | `apm` | Type of data to be generated, `log` must be passed when generating logs | ## Testing diff --git a/packages/kbn-apm-synthtrace/index.ts b/packages/kbn-apm-synthtrace/index.ts index 921243e67ac6a..880b97cac2a8f 100644 --- a/packages/kbn-apm-synthtrace/index.ts +++ b/packages/kbn-apm-synthtrace/index.ts @@ -17,6 +17,8 @@ export { AssetsSynthtraceEsClient } from './src/lib/assets/assets_synthtrace_es_ export { MonitoringSynthtraceEsClient } from './src/lib/monitoring/monitoring_synthtrace_es_client'; +export { LogsSynthtraceEsClient } from './src/lib/logs/logs_synthtrace_es_client'; + export { addObserverVersionTransform, deleteSummaryFieldTransform, diff --git a/packages/kbn-apm-synthtrace/kibana.jsonc b/packages/kbn-apm-synthtrace/kibana.jsonc index 1b3ef5b846149..9c85fa210bdd9 100644 --- a/packages/kbn-apm-synthtrace/kibana.jsonc +++ b/packages/kbn-apm-synthtrace/kibana.jsonc @@ -2,5 +2,5 @@ "type": "shared-server", "id": "@kbn/apm-synthtrace", "devOnly": true, - "owner": "@elastic/obs-ux-infra_services-team" + "owner": ["@elastic/obs-ux-infra_services-team", "@elastic/obs-ux-logs-team"] } diff --git a/packages/kbn-apm-synthtrace/src/cli/scenario.ts b/packages/kbn-apm-synthtrace/src/cli/scenario.ts index f89d335749326..0ba4665f0ee0e 100644 --- a/packages/kbn-apm-synthtrace/src/cli/scenario.ts +++ b/packages/kbn-apm-synthtrace/src/cli/scenario.ts @@ -6,17 +6,24 @@ * Side Public License, v 1. */ -import { SynthtraceGenerator, Timerange } from '@kbn/apm-synthtrace-client'; -import { Readable } from 'stream'; -import { ApmSynthtraceEsClient } from '../lib/apm/client/apm_synthtrace_es_client'; +import { Timerange } from '@kbn/apm-synthtrace-client'; import { Logger } from '../lib/utils/create_logger'; import { RunOptions } from './utils/parse_run_cli_flags'; +import { ApmSynthtraceEsClient, LogsSynthtraceEsClient } from '../..'; +import { ScenarioReturnType } from '../lib/utils/with_client'; type Generate = (options: { range: Timerange; -}) => SynthtraceGenerator | Array> | Readable; + clients: { + apmEsClient: ApmSynthtraceEsClient; + logsEsClient: LogsSynthtraceEsClient; + }; +}) => ScenarioReturnType | Array>; export type Scenario = (options: RunOptions & { logger: Logger }) => Promise<{ - bootstrap?: (options: { apmEsClient: ApmSynthtraceEsClient }) => Promise; + bootstrap?: (options: { + apmEsClient: ApmSynthtraceEsClient; + logsEsClient: LogsSynthtraceEsClient; + }) => Promise; generate: Generate; }>; diff --git a/packages/kbn-apm-synthtrace/src/cli/utils/bootstrap.ts b/packages/kbn-apm-synthtrace/src/cli/utils/bootstrap.ts index c12f6fc6beb51..be0bd7ff6168a 100644 --- a/packages/kbn-apm-synthtrace/src/cli/utils/bootstrap.ts +++ b/packages/kbn-apm-synthtrace/src/cli/utils/bootstrap.ts @@ -7,7 +7,8 @@ */ import { createLogger } from '../../lib/utils/create_logger'; -import { getEsClient } from './get_es_client'; +import { getApmEsClient } from './get_apm_es_client'; +import { getLogsEsClient } from './get_logs_es_client'; import { getKibanaClient } from './get_kibana_client'; import { getServiceUrls } from './get_service_urls'; import { RunOptions } from './parse_run_cli_flags'; @@ -26,22 +27,30 @@ export async function bootstrap(runOptions: RunOptions) { const version = runOptions.versionOverride || latestPackageVersion; - const apmEsClient = getEsClient({ + const apmEsClient = getApmEsClient({ target: esUrl, logger, concurrency: runOptions.concurrency, version, }); + const logsEsClient = getLogsEsClient({ + target: esUrl, + logger, + concurrency: runOptions.concurrency, + }); + await kibanaClient.installApmPackage(latestPackageVersion); if (runOptions.clean) { await apmEsClient.clean(); + await logsEsClient.clean(); } return { logger, apmEsClient, + logsEsClient, version, kibanaUrl, esUrl, diff --git a/packages/kbn-apm-synthtrace/src/cli/utils/get_es_client.ts b/packages/kbn-apm-synthtrace/src/cli/utils/get_apm_es_client.ts similarity index 87% rename from packages/kbn-apm-synthtrace/src/cli/utils/get_es_client.ts rename to packages/kbn-apm-synthtrace/src/cli/utils/get_apm_es_client.ts index e5caf0dcc22bd..ee350ab3c56d8 100644 --- a/packages/kbn-apm-synthtrace/src/cli/utils/get_es_client.ts +++ b/packages/kbn-apm-synthtrace/src/cli/utils/get_apm_es_client.ts @@ -7,11 +7,11 @@ */ import { Client } from '@elastic/elasticsearch'; -import { ApmSynthtraceEsClient } from '../../lib/apm/client/apm_synthtrace_es_client'; +import { ApmSynthtraceEsClient } from '../../..'; import { Logger } from '../../lib/utils/create_logger'; import { RunOptions } from './parse_run_cli_flags'; -export function getEsClient({ +export function getApmEsClient({ target, logger, version, diff --git a/packages/kbn-apm-synthtrace/src/cli/utils/get_logs_es_client.ts b/packages/kbn-apm-synthtrace/src/cli/utils/get_logs_es_client.ts new file mode 100644 index 0000000000000..8bfcdaef90839 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/cli/utils/get_logs_es_client.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 { Client } from '@elastic/elasticsearch'; +import { LogsSynthtraceEsClient } from '../../lib/logs/logs_synthtrace_es_client'; +import { Logger } from '../../lib/utils/create_logger'; +import { RunOptions } from './parse_run_cli_flags'; + +export function getLogsEsClient({ + target, + logger, + concurrency, +}: Pick & { + target: string; + logger: Logger; +}) { + const client = new Client({ + node: target, + }); + + return new LogsSynthtraceEsClient({ + client, + logger, + concurrency, + }); +} diff --git a/packages/kbn-apm-synthtrace/src/cli/utils/start_live_data_upload.ts b/packages/kbn-apm-synthtrace/src/cli/utils/start_live_data_upload.ts index 4fe29e3c94930..669ee9b3e3275 100644 --- a/packages/kbn-apm-synthtrace/src/cli/utils/start_live_data_upload.ts +++ b/packages/kbn-apm-synthtrace/src/cli/utils/start_live_data_upload.ts @@ -14,6 +14,7 @@ import { awaitStream } from '../../lib/utils/wait_until_stream_finished'; import { bootstrap } from './bootstrap'; import { getScenario } from './get_scenario'; import { RunOptions } from './parse_run_cli_flags'; +import { SynthtraceEsClient } from '../../lib/utils/with_client'; export async function startLiveDataUpload({ runOptions, @@ -24,7 +25,7 @@ export async function startLiveDataUpload({ }) { const file = runOptions.file; - const { logger, apmEsClient } = await bootstrap(runOptions); + const { logger, apmEsClient, logsEsClient } = await bootstrap(runOptions); const scenario = await getScenario({ file, logger }); const { generate } = await scenario({ ...runOptions, logger }); @@ -32,22 +33,22 @@ export async function startLiveDataUpload({ const bucketSizeInMs = 1000 * 60; let requestedUntil = start; - const stream = new PassThrough({ - objectMode: true, - }); + let currentStreams: PassThrough[] = []; + const cachedStreams: WeakMap = new WeakMap(); - apmEsClient.index(stream); + process.on('SIGINT', () => closeStreams()); + process.on('SIGTERM', () => closeStreams()); + process.on('SIGQUIT', () => closeStreams()); - function closeStream() { - stream.end(() => { - process.exit(0); + function closeStreams() { + currentStreams.forEach((stream) => { + stream.end(() => { + process.exit(0); + }); }); + currentStreams = []; // Reset the stream array } - process.on('SIGINT', closeStream); - process.on('SIGTERM', closeStream); - process.on('SIGQUIT', closeStream); - async function uploadNextBatch() { const now = Date.now(); @@ -59,22 +60,52 @@ export async function startLiveDataUpload({ `Requesting ${new Date(bucketFrom).toISOString()} to ${new Date(bucketTo).toISOString()}` ); - const next = logger.perf('execute_scenario', () => - generate({ range: timerange(bucketFrom.getTime(), bucketTo.getTime()) }) - ); + const generatorsAndClients = generate({ + range: timerange(bucketFrom.getTime(), bucketTo.getTime()), + clients: { logsEsClient, apmEsClient }, + }); + + const generatorsAndClientsArray = castArray(generatorsAndClients); + + const streams = generatorsAndClientsArray.map(({ client }) => { + let stream: PassThrough; + + if (cachedStreams.has(client)) { + stream = cachedStreams.get(client)!; + } else { + stream = new PassThrough({ objectMode: true }); + cachedStreams.set(client, stream); + client.index(stream); + } + + return stream; + }); - const concatenatedStream = castArray(next) - .reverse() - .reduce((prev, current) => { - const currentStream = isGeneratorObject(current) ? Readable.from(current) : current; - return currentStream.pipe(prev); - }, new PassThrough({ objectMode: true })); + currentStreams = streams; - concatenatedStream.pipe(stream, { end: false }); + const promises = generatorsAndClientsArray.map(({ generator }, i) => { + const concatenatedStream = castArray(generator) + .reverse() + .reduce((prev, current) => { + const currentStream = isGeneratorObject(current) ? Readable.from(current) : current; + return currentStream.pipe(prev); + }, new PassThrough({ objectMode: true })); - await awaitStream(concatenatedStream); + concatenatedStream.pipe(streams[i], { end: false }); - await apmEsClient.refresh(); + return awaitStream(concatenatedStream); + }); + + await Promise.all(promises); + + logger.info('Indexing completed'); + + const refreshPromise = generatorsAndClientsArray.map(async ({ client }) => { + await client.refresh(); + }); + + await Promise.all(refreshPromise); + logger.info('Refreshing completed'); requestedUntil = bucketTo; } @@ -85,6 +116,7 @@ export async function startLiveDataUpload({ await delay(bucketSizeInMs); } while (true); } + async function delay(ms: number) { return await new Promise((resolve) => setTimeout(resolve, ms)); } diff --git a/packages/kbn-apm-synthtrace/src/cli/utils/synthtrace_worker.ts b/packages/kbn-apm-synthtrace/src/cli/utils/synthtrace_worker.ts index 7617a9d58dd96..48a9bd60e5ac1 100644 --- a/packages/kbn-apm-synthtrace/src/cli/utils/synthtrace_worker.ts +++ b/packages/kbn-apm-synthtrace/src/cli/utils/synthtrace_worker.ts @@ -7,12 +7,14 @@ */ import { parentPort, workerData } from 'worker_threads'; import pidusage from 'pidusage'; +import { castArray } from 'lodash'; import { memoryUsage } from 'process'; import { timerange } from '@kbn/apm-synthtrace-client'; -import { getEsClient } from './get_es_client'; +import { getApmEsClient } from './get_apm_es_client'; import { getScenario } from './get_scenario'; import { loggerProxy } from './logger_proxy'; import { RunOptions } from './parse_run_cli_flags'; +import { getLogsEsClient } from './get_logs_es_client'; export interface WorkerData { bucketFrom: Date; @@ -27,13 +29,19 @@ const { bucketFrom, bucketTo, runOptions, esUrl, version } = workerData as Worke async function start() { const logger = loggerProxy; - const apmEsClient = getEsClient({ + const apmEsClient = getApmEsClient({ concurrency: runOptions.concurrency, target: esUrl, logger, version, }); + const logsEsClient = getLogsEsClient({ + concurrency: runOptions.concurrency, + target: esUrl, + logger, + }); + const file = runOptions.file; const scenario = await logger.perf('get_scenario', () => getScenario({ file, logger })); @@ -43,15 +51,17 @@ async function start() { const { generate, bootstrap } = await scenario({ ...runOptions, logger }); if (bootstrap) { - await bootstrap({ apmEsClient }); + await bootstrap({ apmEsClient, logsEsClient }); } logger.debug('Generating scenario'); - const generators = logger.perf('generate_scenario', () => - generate({ range: timerange(bucketFrom, bucketTo) }) + const generatorsAndClients = logger.perf('generate_scenario', () => + generate({ range: timerange(bucketFrom, bucketTo), clients: { logsEsClient, apmEsClient } }) ); + const generatorsAndClientsArray = castArray(generatorsAndClients); + logger.debug('Indexing scenario'); function mb(value: number): string { @@ -65,8 +75,12 @@ async function start() { }, 5000); await logger.perf('index_scenario', async () => { - await apmEsClient.index(generators); - await apmEsClient.refresh(); + const promises = generatorsAndClientsArray.map(async ({ client, generator }) => { + await client.index(generator); + await client.refresh(); + }); + + await Promise.all(promises); }); } diff --git a/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts b/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts new file mode 100644 index 0000000000000..8d2b32849bd8f --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Client } from '@elastic/elasticsearch'; +import { ESDocumentWithOperation } from '@kbn/apm-synthtrace-client'; +import { pipeline, Readable, Transform } from 'stream'; +import { LogDocument } from '@kbn/apm-synthtrace-client/src/lib/logs'; +import { SynthtraceEsClient, SynthtraceEsClientOptions } from '../shared/base_client'; +import { getSerializeTransform } from '../shared/get_serialize_transform'; +import { Logger } from '../utils/create_logger'; + +export type LogsSynthtraceEsClientOptions = Omit; + +export class LogsSynthtraceEsClient extends SynthtraceEsClient { + constructor(options: { client: Client; logger: Logger } & LogsSynthtraceEsClientOptions) { + super({ + ...options, + pipeline: logsPipeline(), + }); + this.dataStreams = ['logs-*-*']; + } +} + +function logsPipeline() { + return (base: Readable) => { + return pipeline( + base, + getSerializeTransform(), + getRoutingTransform(), + (err: unknown) => { + if (err) { + throw err; + } + } + ); + }; +} + +function getRoutingTransform() { + return new Transform({ + objectMode: true, + transform(document: ESDocumentWithOperation, encoding, callback) { + if ( + 'data_stream.type' in document && + 'data_stream.dataset' in document && + 'data_stream.namespace' in document + ) { + document._index = `${document['data_stream.type']}-${document['data_stream.dataset']}-${document['data_stream.namespace']}`; + } else { + throw new Error('Cannot determine index for event'); + } + + callback(null, document); + }, + }); +} diff --git a/packages/kbn-apm-synthtrace/src/lib/shared/get_serialize_transform.ts b/packages/kbn-apm-synthtrace/src/lib/shared/get_serialize_transform.ts index 26edb98429779..ed93c9502b722 100644 --- a/packages/kbn-apm-synthtrace/src/lib/shared/get_serialize_transform.ts +++ b/packages/kbn-apm-synthtrace/src/lib/shared/get_serialize_transform.ts @@ -9,13 +9,13 @@ import { ApmFields, Serializable } from '@kbn/apm-synthtrace-client'; import { Transform } from 'stream'; -export function getSerializeTransform() { - const buffer: ApmFields[] = []; +export function getSerializeTransform() { + const buffer: TFields[] = []; let cb: (() => void) | undefined; - function push(stream: Transform, events: ApmFields[], callback?: () => void) { - let event: ApmFields | undefined; + function push(stream: Transform, events: TFields[], callback?: () => void) { + let event: TFields | undefined; while ((event = events.shift())) { if (!stream.push(event)) { buffer.push(...events); @@ -37,7 +37,7 @@ export function getSerializeTransform() { push(this, nextEvents, nextCallback); } }, - write(chunk: Serializable, encoding, callback) { + write(chunk: Serializable, encoding, callback) { push(this, chunk.serialize(), callback); }, }); diff --git a/packages/kbn-apm-synthtrace/src/lib/utils/with_client.ts b/packages/kbn-apm-synthtrace/src/lib/utils/with_client.ts new file mode 100644 index 0000000000000..68dc780ac6464 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/lib/utils/with_client.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { SynthtraceGenerator } from '@kbn/apm-synthtrace-client'; +import { Readable } from 'stream'; +import { ApmSynthtraceEsClient, LogsSynthtraceEsClient } from '../../..'; + +export type SynthtraceEsClient = ApmSynthtraceEsClient | LogsSynthtraceEsClient; +export type SynthGenerator = + | SynthtraceGenerator + | Array> + | Readable; + +export const withClient = ( + client: SynthtraceEsClient, + generator: SynthGenerator +) => { + return { + client, + generator, + }; +}; + +export type ScenarioReturnType = ReturnType>; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/agent_config.ts b/packages/kbn-apm-synthtrace/src/scenarios/agent_config.ts index 7f72e27193756..e77a16bef6c14 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/agent_config.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/agent_config.ts @@ -7,21 +7,25 @@ */ import { observer, AgentConfigFields } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; +import { withClient } from '../lib/utils/with_client'; const scenario: Scenario = async ({ logger }) => { return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const agentConfig = observer().agentConfig(); - return range - .interval('30s') - .rate(1) - .generator((timestamp) => { - const events = logger.perf('generating_agent_config_events', () => { - return agentConfig.etag('test-etag').timestamp(timestamp); - }); - return events; - }); + return withClient( + apmEsClient, + range + .interval('30s') + .rate(1) + .generator((timestamp) => { + const events = logger.perf('generating_agent_config_events', () => { + return agentConfig.etag('test-etag').timestamp(timestamp); + }); + return events; + }) + ); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/aws_lambda.ts b/packages/kbn-apm-synthtrace/src/scenarios/aws_lambda.ts index 9b5ed599fa2fb..44f11b05d90cf 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/aws_lambda.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/aws_lambda.ts @@ -10,12 +10,13 @@ import { apm, ApmFields } from '@kbn/apm-synthtrace-client'; 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 }) => { + generate: ({ range, clients: { apmEsClient } }) => { const timestamps = range.ratePerMinute(180); const cloudFields: ApmFields = { @@ -91,7 +92,7 @@ const scenario: Scenario = async (runOptions: RunOptions) => { ]; }); - return awsLambdaEvents; + return withClient(apmEsClient, awsLambdaEvents); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/azure_functions.ts b/packages/kbn-apm-synthtrace/src/scenarios/azure_functions.ts index 070b6218183b8..69be0a5b157e8 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/azure_functions.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/azure_functions.ts @@ -10,12 +10,13 @@ import { apm, ApmFields } from '@kbn/apm-synthtrace-client'; 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 }) => { + generate: ({ range, clients: { apmEsClient } }) => { const timestamps = range.ratePerMinute(180); const cloudFields: ApmFields = { @@ -61,7 +62,7 @@ const scenario: Scenario = async (runOptions: RunOptions) => { ]; }); - return awsLambdaEvents; + return withClient(apmEsClient, awsLambdaEvents); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/cloud_services_icons.ts b/packages/kbn-apm-synthtrace/src/scenarios/cloud_services_icons.ts index c4ee421dbab4a..3c7ee8d6566cd 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/cloud_services_icons.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/cloud_services_icons.ts @@ -9,6 +9,7 @@ import { apm, ApmFields, Instance } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); @@ -16,7 +17,7 @@ const scenario: Scenario = async ({ logger, scenarioOpts }) => { const { numServices = 3 } = scenarioOpts || {}; return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const transactionName = 'Azure-AWS-Transaction'; const successfulTimestamps = range.ratePerMinute(60); @@ -176,7 +177,10 @@ const scenario: Scenario = async ({ logger, scenarioOpts }) => { return successfulTraceEvents; }; - return logger.perf('generating_apm_events', () => instances.flatMap(instanceSpans)); + return withClient( + apmEsClient, + logger.perf('generating_apm_events', () => instances.flatMap(instanceSpans)) + ); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/continuous_rollups.ts b/packages/kbn-apm-synthtrace/src/scenarios/continuous_rollups.ts index 0a346dcf99542..4b1a62a800430 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/continuous_rollups.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/continuous_rollups.ts @@ -11,6 +11,7 @@ import { merge, range as lodashRange } from 'lodash'; import { Scenario } from '../cli/scenario'; import { ComponentTemplateName } from '../lib/apm/client/apm_synthtrace_es_client'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENTS = ['production', 'development'].map((env) => getSynthtraceEnvironment(__filename, env) @@ -40,7 +41,7 @@ const scenario: Scenario = async ({ logger, scenarioOpts }) => { } ); }, - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const TRANSACTION_TYPES = ['request', 'custom']; const MIN_DURATION = 10; @@ -64,36 +65,39 @@ const scenario: Scenario = async ({ logger, scenarioOpts }) => { const transactionGroupRange = lodashRange(0, numTxGroups); - return range - .interval('1m') - .rate(1) - .generator((timestamp, timestampIndex) => { - return logger.perf( - 'generate_events_for_timestamp ' + new Date(timestamp).toISOString(), - () => { - const events = instances.flatMap((instance) => - transactionGroupRange.flatMap((groupId, groupIndex) => - OUTCOMES.map((outcome) => { - const duration = Math.round( - (timestampIndex % MAX_BUCKETS) * BUCKET_SIZE + MIN_DURATION - ); - - return instance - .transaction( - `transaction-${groupId}`, - TRANSACTION_TYPES[groupIndex % TRANSACTION_TYPES.length] - ) - .timestamp(timestamp) - .duration(duration) - .outcome(outcome); - }) - ) - ); - - return events; - } - ); - }); + return withClient( + apmEsClient, + range + .interval('1m') + .rate(1) + .generator((timestamp, timestampIndex) => { + return logger.perf( + 'generate_events_for_timestamp ' + new Date(timestamp).toISOString(), + () => { + const events = instances.flatMap((instance) => + transactionGroupRange.flatMap((groupId, groupIndex) => + OUTCOMES.map((outcome) => { + const duration = Math.round( + (timestampIndex % MAX_BUCKETS) * BUCKET_SIZE + MIN_DURATION + ); + + return instance + .transaction( + `transaction-${groupId}`, + TRANSACTION_TYPES[groupIndex % TRANSACTION_TYPES.length] + ) + .timestamp(timestamp) + .duration(duration) + .outcome(outcome); + }) + ) + ); + + return events; + } + ); + }) + ); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace.ts b/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace.ts index c47e10733fd5f..5b591078c46bf 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace.ts @@ -11,12 +11,13 @@ 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 }) => { + generate: ({ range, clients: { apmEsClient } }) => { const transactionName = '240rpm/75% 1000ms'; const successfulTimestamps = range.interval('1s').rate(3); @@ -86,7 +87,7 @@ const scenario: Scenario = async (runOptions: RunOptions) => { ); }); - return traces; + return withClient(apmEsClient, traces); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace_long.ts b/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace_long.ts index cd4b719494b56..d298a76ffccae 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace_long.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace_long.ts @@ -12,12 +12,13 @@ import { apm, ApmFields, DistributedTrace } from '@kbn/apm-synthtrace-client'; 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 }) => { + generate: ({ range, clients: { apmEsClient } }) => { const ratePerMinute = 1; const traceDuration = 1100; const rootTransactionName = `${ratePerMinute}rpm / ${traceDuration}ms`; @@ -122,7 +123,7 @@ const scenario: Scenario = async (runOptions: RunOptions) => { }).getTransaction(); }); - return traces; + return withClient(apmEsClient, traces); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/high_throughput.ts b/packages/kbn-apm-synthtrace/src/scenarios/high_throughput.ts index 2e7d8c22a4696..70988d16a0744 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/high_throughput.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/high_throughput.ts @@ -10,6 +10,7 @@ import { random } from 'lodash'; import { apm, Instance, ApmFields } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); @@ -18,7 +19,7 @@ const scenario: Scenario = async ({ logger }) => { const services = ['web', 'order-processing', 'api-backend']; return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const successfulTimestamps = range.interval('1s'); const instances = services.map((service, index) => @@ -95,10 +96,13 @@ const scenario: Scenario = async ({ logger }) => { return successfulTraceEvents; }; - return logger.perf('generating_apm_events', () => - instances - .flatMap((instance) => urls.map((url) => ({ instance, url }))) - .map(({ instance, url }, index) => instanceSpans(instance, url, index)) + return withClient( + apmEsClient, + logger.perf('generating_apm_events', () => + instances + .flatMap((instance) => urls.map((url) => ({ instance, url }))) + .map(({ instance, url }, index) => instanceSpans(instance, url, index)) + ) ); }, }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts b/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts new file mode 100644 index 0000000000000..7532b3dc9477c --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts @@ -0,0 +1,161 @@ +/* + * Copyright 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 { + LogDocument, + log, + generateShortId, + generateLongId, + apm, + Instance, +} from '@kbn/apm-synthtrace-client'; +import { Scenario } from '../cli/scenario'; +import { withClient } from '../lib/utils/with_client'; +import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; + +const ENVIRONMENT = getSynthtraceEnvironment(__filename); + +const scenario: Scenario = async (runOptions) => { + return { + generate: ({ range, clients: { logsEsClient, apmEsClient } }) => { + const { numServices = 3 } = runOptions.scenarioOpts || {}; + const { logger } = runOptions; + + // Logs Data logic + const MESSAGE_LOG_LEVELS = [ + { message: 'A simple log', level: 'info' }, + { message: 'Yet another debug log', level: 'debug' }, + { message: 'Error with certificate: "ca_trusted_fingerprint"', level: 'error' }, + ]; + const CLOUD_PROVIDERS = ['gcp', 'aws', 'azure']; + const CLOUD_REGION = ['eu-central-1', 'us-east-1', 'area-51']; + + const CLUSTER = [ + { clusterId: generateShortId(), clusterName: 'synth-cluster-1' }, + { clusterId: generateShortId(), clusterName: 'synth-cluster-2' }, + { clusterId: generateShortId(), clusterName: 'synth-cluster-3' }, + ]; + + const SERVICE_NAMES = Array(3) + .fill(null) + .map((_, idx) => `synth-service-${idx}`); + + const logs = range + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(20) + .fill(0) + .map(() => { + const index = Math.floor(Math.random() * 3); + return log + .create() + .message(MESSAGE_LOG_LEVELS[index].message) + .logLevel(MESSAGE_LOG_LEVELS[index].level) + .service(SERVICE_NAMES[index]) + .defaults({ + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + 'orchestrator.cluster.name': CLUSTER[index].clusterName, + 'orchestrator.cluster.id': CLUSTER[index].clusterId, + 'orchestrator.resource.id': generateShortId(), + 'cloud.provider': CLOUD_PROVIDERS[Math.floor(Math.random() * 3)], + 'cloud.region': CLOUD_REGION[index], + 'cloud.availability_zone': `${CLOUD_REGION[index]}a`, + 'cloud.project.id': generateShortId(), + 'cloud.instance.id': generateShortId(), + 'log.file.path': `/logs/${generateLongId()}/error.txt`, + }) + .timestamp(timestamp); + }); + }); + + // APM Simple Trace + + const transactionName = '240rpm/75% 1000ms'; + + const successfulTimestamps = range.interval('1m').rate(180); + const failedTimestamps = range.interval('1m').rate(180); + + const instances = [...Array(numServices).keys()].map((index) => + apm + .service({ name: SERVICE_NAMES[index], environment: ENVIRONMENT, agentName: 'go' }) + .instance('instance') + ); + const instanceSpans = (instance: Instance) => { + const successfulTraceEvents = successfulTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + .children( + instance + .span({ + spanName: 'GET apm-*/_search', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .duration(1000) + .success() + .destination('elasticsearch') + .timestamp(timestamp), + instance + .span({ spanName: 'custom_operation', spanType: 'custom' }) + .duration(100) + .success() + .timestamp(timestamp) + ) + ); + + const failedTraceEvents = failedTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + + const metricsets = range + .interval('30s') + .rate(1) + .generator((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + ); + + return [successfulTraceEvents, failedTraceEvents, metricsets]; + }; + + return [ + withClient( + logsEsClient, + logger.perf('generating_logs', () => logs) + ), + withClient( + apmEsClient, + logger.perf('generating_apm_events', () => + instances.flatMap((instance) => instanceSpans(instance)) + ) + ), + ]; + }, + }; +}; + +export default scenario; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/low_throughput.ts b/packages/kbn-apm-synthtrace/src/scenarios/low_throughput.ts index 8a79706289cea..de54a7a721911 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/low_throughput.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/low_throughput.ts @@ -10,6 +10,7 @@ import { ApmFields, Instance, apm } from '@kbn/apm-synthtrace-client'; import { random } from 'lodash'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); @@ -18,7 +19,7 @@ const scenario: Scenario = async ({ logger }) => { const services = ['web', 'order-processing', 'api-backend']; return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const successfulTimestamps = range.ratePerMinute(60); const instances = services.map((serviceName, index) => @@ -78,10 +79,13 @@ const scenario: Scenario = async ({ logger }) => { return successfulTraceEvents; }; - return logger.perf('generating_apm_events', () => - instances - .flatMap((instance) => urls.map((url) => ({ instance, url }))) - .map(({ instance, url }, index) => instanceSpans(instance, url, index)) + return withClient( + apmEsClient, + logger.perf('generating_apm_events', () => + instances + .flatMap((instance) => urls.map((url) => ({ instance, url }))) + .map(({ instance, url }, index) => instanceSpans(instance, url, index)) + ) ); }, }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts index 14bd5d9a70042..705d425d8d932 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts @@ -10,6 +10,7 @@ import { ApmFields, apm, Instance } from '@kbn/apm-synthtrace-client'; import { flatten, random } from 'lodash'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); @@ -25,7 +26,7 @@ const scenario: Scenario = async ({ logger }) => { }; return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const successfulTimestamps = range.ratePerMinute(180); const instances = flatten( @@ -95,10 +96,13 @@ const scenario: Scenario = async ({ logger }) => { return successfulTraceEvents; }; - return logger.perf('generating_apm_events', () => - instances - .flatMap((instance) => urls.map((url) => ({ instance, url }))) - .map(({ instance, url }) => instanceSpans(instance, url)) + return withClient( + apmEsClient, + logger.perf('generating_apm_events', () => + instances + .flatMap((instance) => urls.map((url) => ({ instance, url }))) + .map(({ instance, url }) => instanceSpans(instance, url)) + ) ); }, }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_transactions_per_service.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_transactions_per_service.ts index e814ed51b08e6..565ac8ea4f1ab 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_transactions_per_service.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_transactions_per_service.ts @@ -8,6 +8,7 @@ import { ApmFields, apm, Instance } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); @@ -17,7 +18,7 @@ const scenario: Scenario = async (runOptions) => { const numTransactions = 100; return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const urls = ['GET /order', 'POST /basket', 'DELETE /basket', 'GET /products']; const successfulTimestamps = range.ratePerMinute(180); @@ -68,14 +69,17 @@ const scenario: Scenario = async (runOptions) => { return [successfulTraceEvents, failedTraceEvents, metricsets]; }; - return logger.perf('generating_apm_events', () => - instances - .flatMap((instance) => - transactionNames.map((transactionName) => ({ instance, transactionName })) - ) - .flatMap(({ instance, transactionName }, index) => - instanceSpans(instance, transactionName) - ) + return withClient( + apmEsClient, + logger.perf('generating_apm_events', () => + instances + .flatMap((instance) => + transactionNames.map((transactionName) => ({ instance, transactionName })) + ) + .flatMap(({ instance, transactionName }, index) => + instanceSpans(instance, transactionName) + ) + ) ); }, }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/mobile.ts b/packages/kbn-apm-synthtrace/src/scenarios/mobile.ts index 0ca4abf07bf91..594bd0b875324 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/mobile.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/mobile.ts @@ -15,6 +15,7 @@ import type { } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); @@ -328,7 +329,7 @@ const scenario: Scenario = async ({ scenarioOpts, logger }) => { const { numDevices = 10 } = scenarioOpts || {}; return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const androidDevices = [...Array(numDevices).keys()].map((index) => { const deviceMetadata = ANDROID_DEVICES[randomInt(ANDROID_DEVICES.length)]; const geoNetwork = GEO_AND_NETWORK[randomInt(GEO_AND_NETWORK.length)]; @@ -444,13 +445,13 @@ const scenario: Scenario = async ({ scenarioOpts, logger }) => { ); }; - return [ + return withClient(apmEsClient, [ ...androidDevices.flatMap((device) => [ sessionTransactions(device), appLaunchMetrics(device), ]), ...iOSDevices.map((device) => sessionTransactions(device)), - ]; + ]); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/other_bucket_group.ts b/packages/kbn-apm-synthtrace/src/scenarios/other_bucket_group.ts index 49fcc2f6ac47b..db0de7e5a5b32 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/other_bucket_group.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/other_bucket_group.ts @@ -9,6 +9,7 @@ import { apm, ApmFields } from '@kbn/apm-synthtrace-client'; import { range as lodashRange } from 'lodash'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENTS = ['production', 'development'].map((env) => getSynthtraceEnvironment(__filename, env) @@ -18,7 +19,7 @@ const scenario: Scenario = async ({ logger, scenarioOpts }) => { const { services: numServices = 10, txGroups: numTxGroups = 10 } = scenarioOpts ?? {}; return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const TRANSACTION_TYPES = ['request']; const MIN_DURATION = 10; @@ -46,41 +47,47 @@ const scenario: Scenario = async ({ logger, scenarioOpts }) => { '_other', ]; - return range - .interval('1m') - .rate(1) - .generator((timestamp, timestampIndex) => { - return logger.perf( - 'generate_events_for_timestamp ' + new Date(timestamp).toISOString(), - () => { - const events = instances.flatMap((instance) => - transactionGroupRange.flatMap((groupId, groupIndex) => { - const duration = Math.round( - (timestampIndex % MAX_BUCKETS) * BUCKET_SIZE + MIN_DURATION - ); + return withClient( + apmEsClient, + range + .interval('1m') + .rate(1) + .generator((timestamp, timestampIndex) => { + return logger.perf( + 'generate_events_for_timestamp ' + new Date(timestamp).toISOString(), + () => { + const events = instances.flatMap((instance) => + transactionGroupRange.flatMap((groupId, groupIndex) => { + const duration = Math.round( + (timestampIndex % MAX_BUCKETS) * BUCKET_SIZE + MIN_DURATION + ); + + if (groupId === '_other') { + return instance + .transaction(groupId) + .timestamp(timestamp) + .duration(duration) + .defaults({ + 'transaction.aggregation.overflow_count': 10, + }); + } - if (groupId === '_other') { return instance - .transaction(groupId) + .transaction( + groupId, + TRANSACTION_TYPES[groupIndex % TRANSACTION_TYPES.length] + ) .timestamp(timestamp) .duration(duration) - .defaults({ - 'transaction.aggregation.overflow_count': 10, - }); - } - - return instance - .transaction(groupId, TRANSACTION_TYPES[groupIndex % TRANSACTION_TYPES.length]) - .timestamp(timestamp) - .duration(duration) - .success(); - }) - ); + .success(); + }) + ); - return events; - } - ); - }); + return events; + } + ); + }) + ); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/service_map.ts b/packages/kbn-apm-synthtrace/src/scenarios/service_map.ts index f39d4bdd1e221..2c6c75e4dfe81 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/service_map.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/service_map.ts @@ -10,67 +10,71 @@ import { ApmFields, serviceMap } from '@kbn/apm-synthtrace-client'; 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 }) => { - return range - .interval('1s') - .rate(3) - .generator( - serviceMap({ - services: [ - { 'frontend-rum': 'rum-js' }, - { 'frontend-node': 'nodejs' }, - { advertService: 'java' }, - { checkoutService: 'go' }, - { cartService: 'dotnet' }, - { paymentService: 'nodejs' }, - { productCatalogService: 'go' }, - ], - environment, - definePaths([rum, node, adv, chk, cart, pay, prod]) { - return [ - [ - [rum, 'fetchAd'], - [node, 'GET /nodejs/adTag'], - [adv, 'APIRestController#getAd'], - ['elasticsearch', 'GET ad-*/_search'], - ], - [ - [rum, 'AddToCart'], - [node, 'POST /nodejs/addToCart'], - [cart, 'POST /dotnet/reserveProduct'], - ['redis', 'DECR inventory:i012345:stock'], - ], - [ - [rum, 'Checkout'], - [node, 'POST /nodejs/placeOrder'], - [chk, 'POST /go/placeOrder'], - [pay, 'POST /nodejs/processPayment'], - ], - [ - [chk, 'POST /go/clearCart'], - [cart, 'PUT /dotnet/cart/c12345/reset'], - ['redis', 'INCR inventory:i012345:stock'], - ], - [ - [rum, 'ProductDashboard'], - [node, 'GET /nodejs/products'], - [prod, 'GET /go/product-catalog'], - ['elasticsearch', 'GET product-*/_search'], - ], - [ - [chk, 'PUT /go/update-inventory'], - [prod, 'PUT /go/product/i012345'], - ], - [pay], - ]; - }, - }) - ); + generate: ({ range, clients: { apmEsClient } }) => { + return withClient( + apmEsClient, + range + .interval('1s') + .rate(3) + .generator( + serviceMap({ + services: [ + { 'frontend-rum': 'rum-js' }, + { 'frontend-node': 'nodejs' }, + { advertService: 'java' }, + { checkoutService: 'go' }, + { cartService: 'dotnet' }, + { paymentService: 'nodejs' }, + { productCatalogService: 'go' }, + ], + environment, + definePaths([rum, node, adv, chk, cart, pay, prod]) { + return [ + [ + [rum, 'fetchAd'], + [node, 'GET /nodejs/adTag'], + [adv, 'APIRestController#getAd'], + ['elasticsearch', 'GET ad-*/_search'], + ], + [ + [rum, 'AddToCart'], + [node, 'POST /nodejs/addToCart'], + [cart, 'POST /dotnet/reserveProduct'], + ['redis', 'DECR inventory:i012345:stock'], + ], + [ + [rum, 'Checkout'], + [node, 'POST /nodejs/placeOrder'], + [chk, 'POST /go/placeOrder'], + [pay, 'POST /nodejs/processPayment'], + ], + [ + [chk, 'POST /go/clearCart'], + [cart, 'PUT /dotnet/cart/c12345/reset'], + ['redis', 'INCR inventory:i012345:stock'], + ], + [ + [rum, 'ProductDashboard'], + [node, 'GET /nodejs/products'], + [prod, 'GET /go/product-catalog'], + ['elasticsearch', 'GET product-*/_search'], + ], + [ + [chk, 'PUT /go/update-inventory'], + [prod, 'PUT /go/product/i012345'], + ], + [pay], + ]; + }, + }) + ) + ); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/service_map_oom.ts b/packages/kbn-apm-synthtrace/src/scenarios/service_map_oom.ts index 30f0a8c58e577..7c0d4dbbc8475 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/service_map_oom.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/service_map_oom.ts @@ -10,18 +10,18 @@ import { ApmFields, httpExitSpan } from '@kbn/apm-synthtrace-client'; import { service } from '@kbn/apm-synthtrace-client/src/lib/apm/service'; import { Transaction } from '@kbn/apm-synthtrace-client/src/lib/apm/transaction'; 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) => { +const scenario: Scenario = async () => { const numServices = 500; const tracesPerMinute = 10; return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const services = new Array(numServices) .fill(undefined) .map((_, idx) => { @@ -29,34 +29,37 @@ const scenario: Scenario = async (runOptions: RunOptions) => { }) .reverse(); - return range.ratePerMinute(tracesPerMinute).generator((timestamp) => { - const rootTransaction = services.reduce((prev, currentService) => { - const tx = currentService - .transaction(`GET /my/function`, 'request') - .timestamp(timestamp) - .duration(1000) - .children( - ...(prev - ? [ - currentService - .span( - httpExitSpan({ - spanName: `exit-span-${currentService.fields['service.name']}`, - destinationUrl: `http://address-to-exit-span-${currentService.fields['service.name']}`, - }) - ) - .timestamp(timestamp) - .duration(1000) - .children(prev), - ] - : []) - ); + return withClient( + apmEsClient, + range.ratePerMinute(tracesPerMinute).generator((timestamp) => { + const rootTransaction = services.reduce((prev, currentService) => { + const tx = currentService + .transaction(`GET /my/function`, 'request') + .timestamp(timestamp) + .duration(1000) + .children( + ...(prev + ? [ + currentService + .span( + httpExitSpan({ + spanName: `exit-span-${currentService.fields['service.name']}`, + destinationUrl: `http://address-to-exit-span-${currentService.fields['service.name']}`, + }) + ) + .timestamp(timestamp) + .duration(1000) + .children(prev), + ] + : []) + ); - return tx; - }, undefined as Transaction | undefined); + return tx; + }, undefined as Transaction | undefined); - return rootTransaction!; - }); + return rootTransaction!; + }) + ); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/services_without_transactions.ts b/packages/kbn-apm-synthtrace/src/scenarios/services_without_transactions.ts index c7d535028a1af..b06111d4b6026 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/services_without_transactions.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/services_without_transactions.ts @@ -8,12 +8,13 @@ import { apm, ApmFields } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); -const scenario: Scenario = async ({ logger, scenarioOpts }) => { +const scenario: Scenario = async () => { return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const withTx = apm .service('service-with-transactions', ENVIRONMENT, 'java') .instance('instance'); @@ -26,7 +27,7 @@ const scenario: Scenario = async ({ logger, scenarioOpts }) => { .service('service-with-app-metrics-only', ENVIRONMENT, 'java') .instance('instance'); - return range + const data = range .interval('1m') .rate(1) .generator((timestamp) => { @@ -45,6 +46,8 @@ const scenario: Scenario = async ({ logger, scenarioOpts }) => { .timestamp(timestamp), ]; }); + + return withClient(apmEsClient, data); }, }; }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts b/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts new file mode 100644 index 0000000000000..18c1fc1c52550 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { LogDocument, log, generateShortId, generateLongId } from '@kbn/apm-synthtrace-client'; +import { Scenario } from '../cli/scenario'; +import { withClient } from '../lib/utils/with_client'; + +const scenario: Scenario = async (runOptions) => { + return { + generate: ({ range, clients: { logsEsClient } }) => { + const { logger } = runOptions; + + // Logs Data logic + const MESSAGE_LOG_LEVELS = [ + { message: 'A simple log', level: 'info' }, + { message: 'Yet another debug log', level: 'debug' }, + { message: 'Error with certificate: "ca_trusted_fingerprint"', level: 'error' }, + ]; + const CLOUD_PROVIDERS = ['gcp', 'aws', 'azure']; + const CLOUD_REGION = ['eu-central-1', 'us-east-1', 'area-51']; + + const CLUSTER = [ + { clusterId: generateShortId(), clusterName: 'synth-cluster-1' }, + { clusterId: generateShortId(), clusterName: 'synth-cluster-2' }, + { clusterId: generateShortId(), clusterName: 'synth-cluster-3' }, + ]; + + const SERVICE_NAMES = Array(3) + .fill(null) + .map((_, idx) => `synth-service-${idx}`); + + const logs = range + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(20) + .fill(0) + .map(() => { + const index = Math.floor(Math.random() * 3); + return log + .create() + .message(MESSAGE_LOG_LEVELS[index].message) + .logLevel(MESSAGE_LOG_LEVELS[index].level) + .service(SERVICE_NAMES[index]) + .defaults({ + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + 'orchestrator.cluster.name': CLUSTER[index].clusterName, + 'orchestrator.cluster.id': CLUSTER[index].clusterId, + 'orchestrator.resource.id': generateShortId(), + 'cloud.provider': CLOUD_PROVIDERS[Math.floor(Math.random() * 3)], + 'cloud.region': CLOUD_REGION[index], + 'cloud.availability_zone': `${CLOUD_REGION[index]}a`, + 'cloud.project.id': generateShortId(), + 'cloud.instance.id': generateShortId(), + 'log.file.path': `/logs/${generateLongId()}/error.txt`, + }) + .timestamp(timestamp); + }); + }); + + return withClient( + logsEsClient, + logger.perf('generating_logs', () => logs) + ); + }, + }; +}; + +export default scenario; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts b/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts index 827cbfca46e79..26b0c1282d514 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts @@ -8,6 +8,7 @@ import { ApmFields, apm, Instance } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); @@ -16,7 +17,7 @@ const scenario: Scenario = async (runOptions) => { const { numServices = 3 } = runOptions.scenarioOpts || {}; return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const transactionName = '240rpm/75% 1000ms'; const successfulTimestamps = range.interval('1m').rate(180); @@ -83,8 +84,11 @@ const scenario: Scenario = async (runOptions) => { return [successfulTraceEvents, failedTraceEvents, metricsets]; }; - return logger.perf('generating_apm_events', () => - instances.flatMap((instance) => instanceSpans(instance)) + return withClient( + apmEsClient, + logger.perf('generating_apm_events', () => + instances.flatMap((instance) => instanceSpans(instance)) + ) ); }, }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/span_links.ts b/packages/kbn-apm-synthtrace/src/scenarios/span_links.ts index 60f63f80e3dec..08930a815ffdf 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/span_links.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/span_links.ts @@ -11,6 +11,7 @@ import { Readable } from 'stream'; import { apm, ApmFields, generateLongId, generateShortId } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); @@ -32,7 +33,7 @@ function getSpanLinksFromEvents(events: ApmFields[]) { const scenario: Scenario = async () => { return { - generate: ({ range }) => { + generate: ({ range, clients: { apmEsClient } }) => { const producerInternalOnlyInstance = apm .service({ name: 'producer-internal-only', environment: ENVIRONMENT, agentName: 'go' }) @@ -111,8 +112,9 @@ const scenario: Scenario = async () => { ); }); - return Readable.from( - Array.from(producerInternalOnlyEvents).concat(Array.from(consumerEvents)) + return withClient( + apmEsClient, + Readable.from(Array.from(producerInternalOnlyEvents).concat(Array.from(consumerEvents))) ); }, }; 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-calculate-auto/index.ts b/packages/kbn-calculate-auto/index.ts new file mode 100644 index 0000000000000..fb114b4bb315e --- /dev/null +++ b/packages/kbn-calculate-auto/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { 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-calculate-auto/package.json b/packages/kbn-calculate-auto/package.json new file mode 100644 index 0000000000000..71de96101c616 --- /dev/null +++ b/packages/kbn-calculate-auto/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/calculate-auto", + "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-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-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index af8fae6214ff8..603f0efd54a87 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -2363,9 +2363,6 @@ }, "tags": { "type": "keyword" - }, - "version": { - "type": "long" } } }, 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-custom-icons/jest.config.js b/packages/kbn-custom-icons/jest.config.js new file mode 100644 index 0000000000000..518564ce1dbbd --- /dev/null +++ b/packages/kbn-custom-icons/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-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 9e0d380c2f016..afc8252e7e13e 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -769,6 +769,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { uninstallAgent: `${SECURITY_SOLUTION_DOCS}uninstall-agent.html`, 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`, }, 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 37974c9244b73..5e4202dd7fa45 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -527,6 +527,7 @@ export interface DocLinks { uninstallAgent: string; installAndUninstallIntegrationAssets: string; elasticAgentInputConfiguration: string; + policySecrets: 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-expandable-flyout/README.md b/packages/kbn-expandable-flyout/README.md index 63a6f9483ead0..3e3b620a06b53 100644 --- a/packages/kbn-expandable-flyout/README.md +++ b/packages/kbn-expandable-flyout/README.md @@ -16,8 +16,12 @@ The flyout is composed of 3 sections: The expandable-flyout package is designed to render a single flyout for an entire plugin. While displaying multiple flyouts might be feasible, it will be a bit complicated, and we recommend instead to build multiple panels, with each their own context to manage their data (for example, take a look at the Security Solution [setup](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/flyout)). The expandable-flyout is making some strict UI design decisions: -- when in collapsed mode (i.e. when only the right/preview section is open), the flyout's width is fixed to the EUI `s` size -- when in expanded mode (i.e. when the left section is opened), the flyout's width is fixed to the EUI `l` size. Internally the right, left and preview sections' widths are set to a hardcoded percentage (40%, 60$ and 40% respectively) +- when in collapsed mode (i.e. when only the right/preview section is open), the flyout's width linearly grows from its minimum value of 380px to its maximum value of 750px +- when in expanded mode (i.e. when the left section is opened), the flyout's width changes depending on the browser's width: + - if the window is smaller than 1600px, the flyout takes the entire browser window (minus 48px of padding on the left) + - for windows bigger than 1600px, the flyout's width is 80% of the entire browser window (with a max width of 1500px for the left section, and 750px for the right section) + +> While the expandable-flyout will work on very small screens, having both the right and left sections visible at the same time will not be a good experience to the user. We recommend only showing the right panel, and therefore handling this situation when you build your panels by considering hiding the actions that could open the left panel (like the expand details button in the [FlyoutNavigation](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_navigation.tsx)). ## Package API diff --git a/packages/kbn-expandable-flyout/src/components/left_section.tsx b/packages/kbn-expandable-flyout/src/components/left_section.tsx index 1d2a4a7eeabac..37cc0564d22ee 100644 --- a/packages/kbn-expandable-flyout/src/components/left_section.tsx +++ b/packages/kbn-expandable-flyout/src/components/left_section.tsx @@ -26,7 +26,7 @@ interface LeftSectionProps { */ export const LeftSection: React.FC = ({ component, width }: LeftSectionProps) => { const style = useMemo( - () => ({ height: '100%', width: `${width * 100}%` }), + () => ({ height: '100%', width: `${width}px` }), [width] ); return ( diff --git a/packages/kbn-expandable-flyout/src/components/preview_section.test.tsx b/packages/kbn-expandable-flyout/src/components/preview_section.test.tsx index f365c8f299623..950d406893082 100644 --- a/packages/kbn-expandable-flyout/src/components/preview_section.test.tsx +++ b/packages/kbn-expandable-flyout/src/components/preview_section.test.tsx @@ -8,10 +8,11 @@ import React from 'react'; import { render } from '@testing-library/react'; -import { PreviewSection } from './preview_section'; +import { PreviewBanner, PreviewSection } from './preview_section'; import { PREVIEW_SECTION_BACK_BUTTON_TEST_ID, PREVIEW_SECTION_CLOSE_BUTTON_TEST_ID, + PREVIEW_SECTION_TEST_ID, } from './test_ids'; import { ExpandableFlyoutContext } from '../context'; @@ -28,14 +29,15 @@ describe('PreviewSection', () => { }, } as unknown as ExpandableFlyoutContext; + const component =

{'component'}
; + const left = 500; + it('should render close button in header', () => { - const component =
{'component'}
; - const width = 500; const showBackButton = false; const { getByTestId } = render( - + ); @@ -43,16 +45,43 @@ describe('PreviewSection', () => { }); it('should render back button in header', () => { - const component =
{'component'}
; - const width = 500; const showBackButton = true; const { getByTestId } = render( - + ); expect(getByTestId(PREVIEW_SECTION_BACK_BUTTON_TEST_ID)).toBeInTheDocument(); }); + + it('should render banner', () => { + const showBackButton = false; + const title = 'test'; + const banner: PreviewBanner = { + title, + backgroundColor: 'primary', + textColor: 'red', + }; + + const { getByTestId, getByText } = render( + + + + ); + + expect(getByTestId(`${PREVIEW_SECTION_TEST_ID}BannerPanel`)).toHaveClass( + `euiPanel--${banner.backgroundColor}` + ); + expect(getByTestId(`${PREVIEW_SECTION_TEST_ID}BannerText`)).toHaveStyle( + `color: ${banner.textColor}` + ); + expect(getByText(title)).toBeInTheDocument(); + }); }); diff --git a/packages/kbn-expandable-flyout/src/components/preview_section.tsx b/packages/kbn-expandable-flyout/src/components/preview_section.tsx index 1cc2243d65849..ae96bdb7ce187 100644 --- a/packages/kbn-expandable-flyout/src/components/preview_section.tsx +++ b/packages/kbn-expandable-flyout/src/components/preview_section.tsx @@ -65,9 +65,9 @@ interface PreviewSectionProps { */ component: React.ReactElement; /** - * Width used when rendering the panel + * Left position used when rendering the panel */ - width: number; + leftPosition: number; /** * Display the back button in the header */ @@ -85,12 +85,13 @@ interface PreviewSectionProps { export const PreviewSection: React.FC = ({ component, showBackButton, - width, + leftPosition, banner, }: PreviewSectionProps) => { const { euiTheme } = useEuiTheme(); const { closePreviewPanel, previousPreviewPanel } = useExpandableFlyoutContext(); - const left = `${(1 - width) * 100}%`; + + const left = leftPosition + 4; const closeButton = ( @@ -103,7 +104,7 @@ export const PreviewSection: React.FC = ({ ); const header = showBackButton ? ( - + = ({ {closeButton} ) : ( - {closeButton} + + {closeButton} + ); return (
{isPreviewBanner(banner) && ( - - + + {banner.title} diff --git a/packages/kbn-expandable-flyout/src/components/right_section.tsx b/packages/kbn-expandable-flyout/src/components/right_section.tsx index 6e7e94dc14048..ae6cad5c7e9f3 100644 --- a/packages/kbn-expandable-flyout/src/components/right_section.tsx +++ b/packages/kbn-expandable-flyout/src/components/right_section.tsx @@ -29,7 +29,7 @@ export const RightSection: React.FC = ({ width, }: RightSectionProps) => { const style = useMemo( - () => ({ height: '100%', width: `${width * 100}%` }), + () => ({ height: '100%', width: `${width}px` }), [width] ); diff --git a/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.test.ts b/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.test.ts new file mode 100644 index 0000000000000..cc8f7e0f283ee --- /dev/null +++ b/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.test.ts @@ -0,0 +1,250 @@ +/* + * Copyright 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 { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react-hooks'; +import type { UserSectionsSizesParams, UserSectionsSizesResult } from './use_sections_sizes'; +import { useSectionSizes } from './use_sections_sizes'; + +describe('useSectionSizes', () => { + let hookResult: RenderHookResult; + + describe('Right section', () => { + it('should return 0 for right section if it is hidden', () => { + const initialProps = { + windowWidth: 350, + showRight: false, + showLeft: false, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + rightSectionWidth: 0, + leftSectionWidth: 0, + flyoutWidth: '0px', + previewSectionLeft: 0, + }); + }); + + it('should return the window width for right section size for tiny screen', () => { + const initialProps = { + windowWidth: 350, + showRight: true, + showLeft: false, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + rightSectionWidth: 350, + leftSectionWidth: 0, + flyoutWidth: '350px', + previewSectionLeft: 0, + }); + }); + + it('should return 380 for right section size for medium screen', () => { + const initialProps = { + windowWidth: 600, + showRight: true, + showLeft: false, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + rightSectionWidth: 380, + leftSectionWidth: 0, + flyoutWidth: '380px', + previewSectionLeft: 0, + }); + }); + + it('should return 500 for right section size for large screen', () => { + const initialProps = { + windowWidth: 1300, + showRight: true, + showLeft: false, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current.rightSectionWidth).toBeGreaterThan(420); + expect(hookResult.result.current.rightSectionWidth).toBeLessThan(750); + expect(hookResult.result.current.leftSectionWidth).toEqual(0); + expect(hookResult.result.current.flyoutWidth).toEqual( + `${hookResult.result.current.rightSectionWidth}px` + ); + expect(hookResult.result.current.previewSectionLeft).toEqual(0); + }); + + it('should return 750 for right section size for very large screen', () => { + const initialProps = { + windowWidth: 2500, + showRight: true, + showLeft: false, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + rightSectionWidth: 750, + leftSectionWidth: 0, + flyoutWidth: '750px', + previewSectionLeft: 0, + }); + }); + }); + + describe('Left section', () => { + it('should return 0 for left section if it is hidden', () => { + const initialProps = { + windowWidth: 500, + showRight: true, + showLeft: false, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + rightSectionWidth: 380, + leftSectionWidth: 0, + flyoutWidth: '380px', + previewSectionLeft: 0, + }); + }); + + it('should return the remaining for left section', () => { + const initialProps = { + windowWidth: 500, + showRight: true, + showLeft: true, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + rightSectionWidth: 380, + leftSectionWidth: 72, + flyoutWidth: '452px', + previewSectionLeft: 0, + }); + }); + + it('should return 80% of remaining for left section', () => { + const initialProps = { + windowWidth: 2500, + showRight: true, + showLeft: true, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current.rightSectionWidth).toEqual(750); + expect(hookResult.result.current.leftSectionWidth).toEqual((2500 - 750) * 0.8); + expect(hookResult.result.current.flyoutWidth).toEqual( + `${ + hookResult.result.current.rightSectionWidth + hookResult.result.current.leftSectionWidth + }px` + ); + expect(hookResult.result.current.previewSectionLeft).toEqual(0); + }); + + it('should return max out at 1500px for really big screens', () => { + const initialProps = { + windowWidth: 2700, + showRight: true, + showLeft: true, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current.rightSectionWidth).toEqual(750); + expect(hookResult.result.current.leftSectionWidth).toEqual(1500); + expect(hookResult.result.current.flyoutWidth).toEqual( + `${ + hookResult.result.current.rightSectionWidth + hookResult.result.current.leftSectionWidth + }px` + ); + expect(hookResult.result.current.previewSectionLeft).toEqual(0); + }); + }); + + describe('Preview section', () => { + it('should return the 0 for preview section if it is hidden', () => { + const initialProps = { + windowWidth: 600, + showRight: true, + showLeft: false, + showPreview: false, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + rightSectionWidth: 380, + leftSectionWidth: 0, + flyoutWidth: '380px', + previewSectionLeft: 0, + }); + }); + + it('should return the 0 for preview section when left section is hidden', () => { + const initialProps = { + windowWidth: 600, + showRight: true, + showLeft: false, + showPreview: true, + }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + rightSectionWidth: 380, + leftSectionWidth: 0, + flyoutWidth: '380px', + previewSectionLeft: 0, + }); + }); + + it('should return for preview section when left section is visible', () => { + const initialProps = { windowWidth: 600, showRight: true, showLeft: true, showPreview: true }; + hookResult = renderHook((props: UserSectionsSizesParams) => useSectionSizes(props), { + initialProps, + }); + + expect(hookResult.result.current).toEqual({ + rightSectionWidth: 380, + leftSectionWidth: 172, + flyoutWidth: '552px', + previewSectionLeft: 172, + }); + }); + }); +}); diff --git a/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.ts b/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.ts new file mode 100644 index 0000000000000..94b10cde6e1c8 --- /dev/null +++ b/packages/kbn-expandable-flyout/src/hooks/use_sections_sizes.ts @@ -0,0 +1,113 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +const RIGHT_SECTION_MIN_WIDTH = 380; +const MIN_RESOLUTION_BREAKPOINT = 992; +const RIGHT_SECTION_MAX_WIDTH = 750; +const MAX_RESOLUTION_BREAKPOINT = 1920; + +const LEFT_SECTION_MAX_WIDTH = 1500; + +const FULL_WIDTH_BREAKPOINT = 1600; +const FULL_WIDTH_PADDING = 48; + +export interface UserSectionsSizesParams { + /** + * The width of the browser window + */ + windowWidth: number; + /** + * True if the right section is visible, false otherwise + */ + showRight: boolean; + /** + * True if the left section is visible, false otherwise + */ + showLeft: boolean; + /** + * True if the preview section is visible, false otherwise + */ + showPreview: boolean; +} + +export interface UserSectionsSizesResult { + /** + * Width of the right section in pixels + */ + rightSectionWidth: number; + /** + * Width of the left section in pixels + */ + leftSectionWidth: number; + /** + * Width of the flyout in pixels + */ + flyoutWidth: string; + /** + * Left position of the preview section in pixels + */ + previewSectionLeft: number; +} + +/** + * Hook that calculate the different width for the sections of the flyout and the flyout itself + */ +export const useSectionSizes = ({ + windowWidth, + showRight, + showLeft, + showPreview, +}: UserSectionsSizesParams): UserSectionsSizesResult => { + let rightSectionWidth: number = 0; + if (showRight) { + if (windowWidth < MIN_RESOLUTION_BREAKPOINT) { + // the right section's width will grow from 380px (at 992px resolution) while handling tiny screens by not going smaller than the window width + rightSectionWidth = Math.min(RIGHT_SECTION_MIN_WIDTH, windowWidth); + } else { + const ratioWidth = + (RIGHT_SECTION_MAX_WIDTH - RIGHT_SECTION_MIN_WIDTH) * + ((windowWidth - MIN_RESOLUTION_BREAKPOINT) / + (MAX_RESOLUTION_BREAKPOINT - MIN_RESOLUTION_BREAKPOINT)); + + // the right section's width will grow to 750px (at 1920px resolution) and will never go bigger than 750px in higher resolutions + rightSectionWidth = Math.min(RIGHT_SECTION_MIN_WIDTH + ratioWidth, RIGHT_SECTION_MAX_WIDTH); + } + } + + let leftSectionWidth: number = 0; + if (showLeft) { + // the left section's width will be nearly the remaining space for resolution lower than 1600px + if (windowWidth <= FULL_WIDTH_BREAKPOINT) { + leftSectionWidth = windowWidth - rightSectionWidth - FULL_WIDTH_PADDING; + } else { + // the left section's width will be taking 80% of the remaining space for resolution higher than 1600px, while never going bigger than 1500px + leftSectionWidth = Math.min( + ((windowWidth - rightSectionWidth) * 80) / 100, + LEFT_SECTION_MAX_WIDTH + ); + } + } + + const flyoutWidth: string = + showRight && showLeft ? `${rightSectionWidth + leftSectionWidth}px` : `${rightSectionWidth}px`; + + // preview section's width should only be similar to the right section. + // Though because the preview is rendered with an absolute position in the flyout, we calculate its left position instead of the width + let previewSectionLeft: number = 0; + if (showPreview) { + // the preview section starts where the left section ends + previewSectionLeft = leftSectionWidth; + } + + return { + rightSectionWidth, + leftSectionWidth, + flyoutWidth, + previewSectionLeft, + }; +}; diff --git a/packages/kbn-expandable-flyout/src/hooks/use_window_size.test.ts b/packages/kbn-expandable-flyout/src/hooks/use_window_size.test.ts new file mode 100644 index 0000000000000..cb9f44d36e2fd --- /dev/null +++ b/packages/kbn-expandable-flyout/src/hooks/use_window_size.test.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import { useWindowSize } from './use_window_size'; + +describe('useWindowSize', () => { + it('should return the window size', () => { + const hookResult = renderHook(() => useWindowSize()); + expect(hookResult.result.current).toEqual(1024); + }); +}); diff --git a/packages/kbn-expandable-flyout/src/hooks/use_window_size.ts b/packages/kbn-expandable-flyout/src/hooks/use_window_size.ts new file mode 100644 index 0000000000000..0d773ad02c1c3 --- /dev/null +++ b/packages/kbn-expandable-flyout/src/hooks/use_window_size.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { useLayoutEffect, useState } from 'react'; + +/** + * Hook that returns the browser window width + */ +export const useWindowSize = (): number => { + const [width, setWidth] = useState(0); + useLayoutEffect(() => { + function updateSize() { + setWidth(window.innerWidth); + } + window.addEventListener('resize', updateSize); + updateSize(); + return () => window.removeEventListener('resize', updateSize); + }, []); + return width; +}; diff --git a/packages/kbn-expandable-flyout/src/index.tsx b/packages/kbn-expandable-flyout/src/index.tsx index d5a1bff46439b..17613be6859b7 100644 --- a/packages/kbn-expandable-flyout/src/index.tsx +++ b/packages/kbn-expandable-flyout/src/index.tsx @@ -7,8 +7,10 @@ */ import React, { useCallback, useMemo } from 'react'; -import type { EuiFlyoutProps } from '@elastic/eui'; +import { EuiFlyoutProps } from '@elastic/eui'; import { EuiFlexGroup, EuiFlyout } from '@elastic/eui'; +import { useSectionSizes } from './hooks/use_sections_sizes'; +import { useWindowSize } from './hooks/use_window_size'; import { useExpandableFlyoutContext } from './context'; import { PreviewSection } from './components/preview_section'; import { RightSection } from './components/right_section'; @@ -16,6 +18,8 @@ import type { FlyoutPanelProps, Panel } from './types'; import { LeftSection } from './components/left_section'; import { isPreviewBanner } from './components/preview_section'; +const flyoutInnerStyles = { height: '100%' }; + export interface ExpandableFlyoutProps extends Omit { /** * List of all registered panels available for render @@ -27,8 +31,6 @@ export interface ExpandableFlyoutProps extends Omit { handleOnFlyoutClosed?: () => void; } -const flyoutInnerStyles = { height: '100%' }; - /** * Expandable flyout UI React component. * Displays 3 sections (right, left, preview) depending on the panels in the context. @@ -41,6 +43,8 @@ export const ExpandableFlyout: React.FC = ({ handleOnFlyoutClosed, ...flyoutProps }) => { + const windowWidth = useWindowSize(); + const { panels, closeFlyout } = useExpandableFlyoutContext(); const { left, right, preview } = panels; @@ -71,17 +75,22 @@ export const ExpandableFlyout: React.FC = ({ [mostRecentPreview, registeredPanels] ); - const hideFlyout = !left && !right && !preview.length; + const showRight = rightSection != null && right != null; + const showLeft = leftSection != null && left != null; + const showPreview = previewSection != null && preview != null; + + const { rightSectionWidth, leftSectionWidth, flyoutWidth, previewSectionLeft } = useSectionSizes({ + windowWidth, + showRight, + showLeft, + showPreview, + }); + const hideFlyout = !left && !right && !preview.length; if (hideFlyout) { return null; } - const flyoutWidth: string = leftSection && rightSection ? 'l' : 's'; - const rightSectionWidth: number = leftSection ? 0.4 : 1; - const leftSectionWidth: number = 0.6; - const previewSectionWidth: number = leftSection ? 0.4 : 1; - return ( = ({ wrap={false} gutterSize="none" style={flyoutInnerStyles} + responsive={false} > - {leftSection && left ? ( + {showLeft ? ( ) : null} - {rightSection && right ? ( + {showRight ? ( = ({ ) : null} - {previewSection && preview ? ( + {showPreview ? ( ) : 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-lens-embeddable-utils/attribute_builder/types.ts b/packages/kbn-lens-embeddable-utils/attribute_builder/types.ts index 6c9011b9782dc..428f6aacce133 100644 --- a/packages/kbn-lens-embeddable-utils/attribute_builder/types.ts +++ b/packages/kbn-lens-embeddable-utils/attribute_builder/types.ts @@ -16,6 +16,7 @@ import type { XYState, FormulaPublicApi, XYLayerConfig, + FillStyle, } from '@kbn/lens-plugin/public'; export type LensAttributes = TypedLensByValueInput['attributes']; @@ -87,5 +88,6 @@ export type FormulaValueConfig = Omit & { export type StaticValueConfig = Omit & { color?: string; + fill?: FillStyle; value: string; }; diff --git a/packages/kbn-lens-embeddable-utils/attribute_builder/utils.ts b/packages/kbn-lens-embeddable-utils/attribute_builder/utils.ts index ed75956cadbe1..58981aab8bcb4 100644 --- a/packages/kbn-lens-embeddable-utils/attribute_builder/utils.ts +++ b/packages/kbn-lens-embeddable-utils/attribute_builder/utils.ts @@ -27,7 +27,7 @@ export type DateHistogramColumnParams = DateHistogramIndexPatternColumn['params' export type TopValuesColumnParams = Pick< TermsIndexPatternColumn['params'], - 'size' | 'orderDirection' | 'orderBy' + 'size' | 'orderDirection' | 'orderBy' | 'secondaryFields' | 'accuracyMode' >; export const getHistogramColumn = ({ @@ -37,10 +37,11 @@ export const getHistogramColumn = ({ columnName: string; options?: Partial< Pick & { - params: DateHistogramColumnParams; + params: Partial; } >; }) => { + const { interval = 'auto', ...rest } = options?.params ?? {}; return { [columnName]: { dataType: 'date', @@ -48,9 +49,8 @@ export const getHistogramColumn = ({ label: '@timestamp', operationType: 'date_histogram', scale: 'interval', - sourceField: '@timestamp', - ...options, - params: { interval: 'auto', ...options?.params }, + sourceField: options?.sourceField ?? '@timestamp', + params: { interval, ...rest }, } as DateHistogramIndexPatternColumn, }; }; diff --git a/packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/layers/xy_data_layer.ts b/packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/layers/xy_data_layer.ts index 21fe17d156cac..f4845a5c93ab9 100644 --- a/packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/layers/xy_data_layer.ts +++ b/packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/layers/xy_data_layer.ts @@ -86,7 +86,9 @@ export class XYDataLayer implements ChartLayer { ? getHistogramColumn({ columnName: HISTOGRAM_COLUMN_NAME, options: { - ...options.buckets.params, + params: { + ...options.buckets.params, + }, sourceField: options.buckets.field ?? dataView.timeFieldName, }, }) diff --git a/packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/layers/xy_reference_lines_layer.ts b/packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/layers/xy_reference_lines_layer.ts index 1823de59684e2..2a105c10677af 100644 --- a/packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/layers/xy_reference_lines_layer.ts +++ b/packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/layers/xy_reference_lines_layer.ts @@ -60,6 +60,7 @@ export class XYReferenceLinesLayer implements ChartLayer { @@ -80,6 +83,8 @@ export class XYChart implements Chart { endValue: this.chartConfig.visualOptions?.endValues, curveType: this.chartConfig.visualOptions?.lineInterpolation, emphasizeFitting: !this.chartConfig.visualOptions?.showDottedLine, + valueLabels: this.chartConfig.visualOptions?.valueLabels, + axisTitlesVisibilitySettings: this.chartConfig.visualOptions?.axisTitlesVisibilitySettings, }; } diff --git a/packages/kbn-lens-embeddable-utils/tsconfig.json b/packages/kbn-lens-embeddable-utils/tsconfig.json index eca0b277bff1d..6238ba09d0374 100644 --- a/packages/kbn-lens-embeddable-utils/tsconfig.json +++ b/packages/kbn-lens-embeddable-utils/tsconfig.json @@ -6,5 +6,11 @@ }, "include": ["**/*.ts"], "exclude": ["target/**/*"], - "kbn_references": ["@kbn/core", "@kbn/data-plugin", "@kbn/data-views-plugin", "@kbn/lens-plugin"] + "kbn_references": [ + "@kbn/core", + "@kbn/data-plugin", + "@kbn/data-views-plugin", + "@kbn/lens-plugin", + "@kbn/visualizations-plugin", + ] } diff --git a/packages/kbn-management/settings/application/__stories__/application.stories.tsx b/packages/kbn-management/settings/application/__stories__/application.stories.tsx index b7742e8eca541..efc27f7f8300c 100644 --- a/packages/kbn-management/settings/application/__stories__/application.stories.tsx +++ b/packages/kbn-management/settings/application/__stories__/application.stories.tsx @@ -40,6 +40,13 @@ export const SettingsApplication: Story = () => { showReloadPagePrompt={action('showReloadPagePrompt')} subscribeToUpdates={() => new Subscription()} addUrlToHistory={action('addUrlToHistory')} + validateChange={async (key, value) => { + action(`validateChange`)({ + key, + value, + }); + return { successfulValidation: true, valid: true }; + }} > diff --git a/packages/kbn-management/settings/application/services.tsx b/packages/kbn-management/settings/application/services.tsx index 09ce0780b06d4..d64657525d351 100644 --- a/packages/kbn-management/settings/application/services.tsx +++ b/packages/kbn-management/settings/application/services.tsx @@ -32,7 +32,10 @@ export type SettingsApplicationServices = Services & FormServices; export interface KibanaDependencies { settings: { - client: Pick; + client: Pick< + IUiSettingsClient, + 'getAll' | 'isCustom' | 'isOverridden' | 'getUpdate$' | 'validateValue' + >; }; history: ScopedHistory; } @@ -52,6 +55,7 @@ export const SettingsApplicationProvider: FC = ({ const { saveChanges, showError, + validateChange, showReloadPagePrompt, links, showDanger, @@ -72,7 +76,9 @@ export const SettingsApplicationProvider: FC = ({ addUrlToHistory, }} > - + {children} diff --git a/packages/kbn-management/settings/components/field_category/__stories__/categories.stories.tsx b/packages/kbn-management/settings/components/field_category/__stories__/categories.stories.tsx index 1a9fb03b27532..8185310c71a01 100644 --- a/packages/kbn-management/settings/components/field_category/__stories__/categories.stories.tsx +++ b/packages/kbn-management/settings/components/field_category/__stories__/categories.stories.tsx @@ -53,6 +53,13 @@ export const Categories: Story = (params) => { { + action(`validateChange`)({ + key, + value, + }); + return { successfulValidation: true, valid: true }; + }} > { + action(`validateChange`)({ + key, + value, + }); + return { successfulValidation: true, valid: true }; + }} {...{ isSavingEnabled, onFieldChange }} > 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/field_input/__stories__/common.tsx b/packages/kbn-management/settings/components/field_input/__stories__/common.tsx index 39daed80f40b8..0bdd569b99749 100644 --- a/packages/kbn-management/settings/components/field_input/__stories__/common.tsx +++ b/packages/kbn-management/settings/components/field_input/__stories__/common.tsx @@ -75,7 +75,16 @@ export const getStory = (title: string, description: string) => }, decorators: [ (Story) => ( - + { + action(`validateChange`)({ + key, + value, + }); + return { successfulValidation: true, valid: true }; + }} + > diff --git a/packages/kbn-management/settings/components/field_input/input/array_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/array_input.test.tsx index c954035e9c639..ee0d7cb5e723c 100644 --- a/packages/kbn-management/settings/components/field_input/input/array_input.test.tsx +++ b/packages/kbn-management/settings/components/field_input/input/array_input.test.tsx @@ -6,8 +6,7 @@ * Side Public License, v 1. */ import React from 'react'; -import { act, fireEvent, render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { ArrayInput } from './array_input'; import { TEST_SUBJ_PREFIX_FIELD } from '.'; @@ -60,34 +59,17 @@ describe('ArrayInput', () => { expect(screen.getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`)).toHaveValue('foo, bar, baz'); }); - it('formats array when blurred', () => { + it('calls the onInputChange prop when the value changes', async () => { render(wrap()); const input = screen.getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); - fireEvent.focus(input); - userEvent.type(input, ',baz'); - expect(input).toHaveValue('foo, bar,baz'); - input.blur(); - expect(input).toHaveValue('foo, bar, baz'); - }); - - it('only calls onInputChange when blurred ', () => { - render(wrap()); - const input = screen.getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); - - fireEvent.focus(input); - userEvent.type(input, ',baz'); + fireEvent.change(input, { target: { value: 'foo, bar,baz' } }); - expect(input).toHaveValue('foo, bar,baz'); - expect(defaultProps.onInputChange).not.toHaveBeenCalled(); - - act(() => { - input.blur(); - }); - - expect(defaultProps.onInputChange).toHaveBeenCalledWith({ - type: 'array', - unsavedValue: ['foo', 'bar', 'baz'], - }); + await waitFor(() => + expect(defaultProps.onInputChange).toHaveBeenCalledWith({ + type: 'array', + unsavedValue: ['foo', 'bar', 'baz'], + }) + ); }); it('disables the input when isDisabled prop is true', () => { diff --git a/packages/kbn-management/settings/components/field_input/input/array_input.tsx b/packages/kbn-management/settings/components/field_input/input/array_input.tsx index f2ce42051eb04..0dc9b8ddc406e 100644 --- a/packages/kbn-management/settings/components/field_input/input/array_input.tsx +++ b/packages/kbn-management/settings/components/field_input/input/array_input.tsx @@ -6,12 +6,14 @@ * Side Public License, v 1. */ -import React, { useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { EuiFieldText, EuiFieldTextProps } from '@elastic/eui'; import { getFieldInputValue } from '@kbn/management-settings-utilities'; import { useUpdate } from '@kbn/management-settings-utilities'; +import { debounce } from 'lodash'; +import { useServices } from '../services'; import { InputProps } from '../types'; import { TEST_SUBJ_PREFIX_FIELD } from '.'; @@ -33,29 +35,45 @@ export const ArrayInput = ({ }: ArrayInputProps) => { const [inputValue] = getFieldInputValue(field, unsavedChange) || []; const [value, setValue] = useState(inputValue?.join(', ')); + const { validateChange } = useServices(); + const onUpdate = useUpdate({ onInputChange, field }); + + const updateValue = useCallback( + async (newValue: string, onUpdateFn) => { + const parsedValue = newValue + .replace(REGEX, ',') + .split(',') + .filter((v) => v !== ''); + const validationResponse = await validateChange(field.id, parsedValue); + if (validationResponse.successfulValidation && !validationResponse.valid) { + onUpdateFn({ + type: field.type, + unsavedValue: parsedValue, + isInvalid: !validationResponse.valid, + error: validationResponse.errorMessage, + }); + } else { + onUpdateFn({ type: field.type, unsavedValue: parsedValue }); + } + }, + [validateChange, field.id, field.type] + ); + + const debouncedUpdateValue = useMemo(() => { + // Trigger update 1000 ms after the user stopped typing to reduce validation requests to the server + return debounce(updateValue, 1000); + }, [updateValue]); - const onChange: EuiFieldTextProps['onChange'] = (event) => { + const onChange: EuiFieldTextProps['onChange'] = async (event) => { const newValue = event.target.value; setValue(newValue); + await debouncedUpdateValue(newValue, onUpdate); }; - const onUpdate = useUpdate({ onInputChange, field }); - useEffect(() => { setValue(inputValue?.join(', ')); }, [inputValue]); - // In the past, each keypress would invoke the `onChange` callback. This - // is likely wasteful, so we've switched it to `onBlur` instead. - const onBlur = (event: React.ChangeEvent) => { - const blurValue = event.target.value - .replace(REGEX, ',') - .split(',') - .filter((v) => v !== ''); - onUpdate({ type: field.type, unsavedValue: blurValue }); - setValue(blurValue.join(', ')); - }; - const { id, name, ariaAttributes } = field; const { ariaLabel, ariaDescribedBy } = ariaAttributes; @@ -66,7 +84,7 @@ export const ArrayInput = ({ disabled={!isSavingEnabled} aria-label={ariaLabel} aria-describedby={ariaDescribedBy} - {...{ name, onBlur, onChange, value }} + {...{ name, onChange, value }} /> ); }; diff --git a/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx b/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx index 5b9d90154d087..cbf53979efa83 100644 --- a/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx +++ b/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx @@ -6,13 +6,13 @@ * Side Public License, v 1. */ -import React from 'react'; - -import { i18n } from '@kbn/i18n'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { SettingType } from '@kbn/management-settings-types'; import { getFieldInputValue, useUpdate } from '@kbn/management-settings-utilities'; +import { debounce } from 'lodash'; +import { useServices } from '../services'; import { CodeEditor, CodeEditorProps } from '../code_editor'; import type { InputProps } from '../types'; import { TEST_SUBJ_PREFIX_FIELD } from '.'; @@ -45,39 +45,48 @@ export const CodeEditorInput = ({ defaultValue, onInputChange, }: CodeEditorInputProps) => { + // @ts-expect-error + const [inputValue] = getFieldInputValue(field, unsavedChange); + const [value, setValue] = useState(inputValue); + const { validateChange } = useServices(); const onUpdate = useUpdate({ onInputChange, field }); - const onChange: CodeEditorProps['onChange'] = (inputValue) => { - let newUnsavedValue; - let errorParams = {}; - - switch (type) { - case 'json': - const isJsonArray = Array.isArray(JSON.parse(defaultValue || '{}')); - newUnsavedValue = inputValue || (isJsonArray ? '[]' : '{}'); + const updateValue = useCallback( + async (newValue: string, onUpdateFn) => { + const isJsonArray = Array.isArray(JSON.parse(defaultValue || '{}')); + const parsedValue = newValue || (isJsonArray ? '[]' : '{}'); + const validationResponse = await validateChange(field.id, parsedValue); + if (validationResponse.successfulValidation && !validationResponse.valid) { + onUpdateFn({ + type: field.type, + unsavedValue: newValue, + isInvalid: !validationResponse.valid, + error: validationResponse.errorMessage, + }); + } else { + onUpdateFn({ type: field.type, unsavedValue: newValue }); + } + }, + [validateChange, field.id, field.type, defaultValue] + ); - try { - JSON.parse(newUnsavedValue); - } catch (e) { - errorParams = { - error: i18n.translate('management.settings.field.codeEditorSyntaxErrorMessage', { - defaultMessage: 'Invalid JSON syntax', - }), - isInvalid: true, - }; - } - break; - default: - newUnsavedValue = inputValue; - } + const debouncedUpdateValue = useMemo(() => { + // Trigger update 1000 ms after the user stopped typing to reduce validation requests to the server + return debounce(updateValue, 1000); + }, [updateValue]); - onUpdate({ type: field.type, unsavedValue: inputValue, ...errorParams }); + const onChange: CodeEditorProps['onChange'] = async (newValue) => { + // @ts-expect-error + setValue(newValue); + await debouncedUpdateValue(newValue, onUpdate); }; + useEffect(() => { + setValue(inputValue); + }, [inputValue]); + const { id, ariaAttributes } = field; const { ariaLabel, ariaDescribedBy } = ariaAttributes; - // @ts-expect-error - const [value] = getFieldInputValue(field, unsavedChange); return (
diff --git a/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx index 800a807f8103a..ecc132dad8c89 100644 --- a/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx +++ b/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx @@ -16,6 +16,7 @@ import { CodeEditorProps } from '../code_editor'; const name = 'Some json field'; const id = 'some:json:field'; const initialValue = '{"foo":"bar"}'; +import { wrap } from '../mocks'; jest.mock('../code_editor', () => ({ CodeEditor: ({ value, onChange }: CodeEditorProps) => ( @@ -55,51 +56,46 @@ describe('JsonEditorInput', () => { }); it('renders without errors', () => { - const { container } = render(); + const { container } = render(wrap()); expect(container).toBeInTheDocument(); }); it('renders the value prop', () => { - const { getByTestId } = render(); + const { getByTestId } = render(wrap()); const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); expect(input).toHaveValue(initialValue); }); - it('calls the onInputChange prop when the object value changes', () => { - const { getByTestId } = render(); + it('calls the onInputChange prop when the object value changes', async () => { + const { getByTestId } = render(wrap()); const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); fireEvent.change(input, { target: { value: '{"bar":"foo"}' } }); - expect(defaultProps.onInputChange).toHaveBeenCalledWith({ - type: 'json', - unsavedValue: '{"bar":"foo"}', - }); + + await waitFor(() => + expect(defaultProps.onInputChange).toHaveBeenCalledWith({ + type: 'json', + unsavedValue: '{"bar":"foo"}', + }) + ); }); - it('calls the onInputChange prop when the object value changes with no value', () => { - const { getByTestId } = render(); + it('calls the onInputChange prop when the object value changes with no value', async () => { + const { getByTestId } = render(wrap()); const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); fireEvent.change(input, { target: { value: '' } }); - expect(defaultProps.onInputChange).toHaveBeenCalledWith({ type: 'json', unsavedValue: '' }); - }); - it('calls the onInputChange prop with an error when the object value changes to invalid JSON', () => { - const { getByTestId } = render(); - const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); - fireEvent.change(input, { target: { value: '{"bar" "foo"}' } }); - expect(defaultProps.onInputChange).toHaveBeenCalledWith({ - type: 'json', - unsavedValue: '{"bar" "foo"}', - error: 'Invalid JSON syntax', - isInvalid: true, - }); + await waitFor(() => + expect(defaultProps.onInputChange).toHaveBeenCalledWith({ type: 'json', unsavedValue: '' }) + ); }); - it('calls the onInputChange prop when the array value changes', () => { + it('calls the onInputChange prop when the array value changes', async () => { const props = { ...defaultProps, defaultValue: '["bar", "foo"]', value: undefined }; - const { getByTestId } = render(); + const { getByTestId } = render(wrap()); const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); fireEvent.change(input, { target: { value: '["foo", "bar", "baz"]' } }); - waitFor(() => + + await waitFor(() => expect(defaultProps.onInputChange).toHaveBeenCalledWith({ type: 'json', unsavedValue: '["foo", "bar", "baz"]', @@ -107,28 +103,18 @@ describe('JsonEditorInput', () => { ); }); - it('calls the onInputChange prop when the array value changes with no value', () => { + it('calls the onInputChange prop when the array value changes with no value', async () => { const props = { ...defaultProps, defaultValue: '["bar", "foo"]', value: '["bar", "foo"]', }; - const { getByTestId } = render(); + const { getByTestId } = render(wrap()); const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); fireEvent.change(input, { target: { value: '' } }); - expect(defaultProps.onInputChange).toHaveBeenCalledWith({ type: 'json', unsavedValue: '' }); - }); - it('calls the onInputChange prop with an array when the array value changes to invalid JSON', () => { - const props = { ...defaultProps, defaultValue: '["bar", "foo"]', value: undefined }; - const { getByTestId } = render(); - const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); - fireEvent.change(input, { target: { value: '["bar", "foo" | "baz"]' } }); - expect(defaultProps.onInputChange).toHaveBeenCalledWith({ - type: 'json', - unsavedValue: '["bar", "foo" | "baz"]', - error: 'Invalid JSON syntax', - isInvalid: true, - }); + await waitFor(() => + expect(defaultProps.onInputChange).toHaveBeenCalledWith({ type: 'json', unsavedValue: '' }) + ); }); }); diff --git a/packages/kbn-management/settings/components/field_input/input/markdown_editor_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/markdown_editor_input.test.tsx index 291585e5f149a..f26e59e43efbd 100644 --- a/packages/kbn-management/settings/components/field_input/input/markdown_editor_input.test.tsx +++ b/packages/kbn-management/settings/components/field_input/input/markdown_editor_input.test.tsx @@ -7,11 +7,12 @@ */ import React from 'react'; -import { render, fireEvent } from '@testing-library/react'; +import { render, fireEvent, waitFor } from '@testing-library/react'; import { CodeEditorInput, CodeEditorInputProps } from './code_editor_input'; import { TEST_SUBJ_PREFIX_FIELD } from '.'; import { CodeEditorProps } from '../code_editor'; +import { wrap } from '../mocks'; const name = 'Some markdown field'; const id = 'some:markdown:field'; @@ -55,23 +56,26 @@ describe('MarkdownEditorInput', () => { }); it('renders without errors', () => { - const { container } = render(); + const { container } = render(wrap()); expect(container).toBeInTheDocument(); }); it('renders the value prop', () => { - const { getByTestId } = render(); + const { getByTestId } = render(wrap()); const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); expect(input).toHaveValue(initialValue); }); - it('calls the onInputChange prop when the value changes', () => { - const { getByTestId } = render(); + it('calls the onInputChange prop when the value changes', async () => { + const { getByTestId } = render(wrap()); const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); fireEvent.change(input, { target: { value: '# New Markdown Title' } }); - expect(defaultProps.onInputChange).toHaveBeenCalledWith({ - type: 'markdown', - unsavedValue: '# New Markdown Title', - }); + + await waitFor(() => + expect(defaultProps.onInputChange).toHaveBeenCalledWith({ + type: 'markdown', + unsavedValue: '# New Markdown Title', + }) + ); }); }); diff --git a/packages/kbn-management/settings/components/field_input/input/number_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/number_input.test.tsx index fa228a48b721e..968982759a1dc 100644 --- a/packages/kbn-management/settings/components/field_input/input/number_input.test.tsx +++ b/packages/kbn-management/settings/components/field_input/input/number_input.test.tsx @@ -65,14 +65,17 @@ describe('NumberInput', () => { expect(input).toHaveValue(4321); }); - it('calls the onInputChange prop when the value changes', () => { + it('calls the onInputChange prop when the value changes', async () => { const { getByTestId } = render(wrap()); const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); fireEvent.change(input, { target: { value: '54321' } }); - expect(defaultProps.onInputChange).toHaveBeenCalledWith({ - type: 'number', - unsavedValue: 54321, - }); + + await waitFor(() => + expect(defaultProps.onInputChange).toHaveBeenCalledWith({ + type: 'number', + unsavedValue: 54321, + }) + ); }); it('disables the input when isDisabled prop is true', () => { diff --git a/packages/kbn-management/settings/components/field_input/input/number_input.tsx b/packages/kbn-management/settings/components/field_input/input/number_input.tsx index a1929593e3cb5..8a29429eff59f 100644 --- a/packages/kbn-management/settings/components/field_input/input/number_input.tsx +++ b/packages/kbn-management/settings/components/field_input/input/number_input.tsx @@ -6,13 +6,15 @@ * Side Public License, v 1. */ -import React from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { EuiFieldNumber, EuiFieldNumberProps } from '@elastic/eui'; import { getFieldInputValue, useUpdate } from '@kbn/management-settings-utilities'; +import { debounce } from 'lodash'; import { InputProps } from '../types'; import { TEST_SUBJ_PREFIX_FIELD } from '.'; +import { useServices } from '../services'; /** * Props for a {@link NumberInput} component. @@ -28,18 +30,45 @@ export const NumberInput = ({ isSavingEnabled, onInputChange, }: NumberInputProps) => { - const onChange: EuiFieldNumberProps['onChange'] = (event) => { - const inputValue = Number(event.target.value); - onUpdate({ type: field.type, unsavedValue: inputValue }); + const [inputValue] = getFieldInputValue(field, unsavedChange) || undefined; + const [value, setValue] = useState(inputValue); + const { validateChange } = useServices(); + const onUpdate = useUpdate({ onInputChange, field }); + + const updateValue = useCallback( + async (newValue: number, onUpdateFn) => { + const validationResponse = await validateChange(field.id, newValue); + if (validationResponse.successfulValidation && !validationResponse.valid) { + onUpdateFn({ + type: field.type, + unsavedValue: newValue, + isInvalid: !validationResponse.valid, + error: validationResponse.errorMessage, + }); + } else { + onUpdateFn({ type: field.type, unsavedValue: newValue }); + } + }, + [validateChange, field.id, field.type] + ); + + const debouncedUpdateValue = useMemo(() => { + // Trigger update 500 ms after the user stopped typing to reduce validation requests to the server + return debounce(updateValue, 500); + }, [updateValue]); + + const onChange: EuiFieldNumberProps['onChange'] = async (event) => { + const newValue = Number(event.target.value); + setValue(newValue); + await debouncedUpdateValue(newValue, onUpdate); }; - const onUpdate = useUpdate({ onInputChange, field }); + useEffect(() => { + setValue(inputValue); + }, [inputValue]); const { id, name, ariaAttributes } = field; const { ariaLabel, ariaDescribedBy } = ariaAttributes; - const [rawValue] = getFieldInputValue(field, unsavedChange); - - const value = rawValue === null ? undefined : rawValue; return ( { export const createFieldInputServicesMock = (): FieldInputServices => ({ showDanger: jest.fn(), + validateChange: async () => { + return { successfulValidation: true, valid: true }; + }, }); export const TestWrapper = ({ diff --git a/packages/kbn-management/settings/components/field_input/services.tsx b/packages/kbn-management/settings/components/field_input/services.tsx index 95a6474f89b58..d19278268b2a6 100644 --- a/packages/kbn-management/settings/components/field_input/services.tsx +++ b/packages/kbn-management/settings/components/field_input/services.tsx @@ -17,9 +17,13 @@ const FieldInputContext = React.createContext(null); export const FieldInputProvider: FC = ({ children, ...services }) => { // Typescript types are widened to accept more than what is needed. Take only what is necessary // so the context remains clean. - const { showDanger } = services; + const { showDanger, validateChange } = services; - return {children}; + return ( + + {children} + + ); }; /** @@ -28,11 +32,15 @@ export const FieldInputProvider: FC = ({ children, ...servic export const FieldInputKibanaProvider: FC = ({ children, notifications: { toasts }, + settings: { client }, }) => { return ( toasts.addDanger(message), + validateChange: async (key, value) => { + return await client.validateValue(key, value); + }, }} > {children} diff --git a/packages/kbn-management/settings/components/field_input/tsconfig.json b/packages/kbn-management/settings/components/field_input/tsconfig.json index bc47a21a3d752..bb4c6b4aa57d0 100644 --- a/packages/kbn-management/settings/components/field_input/tsconfig.json +++ b/packages/kbn-management/settings/components/field_input/tsconfig.json @@ -29,5 +29,6 @@ "@kbn/core-theme-browser-mocks", "@kbn/core-i18n-browser", "@kbn/core-analytics-browser-mocks", + "@kbn/core-ui-settings-browser", ] } diff --git a/packages/kbn-management/settings/components/field_input/types.ts b/packages/kbn-management/settings/components/field_input/types.ts index e1c2ce1a70dfb..f6eed155a1891 100644 --- a/packages/kbn-management/settings/components/field_input/types.ts +++ b/packages/kbn-management/settings/components/field_input/types.ts @@ -13,6 +13,8 @@ import { UnsavedFieldChange, } from '@kbn/management-settings-types'; import { ToastsStart } from '@kbn/core-notifications-browser'; +import { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; +import { ValueValidation } from '@kbn/core-ui-settings-browser/src/types'; /** * Contextual services used by a {@link FieldInput} component. @@ -23,6 +25,7 @@ export interface FieldInputServices { * @param value The message to display. */ showDanger: (value: string) => void; + validateChange: (key: string, value: any) => Promise; } /** @@ -34,6 +37,9 @@ export interface FieldInputKibanaDependencies { notifications: { toasts: Pick; }; + settings: { + client: IUiSettingsClient; + }; } /** diff --git a/packages/kbn-management/settings/components/field_row/__stories__/common.tsx b/packages/kbn-management/settings/components/field_row/__stories__/common.tsx index e8c51d075c21d..5b20b5fcf24ba 100644 --- a/packages/kbn-management/settings/components/field_row/__stories__/common.tsx +++ b/packages/kbn-management/settings/components/field_row/__stories__/common.tsx @@ -78,6 +78,13 @@ export const getStory = ( { + action(`validateChange`)({ + key, + value, + }); + return { successfulValidation: true, valid: true }; + }} > diff --git a/packages/kbn-management/settings/components/field_row/services.tsx b/packages/kbn-management/settings/components/field_row/services.tsx index 10963041837e6..6350b7f7cd103 100644 --- a/packages/kbn-management/settings/components/field_row/services.tsx +++ b/packages/kbn-management/settings/components/field_row/services.tsx @@ -29,11 +29,11 @@ export interface FieldRowProviderProps extends FieldRowServices { export const FieldRowProvider = ({ children, ...services }: FieldRowProviderProps) => { // Typescript types are widened to accept more than what is needed. Take only what is necessary // so the context remains clean. - const { links, showDanger } = services; + const { links, showDanger, validateChange } = services; return ( - {children} + {children} ); }; @@ -45,6 +45,7 @@ export const FieldRowKibanaProvider: FC = ({ children, docLinks, notifications, + settings, }) => { return ( = ({ links: docLinks.links.management, }} > - {children} + + {children} + ); }; diff --git a/packages/kbn-management/settings/components/form/services.tsx b/packages/kbn-management/settings/components/form/services.tsx index e0a48807b351f..39aac8b4ecb01 100644 --- a/packages/kbn-management/settings/components/form/services.tsx +++ b/packages/kbn-management/settings/components/form/services.tsx @@ -56,7 +56,7 @@ export const FormKibanaProvider: FC = ({ children, ...de return ( - + {children} 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 dce99b908d650..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'; @@ -37,6 +38,13 @@ export default { saveChanges={action('saveChanges')} showError={action('showError')} showReloadPagePrompt={action('showReloadPagePrompt')} + validateChange={async (key, value) => { + action(`validateChange`)({ + key, + value, + }); + return { successfulValidation: true, valid: true }; + }} > @@ -62,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-search-response-warnings/index.ts b/packages/kbn-search-response-warnings/index.ts index 88b61320b99f7..6c3a1ad5487ad 100644 --- a/packages/kbn-search-response-warnings/index.ts +++ b/packages/kbn-search-response-warnings/index.ts @@ -9,11 +9,15 @@ export type { SearchResponseWarning, WarningHandlerCallback } from './src/types'; export { + getWarningsDescription, + getWarningsTitle, SearchResponseWarningsBadge, SearchResponseWarningsBadgePopoverContent, SearchResponseWarningsCallout, SearchResponseWarningsEmptyPrompt, + ViewDetailsPopover, } from './src/components/search_response_warnings'; +export { extractWarnings } from './src/extract_warnings'; export { handleWarnings } from './src/handle_warnings'; export { hasUnsupportedDownsampledAggregationFailure } from './src/has_unsupported_downsampled_aggregation_failure'; diff --git a/packages/kbn-search-response-warnings/src/components/search_response_warnings/index.ts b/packages/kbn-search-response-warnings/src/components/search_response_warnings/index.ts index 06c2b2c18e31a..ff27f996be2a7 100644 --- a/packages/kbn-search-response-warnings/src/components/search_response_warnings/index.ts +++ b/packages/kbn-search-response-warnings/src/components/search_response_warnings/index.ts @@ -6,7 +6,9 @@ * Side Public License, v 1. */ +export { getWarningsDescription, getWarningsTitle } from './i18n_utils'; export { SearchResponseWarningsBadge } from './badge'; export { SearchResponseWarningsBadgePopoverContent } from './badge_popover_content'; export { SearchResponseWarningsCallout } from './callout'; export { SearchResponseWarningsEmptyPrompt } from './empty_prompt'; +export { ViewDetailsPopover } from './view_details_popover'; diff --git a/packages/kbn-test/src/kbn_client/kbn_client_ui_settings.ts b/packages/kbn-test/src/kbn_client/kbn_client_ui_settings.ts index 8b9277fdab8b9..599184b30a461 100644 --- a/packages/kbn-test/src/kbn_client/kbn_client_ui_settings.ts +++ b/packages/kbn-test/src/kbn_client/kbn_client_ui_settings.ts @@ -10,7 +10,7 @@ import { ToolingLog } from '@kbn/tooling-log'; import { KbnClientRequester, pathWithSpace } from './kbn_client_requester'; -export type UiSettingValues = Record; +export type UiSettingValues = Record; interface UiSettingsApiResponse { settings: { [key: string]: { 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_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/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/src/core/public/index.ts b/src/core/public/index.ts index b874a937257b2..6b29603dd63f6 100644 --- a/src/core/public/index.ts +++ b/src/core/public/index.ts @@ -187,6 +187,7 @@ export type { HttpResponse, HttpHandler, IBasePath, + IStaticAssets, IAnonymousPaths, IExternalUrl, IHttpInterceptController, diff --git a/src/core/server/index.ts b/src/core/server/index.ts index 30562d389ac41..3e63315e6d8fa 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -184,6 +184,7 @@ export type { ICspConfig, IExternalUrlConfig, IBasePath, + IStaticAssets, SessionStorage, SessionStorageCookieOptions, SessionCookieValidationResult, diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index 2bc127bcadcfa..2c7d540132139 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -142,7 +142,7 @@ describe('checking migration metadata changes on all registered SO types', () => "siem-ui-timeline": "d3de8ff3617be8f2a799d66b1471b9be6124bf40", "siem-ui-timeline-note": "0a32fb776907f596bedca292b8c646496ae9c57b", "siem-ui-timeline-pinned-event": "082daa3ce647b33873f6abccf340bdfa32057c8d", - "slo": "9a9995e4572de1839651c43b5fc4dc8276bb5815", + "slo": "2048ab6791df2e1ae0936f29c20765cb8d2fcfaa", "space": "8de4ec513e9bbc6b2f1d635161d850be7747d38e", "spaces-usage-stats": "3abca98713c52af8b30300e386c7779b3025a20e", "synthetics-monitor": "33ddc4b8979f378edf58bcc7ba13c5c5b572f42d", 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 f65a5b59487be..da10b231b7a22 100644 --- a/src/core/server/integration_tests/http/http_server.test.ts +++ b/src/core/server/integration_tests/http/http_server.test.ts @@ -36,6 +36,7 @@ describe('Http server', () => { allowFromAnyIp: true, ipAllowlist: [], }, + cdn: {}, cors: { enabled: false, }, diff --git a/src/core/server/integration_tests/ui_settings/routes.test.ts b/src/core/server/integration_tests/ui_settings/routes.test.ts index 6999731947d86..078946a7a9ab5 100644 --- a/src/core/server/integration_tests/ui_settings/routes.test.ts +++ b/src/core/server/integration_tests/ui_settings/routes.test.ts @@ -156,6 +156,47 @@ describe('ui settings service', () => { }); }); + describe('validate', () => { + it('returns correct validation error message for invalid value', async () => { + const response = await request + .post(root, '/internal/kibana/settings/custom/validate') + .send({ value: 100 }) + .expect(200); + + expect(response.body).toMatchObject({ + valid: false, + errorMessage: 'expected value of type [string] but got [number]', + }); + }); + + it('returns no validation error message for valid value', async () => { + const response = await request + .post(root, '/internal/kibana/settings/custom/validate') + .send({ value: 'test' }) + .expect(200); + + expect(response.body).toMatchObject({ valid: true }); + }); + + it('returns a 404 for non-existing key', async () => { + const response = await request + .post(root, '/internal/kibana/settings/test/validate') + .send({ value: 'test' }) + .expect(404); + + expect(response.body.message).toBe('Setting with a key [test] does not exist.'); + }); + + it('returns a 400 for a null value', async () => { + const response = await request + .post(root, '/internal/kibana/settings/test/validate') + .send({ value: null }) + .expect(400); + + expect(response.body.message).toBe('No value was specified.'); + }); + }); + describe('global', () => { describe('set', () => { it('validates value', async () => { 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..98470ccf13658 100644 --- a/src/dev/storybook/aliases.ts +++ b/src/dev/storybook/aliases.ts @@ -22,6 +22,7 @@ export const storybookAliases = { 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/advanced_settings/public/management_app/settings.test.tsx b/src/plugins/advanced_settings/public/management_app/settings.test.tsx index f51eec4e97bb6..a98b29922af1a 100644 --- a/src/plugins/advanced_settings/public/management_app/settings.test.tsx +++ b/src/plugins/advanced_settings/public/management_app/settings.test.tsx @@ -201,6 +201,8 @@ function mockConfig() { }, }; }, + validateValue: (key: string, value: any) => + Promise.resolve({ successfulValidation: true, valid: true }), }; return { core: { diff --git a/src/plugins/advanced_settings/public/management_app/settings_helper.test.ts b/src/plugins/advanced_settings/public/management_app/settings_helper.test.ts index 7f745db9b786b..e4aaab4bb3054 100644 --- a/src/plugins/advanced_settings/public/management_app/settings_helper.test.ts +++ b/src/plugins/advanced_settings/public/management_app/settings_helper.test.ts @@ -129,6 +129,8 @@ describe('Settings Helper', () => { ...imageSetting, }; }, + validateValue: (key: string, value: any) => + Promise.resolve({ successfulValidation: true, valid: true }), }; it('mapConfig', () => { diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/__mocks__/ui_settings.ts b/src/plugins/chart_expressions/expression_partition_vis/public/__mocks__/ui_settings.ts index 1585133e3b8d6..490d2c931b447 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/__mocks__/ui_settings.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/public/__mocks__/ui_settings.ts @@ -28,4 +28,6 @@ export const uiSettings: IUiSettingsClient = { getAll: (): Readonly> => { return {}; }, + validateValue: (key: string, value: any) => + Promise.resolve({ successfulValidation: true, valid: true }), }; 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/data/config.ts b/src/plugins/data/config.ts index 03cd77653becb..b6adfdede2469 100644 --- a/src/plugins/data/config.ts +++ b/src/plugins/data/config.ts @@ -86,6 +86,10 @@ export const searchConfigSchema = schema.object({ export const configSchema = schema.object({ search: searchConfigSchema, + /** + * Turns on/off limit validations for the registered uiSettings. + */ + enableUiSettingsValidations: schema.boolean({ defaultValue: false }), }); export type ConfigSchema = TypeOf; diff --git a/src/plugins/data/server/plugin.ts b/src/plugins/data/server/plugin.ts index 1b2b0c3c78ca1..dfe88a12026bb 100644 --- a/src/plugins/data/server/plugin.ts +++ b/src/plugins/data/server/plugin.ts @@ -74,9 +74,11 @@ export class DataServerPlugin private readonly kqlTelemetryService: KqlTelemetryService; private readonly queryService = new QueryService(); private readonly logger: Logger; + private readonly config: ConfigSchema; constructor(initializerContext: PluginInitializerContext) { this.logger = initializerContext.logger.get('data'); + this.config = initializerContext.config.get(); this.searchService = new SearchService(initializerContext, this.logger); this.scriptsService = new ScriptsService(); this.kqlTelemetryService = new KqlTelemetryService(initializerContext); @@ -90,7 +92,7 @@ export class DataServerPlugin const querySetup = this.queryService.setup(core); this.kqlTelemetryService.setup(core, { usageCollection }); - core.uiSettings.register(getUiSettings(core.docLinks)); + core.uiSettings.register(getUiSettings(core.docLinks, this.config.enableUiSettingsValidations)); const searchSetup = this.searchService.setup(core, { bfetch, diff --git a/src/plugins/data/server/ui_settings.ts b/src/plugins/data/server/ui_settings.ts index 3ed2a86fb0533..7b386e864fbc1 100644 --- a/src/plugins/data/server/ui_settings.ts +++ b/src/plugins/data/server/ui_settings.ts @@ -32,7 +32,8 @@ const requestPreferenceOptionLabels = { }; export function getUiSettings( - docLinks: DocLinksServiceSetup + docLinks: DocLinksServiceSetup, + enableValidations: boolean ): Record> { return { [UI_SETTINGS.META_FIELDS]: { @@ -463,13 +464,22 @@ export function getUiSettings( '', }, }), - schema: schema.arrayOf( - schema.object({ - from: schema.string(), - to: schema.string(), - display: schema.string(), - }) - ), + schema: enableValidations + ? schema.arrayOf( + schema.object({ + from: schema.string(), + to: schema.string(), + display: schema.string(), + }), + { maxSize: 10 } + ) + : schema.arrayOf( + schema.object({ + from: schema.string(), + to: schema.string(), + display: schema.string(), + }) + ), }, [UI_SETTINGS.FILTERS_PINNED_BY_DEFAULT]: { name: i18n.translate('data.advancedSettings.pinFiltersTitle', { 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/public/data_views/data_views_api_client.test.ts b/src/plugins/data_views/public/data_views/data_views_api_client.test.ts index 90a208650a965..f36776153ee3a 100644 --- a/src/plugins/data_views/public/data_views/data_views_api_client.test.ts +++ b/src/plugins/data_views/public/data_views/data_views_api_client.test.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import type { HttpSetup } from '@kbn/core/public'; import { http } from './data_views_api_client.test.mock'; import { DataViewsApiClient } from './data_views_api_client'; import { FIELDS_FOR_WILDCARD_PATH as expectedPath } from '../../common/constants'; @@ -16,7 +17,7 @@ describe('IndexPatternsApiClient', () => { beforeEach(() => { fetchSpy = jest.spyOn(http, 'fetch').mockImplementation(() => Promise.resolve({})); - indexPatternsApiClient = new DataViewsApiClient(http); + indexPatternsApiClient = new DataViewsApiClient(http as HttpSetup); }); test('uses the right URI to fetch fields for wildcard', async function () { diff --git a/src/plugins/discover/public/__mocks__/data_view_complex.ts b/src/plugins/discover/public/__mocks__/data_view_complex.ts index 03161a0df4e3f..05051f48b155c 100644 --- a/src/plugins/discover/public/__mocks__/data_view_complex.ts +++ b/src/plugins/discover/public/__mocks__/data_view_complex.ts @@ -426,3 +426,18 @@ export const dataViewAdHoc = { }), isPersisted: () => false, } as DataView; + +export const dataViewWithDefaultColumnMock = buildDataViewMock({ + name: 'data-view-with-user-default-column', + fields: [ + ...fields, + { + name: 'default_column', + type: 'date', + scripted: false, + searchable: true, + aggregatable: true, + }, + ] as DataView['fields'], + timeFieldName: '@timestamp', +}); diff --git a/src/plugins/discover/public/application/context/context_app_content.tsx b/src/plugins/discover/public/application/context/context_app_content.tsx index 098f789be1a6f..84d2126f15495 100644 --- a/src/plugins/discover/public/application/context/context_app_content.tsx +++ b/src/plugins/discover/public/application/context/context_app_content.tsx @@ -151,7 +151,7 @@ export function ContextAppContent({ return ( - {interceptedWarnings.length && ( + {Boolean(interceptedWarnings.length) && ( <> 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/discover/public/application/main/hooks/utils/change_data_view.test.ts b/src/plugins/discover/public/application/main/hooks/utils/change_data_view.test.ts index 37a503716af0e..a0266b65ed01d 100644 --- a/src/plugins/discover/public/application/main/hooks/utils/change_data_view.test.ts +++ b/src/plugins/discover/public/application/main/hooks/utils/change_data_view.test.ts @@ -6,11 +6,14 @@ * Side Public License, v 1. */ +import { + dataViewComplexMock, + dataViewWithDefaultColumnMock, +} from '../../../../__mocks__/data_view_complex'; import { changeDataView } from './change_data_view'; import { savedSearchMock } from '../../../../__mocks__/saved_search'; import { discoverServiceMock } from '../../../../__mocks__/services'; import type { DataView } from '@kbn/data-views-plugin/common'; -import { dataViewComplexMock } from '../../../../__mocks__/data_view_complex'; import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; const setupTestParams = (dataView: DataView | undefined) => { @@ -27,11 +30,21 @@ const setupTestParams = (dataView: DataView | undefined) => { }; describe('changeDataView', () => { + it('should set the right app state when a valid data view (which includes the preconfigured default column) to switch to is given', async () => { + const params = setupTestParams(dataViewWithDefaultColumnMock); + await changeDataView(dataViewWithDefaultColumnMock.id!, params); + expect(params.appState.update).toHaveBeenCalledWith({ + columns: ['default_column'], // default_column would be added as dataViewWithDefaultColumn has it as a mapped field + index: 'data-view-with-user-default-column-id', + sort: [['@timestamp', 'desc']], + }); + }); + it('should set the right app state when a valid data view to switch to is given', async () => { - const params = setupTestParams(dataViewComplexMock as DataView); - await changeDataView('data-view-with-various-field-types', params); + const params = setupTestParams(dataViewComplexMock); + await changeDataView(dataViewComplexMock.id!, params); expect(params.appState.update).toHaveBeenCalledWith({ - columns: ['default_column'], + columns: [], // default_column would not be added as dataViewComplexMock does not have it as a mapped field index: 'data-view-with-various-field-types-id', sort: [['data', 'desc']], }); diff --git a/src/plugins/discover/public/application/main/hooks/utils/change_data_view.ts b/src/plugins/discover/public/application/main/hooks/utils/change_data_view.ts index db7a4b0c00bbe..7218ea76b2ac6 100644 --- a/src/plugins/discover/public/application/main/hooks/utils/change_data_view.ts +++ b/src/plugins/discover/public/application/main/hooks/utils/change_data_view.ts @@ -8,7 +8,11 @@ import { SortOrder } from '@kbn/saved-search-plugin/public'; import { DataView } from '@kbn/data-views-plugin/common'; -import { MODIFY_COLUMNS_ON_SWITCH, SORT_DEFAULT_ORDER_SETTING } from '@kbn/discover-utils'; +import { + MODIFY_COLUMNS_ON_SWITCH, + SORT_DEFAULT_ORDER_SETTING, + DEFAULT_COLUMNS_SETTING, +} from '@kbn/discover-utils'; import { DiscoverInternalStateContainer } from '../../services/discover_internal_state_container'; import { DiscoverAppStateContainer } from '../../services/discover_app_state_container'; import { addLog } from '../../../../utils/add_log'; @@ -46,6 +50,7 @@ export async function changeDataView( const nextAppState = getDataViewAppState( dataView, nextDataView, + uiSettings.get(DEFAULT_COLUMNS_SETTING, []), state.columns || [], (state.sort || []) as SortOrder[], uiSettings.get(MODIFY_COLUMNS_ON_SWITCH), diff --git a/src/plugins/discover/public/application/main/services/discover_state.test.ts b/src/plugins/discover/public/application/main/services/discover_state.test.ts index dd2bc17bd891a..c946ac70bbe62 100644 --- a/src/plugins/discover/public/application/main/services/discover_state.test.ts +++ b/src/plugins/discover/public/application/main/services/discover_state.test.ts @@ -704,7 +704,7 @@ describe('Test discover state actions', () => { await state.actions.onChangeDataView(dataViewComplexMock.id!); await new Promise(process.nextTick); expect(getCurrentUrl()).toMatchInlineSnapshot( - `"/#?_g=(refreshInterval:(pause:!t,value:1000),time:(from:now-15d,to:now))&_a=(columns:!(default_column),index:data-view-with-various-field-types-id,interval:auto,sort:!(!(data,desc)))"` + `"/#?_g=(refreshInterval:(pause:!t,value:1000),time:(from:now-15d,to:now))&_a=(columns:!(),index:data-view-with-various-field-types-id,interval:auto,sort:!(!(data,desc)))"` ); await waitFor(() => { expect(state.dataState.fetch).toHaveBeenCalledTimes(1); diff --git a/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.test.ts b/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.test.ts index cf987c8c71090..e265a90ab291d 100644 --- a/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.test.ts +++ b/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.test.ts @@ -9,6 +9,8 @@ import { getDataViewAppState } from './get_switch_data_view_app_state'; import { DataView } from '@kbn/data-views-plugin/public'; +const emptyDefaultColumns: string[] = []; + /** * Helper function returning an data view */ @@ -36,23 +38,36 @@ const getDataView = (id: string, timeFieldName: string, fields: string[]) => { }; const currentDataView = getDataView('curr', '', ['category', 'name']); -const nextDataView = getDataView('next', '', ['category']); +const nextDataView = getDataView('next', '', ['category', 'user_default_column']); describe('Discover getDataViewAppState', () => { test('removing fields that are not part of the next data view, keeping unknown fields ', async () => { const result = getDataViewAppState( currentDataView, nextDataView, + emptyDefaultColumns, ['category', 'name', 'unknown'], [['category', 'desc']] ); expect(result.columns).toEqual(['category', 'unknown']); expect(result.sort).toEqual([['category', 'desc']]); }); + test('removing fields that are not part of the next data view and adding default columns', async () => { + const result = getDataViewAppState( + currentDataView, + nextDataView, + ['user_default_column', 'user_unknown_default_column'], + ['category', 'name', 'user_default_column'], + [['category', 'desc']] + ); + expect(result.columns).toEqual(['category', 'user_default_column']); + expect(result.sort).toEqual([['category', 'desc']]); + }); test('removing sorted by fields that are not part of the next data view', async () => { const result = getDataViewAppState( currentDataView, nextDataView, + emptyDefaultColumns, ['name'], [ ['category', 'desc'], @@ -66,6 +81,7 @@ describe('Discover getDataViewAppState', () => { const result = getDataViewAppState( currentDataView, nextDataView, + emptyDefaultColumns, ['name'], [ ['category', 'desc'], @@ -80,7 +96,13 @@ describe('Discover getDataViewAppState', () => { const current = getDataView('a', 'timeFieldA', ['timeFieldA']); const next = getDataView('b', 'timeFieldB', ['timeFieldB']); - const result = getDataViewAppState(current, next, [], [['timeFieldA', 'desc']]); + const result = getDataViewAppState( + current, + next, + emptyDefaultColumns, + [], + [['timeFieldA', 'desc']] + ); expect(result.columns).toEqual([]); expect(result.sort).toEqual([['timeFieldB', 'desc']]); }); @@ -89,7 +111,13 @@ describe('Discover getDataViewAppState', () => { const current = getDataView('a', 'timeFieldA', ['timeFieldA']); const next = getDataView('b', '', ['timeFieldA']); - const result = getDataViewAppState(current, next, [], [['timeFieldA', 'desc']]); + const result = getDataViewAppState( + current, + next, + emptyDefaultColumns, + [], + [['timeFieldA', 'desc']] + ); expect(result.columns).toEqual([]); expect(result.sort).toEqual([]); }); @@ -97,7 +125,7 @@ describe('Discover getDataViewAppState', () => { const current = getDataView('b', '', ['timeFieldA']); const next = getDataView('a', 'timeFieldA', ['timeFieldA']); - const result = getDataViewAppState(current, next, [], []); + const result = getDataViewAppState(current, next, emptyDefaultColumns, [], []); expect(result.columns).toEqual([]); expect(result.sort).toEqual([['timeFieldA', 'desc']]); }); @@ -105,8 +133,16 @@ describe('Discover getDataViewAppState', () => { const current = getDataView('timebased', 'timefield', ['timefield']); const next = getDataView('timebased2', 'timefield2', ['timefield', 'timefield2']); - const result = getDataViewAppState(current, next, [], [['timefield', 'desc']]); + const result = getDataViewAppState( + current, + next, + emptyDefaultColumns, + [], + [['timefield', 'desc']] + ); expect(result.columns).toEqual([]); expect(result.sort).toEqual([['timefield2', 'desc']]); }); + + // TODO: add tests }); diff --git a/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.ts b/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.ts index 064fe36d974ec..9597aa8537425 100644 --- a/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.ts +++ b/src/plugins/discover/public/application/main/utils/get_switch_data_view_app_state.ts @@ -5,6 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ +import { uniq } from 'lodash'; import { isOfAggregateQueryType, Query, AggregateQuery } from '@kbn/es-query'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { SortOrder } from '@kbn/saved-search-plugin/public'; @@ -17,20 +18,25 @@ import { getSortArray } from '../../../utils/sorting'; export function getDataViewAppState( currentDataView: DataView, nextDataView: DataView, + defaultColumns: string[], currentColumns: string[], currentSort: SortOrder[], modifyColumns: boolean = true, sortDirection: string = 'desc', query?: Query | AggregateQuery ) { - const nextColumns = modifyColumns - ? currentColumns.filter( - (column) => - nextDataView.fields.getByName(column) || !currentDataView.fields.getByName(column) - ) - : currentColumns; + let columns = currentColumns || []; + + if (modifyColumns) { + const currentUnknownColumns = columns.filter( + (column) => !currentDataView.fields.getByName(column) && !defaultColumns.includes(column) + ); + const currentColumnsRefreshed = uniq([...columns, ...defaultColumns]); + columns = currentColumnsRefreshed.filter( + (column) => nextDataView.fields.getByName(column) || currentUnknownColumns.includes(column) + ); + } - let columns = nextColumns.length ? nextColumns : []; if (query && isOfAggregateQueryType(query)) { columns = []; } diff --git a/src/plugins/discover/server/config.ts b/src/plugins/discover/server/config.ts new file mode 100644 index 0000000000000..5813ce2d50498 --- /dev/null +++ b/src/plugins/discover/server/config.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; +import { PluginConfigDescriptor } from '@kbn/core-plugins-server'; + +const configSchema = schema.object({ + enableUiSettingsValidations: schema.boolean({ defaultValue: false }), +}); + +export type ConfigSchema = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; diff --git a/src/plugins/discover/server/index.ts b/src/plugins/discover/server/index.ts index 1b5a9b5080da9..4ec924a258590 100644 --- a/src/plugins/discover/server/index.ts +++ b/src/plugins/discover/server/index.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { KibanaRequest } from '@kbn/core/server'; +import { KibanaRequest, PluginInitializerContext } from '@kbn/core/server'; import { DataPluginStart } from '@kbn/data-plugin/server/plugin'; import { ColumnsFromLocatorFn, SearchSourceFromLocatorFn, TitleFromLocatorFn } from './locator'; @@ -28,7 +28,9 @@ export interface DiscoverServerPluginStart { locator: DiscoverServerPluginLocatorService; } -export const plugin = async () => { +export { config } from './config'; + +export const plugin = async (context: PluginInitializerContext) => { const { DiscoverServerPlugin } = await import('./plugin'); - return new DiscoverServerPlugin(); + return new DiscoverServerPlugin(context); }; diff --git a/src/plugins/discover/server/plugin.ts b/src/plugins/discover/server/plugin.ts index b12833edf67a1..dc7761b2ba20d 100644 --- a/src/plugins/discover/server/plugin.ts +++ b/src/plugins/discover/server/plugin.ts @@ -12,6 +12,7 @@ import type { EmbeddableSetup } from '@kbn/embeddable-plugin/server'; import type { HomeServerPluginSetup } from '@kbn/home-plugin/server'; import { setStateToKbnUrl } from '@kbn/kibana-utils-plugin/common'; import type { SharePluginSetup } from '@kbn/share-plugin/server'; +import { PluginInitializerContext } from '@kbn/core/server'; import type { DiscoverServerPluginStart, DiscoverServerPluginStartDeps } from '.'; import { DiscoverAppLocatorDefinition } from '../common/locator'; import { capabilitiesProvider } from './capabilities_provider'; @@ -19,10 +20,17 @@ import { createSearchEmbeddableFactory } from './embeddable'; import { initializeLocatorServices } from './locator'; import { registerSampleData } from './sample_data'; import { getUiSettings } from './ui_settings'; +import { ConfigSchema } from './config'; export class DiscoverServerPlugin implements Plugin { + private readonly config: ConfigSchema; + + constructor(initializerContext: PluginInitializerContext) { + this.config = initializerContext.config.get(); + } + public setup( core: CoreSetup, plugins: { @@ -33,7 +41,7 @@ export class DiscoverServerPlugin } ) { core.capabilities.registerProvider(capabilitiesProvider); - core.uiSettings.register(getUiSettings(core.docLinks)); + core.uiSettings.register(getUiSettings(core.docLinks, this.config.enableUiSettingsValidations)); if (plugins.home) { registerSampleData(plugins.home.sampleData); diff --git a/src/plugins/discover/server/ui_settings.ts b/src/plugins/discover/server/ui_settings.ts index d6bbbd0eed9f0..806ae826bf3ab 100644 --- a/src/plugins/discover/server/ui_settings.ts +++ b/src/plugins/discover/server/ui_settings.ts @@ -38,8 +38,12 @@ const technicalPreviewLabel = i18n.translate('discover.advancedSettings.technica defaultMessage: 'technical preview', }); -export const getUiSettings: (docLinks: DocLinksServiceSetup) => Record = ( - docLinks: DocLinksServiceSetup +export const getUiSettings: ( + docLinks: DocLinksServiceSetup, + enableValidations: boolean +) => Record = ( + docLinks: DocLinksServiceSetup, + enableValidations: boolean ) => ({ [DEFAULT_COLUMNS_SETTING]: { name: i18n.translate('discover.advancedSettings.defaultColumnsTitle', { @@ -51,7 +55,9 @@ export const getUiSettings: (docLinks: DocLinksServiceSetup) => Record 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/home/server/services/sample_data/data_sets/ecommerce/index.ts b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/index.ts index e995510c99fee..f68036496914d 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/index.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/index.ts @@ -10,7 +10,7 @@ import path from 'path'; import { i18n } from '@kbn/i18n'; import { getSavedObjects } from './saved_objects'; import { fieldMappings } from './field_mappings'; -import { SampleDatasetSchema } from '../../lib/sample_dataset_registry_types'; +import { SampleDatasetProvider } from '../../lib/sample_dataset_registry_types'; const ecommerceName = i18n.translate('home.sampleData.ecommerceSpecTitle', { defaultMessage: 'Sample eCommerce orders', @@ -19,14 +19,17 @@ const ecommerceDescription = i18n.translate('home.sampleData.ecommerceSpecDescri defaultMessage: 'Sample data, visualizations, and dashboards for tracking eCommerce orders.', }); -export const ecommerceSpecProvider = function (): SampleDatasetSchema { +export const ecommerceSpecProvider: SampleDatasetProvider = ({ staticAssets }) => { return { id: 'ecommerce', name: ecommerceName, description: ecommerceDescription, - previewImagePath: '/plugins/home/assets/sample_data_resources/ecommerce/dashboard.webp', - darkPreviewImagePath: - '/plugins/home/assets/sample_data_resources/ecommerce/dashboard_dark.webp', + previewImagePath: staticAssets.getPluginAssetHref( + '/sample_data_resources/ecommerce/dashboard.webp' + ), + darkPreviewImagePath: staticAssets.getPluginAssetHref( + '/sample_data_resources/ecommerce/dashboard_dark.webp' + ), overviewDashboard: '722b74f0-b882-11e8-a6d9-e546fe2bba5f', defaultIndex: 'ff959d40-b880-11e8-a6d9-e546fe2bba5f', savedObjects: getSavedObjects(), @@ -41,6 +44,6 @@ export const ecommerceSpecProvider = function (): SampleDatasetSchema { }, ], status: 'not_installed', - iconPath: '/plugins/home/assets/sample_data_resources/ecommerce/icon.svg', + iconPath: staticAssets.getPluginAssetHref('/sample_data_resources/ecommerce/icon.svg'), }; }; diff --git a/src/plugins/home/server/services/sample_data/data_sets/flights/index.ts b/src/plugins/home/server/services/sample_data/data_sets/flights/index.ts index 691ac8334cbc3..7481f4cd50721 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/flights/index.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/flights/index.ts @@ -10,7 +10,7 @@ import path from 'path'; import { i18n } from '@kbn/i18n'; import { getSavedObjects } from './saved_objects'; import { fieldMappings } from './field_mappings'; -import { SampleDatasetSchema } from '../../lib/sample_dataset_registry_types'; +import { SampleDatasetProvider } from '../../lib/sample_dataset_registry_types'; const flightsName = i18n.translate('home.sampleData.flightsSpecTitle', { defaultMessage: 'Sample flight data', @@ -19,13 +19,17 @@ const flightsDescription = i18n.translate('home.sampleData.flightsSpecDescriptio defaultMessage: 'Sample data, visualizations, and dashboards for monitoring flight routes.', }); -export const flightsSpecProvider = function (): SampleDatasetSchema { +export const flightsSpecProvider: SampleDatasetProvider = ({ staticAssets }) => { return { id: 'flights', name: flightsName, description: flightsDescription, - previewImagePath: '/plugins/home/assets/sample_data_resources/flights/dashboard.webp', - darkPreviewImagePath: '/plugins/home/assets/sample_data_resources/flights/dashboard_dark.webp', + previewImagePath: staticAssets.getPluginAssetHref( + '/sample_data_resources/flights/dashboard.webp' + ), + darkPreviewImagePath: staticAssets.getPluginAssetHref( + '/sample_data_resources/flights/dashboard_dark.webp' + ), overviewDashboard: '7adfa750-4c81-11e8-b3d7-01146121b73d', defaultIndex: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', savedObjects: getSavedObjects(), @@ -40,6 +44,6 @@ export const flightsSpecProvider = function (): SampleDatasetSchema { }, ], status: 'not_installed', - iconPath: '/plugins/home/assets/sample_data_resources/flights/icon.svg', + iconPath: staticAssets.getPluginAssetHref('/sample_data_resources/flights/icon.svg'), }; }; diff --git a/src/plugins/home/server/services/sample_data/data_sets/logs/index.ts b/src/plugins/home/server/services/sample_data/data_sets/logs/index.ts index 219b7ea2cc9d0..6f001e85c6151 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/logs/index.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/logs/index.ts @@ -10,7 +10,7 @@ import path from 'path'; import { i18n } from '@kbn/i18n'; import { getSavedObjects } from './saved_objects'; import { fieldMappings } from './field_mappings'; -import { SampleDatasetSchema } from '../../lib/sample_dataset_registry_types'; +import { SampleDatasetProvider } from '../../lib/sample_dataset_registry_types'; const logsName = i18n.translate('home.sampleData.logsSpecTitle', { defaultMessage: 'Sample web logs', @@ -20,13 +20,15 @@ const logsDescription = i18n.translate('home.sampleData.logsSpecDescription', { }); export const GLOBE_ICON_PATH = '/plugins/home/assets/sample_data_resources/logs/icon.svg'; -export const logsSpecProvider = function (): SampleDatasetSchema { +export const logsSpecProvider: SampleDatasetProvider = ({ staticAssets }) => { return { id: 'logs', name: logsName, description: logsDescription, - previewImagePath: '/plugins/home/assets/sample_data_resources/logs/dashboard.webp', - darkPreviewImagePath: '/plugins/home/assets/sample_data_resources/logs/dashboard_dark.webp', + previewImagePath: staticAssets.getPluginAssetHref('/sample_data_resources/logs/dashboard.webp'), + darkPreviewImagePath: staticAssets.getPluginAssetHref( + '/sample_data_resources/logs/dashboard_dark.webp' + ), overviewDashboard: 'edf84fe0-e1a0-11e7-b6d5-4dc382ef7f5b', defaultIndex: '90943e30-9a47-11e8-b64d-95841ca0b247', savedObjects: getSavedObjects(), @@ -42,6 +44,6 @@ export const logsSpecProvider = function (): SampleDatasetSchema { }, ], status: 'not_installed', - iconPath: GLOBE_ICON_PATH, + iconPath: staticAssets.getPluginAssetHref('/sample_data_resources/logs/icon.svg'), }; }; diff --git a/src/plugins/home/server/services/sample_data/data_sets/logs_tsdb/index.ts b/src/plugins/home/server/services/sample_data/data_sets/logs_tsdb/index.ts index bfc4ec4554191..39dc153eb2b19 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/logs_tsdb/index.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/logs_tsdb/index.ts @@ -10,7 +10,7 @@ import path from 'path'; import { i18n } from '@kbn/i18n'; import { getSavedObjects } from './saved_objects'; import { fieldMappings } from './field_mappings'; -import { SampleDatasetSchema } from '../../lib/sample_dataset_registry_types'; +import { SampleDatasetProvider } from '../../lib/sample_dataset_registry_types'; const logsName = i18n.translate('home.sampleData.logsTsdbSpecTitle', { defaultMessage: 'Sample web logs (TSDB)', @@ -20,7 +20,7 @@ const logsDescription = i18n.translate('home.sampleData.logsTsdbSpecDescription' }); export const GLOBE_ICON_PATH = '/plugins/home/assets/sample_data_resources/logs/icon.svg'; -export const logsTSDBSpecProvider = function (): SampleDatasetSchema { +export const logsTSDBSpecProvider: SampleDatasetProvider = ({ staticAssets }) => { const startDate = new Date(); const endDate = new Date(); startDate.setMonth(startDate.getMonth() - 1); @@ -29,8 +29,10 @@ export const logsTSDBSpecProvider = function (): SampleDatasetSchema { id: 'logstsdb', name: logsName, description: logsDescription, - previewImagePath: '/plugins/home/assets/sample_data_resources/logs/dashboard.webp', - darkPreviewImagePath: '/plugins/home/assets/sample_data_resources/logs/dashboard_dark.webp', + previewImagePath: staticAssets.getPluginAssetHref('/sample_data_resources/logs/dashboard.webp'), + darkPreviewImagePath: staticAssets.getPluginAssetHref( + '/sample_data_resources/logs/dashboard_dark.webp' + ), overviewDashboard: 'edf84fe0-e1a0-11e7-b6d5-4dc382ef8f5b', defaultIndex: '90943e30-9a47-11e8-b64d-95841ca0c247', savedObjects: getSavedObjects(), @@ -53,6 +55,6 @@ export const logsTSDBSpecProvider = function (): SampleDatasetSchema { }, ], status: 'not_installed', - iconPath: GLOBE_ICON_PATH, + iconPath: staticAssets.getPluginAssetHref('/sample_data_resources/logs/icon.svg'), }; }; diff --git a/src/plugins/home/server/services/sample_data/lib/sample_dataset_registry_types.ts b/src/plugins/home/server/services/sample_data/lib/sample_dataset_registry_types.ts index 9b1212e13b024..eb248cc4d4078 100644 --- a/src/plugins/home/server/services/sample_data/lib/sample_dataset_registry_types.ts +++ b/src/plugins/home/server/services/sample_data/lib/sample_dataset_registry_types.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import type { IStaticAssets } from '@kbn/core/server'; import type { SampleDatasetSchema } from './sample_dataset_schema'; export type { SampleDatasetSchema, DataIndexSchema } from './sample_dataset_schema'; @@ -27,7 +28,11 @@ export enum EmbeddableTypes { SEARCH_EMBEDDABLE_TYPE = 'search', VISUALIZE_EMBEDDABLE_TYPE = 'visualization', } -export type SampleDatasetProvider = () => SampleDatasetSchema; + +export interface SampleDatasetProviderContext { + staticAssets: IStaticAssets; +} +export type SampleDatasetProvider = (context: SampleDatasetProviderContext) => SampleDatasetSchema; /** This type is used to identify an object in a sample dataset. */ export interface SampleObject { diff --git a/src/plugins/home/server/services/sample_data/sample_data_registry.ts b/src/plugins/home/server/services/sample_data/sample_data_registry.ts index 47ddc122f82cb..1f96cbe20def2 100644 --- a/src/plugins/home/server/services/sample_data/sample_data_registry.ts +++ b/src/plugins/home/server/services/sample_data/sample_data_registry.ts @@ -15,6 +15,7 @@ import { SampleDatasetSchema, SampleDatasetDashboardPanel, AppLinkData, + SampleDatasetProviderContext, } from './lib/sample_dataset_registry_types'; import { sampleDataSchema } from './lib/sample_dataset_schema'; @@ -34,11 +35,15 @@ export class SampleDataRegistry { private readonly sampleDatasets: SampleDatasetSchema[] = []; private readonly appLinksMap = new Map(); + private sampleDataProviderContext?: SampleDatasetProviderContext; private registerSampleDataSet(specProvider: SampleDatasetProvider) { + if (!this.sampleDataProviderContext) { + throw new Error('#registerSampleDataSet called before #setup'); + } let value: SampleDatasetSchema; try { - value = sampleDataSchema.validate(specProvider()); + value = sampleDataSchema.validate(specProvider(this.sampleDataProviderContext)); } catch (error) { throw new Error(`Unable to register sample dataset spec because it's invalid. ${error}`); } @@ -83,6 +88,10 @@ export class SampleDataRegistry { createInstallRoute(router, this.sampleDatasets, logger, usageTracker, core.analytics); createUninstallRoute(router, this.sampleDatasets, logger, usageTracker, core.analytics); + this.sampleDataProviderContext = { + staticAssets: core.http.staticAssets, + }; + this.registerSampleDataSet(flightsSpecProvider); this.registerSampleDataSet(logsSpecProvider); this.registerSampleDataSet(ecommerceSpecProvider); diff --git a/src/plugins/home/server/services/tutorials/lib/tutorials_registry_types.ts b/src/plugins/home/server/services/tutorials/lib/tutorials_registry_types.ts index f0746764f4641..dd625c6086717 100644 --- a/src/plugins/home/server/services/tutorials/lib/tutorials_registry_types.ts +++ b/src/plugins/home/server/services/tutorials/lib/tutorials_registry_types.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { KibanaRequest } from '@kbn/core/server'; +import type { KibanaRequest, IStaticAssets } from '@kbn/core/server'; import type { TutorialSchema } from './tutorial_schema'; export { TutorialsCategory } from '../../../../common/constants'; @@ -25,6 +25,7 @@ export type Platform = 'WINDOWS' | 'OSX' | 'DEB' | 'RPM'; export interface TutorialContext { kibanaBranch: string; + staticAssets: IStaticAssets; [key: string]: unknown; } export type TutorialProvider = (context: TutorialContext) => TutorialSchema; diff --git a/src/plugins/home/server/services/tutorials/tutorials_registry.test.ts b/src/plugins/home/server/services/tutorials/tutorials_registry.test.ts index 5a8c6dc55bda4..c8d9fa9d27aec 100644 --- a/src/plugins/home/server/services/tutorials/tutorials_registry.test.ts +++ b/src/plugins/home/server/services/tutorials/tutorials_registry.test.ts @@ -166,10 +166,9 @@ describe('TutorialsRegistry', () => { describe('start', () => { test('exposes proper contract', () => { - const start = new TutorialsRegistry(mockInitContext).start( - coreMock.createStart(), - mockCustomIntegrationsPluginSetup - ); + const registry = new TutorialsRegistry(mockInitContext); + registry.setup(mockCoreSetup, mockCustomIntegrationsPluginSetup); + const start = registry.start(coreMock.createStart(), mockCustomIntegrationsPluginSetup); expect(start).toBeDefined(); }); }); diff --git a/src/plugins/home/server/services/tutorials/tutorials_registry.ts b/src/plugins/home/server/services/tutorials/tutorials_registry.ts index 0ef800f63228b..eb3c6e931ff60 100644 --- a/src/plugins/home/server/services/tutorials/tutorials_registry.ts +++ b/src/plugins/home/server/services/tutorials/tutorials_registry.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { CoreSetup, CoreStart, PluginInitializerContext } from '@kbn/core/server'; +import { CoreSetup, CoreStart, PluginInitializerContext, IStaticAssets } from '@kbn/core/server'; import { CustomIntegrationsPluginSetup } from '@kbn/custom-integrations-plugin/server'; import { IntegrationCategory } from '@kbn/custom-integrations-plugin/common'; import { @@ -71,10 +71,13 @@ function registerBeatsTutorialsWithCustomIntegrations( export class TutorialsRegistry { private tutorialProviders: TutorialProvider[] = []; // pre-register all the tutorials we know we want in here private readonly scopedTutorialContextFactories: TutorialContextFactory[] = []; + private staticAssets!: IStaticAssets; constructor(private readonly initContext: PluginInitializerContext) {} public setup(core: CoreSetup, customIntegrations?: CustomIntegrationsPluginSetup) { + this.staticAssets = core.http.staticAssets; + const router = core.http.createRouter(); router.get( { path: '/api/kibana/home/tutorials', validate: false }, @@ -143,7 +146,10 @@ export class TutorialsRegistry { } private get baseTutorialContext(): TutorialContext { - return { kibanaBranch: this.initContext.env.packageInfo.branch }; + return { + kibanaBranch: this.initContext.env.packageInfo.branch, + staticAssets: this.staticAssets, + }; } } diff --git a/src/plugins/home/server/tutorials/activemq_logs/index.ts b/src/plugins/home/server/tutorials/activemq_logs/index.ts index af1a79e445fd8..b152d760bd60f 100644 --- a/src/plugins/home/server/tutorials/activemq_logs/index.ts +++ b/src/plugins/home/server/tutorials/activemq_logs/index.ts @@ -38,7 +38,7 @@ export function activemqLogsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-activemq.html', }, }), - euiIconType: '/plugins/home/assets/logos/activemq.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/activemq.svg'), artifacts: { dashboards: [ { @@ -54,7 +54,7 @@ export function activemqLogsSpecProvider(context: TutorialContext): TutorialSche }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/activemq_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/activemq_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/activemq_metrics/index.ts b/src/plugins/home/server/tutorials/activemq_metrics/index.ts index c5c68ba0fe0ea..a255a85fa6960 100644 --- a/src/plugins/home/server/tutorials/activemq_metrics/index.ts +++ b/src/plugins/home/server/tutorials/activemq_metrics/index.ts @@ -38,7 +38,7 @@ export function activemqMetricsSpecProvider(context: TutorialContext): TutorialS learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-activemq.html', }, }), - euiIconType: '/plugins/home/assets/logos/activemq.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/activemq.svg'), isBeta: true, artifacts: { application: { diff --git a/src/plugins/home/server/tutorials/apache_logs/index.ts b/src/plugins/home/server/tutorials/apache_logs/index.ts index 2d729daefdc65..3bd77f587f09d 100644 --- a/src/plugins/home/server/tutorials/apache_logs/index.ts +++ b/src/plugins/home/server/tutorials/apache_logs/index.ts @@ -55,7 +55,7 @@ export function apacheLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/apache_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/apache_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/apache_metrics/index.ts b/src/plugins/home/server/tutorials/apache_metrics/index.ts index 114483f7414de..a021401890503 100644 --- a/src/plugins/home/server/tutorials/apache_metrics/index.ts +++ b/src/plugins/home/server/tutorials/apache_metrics/index.ts @@ -54,7 +54,7 @@ export function apacheMetricsSpecProvider(context: TutorialContext): TutorialSch }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/apache_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/apache_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/auditbeat/index.ts b/src/plugins/home/server/tutorials/auditbeat/index.ts index e315398578781..fe9928ff368bb 100644 --- a/src/plugins/home/server/tutorials/auditbeat/index.ts +++ b/src/plugins/home/server/tutorials/auditbeat/index.ts @@ -54,7 +54,7 @@ processes, users, logins, sockets information, file accesses, and more. \ }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/auditbeat/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/auditbeat/screenshot.webp'), onPrem: onPremInstructions(platforms, context), elasticCloud: cloudInstructions(platforms, context), onPremElasticCloud: onPremCloudInstructions(platforms, context), diff --git a/src/plugins/home/server/tutorials/auditd_logs/index.ts b/src/plugins/home/server/tutorials/auditd_logs/index.ts index 383eb46d83a7a..438e847efe337 100644 --- a/src/plugins/home/server/tutorials/auditd_logs/index.ts +++ b/src/plugins/home/server/tutorials/auditd_logs/index.ts @@ -39,7 +39,7 @@ export function auditdLogsSpecProvider(context: TutorialContext): TutorialSchema learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-auditd.html', }, }), - euiIconType: '/plugins/home/assets/logos/linux.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/linux.svg'), artifacts: { dashboards: [ { @@ -55,7 +55,7 @@ export function auditdLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/auditd_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/auditd_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/aws_logs/index.ts b/src/plugins/home/server/tutorials/aws_logs/index.ts index dd20d8d282f10..e8c178c040ad3 100644 --- a/src/plugins/home/server/tutorials/aws_logs/index.ts +++ b/src/plugins/home/server/tutorials/aws_logs/index.ts @@ -55,7 +55,7 @@ export function awsLogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/aws_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/aws_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/aws_metrics/index.ts b/src/plugins/home/server/tutorials/aws_metrics/index.ts index cdc4a3970b426..d5bf865b79026 100644 --- a/src/plugins/home/server/tutorials/aws_metrics/index.ts +++ b/src/plugins/home/server/tutorials/aws_metrics/index.ts @@ -56,7 +56,7 @@ export function awsMetricsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/aws_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/aws_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/azure_logs/index.ts b/src/plugins/home/server/tutorials/azure_logs/index.ts index 8efa2cea888ec..62f75a3eb0537 100644 --- a/src/plugins/home/server/tutorials/azure_logs/index.ts +++ b/src/plugins/home/server/tutorials/azure_logs/index.ts @@ -56,7 +56,7 @@ export function azureLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/azure_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/azure_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/azure_metrics/index.ts b/src/plugins/home/server/tutorials/azure_metrics/index.ts index 32f9840b9ed65..59492f6704ac8 100644 --- a/src/plugins/home/server/tutorials/azure_metrics/index.ts +++ b/src/plugins/home/server/tutorials/azure_metrics/index.ts @@ -55,7 +55,7 @@ export function azureMetricsSpecProvider(context: TutorialContext): TutorialSche }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/azure_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/azure_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/barracuda_logs/index.ts b/src/plugins/home/server/tutorials/barracuda_logs/index.ts index 70daca5656a66..d91b77495dca2 100644 --- a/src/plugins/home/server/tutorials/barracuda_logs/index.ts +++ b/src/plugins/home/server/tutorials/barracuda_logs/index.ts @@ -40,7 +40,7 @@ export function barracudaLogsSpecProvider(context: TutorialContext): TutorialSch learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-barracuda.html', }, }), - euiIconType: '/plugins/home/assets/logos/barracuda.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/barracuda.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/checkpoint_logs/index.ts b/src/plugins/home/server/tutorials/checkpoint_logs/index.ts index 3fa333c218396..bd7457f0157f5 100644 --- a/src/plugins/home/server/tutorials/checkpoint_logs/index.ts +++ b/src/plugins/home/server/tutorials/checkpoint_logs/index.ts @@ -39,7 +39,7 @@ export function checkpointLogsSpecProvider(context: TutorialContext): TutorialSc learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-checkpoint.html', }, }), - euiIconType: '/plugins/home/assets/logos/checkpoint.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/checkpoint.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/cisco_logs/index.ts b/src/plugins/home/server/tutorials/cisco_logs/index.ts index 098819c14297f..c125c283702d9 100644 --- a/src/plugins/home/server/tutorials/cisco_logs/index.ts +++ b/src/plugins/home/server/tutorials/cisco_logs/index.ts @@ -39,7 +39,7 @@ export function ciscoLogsSpecProvider(context: TutorialContext): TutorialSchema learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-cisco.html', }, }), - euiIconType: '/plugins/home/assets/logos/cisco.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/cisco.svg'), artifacts: { dashboards: [ { @@ -55,7 +55,7 @@ export function ciscoLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/cisco_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/cisco_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/cockroachdb_metrics/index.ts b/src/plugins/home/server/tutorials/cockroachdb_metrics/index.ts index 1d5cbd95d67f5..14c1d2c1b9c19 100644 --- a/src/plugins/home/server/tutorials/cockroachdb_metrics/index.ts +++ b/src/plugins/home/server/tutorials/cockroachdb_metrics/index.ts @@ -38,7 +38,7 @@ export function cockroachdbMetricsSpecProvider(context: TutorialContext): Tutori learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-cockroachdb.html', }, }), - euiIconType: '/plugins/home/assets/logos/cockroachdb.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/cockroachdb.svg'), artifacts: { dashboards: [ { @@ -57,7 +57,9 @@ export function cockroachdbMetricsSpecProvider(context: TutorialContext): Tutori }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/cockroachdb_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref( + '/cockroachdb_metrics/screenshot.webp' + ), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/consul_metrics/index.ts b/src/plugins/home/server/tutorials/consul_metrics/index.ts index bc1d1b6f1d1ea..64b7cb80e8813 100644 --- a/src/plugins/home/server/tutorials/consul_metrics/index.ts +++ b/src/plugins/home/server/tutorials/consul_metrics/index.ts @@ -38,7 +38,7 @@ export function consulMetricsSpecProvider(context: TutorialContext): TutorialSch learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-consul.html', }, }), - euiIconType: '/plugins/home/assets/logos/consul.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/consul.svg'), artifacts: { dashboards: [ { @@ -54,7 +54,7 @@ export function consulMetricsSpecProvider(context: TutorialContext): TutorialSch }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/consul_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/consul_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/coredns_logs/index.ts b/src/plugins/home/server/tutorials/coredns_logs/index.ts index fedea213c0087..a740144e07400 100644 --- a/src/plugins/home/server/tutorials/coredns_logs/index.ts +++ b/src/plugins/home/server/tutorials/coredns_logs/index.ts @@ -39,7 +39,7 @@ export function corednsLogsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-coredns.html', }, }), - euiIconType: '/plugins/home/assets/logos/coredns.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/coredns.svg'), artifacts: { dashboards: [ { @@ -55,7 +55,7 @@ export function corednsLogsSpecProvider(context: TutorialContext): TutorialSchem }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/coredns_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/coredns_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/coredns_metrics/index.ts b/src/plugins/home/server/tutorials/coredns_metrics/index.ts index b3e5de7fb58a8..82f1205971aac 100644 --- a/src/plugins/home/server/tutorials/coredns_metrics/index.ts +++ b/src/plugins/home/server/tutorials/coredns_metrics/index.ts @@ -38,7 +38,7 @@ export function corednsMetricsSpecProvider(context: TutorialContext): TutorialSc learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-coredns.html', }, }), - euiIconType: '/plugins/home/assets/logos/coredns.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/coredns.svg'), artifacts: { application: { label: i18n.translate('home.tutorials.corednsMetrics.artifacts.application.label', { @@ -52,7 +52,7 @@ export function corednsMetricsSpecProvider(context: TutorialContext): TutorialSc }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/coredns_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/coredns_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/couchdb_metrics/index.ts b/src/plugins/home/server/tutorials/couchdb_metrics/index.ts index 59f8431fe6a08..c63d9a045f590 100644 --- a/src/plugins/home/server/tutorials/couchdb_metrics/index.ts +++ b/src/plugins/home/server/tutorials/couchdb_metrics/index.ts @@ -38,7 +38,7 @@ export function couchdbMetricsSpecProvider(context: TutorialContext): TutorialSc learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-couchdb.html', }, }), - euiIconType: '/plugins/home/assets/logos/couchdb.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/couchdb.svg'), artifacts: { dashboards: [ { @@ -57,7 +57,7 @@ export function couchdbMetricsSpecProvider(context: TutorialContext): TutorialSc }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/couchdb_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/couchdb_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/crowdstrike_logs/index.ts b/src/plugins/home/server/tutorials/crowdstrike_logs/index.ts index f55d84e7b58c9..566624d8252b1 100644 --- a/src/plugins/home/server/tutorials/crowdstrike_logs/index.ts +++ b/src/plugins/home/server/tutorials/crowdstrike_logs/index.ts @@ -43,7 +43,7 @@ export function crowdstrikeLogsSpecProvider(context: TutorialContext): TutorialS learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-crowdstrike.html', }, }), - euiIconType: '/plugins/home/assets/logos/crowdstrike.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/crowdstrike.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/cylance_logs/index.ts b/src/plugins/home/server/tutorials/cylance_logs/index.ts index 805391dc4d364..e1781fa69df5d 100644 --- a/src/plugins/home/server/tutorials/cylance_logs/index.ts +++ b/src/plugins/home/server/tutorials/cylance_logs/index.ts @@ -39,7 +39,7 @@ export function cylanceLogsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-cylance.html', }, }), - euiIconType: '/plugins/home/assets/logos/cylance.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/cylance.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/docker_metrics/index.ts b/src/plugins/home/server/tutorials/docker_metrics/index.ts index 180723079acba..6f683c7eb9b77 100644 --- a/src/plugins/home/server/tutorials/docker_metrics/index.ts +++ b/src/plugins/home/server/tutorials/docker_metrics/index.ts @@ -54,7 +54,7 @@ export function dockerMetricsSpecProvider(context: TutorialContext): TutorialSch }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/docker_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/docker_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/elasticsearch_logs/index.ts b/src/plugins/home/server/tutorials/elasticsearch_logs/index.ts index bdcc65ead4182..1763a434d4906 100644 --- a/src/plugins/home/server/tutorials/elasticsearch_logs/index.ts +++ b/src/plugins/home/server/tutorials/elasticsearch_logs/index.ts @@ -54,7 +54,9 @@ export function elasticsearchLogsSpecProvider(context: TutorialContext): Tutoria }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/elasticsearch_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref( + '/elasticsearch_logs/screenshot.webp' + ), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts b/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts index 06f0587e1021d..aa071297ed978 100644 --- a/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts +++ b/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts @@ -39,7 +39,7 @@ export function envoyproxyLogsSpecProvider(context: TutorialContext): TutorialSc learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-envoyproxy.html', }, }), - euiIconType: '/plugins/home/assets/logos/envoyproxy.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/envoyproxy.svg'), artifacts: { dashboards: [ { @@ -58,7 +58,7 @@ export function envoyproxyLogsSpecProvider(context: TutorialContext): TutorialSc }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/envoyproxy_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/envoyproxy_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/envoyproxy_metrics/index.ts b/src/plugins/home/server/tutorials/envoyproxy_metrics/index.ts index 03bc5d13baf9c..8c4396ff90ba0 100644 --- a/src/plugins/home/server/tutorials/envoyproxy_metrics/index.ts +++ b/src/plugins/home/server/tutorials/envoyproxy_metrics/index.ts @@ -38,7 +38,7 @@ export function envoyproxyMetricsSpecProvider(context: TutorialContext): Tutoria learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-envoyproxy.html', }, }), - euiIconType: '/plugins/home/assets/logos/envoyproxy.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/envoyproxy.svg'), artifacts: { dashboards: [], exportedFields: { diff --git a/src/plugins/home/server/tutorials/f5_logs/index.ts b/src/plugins/home/server/tutorials/f5_logs/index.ts index ae596b52a538b..e79018c6b58e4 100644 --- a/src/plugins/home/server/tutorials/f5_logs/index.ts +++ b/src/plugins/home/server/tutorials/f5_logs/index.ts @@ -39,7 +39,7 @@ export function f5LogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-f5.html', }, }), - euiIconType: '/plugins/home/assets/logos/f5.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/f5.svg'), artifacts: { dashboards: [], application: { @@ -53,7 +53,7 @@ export function f5LogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/f5_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/f5_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/fortinet_logs/index.ts b/src/plugins/home/server/tutorials/fortinet_logs/index.ts index 32338480fb009..4128f7460b90d 100644 --- a/src/plugins/home/server/tutorials/fortinet_logs/index.ts +++ b/src/plugins/home/server/tutorials/fortinet_logs/index.ts @@ -39,7 +39,7 @@ export function fortinetLogsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-fortinet.html', }, }), - euiIconType: '/plugins/home/assets/logos/fortinet.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/fortinet.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/gcp_logs/index.ts b/src/plugins/home/server/tutorials/gcp_logs/index.ts index 6c33ac1fbaa0b..bc0fa1de8184e 100644 --- a/src/plugins/home/server/tutorials/gcp_logs/index.ts +++ b/src/plugins/home/server/tutorials/gcp_logs/index.ts @@ -57,7 +57,7 @@ export function gcpLogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/gcp_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/gcp_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/gcp_metrics/index.ts b/src/plugins/home/server/tutorials/gcp_metrics/index.ts index 649fd54dbde52..4b9fc9c23e790 100644 --- a/src/plugins/home/server/tutorials/gcp_metrics/index.ts +++ b/src/plugins/home/server/tutorials/gcp_metrics/index.ts @@ -55,7 +55,7 @@ export function gcpMetricsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/gcp_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/gcp_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/haproxy_logs/index.ts b/src/plugins/home/server/tutorials/haproxy_logs/index.ts index 6d83b9c544994..4cfa85570d8f5 100644 --- a/src/plugins/home/server/tutorials/haproxy_logs/index.ts +++ b/src/plugins/home/server/tutorials/haproxy_logs/index.ts @@ -55,7 +55,7 @@ export function haproxyLogsSpecProvider(context: TutorialContext): TutorialSchem }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/haproxy_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/haproxy_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/ibmmq_logs/index.ts b/src/plugins/home/server/tutorials/ibmmq_logs/index.ts index fd3327a555b41..0ca37ece3584c 100644 --- a/src/plugins/home/server/tutorials/ibmmq_logs/index.ts +++ b/src/plugins/home/server/tutorials/ibmmq_logs/index.ts @@ -38,7 +38,7 @@ export function ibmmqLogsSpecProvider(context: TutorialContext): TutorialSchema learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-ibmmq.html', }, }), - euiIconType: '/plugins/home/assets/logos/ibmmq.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/ibmmq.svg'), artifacts: { dashboards: [ { @@ -54,7 +54,7 @@ export function ibmmqLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/ibmmq_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/ibmmq_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/ibmmq_metrics/index.ts b/src/plugins/home/server/tutorials/ibmmq_metrics/index.ts index 6b81919ce2814..b6411f1b0bff1 100644 --- a/src/plugins/home/server/tutorials/ibmmq_metrics/index.ts +++ b/src/plugins/home/server/tutorials/ibmmq_metrics/index.ts @@ -38,7 +38,7 @@ export function ibmmqMetricsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-ibmmq.html', }, }), - euiIconType: '/plugins/home/assets/logos/ibmmq.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/ibmmq.svg'), isBeta: true, artifacts: { application: { @@ -53,7 +53,7 @@ export function ibmmqMetricsSpecProvider(context: TutorialContext): TutorialSche }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/ibmmq_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/ibmmq_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/icinga_logs/index.ts b/src/plugins/home/server/tutorials/icinga_logs/index.ts index b8d51b1a1809f..c1cf308543429 100644 --- a/src/plugins/home/server/tutorials/icinga_logs/index.ts +++ b/src/plugins/home/server/tutorials/icinga_logs/index.ts @@ -39,7 +39,7 @@ export function icingaLogsSpecProvider(context: TutorialContext): TutorialSchema learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-icinga.html', }, }), - euiIconType: '/plugins/home/assets/logos/icinga.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/icinga.svg'), artifacts: { dashboards: [ { @@ -55,7 +55,7 @@ export function icingaLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/icinga_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/icinga_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/iis_logs/index.ts b/src/plugins/home/server/tutorials/iis_logs/index.ts index 1b7af958d4f9e..1ce2657b50923 100644 --- a/src/plugins/home/server/tutorials/iis_logs/index.ts +++ b/src/plugins/home/server/tutorials/iis_logs/index.ts @@ -40,7 +40,7 @@ export function iisLogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-iis.html', }, }), - euiIconType: '/plugins/home/assets/logos/iis.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/iis.svg'), artifacts: { dashboards: [ { @@ -56,7 +56,7 @@ export function iisLogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/iis_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/iis_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/iis_metrics/index.ts b/src/plugins/home/server/tutorials/iis_metrics/index.ts index 68f167c7be04d..052b90c0719bb 100644 --- a/src/plugins/home/server/tutorials/iis_metrics/index.ts +++ b/src/plugins/home/server/tutorials/iis_metrics/index.ts @@ -39,7 +39,7 @@ export function iisMetricsSpecProvider(context: TutorialContext): TutorialSchema }, }), isBeta: true, - euiIconType: '/plugins/home/assets/logos/iis.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/iis.svg'), artifacts: { dashboards: [ { @@ -55,7 +55,7 @@ export function iisMetricsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/iis_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/iis_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/infoblox_logs/index.ts b/src/plugins/home/server/tutorials/infoblox_logs/index.ts index ad82d25993dca..f86ccbf0084b6 100644 --- a/src/plugins/home/server/tutorials/infoblox_logs/index.ts +++ b/src/plugins/home/server/tutorials/infoblox_logs/index.ts @@ -39,7 +39,7 @@ export function infobloxLogsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-infoblox.html', }, }), - euiIconType: '/plugins/home/assets/logos/infoblox.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/infoblox.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/iptables_logs/index.ts b/src/plugins/home/server/tutorials/iptables_logs/index.ts index 082b0a239714a..856a8b0331482 100644 --- a/src/plugins/home/server/tutorials/iptables_logs/index.ts +++ b/src/plugins/home/server/tutorials/iptables_logs/index.ts @@ -42,7 +42,7 @@ export function iptablesLogsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-iptables.html', }, }), - euiIconType: '/plugins/home/assets/logos/linux.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/linux.svg'), artifacts: { dashboards: [ { @@ -58,7 +58,7 @@ export function iptablesLogsSpecProvider(context: TutorialContext): TutorialSche }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/iptables_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/iptables_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/juniper_logs/index.ts b/src/plugins/home/server/tutorials/juniper_logs/index.ts index a6d34d1e8447f..04d2e708aeab3 100644 --- a/src/plugins/home/server/tutorials/juniper_logs/index.ts +++ b/src/plugins/home/server/tutorials/juniper_logs/index.ts @@ -39,7 +39,7 @@ export function juniperLogsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-juniper.html', }, }), - euiIconType: '/plugins/home/assets/logos/juniper.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/juniper.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/kafka_logs/index.ts b/src/plugins/home/server/tutorials/kafka_logs/index.ts index cb78ffbaeaea7..a4918995965c6 100644 --- a/src/plugins/home/server/tutorials/kafka_logs/index.ts +++ b/src/plugins/home/server/tutorials/kafka_logs/index.ts @@ -55,7 +55,7 @@ export function kafkaLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/kafka_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/kafka_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/kubernetes_metrics/index.ts b/src/plugins/home/server/tutorials/kubernetes_metrics/index.ts index bb40e88e7541d..6db2731349e23 100644 --- a/src/plugins/home/server/tutorials/kubernetes_metrics/index.ts +++ b/src/plugins/home/server/tutorials/kubernetes_metrics/index.ts @@ -57,7 +57,9 @@ export function kubernetesMetricsSpecProvider(context: TutorialContext): Tutoria }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/kubernetes_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref( + '/kubernetes_metrics/screenshot.webp' + ), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/microsoft_logs/index.ts b/src/plugins/home/server/tutorials/microsoft_logs/index.ts index fc8926df08420..bc7eb73f60625 100644 --- a/src/plugins/home/server/tutorials/microsoft_logs/index.ts +++ b/src/plugins/home/server/tutorials/microsoft_logs/index.ts @@ -39,7 +39,7 @@ export function microsoftLogsSpecProvider(context: TutorialContext): TutorialSch learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-microsoft.html', }, }), - euiIconType: '/plugins/home/assets/logos/microsoft.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/microsoft.svg'), artifacts: { dashboards: [ { @@ -55,7 +55,7 @@ export function microsoftLogsSpecProvider(context: TutorialContext): TutorialSch }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/microsoft_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/microsoft_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/misp_logs/index.ts b/src/plugins/home/server/tutorials/misp_logs/index.ts index 7cb31f8db3a46..3fcd6f35faae9 100644 --- a/src/plugins/home/server/tutorials/misp_logs/index.ts +++ b/src/plugins/home/server/tutorials/misp_logs/index.ts @@ -39,7 +39,7 @@ export function mispLogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-misp.html', }, }), - euiIconType: '/plugins/home/assets/logos/misp.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/misp.svg'), artifacts: { dashboards: [ { @@ -55,7 +55,7 @@ export function mispLogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/misp_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/misp_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/mongodb_logs/index.ts b/src/plugins/home/server/tutorials/mongodb_logs/index.ts index 3f2618d15c844..4cd48e2af715c 100644 --- a/src/plugins/home/server/tutorials/mongodb_logs/index.ts +++ b/src/plugins/home/server/tutorials/mongodb_logs/index.ts @@ -55,7 +55,7 @@ export function mongodbLogsSpecProvider(context: TutorialContext): TutorialSchem }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/mongodb_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/mongodb_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/mongodb_metrics/index.ts b/src/plugins/home/server/tutorials/mongodb_metrics/index.ts index c4b56cef60d17..441ede88c5c38 100644 --- a/src/plugins/home/server/tutorials/mongodb_metrics/index.ts +++ b/src/plugins/home/server/tutorials/mongodb_metrics/index.ts @@ -57,7 +57,7 @@ export function mongodbMetricsSpecProvider(context: TutorialContext): TutorialSc }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/mongodb_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/mongodb_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/mssql_logs/index.ts b/src/plugins/home/server/tutorials/mssql_logs/index.ts index 2add9281860bd..ab8363afd25b6 100644 --- a/src/plugins/home/server/tutorials/mssql_logs/index.ts +++ b/src/plugins/home/server/tutorials/mssql_logs/index.ts @@ -39,7 +39,7 @@ export function mssqlLogsSpecProvider(context: TutorialContext): TutorialSchema learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-mssql.html', }, }), - euiIconType: '/plugins/home/assets/logos/microsoft.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/microsoft.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/mssql_metrics/index.ts b/src/plugins/home/server/tutorials/mssql_metrics/index.ts index 5dd6bca41a812..33091b6b04504 100644 --- a/src/plugins/home/server/tutorials/mssql_metrics/index.ts +++ b/src/plugins/home/server/tutorials/mssql_metrics/index.ts @@ -38,7 +38,7 @@ export function mssqlMetricsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-mssql.html', }, }), - euiIconType: '/plugins/home/assets/logos/mssql.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/mssql.svg'), isBeta: false, artifacts: { dashboards: [ @@ -55,7 +55,7 @@ export function mssqlMetricsSpecProvider(context: TutorialContext): TutorialSche }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/mssql_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/mssql_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/munin_metrics/index.ts b/src/plugins/home/server/tutorials/munin_metrics/index.ts index 1e3e091ab0b8e..aa9ba8e72ddd3 100644 --- a/src/plugins/home/server/tutorials/munin_metrics/index.ts +++ b/src/plugins/home/server/tutorials/munin_metrics/index.ts @@ -26,7 +26,7 @@ export function muninMetricsSpecProvider(context: TutorialContext): TutorialSche defaultMessage: 'Munin Metrics', }), moduleName, - euiIconType: '/plugins/home/assets/logos/munin.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/munin.svg'), isBeta: true, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.muninMetrics.shortDescription', { diff --git a/src/plugins/home/server/tutorials/mysql_logs/index.ts b/src/plugins/home/server/tutorials/mysql_logs/index.ts index 5ca657283d514..776926d9bd74d 100644 --- a/src/plugins/home/server/tutorials/mysql_logs/index.ts +++ b/src/plugins/home/server/tutorials/mysql_logs/index.ts @@ -55,7 +55,7 @@ export function mysqlLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/mysql_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/mysql_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/mysql_metrics/index.ts b/src/plugins/home/server/tutorials/mysql_metrics/index.ts index 8710fb70a4e2f..61f6d936f88e8 100644 --- a/src/plugins/home/server/tutorials/mysql_metrics/index.ts +++ b/src/plugins/home/server/tutorials/mysql_metrics/index.ts @@ -54,7 +54,7 @@ export function mysqlMetricsSpecProvider(context: TutorialContext): TutorialSche }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/mysql_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/mysql_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/nats_logs/index.ts b/src/plugins/home/server/tutorials/nats_logs/index.ts index d72a6df5e7104..2695edaf99380 100644 --- a/src/plugins/home/server/tutorials/nats_logs/index.ts +++ b/src/plugins/home/server/tutorials/nats_logs/index.ts @@ -40,7 +40,7 @@ export function natsLogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-nats.html', }, }), - euiIconType: '/plugins/home/assets/logos/nats.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/nats.svg'), artifacts: { dashboards: [ { @@ -56,7 +56,7 @@ export function natsLogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/nats_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/nats_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/nats_metrics/index.ts b/src/plugins/home/server/tutorials/nats_metrics/index.ts index 1aab107a61210..e9226331b5ec3 100644 --- a/src/plugins/home/server/tutorials/nats_metrics/index.ts +++ b/src/plugins/home/server/tutorials/nats_metrics/index.ts @@ -38,7 +38,7 @@ export function natsMetricsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-nats.html', }, }), - euiIconType: '/plugins/home/assets/logos/nats.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/nats.svg'), artifacts: { dashboards: [ { @@ -54,7 +54,7 @@ export function natsMetricsSpecProvider(context: TutorialContext): TutorialSchem }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/nats_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/nats_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/netscout_logs/index.ts b/src/plugins/home/server/tutorials/netscout_logs/index.ts index 9418a787be5d3..64e7fb351fff8 100644 --- a/src/plugins/home/server/tutorials/netscout_logs/index.ts +++ b/src/plugins/home/server/tutorials/netscout_logs/index.ts @@ -39,7 +39,7 @@ export function netscoutLogsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-netscout.html', }, }), - euiIconType: '/plugins/home/assets/logos/netscout.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/netscout.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/nginx_logs/index.ts b/src/plugins/home/server/tutorials/nginx_logs/index.ts index 451d1b8acbabb..5a08a6ebcddf4 100644 --- a/src/plugins/home/server/tutorials/nginx_logs/index.ts +++ b/src/plugins/home/server/tutorials/nginx_logs/index.ts @@ -55,7 +55,7 @@ export function nginxLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/nginx_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/nginx_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/nginx_metrics/index.ts b/src/plugins/home/server/tutorials/nginx_metrics/index.ts index 9441f59bbe56b..d133af96d03e0 100644 --- a/src/plugins/home/server/tutorials/nginx_metrics/index.ts +++ b/src/plugins/home/server/tutorials/nginx_metrics/index.ts @@ -59,7 +59,7 @@ which must be enabled in your Nginx installation. \ }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/nginx_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/nginx_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/o365_logs/index.ts b/src/plugins/home/server/tutorials/o365_logs/index.ts index c3cecbef32504..87dd8e7dcf246 100644 --- a/src/plugins/home/server/tutorials/o365_logs/index.ts +++ b/src/plugins/home/server/tutorials/o365_logs/index.ts @@ -42,7 +42,7 @@ export function o365LogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-o365.html', }, }), - euiIconType: '/plugins/home/assets/logos/o365.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/o365.svg'), artifacts: { dashboards: [ { @@ -58,7 +58,7 @@ export function o365LogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/o365_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/o365_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/okta_logs/index.ts b/src/plugins/home/server/tutorials/okta_logs/index.ts index c3929cff09099..4e4206ce95318 100644 --- a/src/plugins/home/server/tutorials/okta_logs/index.ts +++ b/src/plugins/home/server/tutorials/okta_logs/index.ts @@ -40,7 +40,7 @@ export function oktaLogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-okta.html', }, }), - euiIconType: '/plugins/home/assets/logos/okta.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/okta.svg'), artifacts: { dashboards: [ { @@ -56,7 +56,7 @@ export function oktaLogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/okta_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/okta_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/openmetrics_metrics/index.ts b/src/plugins/home/server/tutorials/openmetrics_metrics/index.ts index 9c0f6e89b6fa6..56db28fb0e9e2 100644 --- a/src/plugins/home/server/tutorials/openmetrics_metrics/index.ts +++ b/src/plugins/home/server/tutorials/openmetrics_metrics/index.ts @@ -39,7 +39,7 @@ export function openmetricsMetricsSpecProvider(context: TutorialContext): Tutori learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-openmetrics.html', }, }), - euiIconType: '/plugins/home/assets/logos/openmetrics.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/openmetrics.svg'), artifacts: { dashboards: [], exportedFields: { diff --git a/src/plugins/home/server/tutorials/oracle_metrics/index.ts b/src/plugins/home/server/tutorials/oracle_metrics/index.ts index 14f8dd0c39774..71cdedc6bb3ba 100644 --- a/src/plugins/home/server/tutorials/oracle_metrics/index.ts +++ b/src/plugins/home/server/tutorials/oracle_metrics/index.ts @@ -40,7 +40,7 @@ export function oracleMetricsSpecProvider(context: TutorialContext): TutorialSch learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-' + moduleName + '.html', }, }), - euiIconType: '/plugins/home/assets/logos/oracle.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/oracle.svg'), artifacts: { application: { label: i18n.translate('home.tutorials.oracleMetrics.artifacts.application.label', { diff --git a/src/plugins/home/server/tutorials/osquery_logs/index.ts b/src/plugins/home/server/tutorials/osquery_logs/index.ts index 8bf4ba94e9497..e73eb7e544df8 100644 --- a/src/plugins/home/server/tutorials/osquery_logs/index.ts +++ b/src/plugins/home/server/tutorials/osquery_logs/index.ts @@ -43,7 +43,7 @@ export function osqueryLogsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-osquery.html', }, }), - euiIconType: '/plugins/home/assets/logos/osquery.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/osquery.svg'), artifacts: { dashboards: [ { diff --git a/src/plugins/home/server/tutorials/panw_logs/index.ts b/src/plugins/home/server/tutorials/panw_logs/index.ts index 1279b0ebaf5a6..2aa4d6ebb6f2a 100644 --- a/src/plugins/home/server/tutorials/panw_logs/index.ts +++ b/src/plugins/home/server/tutorials/panw_logs/index.ts @@ -42,7 +42,7 @@ export function panwLogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-panw.html', }, }), - euiIconType: '/plugins/home/assets/logos/paloalto.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/paloalto.svg'), artifacts: { dashboards: [ { @@ -58,7 +58,7 @@ export function panwLogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/panw_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/panw_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/postgresql_logs/index.ts b/src/plugins/home/server/tutorials/postgresql_logs/index.ts index 0338d33d9851a..2f8d6acc10f93 100644 --- a/src/plugins/home/server/tutorials/postgresql_logs/index.ts +++ b/src/plugins/home/server/tutorials/postgresql_logs/index.ts @@ -58,7 +58,7 @@ export function postgresqlLogsSpecProvider(context: TutorialContext): TutorialSc }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/postgresql_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/postgresql_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/rabbitmq_logs/index.ts b/src/plugins/home/server/tutorials/rabbitmq_logs/index.ts index 49ca87b1fbaa0..5cfa4d9a7fedc 100644 --- a/src/plugins/home/server/tutorials/rabbitmq_logs/index.ts +++ b/src/plugins/home/server/tutorials/rabbitmq_logs/index.ts @@ -39,7 +39,7 @@ export function rabbitmqLogsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-rabbitmq.html', }, }), - euiIconType: '/plugins/home/assets/logos/rabbitmq.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/rabbitmq.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/rabbitmq_metrics/index.ts b/src/plugins/home/server/tutorials/rabbitmq_metrics/index.ts index 49b4abb6bf836..c3c955e4658a4 100644 --- a/src/plugins/home/server/tutorials/rabbitmq_metrics/index.ts +++ b/src/plugins/home/server/tutorials/rabbitmq_metrics/index.ts @@ -58,7 +58,7 @@ export function rabbitmqMetricsSpecProvider(context: TutorialContext): TutorialS }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/rabbitmq_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/rabbitmq_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/radware_logs/index.ts b/src/plugins/home/server/tutorials/radware_logs/index.ts index 4abd897c0aff3..607fe2fa60149 100644 --- a/src/plugins/home/server/tutorials/radware_logs/index.ts +++ b/src/plugins/home/server/tutorials/radware_logs/index.ts @@ -39,7 +39,7 @@ export function radwareLogsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-radware.html', }, }), - euiIconType: '/plugins/home/assets/logos/radware.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/radware.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/redis_logs/index.ts b/src/plugins/home/server/tutorials/redis_logs/index.ts index f0110b1e4f360..5a278706f7530 100644 --- a/src/plugins/home/server/tutorials/redis_logs/index.ts +++ b/src/plugins/home/server/tutorials/redis_logs/index.ts @@ -61,7 +61,7 @@ Note that the `slowlog` fileset is experimental. \ }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/redis_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/redis_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/redis_metrics/index.ts b/src/plugins/home/server/tutorials/redis_metrics/index.ts index 1b541226ca24d..bef4dcf6b0778 100644 --- a/src/plugins/home/server/tutorials/redis_metrics/index.ts +++ b/src/plugins/home/server/tutorials/redis_metrics/index.ts @@ -54,7 +54,7 @@ export function redisMetricsSpecProvider(context: TutorialContext): TutorialSche }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/redis_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/redis_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/redisenterprise_metrics/index.ts b/src/plugins/home/server/tutorials/redisenterprise_metrics/index.ts index 608ce867727d3..fd1c26f4da16b 100644 --- a/src/plugins/home/server/tutorials/redisenterprise_metrics/index.ts +++ b/src/plugins/home/server/tutorials/redisenterprise_metrics/index.ts @@ -53,7 +53,9 @@ export function redisenterpriseMetricsSpecProvider(context: TutorialContext): Tu }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/redisenterprise_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref( + '/redisenterprise_metrics/screenshot.webp' + ), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/santa_logs/index.ts b/src/plugins/home/server/tutorials/santa_logs/index.ts index eda644458ba3e..292c1b20c41d6 100644 --- a/src/plugins/home/server/tutorials/santa_logs/index.ts +++ b/src/plugins/home/server/tutorials/santa_logs/index.ts @@ -56,7 +56,7 @@ export function santaLogsSpecProvider(context: TutorialContext): TutorialSchema }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/santa_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/santa_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/sonicwall_logs/index.ts b/src/plugins/home/server/tutorials/sonicwall_logs/index.ts index 5e88eb03d75d2..00995b6767abf 100644 --- a/src/plugins/home/server/tutorials/sonicwall_logs/index.ts +++ b/src/plugins/home/server/tutorials/sonicwall_logs/index.ts @@ -39,7 +39,7 @@ export function sonicwallLogsSpecProvider(context: TutorialContext): TutorialSch learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-sonicwall.html', }, }), - euiIconType: '/plugins/home/assets/logos/sonicwall.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/sonicwall.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/sophos_logs/index.ts b/src/plugins/home/server/tutorials/sophos_logs/index.ts index a504ae2a30802..5f43d0bccaf57 100644 --- a/src/plugins/home/server/tutorials/sophos_logs/index.ts +++ b/src/plugins/home/server/tutorials/sophos_logs/index.ts @@ -39,7 +39,7 @@ export function sophosLogsSpecProvider(context: TutorialContext): TutorialSchema learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-sophos.html', }, }), - euiIconType: '/plugins/home/assets/logos/sophos.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/sophos.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/stan_metrics/index.ts b/src/plugins/home/server/tutorials/stan_metrics/index.ts index ca0be2097af13..c83b405e2058a 100644 --- a/src/plugins/home/server/tutorials/stan_metrics/index.ts +++ b/src/plugins/home/server/tutorials/stan_metrics/index.ts @@ -38,7 +38,7 @@ export function stanMetricsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-stan.html', }, }), - euiIconType: '/plugins/home/assets/logos/stan.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/stan.svg'), artifacts: { dashboards: [ { @@ -54,7 +54,7 @@ export function stanMetricsSpecProvider(context: TutorialContext): TutorialSchem }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/stan_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/stan_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/statsd_metrics/index.ts b/src/plugins/home/server/tutorials/statsd_metrics/index.ts index a7c8a27aa7afd..695c890bb449d 100644 --- a/src/plugins/home/server/tutorials/statsd_metrics/index.ts +++ b/src/plugins/home/server/tutorials/statsd_metrics/index.ts @@ -35,7 +35,7 @@ export function statsdMetricsSpecProvider(context: TutorialContext): TutorialSch learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-statsd.html', }, }), - euiIconType: '/plugins/home/assets/logos/statsd.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/statsd.svg'), artifacts: { dashboards: [], exportedFields: { diff --git a/src/plugins/home/server/tutorials/suricata_logs/index.ts b/src/plugins/home/server/tutorials/suricata_logs/index.ts index dfff18cd8f196..aa8a24a843c6d 100644 --- a/src/plugins/home/server/tutorials/suricata_logs/index.ts +++ b/src/plugins/home/server/tutorials/suricata_logs/index.ts @@ -40,7 +40,7 @@ export function suricataLogsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-suricata.html', }, }), - euiIconType: '/plugins/home/assets/logos/suricata.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/suricata.svg'), artifacts: { dashboards: [ { @@ -56,7 +56,7 @@ export function suricataLogsSpecProvider(context: TutorialContext): TutorialSche }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/suricata_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/suricata_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/system_metrics/index.ts b/src/plugins/home/server/tutorials/system_metrics/index.ts index b9d607c9fc59c..1db7e1e335337 100644 --- a/src/plugins/home/server/tutorials/system_metrics/index.ts +++ b/src/plugins/home/server/tutorials/system_metrics/index.ts @@ -40,7 +40,7 @@ It collects system wide statistics and statistics per process and filesystem. \ learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-system.html', }, }), - euiIconType: '/plugins/home/assets/logos/system.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/system.svg'), artifacts: { dashboards: [ { @@ -56,7 +56,7 @@ It collects system wide statistics and statistics per process and filesystem. \ }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/system_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/system_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/tomcat_logs/index.ts b/src/plugins/home/server/tutorials/tomcat_logs/index.ts index 99198f835402c..6694f54428c99 100644 --- a/src/plugins/home/server/tutorials/tomcat_logs/index.ts +++ b/src/plugins/home/server/tutorials/tomcat_logs/index.ts @@ -39,7 +39,7 @@ export function tomcatLogsSpecProvider(context: TutorialContext): TutorialSchema learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-tomcat.html', }, }), - euiIconType: '/plugins/home/assets/logos/tomcat.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/tomcat.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/home/server/tutorials/traefik_logs/index.ts b/src/plugins/home/server/tutorials/traefik_logs/index.ts index 7c096f68aabfb..13a1c448c876a 100644 --- a/src/plugins/home/server/tutorials/traefik_logs/index.ts +++ b/src/plugins/home/server/tutorials/traefik_logs/index.ts @@ -39,7 +39,7 @@ export function traefikLogsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-traefik.html', }, }), - euiIconType: '/plugins/home/assets/logos/traefik.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/traefik.svg'), artifacts: { dashboards: [ { diff --git a/src/plugins/home/server/tutorials/traefik_metrics/index.ts b/src/plugins/home/server/tutorials/traefik_metrics/index.ts index 1bba0718fbd99..daa83e051bd28 100644 --- a/src/plugins/home/server/tutorials/traefik_metrics/index.ts +++ b/src/plugins/home/server/tutorials/traefik_metrics/index.ts @@ -35,7 +35,7 @@ export function traefikMetricsSpecProvider(context: TutorialContext): TutorialSc learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-traefik.html', }, }), - euiIconType: '/plugins/home/assets/logos/traefik.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/traefik.svg'), artifacts: { dashboards: [], exportedFields: { diff --git a/src/plugins/home/server/tutorials/uptime_monitors/index.ts b/src/plugins/home/server/tutorials/uptime_monitors/index.ts index 86b3e99e11057..653cf939108b3 100644 --- a/src/plugins/home/server/tutorials/uptime_monitors/index.ts +++ b/src/plugins/home/server/tutorials/uptime_monitors/index.ts @@ -53,7 +53,7 @@ export function uptimeMonitorsSpecProvider(context: TutorialContext): TutorialSc }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/uptime_monitors/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/uptime_monitors/screenshot.webp'), onPrem: onPremInstructions([], context), elasticCloud: cloudInstructions(context), onPremElasticCloud: onPremCloudInstructions(context), diff --git a/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts b/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts index 4fb6725255e0a..fedc37523baae 100644 --- a/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts +++ b/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts @@ -38,7 +38,7 @@ export function uwsgiMetricsSpecProvider(context: TutorialContext): TutorialSche learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-uwsgi.html', }, }), - euiIconType: '/plugins/home/assets/logos/uwsgi.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/uwsgi.svg'), isBeta: false, artifacts: { dashboards: [ @@ -55,7 +55,7 @@ export function uwsgiMetricsSpecProvider(context: TutorialContext): TutorialSche }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/uwsgi_metrics/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/uwsgi_metrics/screenshot.webp'), onPrem: onPremInstructions(moduleName, context), elasticCloud: cloudInstructions(moduleName, context), onPremElasticCloud: onPremCloudInstructions(moduleName, context), diff --git a/src/plugins/home/server/tutorials/vsphere_metrics/index.ts b/src/plugins/home/server/tutorials/vsphere_metrics/index.ts index 946da1b884a80..66359772a14c5 100644 --- a/src/plugins/home/server/tutorials/vsphere_metrics/index.ts +++ b/src/plugins/home/server/tutorials/vsphere_metrics/index.ts @@ -38,7 +38,7 @@ export function vSphereMetricsSpecProvider(context: TutorialContext): TutorialSc learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-vsphere.html', }, }), - euiIconType: '/plugins/home/assets/logos/vsphere.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/vsphere.svg'), isBeta: true, artifacts: { application: { diff --git a/src/plugins/home/server/tutorials/zeek_logs/index.ts b/src/plugins/home/server/tutorials/zeek_logs/index.ts index 387f1041f4974..1460fb6acf9b4 100644 --- a/src/plugins/home/server/tutorials/zeek_logs/index.ts +++ b/src/plugins/home/server/tutorials/zeek_logs/index.ts @@ -40,7 +40,7 @@ export function zeekLogsSpecProvider(context: TutorialContext): TutorialSchema { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-zeek.html', }, }), - euiIconType: '/plugins/home/assets/logos/zeek.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/zeek.svg'), artifacts: { dashboards: [ { @@ -56,7 +56,7 @@ export function zeekLogsSpecProvider(context: TutorialContext): TutorialSchema { }, }, completionTimeMinutes: 10, - previewImagePath: '/plugins/home/assets/zeek_logs/screenshot.webp', + previewImagePath: context.staticAssets.getPluginAssetHref('/zeek_logs/screenshot.webp'), onPrem: onPremInstructions(moduleName, platforms, context), elasticCloud: cloudInstructions(moduleName, platforms, context), onPremElasticCloud: onPremCloudInstructions(moduleName, platforms, context), diff --git a/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts b/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts index dd65f61a78b3c..2479650a5198d 100644 --- a/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts +++ b/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts @@ -26,7 +26,7 @@ export function zookeeperMetricsSpecProvider(context: TutorialContext): Tutorial defaultMessage: 'Zookeeper Metrics', }), moduleName, - euiIconType: '/plugins/home/assets/logos/zookeeper.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/zookeeper.svg'), isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.zookeeperMetrics.shortDescription', { diff --git a/src/plugins/home/server/tutorials/zscaler_logs/index.ts b/src/plugins/home/server/tutorials/zscaler_logs/index.ts index 316590c74fd76..47be9df4cdf5c 100644 --- a/src/plugins/home/server/tutorials/zscaler_logs/index.ts +++ b/src/plugins/home/server/tutorials/zscaler_logs/index.ts @@ -39,7 +39,7 @@ export function zscalerLogsSpecProvider(context: TutorialContext): TutorialSchem learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-zscaler.html', }, }), - euiIconType: '/plugins/home/assets/logos/zscaler.svg', + euiIconType: context.staticAssets.getPluginAssetHref('/logos/zscaler.svg'), artifacts: { dashboards: [], application: { diff --git a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/get_saved_object_counts/get_saved_object_counts.test.ts b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/get_saved_object_counts/get_saved_object_counts.test.ts index f83200f56f27c..c21b922f4142f 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/get_saved_object_counts/get_saved_object_counts.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/get_saved_object_counts/get_saved_object_counts.test.ts @@ -34,6 +34,7 @@ describe('getSavedObjectsCounts', () => { await getSavedObjectsCounts(soClient, ['type-a', 'type_2']); expect(soClient.find).toHaveBeenCalledWith({ type: ['type-a', 'type_2'], + namespaces: ['*'], perPage: 0, aggs: { types: { @@ -49,9 +50,10 @@ describe('getSavedObjectsCounts', () => { test('should apply the terms query and aggregation with the size matching the length of the list when `exclusive === true`', async () => { soClient.find.mockResolvedValueOnce(soEmptyResponse); - await getSavedObjectsCounts(soClient, ['type_one', 'type_two'], true); + await getSavedObjectsCounts(soClient, ['type_one', 'type_two'], { exclusive: true }); expect(soClient.find).toHaveBeenCalledWith({ type: ['type_one', 'type_two'], + namespaces: ['*'], perPage: 0, aggs: { types: { terms: { field: 'type', size: 2 } } }, }); diff --git a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/get_saved_object_counts/get_saved_object_counts.ts b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/get_saved_object_counts/get_saved_object_counts.ts index cdca68e5d6006..d062d3c35b328 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/get_saved_object_counts/get_saved_object_counts.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/get_saved_object_counts/get_saved_object_counts.ts @@ -41,17 +41,24 @@ export interface SavedObjectsCounts { * * @param soClient The {@link SavedObjectsClientContract} to use when performing the aggregation. * @param soTypes The SO types we want to know about. - * @param exclusive If `true`, the results will only contain the breakdown for the specified `soTypes`. Otherwise, it'll also return `missing` and `others` bucket. + * @param options.exclusive If `true`, the results will only contain the breakdown for the specified `soTypes`. Otherwise, it'll also return `missing` and `others` bucket. + * @param options.namespaces array of namespaces to search. Otherwise it'll default to all namespaces ['*']. * @returns {@link SavedObjectsCounts} */ export async function getSavedObjectsCounts( soClient: SavedObjectsClientContract, soTypes: string[], - exclusive: boolean = false + options?: { + exclusive?: boolean; + namespaces?: string[]; + } ): Promise { + const { exclusive = false, namespaces = ['*'] } = options || {}; + const body = await soClient.find({ type: soTypes, perPage: 0, + namespaces, aggs: { types: { terms: { diff --git a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.test.ts b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.test.ts index 7d6e600ded94b..831bc5a700a00 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.test.ts @@ -97,7 +97,7 @@ describe('getKibanaSavedObjectCounts', () => { expect(getSavedObjectsCountsMock).toHaveBeenCalledWith( soClient, ['dashboard', 'visualization', 'search', 'index-pattern', 'graph-workspace'], - true + { exclusive: true } ); }); }); diff --git a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.ts index 8451b3eadeb00..17b8666f9fb83 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.ts @@ -28,7 +28,7 @@ const TYPES = ['dashboard', 'visualization', 'search', 'index-pattern', 'graph-w export async function getKibanaSavedObjectCounts( soClient: SavedObjectsClientContract ): Promise { - const { per_type: buckets } = await getSavedObjectsCounts(soClient, TYPES, true); + const { per_type: buckets } = await getSavedObjectsCounts(soClient, TYPES, { exclusive: true }); const allZeros = Object.fromEntries( TYPES.map((type) => [snakeCase(type), { total: 0 }]) diff --git a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/saved_objects_count_collector.test.ts b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/saved_objects_count_collector.test.ts index 53168be3c34b6..dbce4a5765441 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/saved_objects_count_collector.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/saved_objects_count_collector.test.ts @@ -16,15 +16,21 @@ import { registerSavedObjectsCountUsageCollector } from './saved_objects_count_c describe('saved_objects_count_collector', () => { const usageCollectionMock = createUsageCollectionSetupMock(); const fetchContextMock = createCollectorFetchContextMock(); + const mockGetSoClientWithHiddenIndices = jest.fn().mockResolvedValue(fetchContextMock.soClient); beforeAll(() => - registerSavedObjectsCountUsageCollector(usageCollectionMock, () => - Promise.resolve(['type_one', 'type_two', 'type-three', 'type-four']) + registerSavedObjectsCountUsageCollector( + usageCollectionMock, + () => Promise.resolve(['type_one', 'type_two', 'type-three', 'type-four']), + mockGetSoClientWithHiddenIndices ) ); afterAll(() => jest.clearAllTimers()); - afterEach(() => getSavedObjectsCountsMock.mockReset()); + afterEach(() => { + getSavedObjectsCountsMock.mockReset(); + mockGetSoClientWithHiddenIndices.mockClear(); + }); test('registered collector is set', () => { expect(usageCollectionMock.makeUsageCollector).toHaveBeenCalled(); @@ -48,6 +54,8 @@ describe('saved_objects_count_collector', () => { non_registered_types: [], others: 0, }); + + expect(mockGetSoClientWithHiddenIndices).toBeCalledTimes(1); }); test('should return some values when the aggregations return something', async () => { @@ -78,10 +86,11 @@ describe('saved_objects_count_collector', () => { total: 153, }); + expect(mockGetSoClientWithHiddenIndices).toBeCalledTimes(1); expect(getSavedObjectsCountsMock).toHaveBeenCalledWith( fetchContextMock.soClient, ['type_one', 'type_two', 'type-three', 'type-four'], - false + { exclusive: false, namespaces: ['*'] } ); }); }); diff --git a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/saved_objects_count_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/saved_objects_count_collector.ts index 49bfb7819389d..b327c3d591731 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/saved_objects_count_collector.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/saved_objects_count_collector.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; import { getSavedObjectsCounts } from './get_saved_object_counts'; @@ -23,7 +24,8 @@ interface SavedObjectsCountUsage { export function registerSavedObjectsCountUsageCollector( usageCollection: UsageCollectionSetup, - getAllSavedObjectTypes: () => Promise + getAllSavedObjectTypes: () => Promise, + getSoClientWithHiddenIndices: () => Promise ) { usageCollection.registerCollector( usageCollection.makeUsageCollector({ @@ -67,14 +69,19 @@ export function registerSavedObjectsCountUsageCollector( }, }, }, - async fetch({ soClient }) { + async fetch() { + const soClient = await getSoClientWithHiddenIndices(); const allRegisteredSOTypes = await getAllSavedObjectTypes(); + const namespaces = ['*']; const { total, per_type: buckets, non_expected_types: nonRegisteredTypes, others, - } = await getSavedObjectsCounts(soClient, allRegisteredSOTypes, false); + } = await getSavedObjectsCounts(soClient, allRegisteredSOTypes, { + namespaces, + exclusive: false, + }); return { total, by_type: buckets.map(({ key: type, doc_count: count }) => ({ type, count })), diff --git a/src/plugins/kibana_usage_collection/server/plugin.ts b/src/plugins/kibana_usage_collection/server/plugin.ts index 5c807e01c0ce0..ff38116c1de44 100644 --- a/src/plugins/kibana_usage_collection/server/plugin.ts +++ b/src/plugins/kibana_usage_collection/server/plugin.ts @@ -152,7 +152,19 @@ export class KibanaUsageCollectionPlugin implements Plugin { .getAllTypes() .map(({ name }) => name); }; - registerSavedObjectsCountUsageCollector(usageCollection, getAllSavedObjectTypes); + + const getSoClientWithHiddenIndices = async () => { + const coreStart = await coreStartPromise; + + const allSoTypes = await getAllSavedObjectTypes(); + return coreStart.savedObjects.createInternalRepository(allSoTypes); + }; + + registerSavedObjectsCountUsageCollector( + usageCollection, + getAllSavedObjectTypes, + getSoClientWithHiddenIndices + ); registerManagementUsageCollector(usageCollection, getUiSettingsClient); registerUiMetricUsageCollector(usageCollection, registerType, getSavedObjectsClient); registerApplicationUsageCollector( 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/saved_objects_management/public/management_section/object_view/__snapshots__/saved_object_view.test.tsx.snap b/src/plugins/saved_objects_management/public/management_section/object_view/__snapshots__/saved_object_view.test.tsx.snap index a04790ca6af23..538755e8d677d 100644 --- a/src/plugins/saved_objects_management/public/management_section/object_view/__snapshots__/saved_object_view.test.tsx.snap +++ b/src/plugins/saved_objects_management/public/management_section/object_view/__snapshots__/saved_object_view.test.tsx.snap @@ -17,6 +17,7 @@ exports[`SavedObjectEdition should render normally 1`] = ` "isOverridden": [MockFunction], "remove": [MockFunction], "set": [MockFunction], + "validateValue": [MockFunction], }, "globalClient": Object { "get": [MockFunction], @@ -30,6 +31,7 @@ exports[`SavedObjectEdition should render normally 1`] = ` "isOverridden": [MockFunction], "remove": [MockFunction], "set": [MockFunction], + "validateValue": [MockFunction], }, }, "theme": Object { @@ -49,6 +51,7 @@ exports[`SavedObjectEdition should render normally 1`] = ` "isOverridden": [MockFunction], "remove": [MockFunction], "set": [MockFunction], + "validateValue": [MockFunction], }, } } diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap b/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap index 1a2fdf031a9d3..92bae41b22e58 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap @@ -188,6 +188,7 @@ exports[`SavedObjectsTable should render normally 1`] = ` } basePath={ BasePath { + "assetsHrefBase": "", "basePath": "", "get": [Function], "prepend": [Function], diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/__snapshots__/flyout.test.tsx.snap b/src/plugins/saved_objects_management/public/management_section/objects_table/components/__snapshots__/flyout.test.tsx.snap index 7d4ed131f6eac..03ba5cf5d9ead 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/__snapshots__/flyout.test.tsx.snap +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/__snapshots__/flyout.test.tsx.snap @@ -174,6 +174,7 @@ exports[`Flyout conflicts should allow conflict resolution 2`] = ` "register": [MockFunction], }, "basePath": BasePath { + "assetsHrefBase": "", "basePath": "", "get": [Function], "prepend": [Function], @@ -195,6 +196,9 @@ exports[`Flyout conflicts should allow conflict resolution 2`] = ` "patch": [MockFunction], "post": [MockFunction], "put": [MockFunction], + "staticAssets": Object { + "getPluginAssetHref": [MockFunction], + }, }, "state": Object { "conflictingRecord": undefined, @@ -401,6 +405,7 @@ exports[`Flyout summary should display summary when import is complete 1`] = ` allowedTypes={Array []} basePath={ BasePath { + "assetsHrefBase": "", "basePath": "", "get": [Function], "prepend": [Function], diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.tsx index 3e0352f613d7e..79e4d32643108 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/table.tsx @@ -13,7 +13,7 @@ import { EuiSearchBar, EuiBasicTable, EuiButton, - EuiIcon, + EuiIconTip, EuiLink, EuiSpacer, EuiToolTip, @@ -245,14 +245,13 @@ export class Table extends PureComponent { render: (type: string, object: SavedObjectWithMetadata) => { const typeLabel = getSavedObjectLabel(type, allowedTypes); return ( - - - + ); }, } as EuiTableFieldDataColumnType>, diff --git a/src/plugins/telemetry_management_section/public/components/__snapshots__/telemetry_management_section.test.tsx.snap b/src/plugins/telemetry_management_section/public/components/__snapshots__/telemetry_management_section.test.tsx.snap index 515add8c29dd4..430cf538779b6 100644 --- a/src/plugins/telemetry_management_section/public/components/__snapshots__/telemetry_management_section.test.tsx.snap +++ b/src/plugins/telemetry_management_section/public/components/__snapshots__/telemetry_management_section.test.tsx.snap @@ -281,6 +281,7 @@ exports[`TelemetryManagementSectionComponent renders null because allowChangingO "register": [MockFunction], }, "basePath": BasePath { + "assetsHrefBase": "", "basePath": "", "get": [Function], "prepend": [Function], @@ -302,6 +303,9 @@ exports[`TelemetryManagementSectionComponent renders null because allowChangingO "patch": [MockFunction], "post": [MockFunction], "put": [MockFunction], + "staticAssets": Object { + "getPluginAssetHref": [MockFunction], + }, }, "isScreenshotMode": false, "notifications": Object { 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/test/functional/apps/dashboard/group5/dashboard_settings.ts b/test/functional/apps/dashboard/group5/dashboard_settings.ts index ae0e727814eef..bd6fb8d6c83a6 100644 --- a/test/functional/apps/dashboard/group5/dashboard_settings.ts +++ b/test/functional/apps/dashboard/group5/dashboard_settings.ts @@ -12,6 +12,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); + const browser = getService('browser'); const globalNav = getService('globalNav'); const kibanaServer = getService('kibanaServer'); const dashboardSettings = getService('dashboardSettings'); @@ -20,6 +21,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('dashboard settings', () => { 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/ccs_compatibility/_search_errors.ts b/test/functional/apps/discover/ccs_compatibility/_search_errors.ts new file mode 100644 index 0000000000000..da2d2b5567341 --- /dev/null +++ b/test/functional/apps/discover/ccs_compatibility/_search_errors.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const config = getService('config'); + const filterBar = getService('filterBar'); + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['common', 'discover', 'header', 'timePicker']); + + const isCcsTest = config.get('esTestCluster.ccs'); + const archiveDirectory = isCcsTest + ? 'test/functional/fixtures/kbn_archiver/ccs/discover.json' + : 'test/functional/fixtures/kbn_archiver/discover.json'; + const esNode = isCcsTest + ? getService('remoteEsArchiver' as 'esArchiver') + : getService('esArchiver'); + + const defaultIndex = isCcsTest ? 'ftr-remote:logstash-*' : 'logstash-*'; + + describe('discover search errors', () => { + before(async () => { + await kibanaServer.importExport.load(archiveDirectory); + await esNode.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + after(async () => { + await kibanaServer.importExport.unload(archiveDirectory); + await esNode.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + it('exception on single shard shows warning and results', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.selectIndexPattern(defaultIndex); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await retry.try(async () => { + const hitCount = await PageObjects.discover.getHitCount(); + expect(hitCount).to.be('14,004'); + }); + await filterBar.addDslFilter(` + { + "query": { + "error_query": { + "indices": [ + { + "name": "${defaultIndex.slice(0, defaultIndex.length - 1)}2015.09.20", + "error_type": "exception", + "message": "'Watch out!'" + } + ] + } + } + }`); + + // Ensure documents are still returned for the successful shards + await retry.try(async function tryingForTime() { + const hitCount = await PageObjects.discover.getHitCount(); + expect(hitCount).to.be('9,247'); + }); + + // Ensure a warning is shown + await testSubjects.exists('searchResponseWarningsCallout'); + }); + + it('exception on all shards shows error', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.selectIndexPattern(defaultIndex); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await retry.try(async () => { + const hitCount = await PageObjects.discover.getHitCount(); + expect(hitCount).to.be('14,004'); + }); + await filterBar.addDslFilter(` + { + "query": { + "error_query": { + "indices": [ + { + "name": "${defaultIndex}", + "error_type": "exception", + "message": "'Watch out!'" + } + ] + } + } + }`); + + // Ensure an error is shown + await testSubjects.exists('searchResponseWarningsEmptyPrompt'); + }); + }); +} diff --git a/test/functional/apps/discover/ccs_compatibility/index.ts b/test/functional/apps/discover/ccs_compatibility/index.ts index 1204ce9daadb2..4f932c3993831 100644 --- a/test/functional/apps/discover/ccs_compatibility/index.ts +++ b/test/functional/apps/discover/ccs_compatibility/index.ts @@ -22,5 +22,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./_data_view_editor')); loadTestFile(require.resolve('./_saved_queries')); + loadTestFile(require.resolve('./_search_errors')); }); } diff --git a/test/functional/apps/discover/group3/_default_columns.ts b/test/functional/apps/discover/group3/_default_columns.ts new file mode 100644 index 0000000000000..64028c54a1b19 --- /dev/null +++ b/test/functional/apps/discover/group3/_default_columns.ts @@ -0,0 +1,175 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const dataGrid = getService('dataGrid'); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'timePicker', + 'unifiedFieldList', + 'unifiedSearch', + 'header', + ]); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const security = getService('security'); + const defaultSettings = { + defaultIndex: 'logstash-*', + defaultColumns: ['message', 'extension', 'DestCountry'], + hideAnnouncements: true, + }; + + describe('discover default columns', function () { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await esArchiver.load('test/functional/fixtures/es_archiver/kibana_sample_data_logs_tsdb'); + await esArchiver.loadIfNeeded( + 'test/functional/fixtures/es_archiver/kibana_sample_data_flights' + ); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/kibana_sample_data_logs_tsdb' + ); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/kibana_sample_data_flights_index_pattern' + ); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + await esArchiver.unload('test/functional/fixtures/es_archiver/kibana_sample_data_logs_tsdb'); + await esArchiver.unload('test/functional/fixtures/es_archiver/kibana_sample_data_flights'); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + beforeEach(async function () { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update(defaultSettings); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + it('should render default columns', async function () { + expect(await dataGrid.getHeaderFields()).to.eql([ + '@timestamp', + 'message', + 'extension', + 'DestCountry', + ]); + }); + + it('should render only available default columns after switching data views', async function () { + expect(await dataGrid.getHeaderFields()).to.eql([ + '@timestamp', + 'message', + 'extension', + 'DestCountry', + ]); + + await PageObjects.unifiedSearch.switchDataView( + 'discover-dataView-switch-link', + 'Kibana Sample Data Logs (TSDB)', + false + ); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + expect(await dataGrid.getHeaderFields()).to.eql(['timestamp', 'message', 'extension']); + + await PageObjects.unifiedSearch.switchDataView( + 'discover-dataView-switch-link', + 'kibana_sample_data_flights', + false + ); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + expect(await dataGrid.getHeaderFields()).to.eql(['timestamp', 'DestCountry']); + + await PageObjects.unifiedSearch.switchDataView( + 'discover-dataView-switch-link', + 'logstash-*', + false + ); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'extension']); + }); + + it('should combine selected columns and default columns after switching data views', async function () { + await PageObjects.unifiedFieldList.clickFieldListItemAdd('bytes'); + await PageObjects.unifiedFieldList.clickFieldListItemRemove('DestCountry'); + await PageObjects.unifiedFieldList.clickFieldListItemRemove('message'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'extension', 'bytes']); + + await PageObjects.unifiedSearch.switchDataView( + 'discover-dataView-switch-link', + 'Kibana Sample Data Logs (TSDB)', + false + ); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + expect(await dataGrid.getHeaderFields()).to.eql([ + 'timestamp', + 'extension', + 'bytes', + 'message', + ]); + + await PageObjects.unifiedSearch.switchDataView( + 'discover-dataView-switch-link', + 'logstash-*', + false + ); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'extension', 'bytes']); + }); + + it('should not change columns if discover:modifyColumnsOnSwitch is off', async function () { + await kibanaServer.uiSettings.update({ + 'discover:modifyColumnsOnSwitch': false, + }); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + expect(await dataGrid.getHeaderFields()).to.eql([ + '@timestamp', + 'message', + 'extension', + 'DestCountry', + ]); + + await PageObjects.unifiedSearch.switchDataView( + 'discover-dataView-switch-link', + 'kibana_sample_data_flights', + false + ); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + expect(await dataGrid.getHeaderFields()).to.eql([ + 'timestamp', + 'message', + 'extension', + 'DestCountry', + ]); + }); + }); +} diff --git a/test/functional/apps/discover/group3/index.ts b/test/functional/apps/discover/group3/index.ts index 4ac4572014a52..848bdc84def4d 100644 --- a/test/functional/apps/discover/group3/index.ts +++ b/test/functional/apps/discover/group3/index.ts @@ -20,6 +20,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); }); + loadTestFile(require.resolve('./_default_columns')); loadTestFile(require.resolve('./_drag_drop')); loadTestFile(require.resolve('./_sidebar')); loadTestFile(require.resolve('./_request_counts')); 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/filter_bar.ts b/test/functional/services/filter_bar.ts index 22fa4ff0b5e59..eb9aae45621e1 100644 --- a/test/functional/services/filter_bar.ts +++ b/test/functional/services/filter_bar.ts @@ -65,6 +65,7 @@ type Filter = FilterLeaf | FilterNode; export class FilterBarService extends FtrService { private readonly comboBox = this.ctx.getService('comboBox'); + private readonly monacoEditor = this.ctx.getService('monacoEditor'); private readonly testSubjects = this.ctx.getService('testSubjects'); private readonly common = this.ctx.getPageObject('common'); private readonly header = this.ctx.getPageObject('header'); @@ -315,6 +316,19 @@ export class FilterBarService extends FtrService { await this.addFilterAndSelectDataView(null, filter); } + public async addDslFilter(value: string) { + await this.testSubjects.click('addFilter'); + await this.testSubjects.click('editQueryDSL'); + await this.monacoEditor.waitCodeEditorReady('addFilterPopover'); + await this.monacoEditor.setCodeEditorValue(value); + await this.testSubjects.scrollIntoView('saveFilter'); + await this.testSubjects.clickWhenNotDisabled('saveFilter'); + await this.retry.try(async () => { + await this.testSubjects.waitForDeleted('saveFilter'); + }); + await this.header.waitUntilLoadingHasFinished(); + } + /** * Activates filter editing * @param key field name 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/tsconfig.base.json b/tsconfig.base.json index a92c90b6aeb38..06ade5904efad 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"], diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx index b1d9145a9e612..b8ee12525c68a 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.test.tsx @@ -75,19 +75,20 @@ describe('API tests', () => { expect(mockHttp.fetch).toHaveBeenCalledWith( '/internal/elastic_assistant/actions/connector/foo/_execute', { - body: '{"params":{"subActionParams":{"model":"gpt-4","messages":[{"role":"user","content":"This is a test"}],"n":1,"stop":null,"temperature":0.2},"subAction":"invokeAI"},"assistantLangChain":false}', - headers: { 'Content-Type': 'application/json' }, + body: '{"params":{"subActionParams":{"model":"gpt-4","messages":[{"role":"user","content":"This is a test"}],"n":1,"stop":null,"temperature":0.2},"subAction":"invokeStream"},"assistantLangChain":false}', method: 'POST', + asResponse: true, + rawResponse: true, signal: undefined, } ); }); - it('returns API_ERROR when the response status is not ok', async () => { + it('returns API_ERROR when the response status is error and langchain is on', async () => { (mockHttp.fetch as jest.Mock).mockResolvedValue({ status: 'error' }); const testProps: FetchConnectorExecuteAction = { - assistantLangChain: false, + assistantLangChain: true, http: mockHttp, messages, apiConfig, @@ -98,10 +99,50 @@ describe('API tests', () => { expect(result).toEqual({ response: API_ERROR, isStream: false, isError: true }); }); + it('returns API_ERROR when the response status is error, langchain is off, and response is not a reader', async () => { + (mockHttp.fetch as jest.Mock).mockResolvedValue({ status: 'error' }); + + const testProps: FetchConnectorExecuteAction = { + assistantLangChain: false, + http: mockHttp, + messages, + apiConfig, + }; + + const result = await fetchConnectorExecuteAction(testProps); + + expect(result).toEqual({ + response: `${API_ERROR}\n\nCould not get reader from response`, + isStream: false, + isError: true, + }); + }); + + it('returns API_ERROR when the response is error, langchain is off, and response is a reader', async () => { + const mockReader = jest.fn(); + (mockHttp.fetch as jest.Mock).mockRejectedValue({ + response: { body: { getReader: jest.fn().mockImplementation(() => mockReader) } }, + }); + const testProps: FetchConnectorExecuteAction = { + assistantLangChain: false, + http: mockHttp, + messages, + apiConfig, + }; + + const result = await fetchConnectorExecuteAction(testProps); + + expect(result).toEqual({ + response: mockReader, + isStream: true, + isError: true, + }); + }); + it('returns API_ERROR when there are no choices', async () => { (mockHttp.fetch as jest.Mock).mockResolvedValue({ status: 'ok', data: '' }); const testProps: FetchConnectorExecuteAction = { - assistantLangChain: false, + assistantLangChain: true, http: mockHttp, messages, apiConfig, 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 69e6d39d85e11..f92585cbdd011 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx @@ -54,17 +54,16 @@ export const fetchConnectorExecuteAction = async ({ messages: outboundMessages, }; - // TODO: Remove in part 2 of streaming work for security solution + // TODO: Remove in part 3 of streaming work for security solution // tracked here: https://github.com/elastic/security-team/issues/7363 - // My "Feature Flag", turn to false before merging - // In part 2 I will make enhancements to invokeAI to make it work with both openA, but to keep it to a Security Soltuion only review on this PR, - // I'm calling the stream action directly - const isStream = !assistantLangChain && false; + // In part 3 I will make enhancements to langchain to introduce streaming + // Once implemented, invokeAI can be removed + const isStream = !assistantLangChain; const requestBody = isStream ? { params: { subActionParams: body, - subAction: 'stream', + subAction: 'invokeStream', }, assistantLangChain, } @@ -105,7 +104,7 @@ export const fetchConnectorExecuteAction = async ({ }; } - // TODO: Remove in part 2 of streaming work for security solution + // TODO: Remove in part 3 of streaming work for security solution // tracked here: https://github.com/elastic/security-team/issues/7363 // This is a temporary code to support the non-streaming API const response = await http.fetch<{ @@ -140,10 +139,19 @@ export const fetchConnectorExecuteAction = async ({ isStream: false, }; } catch (error) { + const reader = error?.response?.body?.getReader(); + + if (!reader) { + return { + response: `${API_ERROR}\n\n${error?.body?.message ?? error?.message}`, + isError: true, + isStream: false, + }; + } return { - response: `${API_ERROR}\n\n${error?.body?.message ?? error?.message}`, + response: reader, + isStream: true, isError: true, - isStream: false, }; } }; 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/index.ts b/x-pack/packages/kbn-slo-schema/index.ts index 98b183d391bb7..3d9e295055a61 100644 --- a/x-pack/packages/kbn-slo-schema/index.ts +++ b/x-pack/packages/kbn-slo-schema/index.ts @@ -8,4 +8,3 @@ export * from './src/schema'; export * from './src/rest_specs'; export * from './src/models/duration'; -export * from './src/models/pagination'; 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 1251e49b56af8..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 @@ -6,7 +6,6 @@ */ import * as t from 'io-ts'; -import { toBooleanRt } from '@kbn/io-ts-utils'; import { allOrAnyString, apmTransactionDurationIndicatorSchema, @@ -61,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, + }), }), }); @@ -106,7 +109,6 @@ const sloResponseSchema = t.intersection([ groupBy: allOrAnyString, createdAt: dateType, updatedAt: dateType, - version: t.number, }), t.partial({ instanceId: allOrAnyString, @@ -155,12 +157,6 @@ const manageSLOParamsSchema = t.type({ path: t.type({ id: sloIdSchema }), }); -const resetSLOParamsSchema = t.type({ - path: t.type({ id: sloIdSchema }), -}); - -const resetSLOResponseSchema = sloResponseSchema; - const updateSLOResponseSchema = sloResponseSchema; const findSLOResponseSchema = t.type({ @@ -186,21 +182,23 @@ const fetchHistoricalSummaryResponseSchema = t.array( }) ); -const findSloDefinitionsParamsSchema = t.partial({ - query: t.partial({ +/** + * The query params schema for /internal/observability/slo/_definitions + * + * @private + */ +const findSloDefinitionsParamsSchema = t.type({ + query: t.type({ search: t.string, - includeOutdatedOnly: toBooleanRt, - page: t.string, - perPage: t.string, }), }); -const findSloDefinitionsResponseSchema = t.type({ - page: t.number, - perPage: t.number, - total: t.number, - results: t.array(sloResponseSchema), -}); +/** + * The response schema for /internal/observability/slo/_definitions + * + * @private + */ +const findSloDefinitionsResponseSchema = t.array(sloResponseSchema); const getSLOBurnRatesResponseSchema = t.type({ burnRates: t.array( @@ -246,9 +244,6 @@ type GetSLOResponse = t.OutputOf; type ManageSLOParams = t.TypeOf; -type ResetSLOParams = t.TypeOf; -type ResetSLOResponse = t.OutputOf; - type UpdateSLOInput = t.OutputOf; type UpdateSLOParams = t.TypeOf; type UpdateSLOResponse = t.OutputOf; @@ -263,8 +258,12 @@ type FetchHistoricalSummaryParams = t.TypeOf; type HistoricalSummaryResponse = t.OutputOf; -type FindSLODefinitionsParams = t.TypeOf; -type FindSLODefinitionsResponse = t.OutputOf; +/** + * The response type for /internal/observability/slo/_definitions + * + * @private + */ +type FindSloDefinitionsResponse = t.OutputOf; type GetPreviewDataParams = t.TypeOf; type GetPreviewDataResponse = t.OutputOf; @@ -301,8 +300,6 @@ export { findSloDefinitionsParamsSchema, findSloDefinitionsResponseSchema, manageSLOParamsSchema, - resetSLOParamsSchema, - resetSLOResponseSchema, sloResponseSchema, sloWithSummaryResponseSchema, updateSLOParamsSchema, @@ -328,11 +325,8 @@ export type { FetchHistoricalSummaryParams, FetchHistoricalSummaryResponse, HistoricalSummaryResponse, - FindSLODefinitionsParams, - FindSLODefinitionsResponse, + FindSloDefinitionsResponse, ManageSLOParams, - ResetSLOParams, - ResetSLOResponse, SLOResponse, SLOWithSummaryResponse, UpdateSLOInput, 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/kbn-slo-schema/src/schema/slo.ts b/x-pack/packages/kbn-slo-schema/src/schema/slo.ts index 27e8a9e998f71..29df82010710d 100644 --- a/x-pack/packages/kbn-slo-schema/src/schema/slo.ts +++ b/x-pack/packages/kbn-slo-schema/src/schema/slo.ts @@ -50,7 +50,6 @@ const sloSchema = t.type({ createdAt: dateType, updatedAt: dateType, groupBy: allOrAnyString, - version: t.number, }); const sloWithSummarySchema = t.intersection([sloSchema, t.type({ summary: summarySchema })]); diff --git a/x-pack/packages/kbn-slo-schema/tsconfig.json b/x-pack/packages/kbn-slo-schema/tsconfig.json index bc9fd2fdede8a..3c94d9a902af8 100644 --- a/x-pack/packages/kbn-slo-schema/tsconfig.json +++ b/x-pack/packages/kbn-slo-schema/tsconfig.json @@ -11,8 +11,7 @@ "**/*.ts" ], "kbn_references": [ - "@kbn/std", - "@kbn/io-ts-utils" + "@kbn/std" ], "exclude": [ "target/**/*", diff --git a/x-pack/packages/ml/response_stream/server/index.ts b/x-pack/packages/ml/response_stream/server/index.ts index 820c76d173c74..2beb722302617 100644 --- a/x-pack/packages/ml/response_stream/server/index.ts +++ b/x-pack/packages/ml/response_stream/server/index.ts @@ -5,4 +5,8 @@ * 2.0. */ -export { streamFactory } from './stream_factory'; +export { + streamFactory, + type StreamFactoryReturnType, + type UncompressedResponseStream, +} from './stream_factory'; diff --git a/x-pack/packages/ml/response_stream/server/stream_factory.ts b/x-pack/packages/ml/response_stream/server/stream_factory.ts index 8836c241e55d8..29c570c2fb564 100644 --- a/x-pack/packages/ml/response_stream/server/stream_factory.ts +++ b/x-pack/packages/ml/response_stream/server/stream_factory.ts @@ -22,13 +22,13 @@ function isCompressedSream(arg: unknown): arg is zlib.Gzip { const FLUSH_KEEP_ALIVE_INTERVAL_MS = 500; const FLUSH_PAYLOAD_SIZE = 4 * 1024; -class UncompressedResponseStream extends Stream.PassThrough {} +export class UncompressedResponseStream extends Stream.PassThrough {} const DELIMITER = '\n'; type StreamType = 'string' | 'ndjson'; -interface StreamFactoryReturnType { +export interface StreamFactoryReturnType { DELIMITER: string; end: () => void; push: (d: T, drain?: boolean) => void; diff --git a/x-pack/plugins/actions/server/lib/action_executor.ts b/x-pack/plugins/actions/server/lib/action_executor.ts index 9cd70d4c7bf91..b27e2c1ee79c7 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.ts @@ -8,12 +8,13 @@ import type { PublicMethodsOf } from '@kbn/utility-types'; import { Logger, KibanaRequest } from '@kbn/core/server'; import { cloneDeep } from 'lodash'; +import { set } from '@kbn/safer-lodash-set'; import { withSpan } from '@kbn/apm-utils'; import { EncryptedSavedObjectsClient } from '@kbn/encrypted-saved-objects-plugin/server'; import { SpacesServiceStart } from '@kbn/spaces-plugin/server'; import { IEventLogger, SAVED_OBJECT_REL_PRIMARY } from '@kbn/event-log-plugin/server'; import { SecurityPluginStart } from '@kbn/security-plugin/server'; -import { PassThrough, Readable } from 'stream'; +import { getGenAiTokenTracking, shouldTrackGenAiToken } from './gen_ai_token_tracking'; import { validateParams, validateConfig, @@ -38,7 +39,6 @@ import { RelatedSavedObjects } from './related_saved_objects'; import { createActionEventLogRecordObject } from './create_action_event_log_record_object'; import { ActionExecutionError, ActionExecutionErrorReason } from './errors/action_execution_error'; import type { ActionsAuthorization } from '../authorization/actions_authorization'; -import { getTokenCountFromOpenAIStream } from './get_token_count_from_openai_stream'; // 1,000,000 nanoseconds in 1 millisecond const Millis2Nanos = 1000 * 1000; @@ -328,55 +328,33 @@ export class ActionExecutor { eventLogger.logEvent(event); } - // start openai extension - // add event.kibana.action.execution.openai to event log when OpenAI Connector is executed - if (result.status === 'ok' && actionTypeId === '.gen-ai') { - const data = result.data as unknown as { - usage: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number }; - }; - event.kibana = event.kibana || {}; - event.kibana.action = event.kibana.action || {}; - event.kibana = { - ...event.kibana, - action: { - ...event.kibana.action, - execution: { - ...event.kibana.action.execution, - gen_ai: { - usage: { - total_tokens: data.usage?.total_tokens, - prompt_tokens: data.usage?.prompt_tokens, - completion_tokens: data.usage?.completion_tokens, - }, - }, - }, - }, - }; - - if (result.data instanceof Readable) { - getTokenCountFromOpenAIStream({ - responseStream: result.data.pipe(new PassThrough()), - body: (validatedParams as { subActionParams: { body: string } }).subActionParams.body, + // start genai extension + if (result.status === 'ok' && shouldTrackGenAiToken(actionTypeId)) { + getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }) + .then((tokenTracking) => { + if (tokenTracking != null) { + set(event, 'kibana.action.execution.gen_ai.usage', { + total_tokens: tokenTracking.total_tokens, + prompt_tokens: tokenTracking.prompt_tokens, + completion_tokens: tokenTracking.completion_tokens, + }); + } }) - .then(({ total, prompt, completion }) => { - event.kibana!.action!.execution!.gen_ai!.usage = { - total_tokens: total, - prompt_tokens: prompt, - completion_tokens: completion, - }; - }) - .catch((err) => { - logger.error('Failed to calculate tokens from streaming response'); - logger.error(err); - }) - .finally(() => { - completeEventLogging(); - }); - - return resultWithoutError; - } + .catch((err) => { + logger.error('Failed to calculate tokens from streaming response'); + logger.error(err); + }) + .finally(() => { + completeEventLogging(); + }); + return resultWithoutError; } - // end openai extension + // end genai extension completeEventLogging(); diff --git a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts new file mode 100644 index 0000000000000..22f91b71d4492 --- /dev/null +++ b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts @@ -0,0 +1,183 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getGenAiTokenTracking, shouldTrackGenAiToken } from './gen_ai_token_tracking'; +import { loggerMock } from '@kbn/logging-mocks'; +import { getTokenCountFromBedrockInvoke } from './get_token_count_from_bedrock_invoke'; +import { getTokenCountFromInvokeStream } from './get_token_count_from_invoke_stream'; +import { IncomingMessage } from 'http'; +import { Socket } from 'net'; + +jest.mock('./get_token_count_from_bedrock_invoke'); +jest.mock('./get_token_count_from_invoke_stream'); + +const logger = loggerMock.create(); + +describe('getGenAiTokenTracking', () => { + let mockGetTokenCountFromBedrockInvoke: jest.Mock; + let mockGetTokenCountFromInvokeStream: jest.Mock; + beforeEach(() => { + mockGetTokenCountFromBedrockInvoke = ( + getTokenCountFromBedrockInvoke as jest.Mock + ).mockResolvedValueOnce({ + total: 100, + prompt: 50, + completion: 50, + }); + mockGetTokenCountFromInvokeStream = ( + getTokenCountFromInvokeStream as jest.Mock + ).mockResolvedValueOnce({ + total: 100, + prompt: 50, + completion: 50, + }); + }); + it('should return the total, prompt, and completion token counts when given a valid OpenAI response', async () => { + const actionTypeId = '.gen-ai'; + + const result = { + actionId: '123', + status: 'ok' as const, + data: { + usage: { + total_tokens: 100, + prompt_tokens: 50, + completion_tokens: 50, + }, + }, + }; + const validatedParams = {}; + + const tokenTracking = await getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }); + + expect(tokenTracking).toEqual({ + total_tokens: 100, + prompt_tokens: 50, + completion_tokens: 50, + }); + expect(logger.error).not.toHaveBeenCalled(); + }); + + it('should return the total, prompt, and completion token counts when given a valid Bedrock response', async () => { + const actionTypeId = '.bedrock'; + + const result = { + actionId: '123', + status: 'ok' as const, + data: { + completion: 'Sample completion', + }, + }; + const validatedParams = { + subAction: 'run', + subActionParams: { + body: 'Sample body', + }, + }; + + const tokenTracking = await getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }); + + expect(tokenTracking).toEqual({ + total_tokens: 100, + prompt_tokens: 50, + completion_tokens: 50, + }); + expect(logger.error).not.toHaveBeenCalled(); + expect(mockGetTokenCountFromBedrockInvoke).toHaveBeenCalledWith({ + response: 'Sample completion', + body: 'Sample body', + }); + }); + + it('should return the total, prompt, and completion token counts when given a valid OpenAI streamed response', async () => { + const mockReader = new IncomingMessage(new Socket()); + const actionTypeId = '.gen-ai'; + const result = { + actionId: '123', + status: 'ok' as const, + data: mockReader, + }; + const validatedParams = { + subAction: 'invokeStream', + subActionParams: { + messages: [ + { + role: 'user', + content: 'Sample message', + }, + ], + }, + }; + + const tokenTracking = await getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }); + + expect(tokenTracking).toEqual({ + total_tokens: 100, + prompt_tokens: 50, + completion_tokens: 50, + }); + expect(logger.error).not.toHaveBeenCalled(); + + expect(JSON.stringify(mockGetTokenCountFromInvokeStream.mock.calls[0][0].body)).toStrictEqual( + JSON.stringify({ + messages: [ + { + role: 'user', + content: 'Sample message', + }, + ], + }) + ); + }); + + it('should return null when given an invalid OpenAI response', async () => { + const actionTypeId = '.gen-ai'; + const result = { + actionId: '123', + status: 'ok' as const, + data: {}, + }; + const validatedParams = {}; + + const tokenTracking = await getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }); + + expect(tokenTracking).toBeNull(); + expect(logger.error).toHaveBeenCalled(); + }); + + describe('shouldTrackGenAiToken', () => { + it('should be true with OpenAI action', () => { + expect(shouldTrackGenAiToken('.gen-ai')).toEqual(true); + }); + it('should be true with bedrock action', () => { + expect(shouldTrackGenAiToken('.bedrock')).toEqual(true); + }); + it('should be false with any other action', () => { + expect(shouldTrackGenAiToken('.jira')).toEqual(false); + }); + }); +}); diff --git a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts new file mode 100644 index 0000000000000..7c104177ea36e --- /dev/null +++ b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PassThrough, Readable } from 'stream'; +import { Logger } from '@kbn/logging'; +import { getTokenCountFromBedrockInvoke } from './get_token_count_from_bedrock_invoke'; +import { ActionTypeExecutorRawResult } from '../../common'; +import { getTokenCountFromOpenAIStream } from './get_token_count_from_openai_stream'; +import { getTokenCountFromInvokeStream, InvokeBody } from './get_token_count_from_invoke_stream'; + +interface OwnProps { + actionTypeId: string; + logger: Logger; + result: ActionTypeExecutorRawResult; + validatedParams: Record; +} +/* + * Calculates the total, prompt, and completion token counts from different types of responses. + * It handles both streamed and non-streamed responses from OpenAI and Bedrock. + * It returns null if it cannot calculate the token counts. + * @param actionTypeId the action type id + * @param logger the logger + * @param result the result from the action executor + * @param validatedParams the validated params from the action executor + */ +export const getGenAiTokenTracking = async ({ + actionTypeId, + logger, + result, + validatedParams, +}: OwnProps): Promise<{ + total_tokens: number; + prompt_tokens: number; + completion_tokens: number; +} | null> => { + // this is a streamed OpenAI or Bedrock response, using the subAction invokeStream to stream the response as a simple string + if (validatedParams.subAction === 'invokeStream' && result.data instanceof Readable) { + try { + const { total, prompt, completion } = await getTokenCountFromInvokeStream({ + responseStream: result.data.pipe(new PassThrough()), + body: (validatedParams as { subActionParams: InvokeBody }).subActionParams, + logger, + }); + return { + total_tokens: total, + prompt_tokens: prompt, + completion_tokens: completion, + }; + } catch (e) { + logger.error('Failed to calculate tokens from Invoke Stream subaction streaming response'); + logger.error(e); + } + } + + // this is a streamed OpenAI response, which did not use the subAction invokeStream + if (actionTypeId === '.gen-ai' && result.data instanceof Readable) { + try { + const { total, prompt, completion } = await getTokenCountFromOpenAIStream({ + responseStream: result.data.pipe(new PassThrough()), + body: (validatedParams as { subActionParams: { body: string } }).subActionParams.body, + logger, + }); + return { + total_tokens: total, + prompt_tokens: prompt, + completion_tokens: completion, + }; + } catch (e) { + logger.error('Failed to calculate tokens from streaming response'); + logger.error(e); + } + } + + // this is a non-streamed OpenAI response, which comes with the usage object + if (actionTypeId === '.gen-ai') { + const data = result.data as unknown as { + usage: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number }; + }; + if (data.usage == null) { + logger.error('Response did not contain usage object'); + return null; + } + return { + total_tokens: data.usage?.total_tokens ?? 0, + prompt_tokens: data.usage?.prompt_tokens ?? 0, + completion_tokens: data.usage?.completion_tokens ?? 0, + }; + } + + // this is a non-streamed Bedrock response + if ( + actionTypeId === '.bedrock' && + (validatedParams.subAction === 'run' || validatedParams.subAction === 'test') + ) { + try { + const { total, prompt, completion } = await getTokenCountFromBedrockInvoke({ + response: ( + result.data as unknown as { + completion: string; + } + ).completion, + body: (validatedParams as { subActionParams: { body: string } }).subActionParams.body, + }); + + return { + total_tokens: total, + prompt_tokens: prompt, + completion_tokens: completion, + }; + } catch (e) { + logger.error('Failed to calculate tokens from Bedrock invoke response'); + logger.error(e); + } + } + return null; +}; + +export const shouldTrackGenAiToken = (actionTypeId: string) => + actionTypeId === '.gen-ai' || actionTypeId === '.bedrock'; diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_bedrock_invoke.test.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_bedrock_invoke.test.ts new file mode 100644 index 0000000000000..efb0c2cd0eaff --- /dev/null +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_bedrock_invoke.test.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 { getTokenCountFromBedrockInvoke } from './get_token_count_from_bedrock_invoke'; + +describe('getTokenCountFromBedrockInvoke', () => { + const body = JSON.stringify({ + prompt: `\n\nAssistant: This is a system message\n\nHuman: This is a user message\n\nAssistant:`, + }); + + const PROMPT_TOKEN_COUNT = 27; + const COMPLETION_TOKEN_COUNT = 4; + + it('counts the prompt tokens', async () => { + const tokens = await getTokenCountFromBedrockInvoke({ + response: 'This is a response', + body, + }); + expect(tokens.prompt).toBe(PROMPT_TOKEN_COUNT); + expect(tokens.completion).toBe(COMPLETION_TOKEN_COUNT); + expect(tokens.total).toBe(PROMPT_TOKEN_COUNT + COMPLETION_TOKEN_COUNT); + }); +}); diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_bedrock_invoke.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_bedrock_invoke.ts new file mode 100644 index 0000000000000..26e320200830b --- /dev/null +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_bedrock_invoke.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 { encode } from 'gpt-tokenizer'; + +export interface InvokeBody { + prompt: string; +} + +/** + * Takes the Bedrock `run` and `test` sub action response and the request prompt as inputs. + * Uses gpt-tokenizer encoding to calculate the number of tokens in the prompt and completion. + * Returns an object containing the total, prompt, and completion token counts. + * @param response (string) - the response completion from the `run` or `test` sub action + * @param body - the stringified request prompt + */ +export async function getTokenCountFromBedrockInvoke({ + response, + body, +}: { + response: string; + body: string; +}): Promise<{ + total: number; + prompt: number; + completion: number; +}> { + const chatCompletionRequest = JSON.parse(body) as InvokeBody; + + // per https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb + const tokensFromMessages = encode(`<|start|>${chatCompletionRequest.prompt}<|end|>`).length; + + const promptTokens = tokensFromMessages; + + const completionTokens = encode(response).length; + + return { + prompt: promptTokens, + completion: completionTokens, + total: promptTokens + completionTokens, + }; +} 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 new file mode 100644 index 0000000000000..3c0dd66130f3a --- /dev/null +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.test.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 { Transform } from 'stream'; +import { getTokenCountFromInvokeStream } from './get_token_count_from_invoke_stream'; +import { loggerMock } from '@kbn/logging-mocks'; + +interface StreamMock { + write: (data: string) => void; + fail: () => void; + complete: () => void; + transform: Transform; +} + +function createStreamMock(): StreamMock { + const transform: Transform = new Transform({}); + + return { + write: (data: string) => { + transform.push(`${data}\n`); + }, + fail: () => { + transform.emit('error', new Error('Stream failed')); + transform.end(); + }, + transform, + complete: () => { + transform.end(); + }, + }; +} +const logger = loggerMock.create(); +describe('getTokenCountFromInvokeStream', () => { + let stream: StreamMock; + const body = { + messages: [ + { + role: 'system', + content: 'This is a system message', + }, + { + role: 'user', + content: 'This is a user message', + }, + ], + }; + + const PROMPT_TOKEN_COUNT = 34; + const COMPLETION_TOKEN_COUNT = 2; + + beforeEach(() => { + stream = createStreamMock(); + stream.write('Single'); + }); + + describe('when a stream completes', () => { + beforeEach(async () => { + stream.complete(); + }); + it('counts the prompt tokens', async () => { + const tokens = await getTokenCountFromInvokeStream({ + responseStream: stream.transform, + body, + logger, + }); + expect(tokens.prompt).toBe(PROMPT_TOKEN_COUNT); + expect(tokens.completion).toBe(COMPLETION_TOKEN_COUNT); + expect(tokens.total).toBe(PROMPT_TOKEN_COUNT + COMPLETION_TOKEN_COUNT); + }); + }); + + describe('when a stream fails', () => { + it('resolves the promise with the correct prompt tokens', async () => { + const tokenPromise = getTokenCountFromInvokeStream({ + responseStream: stream.transform, + body, + logger, + }); + + 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(); + }); + }); +}); 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 new file mode 100644 index 0000000000000..594fec89d93c0 --- /dev/null +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.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 { Logger } from '@kbn/logging'; +import { encode } from 'gpt-tokenizer'; +import { Readable } from 'stream'; +import { finished } from 'stream/promises'; + +export interface InvokeBody { + messages: Array<{ + role: string; + content: string; + }>; +} + +/** + * Takes the OpenAI and Bedrock `invokeStream` sub action response stream and the request messages array as inputs. + * Uses gpt-tokenizer encoding to calculate the number of tokens in the prompt and completion parts of the response stream + * Returns an object containing the total, prompt, and completion token counts. + * @param responseStream the response stream from the `invokeStream` sub action + * @param body the request messages array + * @param logger the logger + */ +export async function getTokenCountFromInvokeStream({ + responseStream, + body, + logger, +}: { + responseStream: Readable; + body: InvokeBody; + logger: Logger; +}): Promise<{ + total: number; + prompt: number; + completion: number; +}> { + const chatCompletionRequest = body; + + // per https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb + const promptTokens = encode( + chatCompletionRequest.messages + .map((msg) => `<|start|>${msg.role}\n${msg.content}<|end|>`) + .join('\n') + ).length; + + let responseBody: string = ''; + + responseStream.on('data', (chunk: string) => { + responseBody += chunk.toString(); + }); + try { + await finished(responseStream); + } catch (e) { + logger.error('An error occurred while calculating streaming response tokens'); + } + + const completionTokens = encode(responseBody).length; + + return { + prompt: promptTokens, + completion: completionTokens, + total: promptTokens + completionTokens, + }; +} diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.test.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.test.ts index 080b7cb5f972f..cc81706fc257c 100644 --- a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.test.ts +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.test.ts @@ -6,6 +6,7 @@ */ import { Transform } from 'stream'; import { getTokenCountFromOpenAIStream } from './get_token_count_from_openai_stream'; +import { loggerMock } from '@kbn/logging-mocks'; interface StreamMock { write: (data: string) => void; @@ -32,6 +33,7 @@ function createStreamMock(): StreamMock { }; } +const logger = loggerMock.create(); describe('getTokenCountFromOpenAIStream', () => { let tokens: Awaited>; let stream: StreamMock; @@ -77,6 +79,7 @@ describe('getTokenCountFromOpenAIStream', () => { beforeEach(async () => { tokens = await getTokenCountFromOpenAIStream({ responseStream: stream.transform, + logger, body: JSON.stringify(body), }); }); @@ -92,6 +95,7 @@ describe('getTokenCountFromOpenAIStream', () => { beforeEach(async () => { tokens = await getTokenCountFromOpenAIStream({ responseStream: stream.transform, + logger, body: JSON.stringify({ ...body, functions: [ @@ -123,6 +127,7 @@ describe('getTokenCountFromOpenAIStream', () => { it('resolves the promise with the correct prompt tokens', async () => { const tokenPromise = getTokenCountFromOpenAIStream({ responseStream: stream.transform, + logger, body: JSON.stringify(body), }); @@ -133,6 +138,7 @@ describe('getTokenCountFromOpenAIStream', () => { total: PROMPT_TOKEN_COUNT + COMPLETION_TOKEN_COUNT, completion: COMPLETION_TOKEN_COUNT, }); + expect(logger.error).toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts index 74c89f716171e..0091faca468e3 100644 --- a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts @@ -10,13 +10,16 @@ import { isEmpty, omitBy } from 'lodash'; import { Readable } from 'stream'; import { finished } from 'stream/promises'; import { CreateChatCompletionRequest } from 'openai'; +import { Logger } from '@kbn/logging'; export async function getTokenCountFromOpenAIStream({ responseStream, body, + logger, }: { responseStream: Readable; body: string; + logger: Logger; }): Promise<{ total: number; prompt: number; @@ -65,8 +68,8 @@ export async function getTokenCountFromOpenAIStream({ try { await finished(responseStream); - } catch { - // no need to handle this explicitly + } catch (e) { + logger.error('An error occurred while calculating streaming response tokens'); } const response = responseBody diff --git a/x-pack/plugins/aiops/README.md b/x-pack/plugins/aiops/README.md index 2d07e0c34653a..2ea2a315c594f 100755 --- a/x-pack/plugins/aiops/README.md +++ b/x-pack/plugins/aiops/README.md @@ -4,6 +4,16 @@ The plugin provides APIs and components for AIOps features, including the “Log --- +## Log Rate Analysis + +Here's some notes on the structure of the code for the API endpoint `/internal/aiops/log_rate_analysis`. The endpoint uses the `@kbn/ml-response-stream` package to return the request's response as a HTTP stream of JSON objects. The files are located in `x-pack/plugins/aiops/server/routes/log_rate_analysis/`. + +`define_route.ts:defineRoute()` is the outer most wrapper that's used to define the route and its versions. It calls `route_handler_factory:routeHandlerFactory()` for each version. + +The route handler sets up `response_stream_factory:responseStreamFactory()` to create the response stream and then walks through the steps of the analysis. + +The response stream factory acts as a wrapper to set up the stream itself, the stream state (for example to set if it's running etc.), some custom actions on the stream as well as analysis handlers that fetch data from ES and pass it on to the stream. + ## Development See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content.tsx b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content.tsx index 0770cfea83771..0ce422a0fb872 100644 --- a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content.tsx +++ b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content.tsx @@ -5,7 +5,8 @@ * 2.0. */ -import React, { useEffect, useState, type FC } from 'react'; +import { isEqual } from 'lodash'; +import React, { useEffect, useMemo, useState, type FC } from 'react'; import { EuiEmptyPrompt, EuiHorizontalRule, EuiPanel } from '@elastic/eui'; import type { Moment } from 'moment'; @@ -32,7 +33,18 @@ import { import type { GroupTableItem } from '../../log_rate_analysis_results_table/types'; import { useLogRateAnalysisResultsTableRowContext } from '../../log_rate_analysis_results_table/log_rate_analysis_results_table_row_provider'; -const DEFAULT_SEARCH_QUERY = { match_all: {} }; +const DEFAULT_SEARCH_QUERY: estypes.QueryDslQueryContainer = { match_all: {} }; +const DEFAULT_SEARCH_BAR_QUERY: estypes.QueryDslQueryContainer = { + bool: { + filter: [], + must: [ + { + match_all: {}, + }, + ], + must_not: [], + }, +}; export function getDocumentCountStatsSplitLabel( significantItem?: SignificantItem, @@ -93,6 +105,13 @@ export const LogRateAnalysisContent: FC = ({ setIsBrushCleared(windowParameters === undefined); }, [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( + () => (isEqual(esSearchQuery, DEFAULT_SEARCH_BAR_QUERY) ? DEFAULT_SEARCH_QUERY : esSearchQuery), + [esSearchQuery] + ); + const { currentSelectedSignificantItem, currentSelectedGroup, @@ -105,7 +124,7 @@ export const LogRateAnalysisContent: FC = ({ const { documentStats, earliest, latest } = useData( dataView, 'log_rate_analysis', - esSearchQuery, + searchQuery, setGlobalState, currentSelectedSignificantItem, currentSelectedGroup, @@ -170,7 +189,7 @@ export const LogRateAnalysisContent: FC = ({ stickyHistogram={stickyHistogram} onReset={clearSelection} sampleProbability={sampleProbability} - searchQuery={esSearchQuery} + searchQuery={searchQuery} windowParameters={windowParameters} barColorOverride={barColorOverride} barHighlightColorOverride={barHighlightColorOverride} diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/grouping_handler.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/grouping_handler.ts new file mode 100644 index 0000000000000..e725d25bbe01f --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/grouping_handler.ts @@ -0,0 +1,247 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { queue } from 'async'; + +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import { KBN_FIELD_TYPES } from '@kbn/field-types'; +import { i18n } from '@kbn/i18n'; +import { + fetchHistogramsForFields, + type SignificantItem, + type SignificantItemGroup, + type SignificantItemHistogramItem, + type NumericChartData, +} from '@kbn/ml-agg-utils'; + +import { RANDOM_SAMPLER_SEED } from '../../../../common/constants'; +import { + addSignificantItemsGroupAction, + addSignificantItemsGroupHistogramAction, + updateLoadingStateAction, +} from '../../../../common/api/log_rate_analysis/actions'; +import type { AiopsLogRateAnalysisApiVersion as ApiVersion } from '../../../../common/api/log_rate_analysis/schema'; + +import { isRequestAbortedError } from '../../../lib/is_request_aborted_error'; + +import { fetchFrequentItemSets } from '../queries/fetch_frequent_item_sets'; +import { fetchTerms2CategoriesCounts } from '../queries/fetch_terms_2_categories_counts'; +import { getGroupFilter } from '../queries/get_group_filter'; +import { getHistogramQuery } from '../queries/get_histogram_query'; +import { getSignificantItemGroups } from '../queries/get_significant_item_groups'; + +import { MAX_CONCURRENT_QUERIES, PROGRESS_STEP_GROUPING } from '../response_stream_utils/constants'; +import type { ResponseStreamFetchOptions } from '../response_stream_factory'; + +export const groupingHandlerFactory = + ({ + abortSignal, + client, + requestBody, + responseStream, + logDebugMessage, + logger, + stateHandler, + version, + }: ResponseStreamFetchOptions) => + async ( + significantCategories: SignificantItem[], + significantTerms: SignificantItem[], + overallTimeSeries?: NumericChartData + ) => { + logDebugMessage('Group results.'); + + function pushHistogramDataLoadingState() { + responseStream.push( + updateLoadingStateAction({ + ccsWarning: false, + loaded: stateHandler.loaded(), + loadingState: i18n.translate( + 'xpack.aiops.logRateAnalysis.loadingState.loadingHistogramData', + { + defaultMessage: 'Loading histogram data.', + } + ), + }) + ); + } + + responseStream.push( + updateLoadingStateAction({ + ccsWarning: false, + loaded: stateHandler.loaded(), + loadingState: i18n.translate('xpack.aiops.logRateAnalysis.loadingState.groupingResults', { + defaultMessage: 'Transforming significant field/value pairs into groups.', + }), + groupsMissing: true, + }) + ); + + try { + const { fields, itemSets } = await fetchFrequentItemSets( + client, + requestBody.index, + JSON.parse(requestBody.searchQuery) as estypes.QueryDslQueryContainer, + significantTerms, + requestBody.timeFieldName, + requestBody.deviationMin, + requestBody.deviationMax, + logger, + stateHandler.sampleProbability(), + responseStream.pushError, + abortSignal + ); + + if (significantCategories.length > 0 && significantTerms.length > 0) { + const { fields: significantCategoriesFields, itemSets: significantCategoriesItemSets } = + await fetchTerms2CategoriesCounts( + client, + requestBody, + JSON.parse(requestBody.searchQuery) as estypes.QueryDslQueryContainer, + significantTerms, + itemSets, + significantCategories, + requestBody.deviationMin, + requestBody.deviationMax, + logger, + responseStream.pushError, + abortSignal + ); + + fields.push(...significantCategoriesFields); + itemSets.push(...significantCategoriesItemSets); + } + + if (stateHandler.shouldStop()) { + logDebugMessage('shouldStop after fetching frequent_item_sets.'); + responseStream.end(); + return; + } + + if (fields.length > 0 && itemSets.length > 0) { + const significantItemGroups = getSignificantItemGroups( + itemSets, + [...significantTerms, ...significantCategories], + fields + ); + + // We'll find out if there's at least one group with at least two items, + // only then will we return the groups to the clients and make the grouping option available. + const maxItems = Math.max(...significantItemGroups.map((g) => g.group.length)); + + if (maxItems > 1) { + responseStream.push(addSignificantItemsGroupAction(significantItemGroups, version)); + } + + stateHandler.loaded(PROGRESS_STEP_GROUPING, false); + pushHistogramDataLoadingState(); + + if (stateHandler.shouldStop()) { + logDebugMessage('shouldStop after grouping.'); + responseStream.end(); + return; + } + + logDebugMessage(`Fetch ${significantItemGroups.length} group histograms.`); + + const groupHistogramQueue = queue(async function (cpg: SignificantItemGroup) { + if (stateHandler.shouldStop()) { + logDebugMessage('shouldStop abort fetching group histograms.'); + groupHistogramQueue.kill(); + responseStream.end(); + return; + } + + if (overallTimeSeries !== undefined) { + const histogramQuery = getHistogramQuery(requestBody, getGroupFilter(cpg)); + + let cpgTimeSeries: NumericChartData; + try { + cpgTimeSeries = ( + (await fetchHistogramsForFields( + client, + requestBody.index, + histogramQuery, + // fields + [ + { + fieldName: requestBody.timeFieldName, + type: KBN_FIELD_TYPES.DATE, + interval: overallTimeSeries.interval, + min: overallTimeSeries.stats[0], + max: overallTimeSeries.stats[1], + }, + ], + // samplerShardSize + -1, + undefined, + abortSignal, + stateHandler.sampleProbability(), + RANDOM_SAMPLER_SEED + )) as [NumericChartData] + )[0]; + } catch (e) { + if (!isRequestAbortedError(e)) { + logger.error( + `Failed to fetch the histogram data for group #${cpg.id}, got: \n${e.toString()}` + ); + responseStream.pushError( + `Failed to fetch the histogram data for group #${cpg.id}.` + ); + } + return; + } + const histogram: SignificantItemHistogramItem[] = + overallTimeSeries.data.map((o) => { + const current = cpgTimeSeries.data.find( + (d1) => d1.key_as_string === o.key_as_string + ) ?? { + doc_count: 0, + }; + + if (version === '1') { + return { + key: o.key, + key_as_string: o.key_as_string ?? '', + doc_count_significant_term: current.doc_count, + doc_count_overall: Math.max(0, o.doc_count - current.doc_count), + }; + } + + return { + key: o.key, + key_as_string: o.key_as_string ?? '', + doc_count_significant_item: current.doc_count, + doc_count_overall: Math.max(0, o.doc_count - current.doc_count), + }; + }) ?? []; + + responseStream.push( + addSignificantItemsGroupHistogramAction( + [ + { + id: cpg.id, + histogram, + }, + ], + version + ) + ); + } + }, MAX_CONCURRENT_QUERIES); + + groupHistogramQueue.push(significantItemGroups); + await groupHistogramQueue.drain(); + } + } catch (e) { + if (!isRequestAbortedError(e)) { + logger.error(`Failed to transform field/value pairs into groups, got: \n${e.toString()}`); + responseStream.pushError(`Failed to transform field/value pairs into groups.`); + } + } + }; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/histogram_handler.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/histogram_handler.ts new file mode 100644 index 0000000000000..1ddb624c99056 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/histogram_handler.ts @@ -0,0 +1,275 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { queue } from 'async'; + +import { i18n } from '@kbn/i18n'; +import { KBN_FIELD_TYPES } from '@kbn/field-types'; +import type { + SignificantItem, + SignificantItemHistogramItem, + NumericChartData, +} from '@kbn/ml-agg-utils'; +import { fetchHistogramsForFields } from '@kbn/ml-agg-utils'; + +import { RANDOM_SAMPLER_SEED } from '../../../../common/constants'; +import { + addSignificantItemsHistogramAction, + updateLoadingStateAction, +} from '../../../../common/api/log_rate_analysis/actions'; +import type { AiopsLogRateAnalysisApiVersion as ApiVersion } from '../../../../common/api/log_rate_analysis/schema'; +import { getCategoryQuery } from '../../../../common/api/log_categorization/get_category_query'; + +import { getHistogramQuery } from '../queries/get_histogram_query'; + +import { + MAX_CONCURRENT_QUERIES, + PROGRESS_STEP_HISTOGRAMS, +} from '../response_stream_utils/constants'; +import type { ResponseStreamFetchOptions } from '../response_stream_factory'; + +export const histogramHandlerFactory = + ({ + abortSignal, + client, + logDebugMessage, + logger, + requestBody, + responseStream, + stateHandler, + version, + }: ResponseStreamFetchOptions) => + async ( + fieldValuePairsCount: number, + significantCategories: SignificantItem[], + significantTerms: SignificantItem[], + overallTimeSeries?: NumericChartData + ) => { + function pushHistogramDataLoadingState() { + responseStream.push( + updateLoadingStateAction({ + ccsWarning: false, + loaded: stateHandler.loaded(), + loadingState: i18n.translate( + 'xpack.aiops.logRateAnalysis.loadingState.loadingHistogramData', + { + defaultMessage: 'Loading histogram data.', + } + ), + }) + ); + } + + logDebugMessage(`Fetch ${significantTerms.length} field/value histograms.`); + + // time series filtered by fields + if ( + significantTerms.length > 0 && + overallTimeSeries !== undefined && + !requestBody.overrides?.regroupOnly + ) { + const fieldValueHistogramQueue = queue(async function (cp: SignificantItem) { + if (stateHandler.shouldStop()) { + logDebugMessage('shouldStop abort fetching field/value histograms.'); + fieldValueHistogramQueue.kill(); + responseStream.end(); + return; + } + + if (overallTimeSeries !== undefined) { + const histogramQuery = getHistogramQuery(requestBody, [ + { + term: { [cp.fieldName]: cp.fieldValue }, + }, + ]); + + let cpTimeSeries: NumericChartData; + + try { + cpTimeSeries = ( + (await fetchHistogramsForFields( + client, + requestBody.index, + histogramQuery, + // fields + [ + { + fieldName: requestBody.timeFieldName, + type: KBN_FIELD_TYPES.DATE, + interval: overallTimeSeries.interval, + min: overallTimeSeries.stats[0], + max: overallTimeSeries.stats[1], + }, + ], + // samplerShardSize + -1, + undefined, + abortSignal, + stateHandler.sampleProbability(), + RANDOM_SAMPLER_SEED + )) as [NumericChartData] + )[0]; + } catch (e) { + logger.error( + `Failed to fetch the histogram data for field/value pair "${cp.fieldName}:${ + cp.fieldValue + }", got: \n${e.toString()}` + ); + responseStream.pushError( + `Failed to fetch the histogram data for field/value pair "${cp.fieldName}:${cp.fieldValue}".` + ); + return; + } + + const histogram: SignificantItemHistogramItem[] = + overallTimeSeries.data.map((o) => { + const current = cpTimeSeries.data.find( + (d1) => d1.key_as_string === o.key_as_string + ) ?? { + doc_count: 0, + }; + if (version === '1') { + return { + key: o.key, + key_as_string: o.key_as_string ?? '', + doc_count_significant_term: current.doc_count, + doc_count_overall: Math.max(0, o.doc_count - current.doc_count), + }; + } + + return { + key: o.key, + key_as_string: o.key_as_string ?? '', + doc_count_significant_item: current.doc_count, + doc_count_overall: Math.max(0, o.doc_count - current.doc_count), + }; + }) ?? []; + + const { fieldName, fieldValue } = cp; + + stateHandler.loaded((1 / fieldValuePairsCount) * PROGRESS_STEP_HISTOGRAMS, false); + pushHistogramDataLoadingState(); + responseStream.push( + addSignificantItemsHistogramAction( + [ + { + fieldName, + fieldValue, + histogram, + }, + ], + version + ) + ); + } + }, MAX_CONCURRENT_QUERIES); + + fieldValueHistogramQueue.push(significantTerms); + await fieldValueHistogramQueue.drain(); + } + + // histograms for text field patterns + if ( + overallTimeSeries !== undefined && + significantCategories.length > 0 && + !requestBody.overrides?.regroupOnly + ) { + const significantCategoriesHistogramQueries = significantCategories.map((d) => { + const histogramQuery = getHistogramQuery(requestBody); + const categoryQuery = getCategoryQuery(d.fieldName, [ + { key: `${d.key}`, count: d.doc_count, examples: [] }, + ]); + if (Array.isArray(histogramQuery.bool?.filter)) { + histogramQuery.bool?.filter?.push(categoryQuery); + } + return histogramQuery; + }); + + for (const [i, histogramQuery] of significantCategoriesHistogramQueries.entries()) { + const cp = significantCategories[i]; + let catTimeSeries: NumericChartData; + + try { + catTimeSeries = ( + (await fetchHistogramsForFields( + client, + requestBody.index, + histogramQuery, + // fields + [ + { + fieldName: requestBody.timeFieldName, + type: KBN_FIELD_TYPES.DATE, + interval: overallTimeSeries.interval, + min: overallTimeSeries.stats[0], + max: overallTimeSeries.stats[1], + }, + ], + // samplerShardSize + -1, + undefined, + abortSignal, + stateHandler.sampleProbability(), + RANDOM_SAMPLER_SEED + )) as [NumericChartData] + )[0]; + } catch (e) { + logger.error( + `Failed to fetch the histogram data for field/value pair "${cp.fieldName}:${ + cp.fieldValue + }", got: \n${e.toString()}` + ); + responseStream.pushError( + `Failed to fetch the histogram data for field/value pair "${cp.fieldName}:${cp.fieldValue}".` + ); + return; + } + + const histogram: SignificantItemHistogramItem[] = + overallTimeSeries.data.map((o) => { + const current = catTimeSeries.data.find( + (d1) => d1.key_as_string === o.key_as_string + ) ?? { + doc_count: 0, + }; + + if (version === '1') { + return { + key: o.key, + key_as_string: o.key_as_string ?? '', + doc_count_significant_term: current.doc_count, + doc_count_overall: Math.max(0, o.doc_count - current.doc_count), + }; + } + + return { + key: o.key, + key_as_string: o.key_as_string ?? '', + doc_count_significant_item: current.doc_count, + doc_count_overall: Math.max(0, o.doc_count - current.doc_count), + }; + }) ?? []; + + const { fieldName, fieldValue } = cp; + + stateHandler.loaded((1 / fieldValuePairsCount) * PROGRESS_STEP_HISTOGRAMS, false); + pushHistogramDataLoadingState(); + responseStream.push( + addSignificantItemsHistogramAction( + [ + { + fieldName, + fieldValue, + histogram, + }, + ], + version + ) + ); + } + } + }; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/index_info_handler.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/index_info_handler.ts new file mode 100644 index 0000000000000..6ae2a07055aec --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/index_info_handler.ts @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +import { updateLoadingStateAction } from '../../../../common/api/log_rate_analysis/actions'; +import type { AiopsLogRateAnalysisApiVersion as ApiVersion } from '../../../../common/api/log_rate_analysis/schema'; + +import { isRequestAbortedError } from '../../../lib/is_request_aborted_error'; + +import { fetchIndexInfo } from '../queries/fetch_index_info'; + +import type { ResponseStreamFetchOptions } from '../response_stream_factory'; +import { LOADED_FIELD_CANDIDATES } from '../response_stream_utils/constants'; + +export const indexInfoHandlerFactory = + (options: ResponseStreamFetchOptions) => + async () => { + const { + abortSignal, + client, + logDebugMessage, + logger, + requestBody, + responseStream, + stateHandler, + } = options; + + const fieldCandidates: string[] = []; + let fieldCandidatesCount = fieldCandidates.length; + + const textFieldCandidates: string[] = []; + + let totalDocCount = 0; + + if (!requestBody.overrides?.remainingFieldCandidates) { + logDebugMessage('Fetch index information.'); + responseStream.push( + updateLoadingStateAction({ + ccsWarning: false, + loaded: stateHandler.loaded(), + loadingState: i18n.translate( + 'xpack.aiops.logRateAnalysis.loadingState.loadingIndexInformation', + { + defaultMessage: 'Loading index information.', + } + ), + }) + ); + + try { + const indexInfo = await fetchIndexInfo( + client, + requestBody, + ['message', 'error.message'], + abortSignal + ); + + fieldCandidates.push(...indexInfo.fieldCandidates); + fieldCandidatesCount = fieldCandidates.length; + textFieldCandidates.push(...indexInfo.textFieldCandidates); + totalDocCount = indexInfo.totalDocCount; + } catch (e) { + if (!isRequestAbortedError(e)) { + logger.error(`Failed to fetch index information, got: \n${e.toString()}`); + responseStream.pushError(`Failed to fetch index information.`); + } + responseStream.end(); + return; + } + + logDebugMessage(`Total document count: ${totalDocCount}`); + + stateHandler.loaded(LOADED_FIELD_CANDIDATES, false); + + responseStream.pushPingWithTimeout(); + + responseStream.push( + updateLoadingStateAction({ + ccsWarning: false, + loaded: stateHandler.loaded(), + loadingState: i18n.translate( + 'xpack.aiops.logRateAnalysis.loadingState.identifiedFieldCandidates', + { + defaultMessage: + 'Identified {fieldCandidatesCount, plural, one {# field candidate} other {# field candidates}}.', + values: { + fieldCandidatesCount, + }, + } + ), + }) + ); + + if (fieldCandidatesCount === 0) { + responseStream.endWithUpdatedLoadingState(); + } else if (stateHandler.shouldStop()) { + logDebugMessage('shouldStop after fetching field candidates.'); + responseStream.end(); + return; + } + } + + return { fieldCandidates, textFieldCandidates }; + }; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/overall_histogram_handler.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/overall_histogram_handler.ts new file mode 100644 index 0000000000000..278cb59b40e07 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/overall_histogram_handler.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { KBN_FIELD_TYPES } from '@kbn/field-types'; +import { + fetchHistogramsForFields, + type NumericChartData, + type NumericHistogramField, +} from '@kbn/ml-agg-utils'; + +import type { AiopsLogRateAnalysisApiVersion as ApiVersion } from '../../../../common/api/log_rate_analysis/schema'; +import { RANDOM_SAMPLER_SEED } from '../../../../common/constants'; + +import { isRequestAbortedError } from '../../../lib/is_request_aborted_error'; + +import { getHistogramQuery } from '../queries/get_histogram_query'; + +import type { ResponseStreamFetchOptions } from '../response_stream_factory'; + +export const overallHistogramHandlerFactory = + ({ + abortSignal, + client, + requestBody, + logDebugMessage, + logger, + responseStream, + stateHandler, + }: ResponseStreamFetchOptions) => + async () => { + const histogramFields: [NumericHistogramField] = [ + { fieldName: requestBody.timeFieldName, type: KBN_FIELD_TYPES.DATE }, + ]; + + logDebugMessage('Fetch overall histogram.'); + + let overallTimeSeries: NumericChartData | undefined; + + const overallHistogramQuery = getHistogramQuery(requestBody); + + try { + overallTimeSeries = ( + (await fetchHistogramsForFields( + client, + requestBody.index, + overallHistogramQuery, + // fields + histogramFields, + // samplerShardSize + -1, + undefined, + abortSignal, + stateHandler.sampleProbability(), + RANDOM_SAMPLER_SEED + )) as [NumericChartData] + )[0]; + } catch (e) { + if (!isRequestAbortedError(e)) { + logger.error(`Failed to fetch the overall histogram data, got: \n${e.toString()}`); + responseStream.pushError(`Failed to fetch overall histogram data.`); + } + // Still continue the analysis even if loading the overall histogram fails. + } + + if (stateHandler.shouldStop()) { + logDebugMessage('shouldStop after fetching overall histogram.'); + responseStream.end(); + return; + } + + return overallTimeSeries; + }; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/overrides_handler.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/overrides_handler.ts new file mode 100644 index 0000000000000..e4a1d784bc468 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/overrides_handler.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 { + resetAllAction, + resetErrorsAction, + resetGroupsAction, +} from '../../../../common/api/log_rate_analysis/actions'; +import type { AiopsLogRateAnalysisApiVersion as ApiVersion } from '../../../../common/api/log_rate_analysis/schema'; + +import type { ResponseStreamFetchOptions } from '../response_stream_factory'; + +export const overridesHandlerFactory = + ({ + requestBody, + logDebugMessage, + responseStream, + stateHandler, + }: ResponseStreamFetchOptions) => + () => { + if (!requestBody.overrides) { + logDebugMessage('Full Reset.'); + responseStream.push(resetAllAction()); + } else { + logDebugMessage('Reset Errors.'); + responseStream.push(resetErrorsAction()); + } + + if (requestBody.overrides?.regroupOnly) { + logDebugMessage('Reset Groups.'); + responseStream.push(resetGroupsAction()); + } + + if (requestBody.overrides?.loaded) { + logDebugMessage(`Set 'loaded' override to '${requestBody.overrides?.loaded}'.`); + stateHandler.loaded(requestBody.overrides?.loaded); + } + }; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/significant_items_handler.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/significant_items_handler.ts new file mode 100644 index 0000000000000..1fefba00cf023 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/analysis_handlers/significant_items_handler.ts @@ -0,0 +1,208 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { queue } from 'async'; + +import { SIGNIFICANT_ITEM_TYPE, type SignificantItem } from '@kbn/ml-agg-utils'; +import { i18n } from '@kbn/i18n'; + +import { + addSignificantItemsAction, + updateLoadingStateAction, +} from '../../../../common/api/log_rate_analysis/actions'; + +import { isRequestAbortedError } from '../../../lib/is_request_aborted_error'; + +import { fetchSignificantCategories } from '../queries/fetch_significant_categories'; +import { fetchSignificantTermPValues } from '../queries/fetch_significant_term_p_values'; + +import type { + AiopsLogRateAnalysisSchema, + AiopsLogRateAnalysisApiVersion as ApiVersion, +} from '../../../../common/api/log_rate_analysis/schema'; + +import { + LOADED_FIELD_CANDIDATES, + MAX_CONCURRENT_QUERIES, + PROGRESS_STEP_P_VALUES, +} from '../response_stream_utils/constants'; +import type { ResponseStreamFetchOptions } from '../response_stream_factory'; + +export const significantItemsHandlerFactory = + ({ + abortSignal, + client, + logDebugMessage, + logger, + requestBody, + responseStream, + stateHandler, + version, + }: ResponseStreamFetchOptions) => + async ({ + fieldCandidates, + textFieldCandidates, + }: { + fieldCandidates: string[]; + textFieldCandidates: string[]; + }) => { + let fieldCandidatesCount = fieldCandidates.length; + + // This will store the combined count of detected significant log patterns and keywords + let fieldValuePairsCount = 0; + + const significantCategories: SignificantItem[] = []; + + if (version === '1') { + significantCategories.push( + ...((requestBody as AiopsLogRateAnalysisSchema<'1'>).overrides?.significantTerms?.filter( + (d) => d.type === SIGNIFICANT_ITEM_TYPE.LOG_PATTERN + ) ?? []) + ); + } + + if (version === '2') { + significantCategories.push( + ...((requestBody as AiopsLogRateAnalysisSchema<'2'>).overrides?.significantItems?.filter( + (d) => d.type === SIGNIFICANT_ITEM_TYPE.LOG_PATTERN + ) ?? []) + ); + } + + // Get significant categories of text fields + if (textFieldCandidates.length > 0) { + significantCategories.push( + ...(await fetchSignificantCategories( + client, + requestBody, + textFieldCandidates, + logger, + stateHandler.sampleProbability(), + responseStream.pushError, + abortSignal + )) + ); + + if (significantCategories.length > 0) { + responseStream.push(addSignificantItemsAction(significantCategories, version)); + } + } + + const significantTerms: SignificantItem[] = []; + + if (version === '1') { + significantTerms.push( + ...((requestBody as AiopsLogRateAnalysisSchema<'1'>).overrides?.significantTerms?.filter( + (d) => d.type === SIGNIFICANT_ITEM_TYPE.KEYWORD + ) ?? []) + ); + } + + if (version === '2') { + significantTerms.push( + ...((requestBody as AiopsLogRateAnalysisSchema<'2'>).overrides?.significantItems?.filter( + (d) => d.type === SIGNIFICANT_ITEM_TYPE.KEYWORD + ) ?? []) + ); + } + + const fieldsToSample = new Set(); + + let remainingFieldCandidates: string[]; + let loadingStepSizePValues = PROGRESS_STEP_P_VALUES; + + if (requestBody.overrides?.remainingFieldCandidates) { + fieldCandidates.push(...requestBody.overrides?.remainingFieldCandidates); + remainingFieldCandidates = requestBody.overrides?.remainingFieldCandidates; + fieldCandidatesCount = fieldCandidates.length; + loadingStepSizePValues = + LOADED_FIELD_CANDIDATES + + PROGRESS_STEP_P_VALUES - + (requestBody.overrides?.loaded ?? PROGRESS_STEP_P_VALUES); + } else { + remainingFieldCandidates = fieldCandidates; + } + + logDebugMessage('Fetch p-values.'); + + const pValuesQueue = queue(async function (fieldCandidate: string) { + stateHandler.loaded((1 / fieldCandidatesCount) * loadingStepSizePValues, false); + + let pValues: Awaited>; + + try { + pValues = await fetchSignificantTermPValues( + client, + requestBody, + [fieldCandidate], + logger, + stateHandler.sampleProbability(), + responseStream.pushError, + abortSignal + ); + } catch (e) { + if (!isRequestAbortedError(e)) { + logger.error(`Failed to fetch p-values for '${fieldCandidate}', got: \n${e.toString()}`); + responseStream.pushError(`Failed to fetch p-values for '${fieldCandidate}'.`); + } + return; + } + + remainingFieldCandidates = remainingFieldCandidates.filter((d) => d !== fieldCandidate); + + if (pValues.length > 0) { + pValues.forEach((d) => { + fieldsToSample.add(d.fieldName); + }); + significantTerms.push(...pValues); + + responseStream.push(addSignificantItemsAction(pValues, version)); + } + + responseStream.push( + updateLoadingStateAction({ + ccsWarning: false, + loaded: stateHandler.loaded(), + loadingState: i18n.translate( + 'xpack.aiops.logRateAnalysis.loadingState.identifiedFieldValuePairs', + { + defaultMessage: + 'Identified {fieldValuePairsCount, plural, one {# significant field/value pair} other {# significant field/value pairs}}.', + values: { + fieldValuePairsCount, + }, + } + ), + remainingFieldCandidates, + }) + ); + }, MAX_CONCURRENT_QUERIES); + + pValuesQueue.push(fieldCandidates, (err) => { + if (err) { + logger.error(`Failed to fetch p-values.', got: \n${err.toString()}`); + responseStream.pushError(`Failed to fetch p-values.`); + pValuesQueue.kill(); + responseStream.end(); + } else if (stateHandler.shouldStop()) { + logDebugMessage('shouldStop fetching p-values.'); + pValuesQueue.kill(); + responseStream.end(); + } + }); + await pValuesQueue.drain(); + + fieldValuePairsCount = significantCategories.length + significantTerms.length; + + if (fieldValuePairsCount === 0) { + logDebugMessage('Stopping analysis, did not find significant terms.'); + responseStream.endWithUpdatedLoadingState(); + return; + } + + return { fieldValuePairsCount, significantCategories, significantTerms }; + }; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/define_route.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/define_route.ts index 6f9343a50ae62..60122c7ec611f 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/define_route.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/define_route.ts @@ -18,6 +18,12 @@ import type { AiopsLicense } from '../../types'; import { routeHandlerFactory } from './route_handler_factory'; +/** + * `defineRoute` is called in the root `plugin.ts` to set up the API route + * for log pattern analysis. Its purpose is to take care of the route setup + * and versioning only. `routeHandlerFactory` is used to take care of + * the actual route logic. + */ export const defineRoute = ( router: IRouter, license: AiopsLicense, diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/__mocks__/params_match_all.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/__mocks__/params_match_all.ts new file mode 100644 index 0000000000000..a81ba523caa43 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/__mocks__/params_match_all.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 const paramsMock = { + index: 'the-index', + timeFieldName: 'the-time-field-name', + start: 0, + end: 50, + baselineMin: 10, + baselineMax: 20, + deviationMin: 30, + deviationMax: 40, + includeFrozen: false, + searchQuery: '{ "match_all": {} }', +}; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/__mocks__/params_search_query.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/__mocks__/params_search_query.ts new file mode 100644 index 0000000000000..dd0ac80585403 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/__mocks__/params_search_query.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 type { AiopsLogRateAnalysisSchema } from '../../../../../common/api/log_rate_analysis/schema'; + +import { paramsMock } from './params_match_all'; +import { searchQueryMock } from './search_query'; + +export const paramsSearchQueryMock: AiopsLogRateAnalysisSchema = { + ...paramsMock, + searchQuery: searchQueryMock, +}; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/__mocks__/search_query.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/__mocks__/search_query.ts new file mode 100644 index 0000000000000..58be3bf372711 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/__mocks__/search_query.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. + */ + +// This is the format that gets passed on from the Kibana search bar. +export const searchQueryMock = JSON.stringify({ + bool: { + filter: [], + minimum_should_match: 1, + must_not: [], + should: [{ term: { 'the-term': { value: 'the-value' } } }], + }, +}); diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.test.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.test.ts new file mode 100644 index 0000000000000..d38dd57c0afd2 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.test.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 { createRandomSamplerWrapper } from '@kbn/ml-random-sampler-utils'; + +import { paramsMock } from './__mocks__/params_match_all'; +import { getBaselineOrDeviationFilter, getCategoryRequest } from './fetch_categories'; + +describe('getBaselineOrDeviationFilter', () => { + it('returns a filter that matches both baseline and deviation time range', () => { + const baselineOrDeviationFilter = getBaselineOrDeviationFilter(paramsMock); + + expect(baselineOrDeviationFilter).toEqual({ + bool: { + should: [ + { + range: { + 'the-time-field-name': { gte: 10, lte: 20, format: 'epoch_millis' }, + }, + }, + { + range: { + 'the-time-field-name': { gte: 30, lte: 40, format: 'epoch_millis' }, + }, + }, + ], + }, + }); + }); +}); + +describe('getCategoryRequest', () => { + it('returns the category request', () => { + const randomSamplerWrapper = createRandomSamplerWrapper({ + probability: 0.1, + seed: 1234, + }); + + const query = getCategoryRequest(paramsMock, 'the-field-name', randomSamplerWrapper); + + // Because the time range filter is covered by the should clauses that cover both + // baseline (10,20) and deviation (30,40), we expect that there is no other + // time range filter whatsoever, for example for start/end (0,50). + expect(query).toEqual({ + index: 'the-index', + size: 0, + body: { + query: { + bool: { + filter: [ + { + bool: { + should: [ + { + range: { + 'the-time-field-name': { + gte: 10, + lte: 20, + format: 'epoch_millis', + }, + }, + }, + { + range: { + 'the-time-field-name': { + gte: 30, + lte: 40, + format: 'epoch_millis', + }, + }, + }, + ], + }, + }, + ], + }, + }, + aggs: { + sample: { + random_sampler: { probability: 0.1, seed: 1234 }, + aggs: { + categories: { + categorize_text: { field: 'the-field-name', size: 1000 }, + aggs: { + hit: { + top_hits: { size: 1, sort: ['the-time-field-name'], _source: 'the-field-name' }, + }, + }, + }, + }, + }, + }, + }, + }); + }); +}); diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.ts index e70255ababffd..703242b7e9a6a 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.ts @@ -28,30 +28,67 @@ import { isRequestAbortedError } from '../../../lib/is_request_aborted_error'; import { getQueryWithParams } from './get_query_with_params'; +// Filter that includes docs from both the baseline and deviation time range. +export const getBaselineOrDeviationFilter = ( + params: AiopsLogRateAnalysisSchema +): estypes.QueryDslQueryContainer => { + return { + bool: { + should: [ + { + range: { + [params.timeFieldName]: { + gte: params.baselineMin, + lte: params.baselineMax, + format: 'epoch_millis', + }, + }, + }, + { + range: { + [params.timeFieldName]: { + gte: params.deviationMin, + lte: params.deviationMax, + format: 'epoch_millis', + }, + }, + }, + ], + }, + }; +}; + export const getCategoryRequest = ( params: AiopsLogRateAnalysisSchema, fieldName: string, - from: number | undefined, - to: number | undefined, - filter: estypes.QueryDslQueryContainer, { wrap }: RandomSamplerWrapper ): estypes.SearchRequest => { const { index, timeFieldName } = params; + const query = getQueryWithParams({ params, - termFilters: undefined, - filter, + // We're skipping the overall range query here since this + // is covered by the filter which will match docs in both baseline + // and deviation time range via `getBaselineOrDeviationFilter`. + skipRangeQuery: true, + filter: getBaselineOrDeviationFilter(params), }); + const { params: request } = createCategoryRequest( index, fieldName, timeFieldName, - from, - to, + undefined, + undefined, query, wrap ); + // In this case we're only interested in the aggregation which + // `createCategoryRequest` returns, so we're re-applying the original + // query we create via `getQueryWithParams` here. + request.body.query = query; + return request; }; @@ -64,9 +101,6 @@ export const fetchCategories = async ( esClient: ElasticsearchClient, params: AiopsLogRateAnalysisSchema, fieldNames: string[], - from: number | undefined, - to: number | undefined, - filter: estypes.QueryDslQueryContainer, logger: Logger, // The default value of 1 means no sampling will be used sampleProbability: number = 1, @@ -82,7 +116,7 @@ export const fetchCategories = async ( const settledPromises = await Promise.allSettled( fieldNames.map((fieldName) => { - const request = getCategoryRequest(params, fieldName, from, to, filter, randomSamplerWrapper); + const request = getCategoryRequest(params, fieldName, randomSamplerWrapper); return esClient.search(request, { signal: abortSignal, maxRetries: 0, diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.test.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.test.ts new file mode 100644 index 0000000000000..b3fa6ff5f31a8 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.test.ts @@ -0,0 +1,139 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { paramsMock } from './__mocks__/params_match_all'; + +import { getCategoryCountRequest, getCategoryCountMSearchRequest } from './fetch_category_counts'; + +describe('getCategoryCountRequest', () => { + it('returns the category count request', () => { + const category = { + key: 'runTask ended no files to process', + count: 667, + examples: ['[runTask()] ended: no files to process'], + }; + + const query = getCategoryCountRequest( + paramsMock, + 'the-field-name', + category, + paramsMock.baselineMin, + paramsMock.baselineMax + ); + + expect(query).toEqual({ + index: 'the-index', + body: { + query: { + bool: { + filter: [ + { range: { 'the-time-field-name': { gte: 10, lte: 20, format: 'epoch_millis' } } }, + { + bool: { + should: [ + { + match: { + 'the-field-name': { + auto_generate_synonyms_phrase_query: false, + fuzziness: 0, + operator: 'and', + query: 'runTask ended no files to process', + }, + }, + }, + ], + }, + }, + ], + }, + }, + size: 0, + track_total_hits: true, + }, + }); + }); +}); + +describe('getCategoryCountMSearchRequest', () => { + it('returns the request body for the msearch request', () => { + const categories = [ + { + key: 'SLO summary transforms installed and started', + count: 500, + examples: ['SLO summary transforms installed and started'], + }, + { key: 'Trusted Apps', count: 500, examples: ['Trusted Apps: '] }, + ]; + + const query = getCategoryCountMSearchRequest( + paramsMock, + 'the-field-name', + categories, + paramsMock.baselineMin, + paramsMock.baselineMax + ); + + expect(query).toEqual([ + { index: 'the-index' }, + { + query: { + bool: { + filter: [ + { range: { 'the-time-field-name': { gte: 10, lte: 20, format: 'epoch_millis' } } }, + { + bool: { + should: [ + { + match: { + 'the-field-name': { + auto_generate_synonyms_phrase_query: false, + fuzziness: 0, + operator: 'and', + query: 'SLO summary transforms installed and started', + }, + }, + }, + ], + }, + }, + ], + }, + }, + size: 0, + track_total_hits: true, + }, + { index: 'the-index' }, + { + query: { + bool: { + filter: [ + { range: { 'the-time-field-name': { gte: 10, lte: 20, format: 'epoch_millis' } } }, + { + bool: { + should: [ + { + match: { + 'the-field-name': { + auto_generate_synonyms_phrase_query: false, + fuzziness: 0, + operator: 'and', + query: 'Trusted Apps', + }, + }, + }, + ], + }, + }, + ], + }, + }, + size: 0, + track_total_hits: true, + }, + ]); + }); +}); diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.ts index 608734ae0e19a..555d49b46dc19 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.ts @@ -33,24 +33,18 @@ export const getCategoryCountRequest = ( ): estypes.SearchRequest => { const { index } = params; - const query = getQueryWithParams({ - params, - }); - const categoryQuery = getCategoryQuery(fieldName, [category]); - if (Array.isArray(query.bool?.filter)) { - query.bool?.filter?.push(categoryQuery); - query.bool?.filter?.push({ - range: { - [params.timeFieldName]: { - gte: from, - lte: to, - format: 'epoch_millis', - }, - }, - }); - } + const query = getQueryWithParams({ + // This will override the original start/end params if + // the optional from/to args are provided. + params: { + ...params, + ...(from ? { start: from } : {}), + ...(to ? { end: to } : {}), + }, + filter: categoryQuery, + }); return { index, @@ -62,6 +56,19 @@ export const getCategoryCountRequest = ( }; }; +export const getCategoryCountMSearchRequest = ( + params: AiopsLogRateAnalysisSchema, + fieldName: string, + categories: FetchCategoriesResponse['categories'], + from: number | undefined, + to: number | undefined +): estypes.MsearchRequestItem[] => + categories.flatMap((category) => [ + { index: params.index }, + getCategoryCountRequest(params, fieldName, category, from, to) + .body as estypes.MsearchMultisearchBody, + ]); + export const fetchCategoryCounts = async ( esClient: ElasticsearchClient, params: AiopsLogRateAnalysisSchema, @@ -75,11 +82,13 @@ export const fetchCategoryCounts = async ( ): Promise => { const updatedCategories = cloneDeep(categories); - const searches = categories.categories.flatMap((category) => [ - { index: params.index }, - getCategoryCountRequest(params, fieldName, category, from, to) - .body as estypes.MsearchMultisearchBody, - ]); + const searches = getCategoryCountMSearchRequest( + params, + fieldName, + categories.categories, + from, + to + ); let mSearchresponse; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.test.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.test.ts index db14c30caebdc..0344005c869f8 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.test.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.test.ts @@ -9,27 +9,14 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { ElasticsearchClient } from '@kbn/core/server'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; +import { paramsSearchQueryMock } from './__mocks__/params_search_query'; import { fetchIndexInfo, getRandomDocsRequest } from './fetch_index_info'; -const params: AiopsLogRateAnalysisSchema = { - index: 'the-index', - timeFieldName: 'the-time-field-name', - start: 1577836800000, - end: 1609459200000, - baselineMin: 10, - baselineMax: 20, - deviationMin: 30, - deviationMax: 40, - includeFrozen: false, - searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', -}; - describe('fetch_index_info', () => { describe('getRandomDocsRequest', () => { it('returns the most basic request body for a sample of random documents', () => { - const req = getRandomDocsRequest(params); + const req = getRandomDocsRequest(paramsSearchQueryMock); expect(req).toEqual({ body: { @@ -40,13 +27,20 @@ describe('fetch_index_info', () => { query: { bool: { filter: [ - { bool: { filter: [], must: [{ match_all: {} }], must_not: [] } }, + { + bool: { + filter: [], + minimum_should_match: 1, + must_not: [], + should: [{ term: { 'the-term': { value: 'the-value' } } }], + }, + }, { range: { 'the-time-field-name': { format: 'epoch_millis', - gte: 1577836800000, - lte: 1609459200000, + gte: 0, + lte: 50, }, }, }, @@ -59,7 +53,7 @@ describe('fetch_index_info', () => { size: 1000, track_total_hits: true, }, - index: params.index, + index: paramsSearchQueryMock.index, ignore_throttled: undefined, ignore_unavailable: true, }); @@ -105,7 +99,10 @@ describe('fetch_index_info', () => { search: esClientSearchMock, } as unknown as ElasticsearchClient; - const { totalDocCount, fieldCandidates } = await fetchIndexInfo(esClientMock, params); + const { totalDocCount, fieldCandidates } = await fetchIndexInfo( + esClientMock, + paramsSearchQueryMock + ); expect(fieldCandidates).toEqual(['myIpFieldName', 'myKeywordFieldName']); expect(totalDocCount).toEqual(5000000); diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_categories.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_categories.ts index 49617a1661ba6..2284622dc808c 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_categories.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_categories.ts @@ -42,39 +42,10 @@ export const fetchSignificantCategories = async ( emitError: (m: string) => void, abortSignal?: AbortSignal ) => { - // Filter that includes docs from both the baseline and deviation time range. - const baselineOrDeviationFilter = { - bool: { - should: [ - { - range: { - [params.timeFieldName]: { - gte: params.baselineMin, - lte: params.baselineMax, - format: 'epoch_millis', - }, - }, - }, - { - range: { - [params.timeFieldName]: { - gte: params.deviationMin, - lte: params.deviationMax, - format: 'epoch_millis', - }, - }, - }, - ], - }, - }; - const categoriesOverall = await fetchCategories( esClient, params, fieldNames, - undefined, - undefined, - baselineOrDeviationFilter, logger, sampleProbability, emitError, diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.test.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.test.ts deleted file mode 100644 index c34d81fa91bdf..0000000000000 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.test.ts +++ /dev/null @@ -1,50 +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 { getFilters } from './get_filters'; - -describe('getFilters', () => { - it('returns an empty array with no timeFieldName and searchQuery supplied', () => { - const filters = getFilters({ - index: 'the-index', - timeFieldName: '', - searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', - start: 1577836800000, - end: 1609459200000, - baselineMin: 10, - baselineMax: 20, - deviationMin: 30, - deviationMax: 40, - }); - expect(filters).toEqual([]); - }); - - it('returns a range filter when timeFieldName is supplied', () => { - const filters = getFilters({ - index: 'the-index', - timeFieldName: 'the-time-field-name', - searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', - start: 1577836800000, - end: 1609459200000, - baselineMin: 10, - baselineMax: 20, - deviationMin: 30, - deviationMax: 40, - }); - expect(filters).toEqual([ - { - range: { - 'the-time-field-name': { - format: 'epoch_millis', - gte: 1577836800000, - lte: 1609459200000, - }, - }, - }, - ]); - }); -}); diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.ts deleted file mode 100644 index e910d2e997441..0000000000000 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.ts +++ /dev/null @@ -1,40 +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 * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; - -import type { ESFilter } from '@kbn/es-types'; - -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; - -export function rangeQuery( - start?: number, - end?: number, - field = '@timestamp' -): estypes.QueryDslQueryContainer[] { - return [ - { - range: { - [field]: { - gte: start, - lte: end, - format: 'epoch_millis', - }, - }, - }, - ]; -} - -export function getFilters({ start, end, timeFieldName }: AiopsLogRateAnalysisSchema): ESFilter[] { - const filters: ESFilter[] = []; - - if (timeFieldName !== '') { - filters.push(...rangeQuery(start, end, timeFieldName)); - } - - return filters; -} diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_histogram_query.test.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_histogram_query.test.ts index 95113d39f41c8..39af620dd266a 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_histogram_query.test.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_histogram_query.test.ts @@ -5,34 +5,30 @@ * 2.0. */ -import { getHistogramQuery } from './get_histogram_query'; +import { paramsSearchQueryMock } from './__mocks__/params_search_query'; -const paramsMock = { - index: 'the-index', - timeFieldName: 'the-time-field-name', - start: 1577836800000, - end: 1609459200000, - baselineMin: 10, - baselineMax: 20, - deviationMin: 30, - deviationMax: 40, - includeFrozen: false, - searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', -}; +import { getHistogramQuery } from './get_histogram_query'; describe('getHistogramQuery', () => { it('returns histogram query without additional filters', () => { - const query = getHistogramQuery(paramsMock); + const query = getHistogramQuery(paramsSearchQueryMock); expect(query).toEqual({ bool: { filter: [ - { bool: { filter: [], must: [{ match_all: {} }], must_not: [] } }, + { + bool: { + filter: [], + minimum_should_match: 1, + must_not: [], + should: [{ term: { 'the-term': { value: 'the-value' } } }], + }, + }, { range: { 'the-time-field-name': { format: 'epoch_millis', - gte: 1577836800000, - lte: 1609459200000, + gte: 0, + lte: 50, }, }, }, @@ -42,7 +38,7 @@ describe('getHistogramQuery', () => { }); it('returns histogram query with additional filters', () => { - const query = getHistogramQuery(paramsMock, [ + const query = getHistogramQuery(paramsSearchQueryMock, [ { term: { ['the-filter-fieldName']: 'the-filter-fieldValue' }, }, @@ -50,7 +46,14 @@ describe('getHistogramQuery', () => { expect(query).toEqual({ bool: { filter: [ - { bool: { filter: [], must: [{ match_all: {} }], must_not: [] } }, + { + bool: { + filter: [], + minimum_should_match: 1, + must_not: [], + should: [{ term: { 'the-term': { value: 'the-value' } } }], + }, + }, { term: { 'the-filter-fieldName': 'the-filter-fieldValue', @@ -60,8 +63,8 @@ describe('getHistogramQuery', () => { range: { 'the-time-field-name': { format: 'epoch_millis', - gte: 1577836800000, - lte: 1609459200000, + gte: 0, + lte: 50, }, }, }, diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.test.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.test.ts index aa600065fd223..cd43e031e916a 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.test.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.test.ts @@ -5,34 +5,33 @@ * 2.0. */ +import { paramsMock } from './__mocks__/params_match_all'; +import { paramsSearchQueryMock } from './__mocks__/params_search_query'; + import { getQueryWithParams } from './get_query_with_params'; describe('getQueryWithParams', () => { it('returns the most basic query filtering', () => { const query = getQueryWithParams({ - params: { - index: 'the-index', - timeFieldName: 'the-time-field-name', - start: 1577836800000, - end: 1609459200000, - baselineMin: 10, - baselineMax: 20, - deviationMin: 30, - deviationMax: 40, - includeFrozen: false, - searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', - }, + params: paramsSearchQueryMock, }); expect(query).toEqual({ bool: { filter: [ - { bool: { filter: [], must: [{ match_all: {} }], must_not: [] } }, + { + bool: { + filter: [], + minimum_should_match: 1, + must_not: [], + should: [{ term: { 'the-term': { value: 'the-value' } } }], + }, + }, { range: { 'the-time-field-name': { format: 'epoch_millis', - gte: 1577836800000, - lte: 1609459200000, + gte: 0, + lte: 50, }, }, }, @@ -43,18 +42,7 @@ describe('getQueryWithParams', () => { it('returns a query considering a custom field/value pair', () => { const query = getQueryWithParams({ - params: { - index: 'the-index', - timeFieldName: 'the-time-field-name', - start: 1577836800000, - end: 1609459200000, - baselineMin: 10, - baselineMax: 20, - deviationMin: 30, - deviationMax: 40, - includeFrozen: false, - searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', - }, + params: paramsSearchQueryMock, termFilters: [ { fieldName: 'actualFieldName', @@ -65,13 +53,20 @@ describe('getQueryWithParams', () => { expect(query).toEqual({ bool: { filter: [ - { bool: { filter: [], must: [{ match_all: {} }], must_not: [] } }, + { + bool: { + filter: [], + minimum_should_match: 1, + must_not: [], + should: [{ term: { 'the-term': { value: 'the-value' } } }], + }, + }, { range: { 'the-time-field-name': { format: 'epoch_millis', - gte: 1577836800000, - lte: 1609459200000, + gte: 0, + lte: 50, }, }, }, @@ -84,4 +79,25 @@ describe('getQueryWithParams', () => { }, }); }); + + it("should not add `searchQuery` if it's just a match_all query", () => { + const query = getQueryWithParams({ + params: paramsMock, + }); + expect(query).toEqual({ + bool: { + filter: [ + { + range: { + 'the-time-field-name': { + format: 'epoch_millis', + gte: 0, + lte: 50, + }, + }, + }, + ], + }, + }); + }); }); diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.ts index b7e2e2619316a..80d67fe73fa81 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.ts @@ -11,7 +11,7 @@ import type { FieldValuePair } from '@kbn/ml-agg-utils'; import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; -import { getFilters } from './get_filters'; +import { getRangeQuery } from './get_range_query'; export const getTermsQuery = ({ fieldName, fieldValue }: FieldValuePair) => { return { term: { [fieldName]: fieldValue } }; @@ -21,21 +21,30 @@ interface QueryParams { params: AiopsLogRateAnalysisSchema<'2'>; termFilters?: FieldValuePair[]; filter?: estypes.QueryDslQueryContainer; + skipRangeQuery?: boolean; } export const getQueryWithParams = ({ params, termFilters, filter, + skipRangeQuery = false, }: QueryParams): estypes.QueryDslQueryContainer => { const searchQuery = JSON.parse(params.searchQuery) as estypes.QueryDslQueryContainer; return { bool: { filter: [ - searchQuery, - ...getFilters(params), + // Add `searchQuery` if it's not a `match_all` query + ...(searchQuery.match_all === undefined ? [searchQuery] : []), + + // Add a range query based on `start/end` for the `timeFieldName`, check for skip flag. + ...(!skipRangeQuery ? [getRangeQuery(params.start, params.end, params.timeFieldName)] : []), + + // Add optional term filters ...(Array.isArray(termFilters) ? termFilters.map(getTermsQuery) : []), + + // Add other optional filters ...(filter ? [filter] : []), - ] as estypes.QueryDslQueryContainer[], + ], }, }; }; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_range_query.test.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_range_query.test.ts new file mode 100644 index 0000000000000..8d232df5d2c23 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_range_query.test.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 { getRangeQuery } from './get_range_query'; + +describe('getRangeQuery', () => { + it('returns a range filter with default time field', () => { + const query = getRangeQuery(0, 50); + expect(query).toEqual({ + range: { + '@timestamp': { + gte: 0, + lte: 50, + format: 'epoch_millis', + }, + }, + }); + }); + + it('returns a range filter with a custom time field', () => { + const query = getRangeQuery(0, 50, 'the-time-field'); + expect(query).toEqual({ + range: { + 'the-time-field': { + gte: 0, + lte: 50, + format: 'epoch_millis', + }, + }, + }); + }); +}); diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_range_query.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_range_query.ts new file mode 100644 index 0000000000000..ca9ae7a299ee7 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_range_query.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +export function getRangeQuery( + start?: number, + end?: number, + field = '@timestamp' +): estypes.QueryDslQueryContainer { + return { + range: { + [field]: { + gte: start, + lte: end, + format: 'epoch_millis', + }, + }, + }; +} diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_request_base.test.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_request_base.test.ts index ee21cb985f5d6..33797e219fd37 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_request_base.test.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_request_base.test.ts @@ -5,36 +5,20 @@ * 2.0. */ +import { paramsMock } from './__mocks__/params_match_all'; + import { getRequestBase } from './get_request_base'; describe('getRequestBase', () => { it('defaults to not setting `ignore_throttled`', () => { - const requestBase = getRequestBase({ - index: 'the-index', - timeFieldName: 'the-time-field-name', - searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', - start: 1577836800000, - end: 1609459200000, - baselineMin: 10, - baselineMax: 20, - deviationMin: 30, - deviationMax: 40, - }); + const requestBase = getRequestBase(paramsMock); expect(requestBase.ignore_throttled).toEqual(undefined); }); it('adds `ignore_throttled=false` when `includeFrozen=true`', () => { const requestBase = getRequestBase({ - index: 'the-index', - timeFieldName: 'the-time-field-name', + ...paramsMock, includeFrozen: true, - searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', - start: 1577836800000, - end: 1609459200000, - baselineMin: 10, - baselineMax: 20, - deviationMin: 30, - deviationMax: 40, }); expect(requestBase.ignore_throttled).toEqual(false); }); diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_factory.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_factory.ts new file mode 100644 index 0000000000000..f54c2e93dd29e --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_factory.ts @@ -0,0 +1,137 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { streamFactory, type StreamFactoryReturnType } from '@kbn/ml-response-stream/server'; +import type { ElasticsearchClient } from '@kbn/core/server'; +import type { Headers, KibanaRequestEvents } from '@kbn/core-http-server'; +import type { Logger } from '@kbn/logging'; + +import { type AiopsLogRateAnalysisApiAction } from '../../../common/api/log_rate_analysis/actions'; + +import type { + AiopsLogRateAnalysisSchema, + AiopsLogRateAnalysisApiVersion as ApiVersion, +} from '../../../common/api/log_rate_analysis/schema'; + +import { indexInfoHandlerFactory } from './analysis_handlers/index_info_handler'; +import { groupingHandlerFactory } from './analysis_handlers/grouping_handler'; +import { histogramHandlerFactory } from './analysis_handlers/histogram_handler'; +import { overridesHandlerFactory } from './analysis_handlers/overrides_handler'; +import { significantItemsHandlerFactory } from './analysis_handlers/significant_items_handler'; +import { overallHistogramHandlerFactory } from './analysis_handlers/overall_histogram_handler'; +import { + logDebugMessageFactory, + type LogDebugMessage, +} from './response_stream_utils/log_debug_message'; +import { stateHandlerFactory, type StateHandler } from './response_stream_utils/state_handler'; +import { streamEndFactory } from './response_stream_utils/stream_end'; +import { streamEndWithUpdatedLoadingStateFactory } from './response_stream_utils/stream_end_with_updated_loading_state'; +import { streamPushErrorFactory } from './response_stream_utils/stream_push_error'; +import { streamPushPingWithTimeoutFactory } from './response_stream_utils/stream_push_ping_with_timeout'; + +/** + * The options to be passed in to `responseStreamFactory`. + */ +export interface ResponseStreamOptions { + version: T; + client: ElasticsearchClient; + requestBody: AiopsLogRateAnalysisSchema; + events: KibanaRequestEvents; + headers: Headers; + logger: Logger; +} + +/** + * The full options object that will be passed on to analysis handlers + * so they're able to access all necessary runtime dependencies. + */ +export interface ResponseStreamFetchOptions extends ResponseStreamOptions { + abortSignal: AbortSignal; + logDebugMessage: LogDebugMessage; + responseStream: { + end: () => void; + endWithUpdatedLoadingState: () => void; + push: StreamFactoryReturnType>['push']; + pushPingWithTimeout: () => void; + pushError: (msg: string) => void; + }; + stateHandler: StateHandler; +} + +/** + * `responseStreamFactory` sets up the response stream, the stream's state (for example + * if it's running, how far the stream progressed etc.), some custom actions for the stream + * as well as analysis handlers that fetch data from ES and pass it on to the stream. + * This factory should avoid to include any logic, its purpose is to take care of setting up + * and passing around dependencies for the various other parts involved + * running the analysis. + */ +export const responseStreamFactory = (options: ResponseStreamOptions) => { + const { events, headers, logger, requestBody } = options; + + const logDebugMessage = logDebugMessageFactory(logger); + const state = stateHandlerFactory({ + groupingEnabled: !!requestBody.grouping, + sampleProbability: requestBody.sampleProbability ?? 1, + }); + const controller = new AbortController(); + const abortSignal = controller.signal; + + events.aborted$.subscribe(() => { + logDebugMessage('aborted$ subscription trigger.'); + state.shouldStop(true); + controller.abort(); + }); + events.completed$.subscribe(() => { + logDebugMessage('completed$ subscription trigger.'); + state.shouldStop(true); + controller.abort(); + }); + + const { + end: streamEnd, + push, + responseWithHeaders, + } = streamFactory>( + headers, + logger, + requestBody.compressResponse, + requestBody.flushFix + ); + + const pushPingWithTimeout = streamPushPingWithTimeoutFactory(state, push, logDebugMessage); + const end = streamEndFactory(state, streamEnd, logDebugMessage); + const endWithUpdatedLoadingState = streamEndWithUpdatedLoadingStateFactory(end, push); + const pushError = streamPushErrorFactory(push, logDebugMessage); + + const streamFetchOptions: ResponseStreamFetchOptions = { + ...options, + abortSignal, + logDebugMessage, + responseStream: { + end, + endWithUpdatedLoadingState, + push, + pushError, + pushPingWithTimeout, + }, + stateHandler: state, + }; + + return { + ...streamFetchOptions, + analysis: { + indexInfoHandler: indexInfoHandlerFactory(streamFetchOptions), + groupingHandler: groupingHandlerFactory(streamFetchOptions), + histogramHandler: histogramHandlerFactory(streamFetchOptions), + overallHistogramHandler: overallHistogramHandlerFactory(streamFetchOptions), + overridesHandler: overridesHandlerFactory(streamFetchOptions), + significantItemsHandler: significantItemsHandlerFactory(streamFetchOptions), + }, + responseWithHeaders, + }; +}; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/constants.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/constants.ts new file mode 100644 index 0000000000000..3069015070239 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/constants.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// Overall progress is a float from 0 to 1. +export const LOADED_FIELD_CANDIDATES = 0.2; +export const PROGRESS_STEP_P_VALUES = 0.5; +export const PROGRESS_STEP_GROUPING = 0.1; +export const PROGRESS_STEP_HISTOGRAMS = 0.1; +export const PROGRESS_STEP_HISTOGRAMS_GROUPS = 0.1; + +// Don't use more than 10 here otherwise Kibana will emit an error +// regarding a limit of abort signal listeners of more than 10. +export const MAX_CONCURRENT_QUERIES = 10; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/log_debug_message.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/log_debug_message.ts new file mode 100644 index 0000000000000..72a61ba93ca7d --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/log_debug_message.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 { Logger } from '@kbn/logging'; + +export type LogDebugMessage = (msg: string) => void; + +export const logDebugMessageFactory = (logger: Logger): LogDebugMessage => { + let logMessageCounter = 0; + + return (msg: string) => { + logMessageCounter++; + logger.debug(`Log Rate Analysis #${logMessageCounter}: ${msg}`); + }; +}; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/state_handler.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/state_handler.ts new file mode 100644 index 0000000000000..98763170083f6 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/state_handler.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. + */ + +export interface StreamState { + isRunning: boolean; + groupingEnabled: boolean; + loaded: number; + sampleProbability: number; + shouldStop: boolean; +} + +const getDefaultStreamState = (overrides: Partial): StreamState => ({ + isRunning: !!overrides.isRunning, + groupingEnabled: !!overrides.groupingEnabled, + loaded: overrides.loaded ?? 0, + sampleProbability: overrides.sampleProbability ?? 1, + shouldStop: !!overrides.shouldStop, +}); + +/** + * `stateHandlerFactory` takes care of handling the inner state of the stream, + * for example how much of the stream has been completed, if the stream is running etc. + * It exposes the state as getter/setter functions, for example `loaded()` will + * retrieve the current loading state, `loaded(0.5)` will update it. + */ +export const stateHandlerFactory = (overrides: Partial) => { + const state = getDefaultStreamState(overrides); + + function groupingEnabled(d?: boolean) { + if (typeof d === 'boolean') { + state.groupingEnabled = d; + } else { + return state.groupingEnabled; + } + } + + function loaded(): number; + function loaded(d: number, replace?: boolean): undefined; + function loaded(d?: number, replace = true) { + if (typeof d === 'number') { + if (replace) { + state.loaded = d; + } else { + state.loaded += d; + } + } else { + return state.loaded; + } + } + + function isRunning(d?: boolean) { + if (typeof d === 'boolean') { + state.isRunning = d; + } else { + return state.isRunning; + } + } + + function sampleProbability(d?: number) { + if (typeof d === 'number') { + state.sampleProbability = d; + } else { + return state.sampleProbability; + } + } + + function shouldStop(d?: boolean) { + if (typeof d === 'boolean') { + state.shouldStop = d; + } else { + return state.shouldStop; + } + } + + return { groupingEnabled, isRunning, loaded, sampleProbability, shouldStop }; +}; + +export type StateHandler = ReturnType; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_end.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_end.ts new file mode 100644 index 0000000000000..1be099d39a95e --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_end.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 { LogDebugMessage } from './log_debug_message'; +import type { StateHandler } from './state_handler'; + +/** + * Helper function that will check if the actual stream is still running + * and only then will call the callback to end the raw stream and update its state. + * This is implemented as a factory that receives the necessary dependencies + * which then returns the actual helper function. + */ +export const streamEndFactory = ( + stateHandler: StateHandler, + streamEndCallback: () => void, + logDebugMessage: LogDebugMessage +) => { + return function end() { + if (stateHandler.isRunning()) { + stateHandler.isRunning(false); + logDebugMessage('Ending analysis.'); + streamEndCallback(); + } else { + logDebugMessage('end() was called again with isRunning already being false.'); + } + }; +}; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_end_with_updated_loading_state.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_end_with_updated_loading_state.ts new file mode 100644 index 0000000000000..95957b9fed201 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_end_with_updated_loading_state.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 { i18n } from '@kbn/i18n'; + +import type { StreamFactoryReturnType } from '@kbn/ml-response-stream/server'; + +import { + updateLoadingStateAction, + type AiopsLogRateAnalysisApiAction, +} from '../../../../common/api/log_rate_analysis/actions'; +import type { AiopsLogRateAnalysisApiVersion as ApiVersion } from '../../../../common/api/log_rate_analysis/schema'; + +/** + * Helper function that will push a message to the stream that it's done and + * then run a callback to end the actual stream. + * This is implemented as a factory that receives the necessary dependencies + * which then returns the actual helper function. + */ +export const streamEndWithUpdatedLoadingStateFactory = ( + streamEndCallback: () => void, + push: StreamFactoryReturnType>['push'] +) => { + return function endWithUpdatedLoadingState() { + push( + updateLoadingStateAction({ + ccsWarning: false, + loaded: 1, + loadingState: i18n.translate('xpack.aiops.logRateAnalysis.loadingState.doneMessage', { + defaultMessage: 'Done.', + }), + }) + ); + + streamEndCallback(); + }; +}; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_push_error.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_push_error.ts new file mode 100644 index 0000000000000..74e10c3125a59 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_push_error.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 type { StreamFactoryReturnType } from '@kbn/ml-response-stream/server'; + +import type { AiopsLogRateAnalysisApiVersion as ApiVersion } from '../../../../common/api/log_rate_analysis/schema'; + +import type { LogDebugMessage } from './log_debug_message'; + +import { + addErrorAction, + type AiopsLogRateAnalysisApiAction, +} from '../../../../common/api/log_rate_analysis/actions'; + +/** + * Helper function that will push an error message to the stream. + * This is implemented as a factory that receives the necessary dependencies + * which then returns the actual helper function. + */ +export const streamPushErrorFactory = ( + push: StreamFactoryReturnType>['push'], + logDebugMessage: LogDebugMessage +) => { + return function pushError(m: string) { + logDebugMessage('Push error.'); + push(addErrorAction(m)); + }; +}; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_push_ping_with_timeout.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_push_ping_with_timeout.ts new file mode 100644 index 0000000000000..d3c03556c0ad6 --- /dev/null +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/response_stream_utils/stream_push_ping_with_timeout.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 type { StreamFactoryReturnType } from '@kbn/ml-response-stream/server'; + +import { + pingAction, + type AiopsLogRateAnalysisApiAction, +} from '../../../../common/api/log_rate_analysis/actions'; +import type { AiopsLogRateAnalysisApiVersion as ApiVersion } from '../../../../common/api/log_rate_analysis/schema'; + +import type { LogDebugMessage } from './log_debug_message'; +import type { StateHandler } from './state_handler'; + +// 10s ping frequency to keep the stream alive. +const PING_FREQUENCY = 10000; + +/** + * Helper function that will push a ping message every 10s until the stream finishes. + * This is implemented as a factory that receives the necessary dependencies + * which then returns the actual helper function. + */ +export const streamPushPingWithTimeoutFactory = ( + stateHandler: StateHandler, + push: StreamFactoryReturnType>['push'], + logDebugMessage: LogDebugMessage +) => { + return function pushPingWithTimeout() { + setTimeout(() => { + if (stateHandler.isRunning()) { + logDebugMessage('Ping message.'); + push(pingAction()); + pushPingWithTimeout(); + } + }, PING_FREQUENCY); + }; +}; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/route_handler_factory.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/route_handler_factory.ts index 30f3dbe55f446..3c1bcde38ebd6 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/route_handler_factory.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/route_handler_factory.ts @@ -5,10 +5,6 @@ * 2.0. */ -import { queue } from 'async'; - -import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; - import type { CoreStart, KibanaRequest, @@ -17,67 +13,30 @@ import type { KibanaResponseFactory, } from '@kbn/core/server'; import type { Logger } from '@kbn/logging'; -import { i18n } from '@kbn/i18n'; -import { KBN_FIELD_TYPES } from '@kbn/field-types'; -import { streamFactory } from '@kbn/ml-response-stream/server'; -import type { - SignificantItem, - SignificantItemGroup, - SignificantItemHistogramItem, - NumericChartData, - NumericHistogramField, -} from '@kbn/ml-agg-utils'; -import { SIGNIFICANT_ITEM_TYPE } from '@kbn/ml-agg-utils'; -import { fetchHistogramsForFields } from '@kbn/ml-agg-utils'; import { createExecutionContext } from '@kbn/ml-route-utils'; import type { UsageCounter } from '@kbn/usage-collection-plugin/server'; -import { RANDOM_SAMPLER_SEED, AIOPS_TELEMETRY_ID } from '../../../common/constants'; -import { - addSignificantItemsAction, - addSignificantItemsGroupAction, - addSignificantItemsGroupHistogramAction, - addSignificantItemsHistogramAction, - addErrorAction, - pingAction, - resetAllAction, - resetErrorsAction, - resetGroupsAction, - updateLoadingStateAction, - AiopsLogRateAnalysisApiAction, -} from '../../../common/api/log_rate_analysis/actions'; +import { AIOPS_TELEMETRY_ID } from '../../../common/constants'; import type { AiopsLogRateAnalysisSchema, AiopsLogRateAnalysisApiVersion as ApiVersion, } from '../../../common/api/log_rate_analysis/schema'; -import { getCategoryQuery } from '../../../common/api/log_categorization/get_category_query'; import { AIOPS_API_ENDPOINT } from '../../../common/api'; import { PLUGIN_ID } from '../../../common'; import { isRequestAbortedError } from '../../lib/is_request_aborted_error'; -import type { AiopsLicense } from '../../types'; - -import { fetchSignificantCategories } from './queries/fetch_significant_categories'; -import { fetchSignificantTermPValues } from './queries/fetch_significant_term_p_values'; -import { fetchIndexInfo } from './queries/fetch_index_info'; -import { fetchFrequentItemSets } from './queries/fetch_frequent_item_sets'; -import { fetchTerms2CategoriesCounts } from './queries/fetch_terms_2_categories_counts'; -import { getHistogramQuery } from './queries/get_histogram_query'; -import { getGroupFilter } from './queries/get_group_filter'; -import { getSignificantItemGroups } from './queries/get_significant_item_groups'; import { trackAIOpsRouteUsage } from '../../lib/track_route_usage'; +import type { AiopsLicense } from '../../types'; -// 10s ping frequency to keep the stream alive. -const PING_FREQUENCY = 10000; - -// Overall progress is a float from 0 to 1. -const LOADED_FIELD_CANDIDATES = 0.2; -const PROGRESS_STEP_P_VALUES = 0.5; -const PROGRESS_STEP_GROUPING = 0.1; -const PROGRESS_STEP_HISTOGRAMS = 0.1; -const PROGRESS_STEP_HISTOGRAMS_GROUPS = 0.1; +import { responseStreamFactory } from './response_stream_factory'; +import { PROGRESS_STEP_HISTOGRAMS_GROUPS } from './response_stream_utils/constants'; +/** + * The log rate analysis route handler sets up `responseStreamFactory` + * to create the response stream and then uses its handlers to + * walk through the steps of the analysis. + */ export function routeHandlerFactory( version: T, license: AiopsLicense, @@ -106,814 +65,71 @@ export function routeHandlerFactory( const executionContext = createExecutionContext(coreStart, PLUGIN_ID, request.route.path); return await coreStart.executionContext.withContext(executionContext, () => { - let logMessageCounter = 1; - - function logDebugMessage(msg: string) { - logger.debug(`Log Rate Analysis #${logMessageCounter}: ${msg}`); - logMessageCounter++; - } - - logDebugMessage('Starting analysis.'); - - const groupingEnabled = !!request.body.grouping; - const sampleProbability = request.body.sampleProbability ?? 1; - - const controller = new AbortController(); - const abortSignal = controller.signal; - - let isRunning = false; - let loaded = 0; - let shouldStop = false; - request.events.aborted$.subscribe(() => { - logDebugMessage('aborted$ subscription trigger.'); - shouldStop = true; - controller.abort(); - }); - request.events.completed$.subscribe(() => { - logDebugMessage('completed$ subscription trigger.'); - shouldStop = true; - controller.abort(); - }); - - const { - end: streamEnd, - push, - responseWithHeaders, - } = streamFactory>( - request.headers, - logger, - request.body.compressResponse, - request.body.flushFix - ); - - function pushPingWithTimeout() { - setTimeout(() => { - if (isRunning) { - logDebugMessage('Ping message.'); - push(pingAction()); - pushPingWithTimeout(); - } - }, PING_FREQUENCY); - } - - function end() { - if (isRunning) { - isRunning = false; - logDebugMessage('Ending analysis.'); - streamEnd(); - } else { - logDebugMessage('end() was called again with isRunning already being false.'); - } - } - - function endWithUpdatedLoadingState() { - push( - updateLoadingStateAction({ - ccsWarning: false, - loaded: 1, - loadingState: i18n.translate('xpack.aiops.logRateAnalysis.loadingState.doneMessage', { - defaultMessage: 'Done.', - }), - }) - ); - - end(); - } - - function pushError(m: string) { - logDebugMessage('Push error.'); - push(addErrorAction(m)); - } + const { analysis, logDebugMessage, stateHandler, responseStream, responseWithHeaders } = + responseStreamFactory({ + version, + client, + requestBody: request.body, + events: request.events, + headers: request.headers, + logger, + }); async function runAnalysis() { try { - isRunning = true; - - if (!request.body.overrides) { - logDebugMessage('Full Reset.'); - push(resetAllAction()); - } else { - logDebugMessage('Reset Errors.'); - push(resetErrorsAction()); - } - - if (request.body.overrides?.regroupOnly) { - logDebugMessage('Reset Groups.'); - push(resetGroupsAction()); - } - - if (request.body.overrides?.loaded) { - logDebugMessage(`Set 'loaded' override to '${request.body.overrides?.loaded}'.`); - loaded = request.body.overrides?.loaded; - } + logDebugMessage('Starting analysis.'); + logDebugMessage(`Sample probability: ${stateHandler.sampleProbability()}`); - pushPingWithTimeout(); + stateHandler.isRunning(true); + analysis.overridesHandler(); + responseStream.pushPingWithTimeout(); // Step 1: Index Info: Field candidates, total doc count, sample probability + const indexInfo = await analysis.indexInfoHandler(); - const fieldCandidates: string[] = []; - let fieldCandidatesCount = fieldCandidates.length; - - const textFieldCandidates: string[] = []; - - let totalDocCount = 0; - - if (!request.body.overrides?.remainingFieldCandidates) { - logDebugMessage('Fetch index information.'); - push( - updateLoadingStateAction({ - ccsWarning: false, - loaded, - loadingState: i18n.translate( - 'xpack.aiops.logRateAnalysis.loadingState.loadingIndexInformation', - { - defaultMessage: 'Loading index information.', - } - ), - }) - ); - - try { - const indexInfo = await fetchIndexInfo( - client, - request.body, - ['message', 'error.message'], - abortSignal - ); - - fieldCandidates.push(...indexInfo.fieldCandidates); - fieldCandidatesCount = fieldCandidates.length; - textFieldCandidates.push(...indexInfo.textFieldCandidates); - totalDocCount = indexInfo.totalDocCount; - } catch (e) { - if (!isRequestAbortedError(e)) { - logger.error(`Failed to fetch index information, got: \n${e.toString()}`); - pushError(`Failed to fetch index information.`); - } - end(); - return; - } - - logDebugMessage(`Total document count: ${totalDocCount}`); - logDebugMessage(`Sample probability: ${sampleProbability}`); - - loaded += LOADED_FIELD_CANDIDATES; - - pushPingWithTimeout(); - - push( - updateLoadingStateAction({ - ccsWarning: false, - loaded, - loadingState: i18n.translate( - 'xpack.aiops.logRateAnalysis.loadingState.identifiedFieldCandidates', - { - defaultMessage: - 'Identified {fieldCandidatesCount, plural, one {# field candidate} other {# field candidates}}.', - values: { - fieldCandidatesCount, - }, - } - ), - }) - ); - - if (fieldCandidatesCount === 0) { - endWithUpdatedLoadingState(); - } else if (shouldStop) { - logDebugMessage('shouldStop after fetching field candidates.'); - end(); - return; - } - } - - // Step 2: Significant Categories and Items - - // This will store the combined count of detected significant log patterns and keywords - let fieldValuePairsCount = 0; - - const significantCategories: SignificantItem[] = []; - - if (version === '1') { - significantCategories.push( - ...(( - request.body as AiopsLogRateAnalysisSchema<'1'> - ).overrides?.significantTerms?.filter( - (d) => d.type === SIGNIFICANT_ITEM_TYPE.LOG_PATTERN - ) ?? []) - ); - } - - if (version === '2') { - significantCategories.push( - ...(( - request.body as AiopsLogRateAnalysisSchema<'2'> - ).overrides?.significantItems?.filter( - (d) => d.type === SIGNIFICANT_ITEM_TYPE.LOG_PATTERN - ) ?? []) - ); - } - - // Get significant categories of text fields - if (textFieldCandidates.length > 0) { - significantCategories.push( - ...(await fetchSignificantCategories( - client, - request.body, - textFieldCandidates, - logger, - sampleProbability, - pushError, - abortSignal - )) - ); - - if (significantCategories.length > 0) { - push(addSignificantItemsAction(significantCategories, version)); - } - } - - const significantTerms: SignificantItem[] = []; - - if (version === '1') { - significantTerms.push( - ...(( - request.body as AiopsLogRateAnalysisSchema<'1'> - ).overrides?.significantTerms?.filter( - (d) => d.type === SIGNIFICANT_ITEM_TYPE.KEYWORD - ) ?? []) - ); - } - - if (version === '2') { - significantTerms.push( - ...(( - request.body as AiopsLogRateAnalysisSchema<'2'> - ).overrides?.significantItems?.filter( - (d) => d.type === SIGNIFICANT_ITEM_TYPE.KEYWORD - ) ?? []) - ); - } - - const fieldsToSample = new Set(); - - // Don't use more than 10 here otherwise Kibana will emit an error - // regarding a limit of abort signal listeners of more than 10. - const MAX_CONCURRENT_QUERIES = 10; - - let remainingFieldCandidates: string[]; - let loadingStepSizePValues = PROGRESS_STEP_P_VALUES; - - if (request.body.overrides?.remainingFieldCandidates) { - fieldCandidates.push(...request.body.overrides?.remainingFieldCandidates); - remainingFieldCandidates = request.body.overrides?.remainingFieldCandidates; - fieldCandidatesCount = fieldCandidates.length; - loadingStepSizePValues = - LOADED_FIELD_CANDIDATES + - PROGRESS_STEP_P_VALUES - - (request.body.overrides?.loaded ?? PROGRESS_STEP_P_VALUES); - } else { - remainingFieldCandidates = fieldCandidates; - } - - logDebugMessage('Fetch p-values.'); - - const pValuesQueue = queue(async function (fieldCandidate: string) { - loaded += (1 / fieldCandidatesCount) * loadingStepSizePValues; - - let pValues: Awaited>; - - try { - pValues = await fetchSignificantTermPValues( - client, - request.body, - [fieldCandidate], - logger, - sampleProbability, - pushError, - abortSignal - ); - } catch (e) { - if (!isRequestAbortedError(e)) { - logger.error( - `Failed to fetch p-values for '${fieldCandidate}', got: \n${e.toString()}` - ); - pushError(`Failed to fetch p-values for '${fieldCandidate}'.`); - } - return; - } - - remainingFieldCandidates = remainingFieldCandidates.filter((d) => d !== fieldCandidate); - - if (pValues.length > 0) { - pValues.forEach((d) => { - fieldsToSample.add(d.fieldName); - }); - significantTerms.push(...pValues); - - push(addSignificantItemsAction(pValues, version)); - } - - push( - updateLoadingStateAction({ - ccsWarning: false, - loaded, - loadingState: i18n.translate( - 'xpack.aiops.logRateAnalysis.loadingState.identifiedFieldValuePairs', - { - defaultMessage: - 'Identified {fieldValuePairsCount, plural, one {# significant field/value pair} other {# significant field/value pairs}}.', - values: { - fieldValuePairsCount, - }, - } - ), - remainingFieldCandidates, - }) - ); - }, MAX_CONCURRENT_QUERIES); - - pValuesQueue.push(fieldCandidates, (err) => { - if (err) { - logger.error(`Failed to fetch p-values.', got: \n${err.toString()}`); - pushError(`Failed to fetch p-values.`); - pValuesQueue.kill(); - end(); - } else if (shouldStop) { - logDebugMessage('shouldStop fetching p-values.'); - pValuesQueue.kill(); - end(); - } - }); - await pValuesQueue.drain(); - - fieldValuePairsCount = significantCategories.length + significantTerms.length; - - if (fieldValuePairsCount === 0) { - logDebugMessage('Stopping analysis, did not find significant terms.'); - endWithUpdatedLoadingState(); + if (!indexInfo) { return; } - const histogramFields: [NumericHistogramField] = [ - { fieldName: request.body.timeFieldName, type: KBN_FIELD_TYPES.DATE }, - ]; - - logDebugMessage('Fetch overall histogram.'); - - let overallTimeSeries: NumericChartData | undefined; - - const overallHistogramQuery = getHistogramQuery(request.body); - - try { - overallTimeSeries = ( - (await fetchHistogramsForFields( - client, - request.body.index, - overallHistogramQuery, - // fields - histogramFields, - // samplerShardSize - -1, - undefined, - abortSignal, - sampleProbability, - RANDOM_SAMPLER_SEED - )) as [NumericChartData] - )[0]; - } catch (e) { - if (!isRequestAbortedError(e)) { - logger.error(`Failed to fetch the overall histogram data, got: \n${e.toString()}`); - pushError(`Failed to fetch overall histogram data.`); - } - // Still continue the analysis even if loading the overall histogram fails. - } - - function pushHistogramDataLoadingState() { - push( - updateLoadingStateAction({ - ccsWarning: false, - loaded, - loadingState: i18n.translate( - 'xpack.aiops.logRateAnalysis.loadingState.loadingHistogramData', - { - defaultMessage: 'Loading histogram data.', - } - ), - }) - ); - } + // Step 2: Significant categories and terms + const significantItemsObj = await analysis.significantItemsHandler(indexInfo); - if (shouldStop) { - logDebugMessage('shouldStop after fetching overall histogram.'); - end(); + if (!significantItemsObj) { return; } - if (groupingEnabled) { - logDebugMessage('Group results.'); - - push( - updateLoadingStateAction({ - ccsWarning: false, - loaded, - loadingState: i18n.translate( - 'xpack.aiops.logRateAnalysis.loadingState.groupingResults', - { - defaultMessage: 'Transforming significant field/value pairs into groups.', - } - ), - groupsMissing: true, - }) - ); - - try { - const { fields, itemSets } = await fetchFrequentItemSets( - client, - request.body.index, - JSON.parse(request.body.searchQuery) as estypes.QueryDslQueryContainer, - significantTerms, - request.body.timeFieldName, - request.body.deviationMin, - request.body.deviationMax, - logger, - sampleProbability, - pushError, - abortSignal - ); - - if (significantCategories.length > 0 && significantTerms.length > 0) { - const { - fields: significantCategoriesFields, - itemSets: significantCategoriesItemSets, - } = await fetchTerms2CategoriesCounts( - client, - request.body, - JSON.parse(request.body.searchQuery) as estypes.QueryDslQueryContainer, - significantTerms, - itemSets, - significantCategories, - request.body.deviationMin, - request.body.deviationMax, - logger, - pushError, - abortSignal - ); - - fields.push(...significantCategoriesFields); - itemSets.push(...significantCategoriesItemSets); - } - - if (shouldStop) { - logDebugMessage('shouldStop after fetching frequent_item_sets.'); - end(); - return; - } - - if (fields.length > 0 && itemSets.length > 0) { - const significantItemGroups = getSignificantItemGroups( - itemSets, - [...significantTerms, ...significantCategories], - fields - ); - - // We'll find out if there's at least one group with at least two items, - // only then will we return the groups to the clients and make the grouping option available. - const maxItems = Math.max(...significantItemGroups.map((g) => g.group.length)); - - if (maxItems > 1) { - push(addSignificantItemsGroupAction(significantItemGroups, version)); - } - - loaded += PROGRESS_STEP_GROUPING; - - pushHistogramDataLoadingState(); - - if (shouldStop) { - logDebugMessage('shouldStop after grouping.'); - end(); - return; - } - - logDebugMessage(`Fetch ${significantItemGroups.length} group histograms.`); - - const groupHistogramQueue = queue(async function (cpg: SignificantItemGroup) { - if (shouldStop) { - logDebugMessage('shouldStop abort fetching group histograms.'); - groupHistogramQueue.kill(); - end(); - return; - } - - if (overallTimeSeries !== undefined) { - const histogramQuery = getHistogramQuery(request.body, getGroupFilter(cpg)); - - let cpgTimeSeries: NumericChartData; - try { - cpgTimeSeries = ( - (await fetchHistogramsForFields( - client, - request.body.index, - histogramQuery, - // fields - [ - { - fieldName: request.body.timeFieldName, - type: KBN_FIELD_TYPES.DATE, - interval: overallTimeSeries.interval, - min: overallTimeSeries.stats[0], - max: overallTimeSeries.stats[1], - }, - ], - // samplerShardSize - -1, - undefined, - abortSignal, - sampleProbability, - RANDOM_SAMPLER_SEED - )) as [NumericChartData] - )[0]; - } catch (e) { - if (!isRequestAbortedError(e)) { - logger.error( - `Failed to fetch the histogram data for group #${ - cpg.id - }, got: \n${e.toString()}` - ); - pushError(`Failed to fetch the histogram data for group #${cpg.id}.`); - } - return; - } - const histogram: SignificantItemHistogramItem[] = - overallTimeSeries.data.map((o) => { - const current = cpgTimeSeries.data.find( - (d1) => d1.key_as_string === o.key_as_string - ) ?? { - doc_count: 0, - }; - - if (version === '1') { - return { - key: o.key, - key_as_string: o.key_as_string ?? '', - doc_count_significant_term: current.doc_count, - doc_count_overall: Math.max(0, o.doc_count - current.doc_count), - }; - } - - return { - key: o.key, - key_as_string: o.key_as_string ?? '', - doc_count_significant_item: current.doc_count, - doc_count_overall: Math.max(0, o.doc_count - current.doc_count), - }; - }) ?? []; - - push( - addSignificantItemsGroupHistogramAction( - [ - { - id: cpg.id, - histogram, - }, - ], - version - ) - ); - } - }, MAX_CONCURRENT_QUERIES); - - groupHistogramQueue.push(significantItemGroups); - await groupHistogramQueue.drain(); - } - } catch (e) { - if (!isRequestAbortedError(e)) { - logger.error( - `Failed to transform field/value pairs into groups, got: \n${e.toString()}` - ); - pushError(`Failed to transform field/value pairs into groups.`); - } - } - } - - loaded += PROGRESS_STEP_HISTOGRAMS_GROUPS; + const { fieldValuePairsCount, significantCategories, significantTerms } = + significantItemsObj; - logDebugMessage(`Fetch ${significantTerms.length} field/value histograms.`); + // Step 3: Fetch overall histogram + const overallTimeSeries = await analysis.overallHistogramHandler(); - // time series filtered by fields - if ( - significantTerms.length > 0 && - overallTimeSeries !== undefined && - !request.body.overrides?.regroupOnly - ) { - const fieldValueHistogramQueue = queue(async function (cp: SignificantItem) { - if (shouldStop) { - logDebugMessage('shouldStop abort fetching field/value histograms.'); - fieldValueHistogramQueue.kill(); - end(); - return; - } - - if (overallTimeSeries !== undefined) { - const histogramQuery = getHistogramQuery(request.body, [ - { - term: { [cp.fieldName]: cp.fieldValue }, - }, - ]); - - let cpTimeSeries: NumericChartData; - - try { - cpTimeSeries = ( - (await fetchHistogramsForFields( - client, - request.body.index, - histogramQuery, - // fields - [ - { - fieldName: request.body.timeFieldName, - type: KBN_FIELD_TYPES.DATE, - interval: overallTimeSeries.interval, - min: overallTimeSeries.stats[0], - max: overallTimeSeries.stats[1], - }, - ], - // samplerShardSize - -1, - undefined, - abortSignal, - sampleProbability, - RANDOM_SAMPLER_SEED - )) as [NumericChartData] - )[0]; - } catch (e) { - logger.error( - `Failed to fetch the histogram data for field/value pair "${cp.fieldName}:${ - cp.fieldValue - }", got: \n${e.toString()}` - ); - pushError( - `Failed to fetch the histogram data for field/value pair "${cp.fieldName}:${cp.fieldValue}".` - ); - return; - } - - const histogram: SignificantItemHistogramItem[] = - overallTimeSeries.data.map((o) => { - const current = cpTimeSeries.data.find( - (d1) => d1.key_as_string === o.key_as_string - ) ?? { - doc_count: 0, - }; - if (version === '1') { - return { - key: o.key, - key_as_string: o.key_as_string ?? '', - doc_count_significant_term: current.doc_count, - doc_count_overall: Math.max(0, o.doc_count - current.doc_count), - }; - } - - return { - key: o.key, - key_as_string: o.key_as_string ?? '', - doc_count_significant_item: current.doc_count, - doc_count_overall: Math.max(0, o.doc_count - current.doc_count), - }; - }) ?? []; - - const { fieldName, fieldValue } = cp; - - loaded += (1 / fieldValuePairsCount) * PROGRESS_STEP_HISTOGRAMS; - pushHistogramDataLoadingState(); - push( - addSignificantItemsHistogramAction( - [ - { - fieldName, - fieldValue, - histogram, - }, - ], - version - ) - ); - } - }, MAX_CONCURRENT_QUERIES); - - fieldValueHistogramQueue.push(significantTerms); - await fieldValueHistogramQueue.drain(); + // Step 4: Smart gropuing + if (stateHandler.groupingEnabled()) { + await analysis.groupingHandler( + significantCategories, + significantTerms, + overallTimeSeries + ); } - // histograms for text field patterns - if ( - overallTimeSeries !== undefined && - significantCategories.length > 0 && - !request.body.overrides?.regroupOnly - ) { - const significantCategoriesHistogramQueries = significantCategories.map((d) => { - const histogramQuery = getHistogramQuery(request.body); - const categoryQuery = getCategoryQuery(d.fieldName, [ - { key: `${d.key}`, count: d.doc_count, examples: [] }, - ]); - if (Array.isArray(histogramQuery.bool?.filter)) { - histogramQuery.bool?.filter?.push(categoryQuery); - } - return histogramQuery; - }); - - for (const [i, histogramQuery] of significantCategoriesHistogramQueries.entries()) { - const cp = significantCategories[i]; - let catTimeSeries: NumericChartData; - - try { - catTimeSeries = ( - (await fetchHistogramsForFields( - client, - request.body.index, - histogramQuery, - // fields - [ - { - fieldName: request.body.timeFieldName, - type: KBN_FIELD_TYPES.DATE, - interval: overallTimeSeries.interval, - min: overallTimeSeries.stats[0], - max: overallTimeSeries.stats[1], - }, - ], - // samplerShardSize - -1, - undefined, - abortSignal, - sampleProbability, - RANDOM_SAMPLER_SEED - )) as [NumericChartData] - )[0]; - } catch (e) { - logger.error( - `Failed to fetch the histogram data for field/value pair "${cp.fieldName}:${ - cp.fieldValue - }", got: \n${e.toString()}` - ); - pushError( - `Failed to fetch the histogram data for field/value pair "${cp.fieldName}:${cp.fieldValue}".` - ); - return; - } - - const histogram: SignificantItemHistogramItem[] = - overallTimeSeries.data.map((o) => { - const current = catTimeSeries.data.find( - (d1) => d1.key_as_string === o.key_as_string - ) ?? { - doc_count: 0, - }; + stateHandler.loaded(PROGRESS_STEP_HISTOGRAMS_GROUPS, false); - if (version === '1') { - return { - key: o.key, - key_as_string: o.key_as_string ?? '', - doc_count_significant_term: current.doc_count, - doc_count_overall: Math.max(0, o.doc_count - current.doc_count), - }; - } - - return { - key: o.key, - key_as_string: o.key_as_string ?? '', - doc_count_significant_item: current.doc_count, - doc_count_overall: Math.max(0, o.doc_count - current.doc_count), - }; - }) ?? []; - - const { fieldName, fieldValue } = cp; - - loaded += (1 / fieldValuePairsCount) * PROGRESS_STEP_HISTOGRAMS; - pushHistogramDataLoadingState(); - push( - addSignificantItemsHistogramAction( - [ - { - fieldName, - fieldValue, - histogram, - }, - ], - version - ) - ); - } - } + // Step 5: Histograms + await analysis.histogramHandler( + fieldValuePairsCount, + significantCategories, + significantTerms, + overallTimeSeries + ); - endWithUpdatedLoadingState(); + responseStream.endWithUpdatedLoadingState(); } catch (e) { if (!isRequestAbortedError(e)) { logger.error(`Log Rate Analysis failed to finish, got: \n${e.toString()}`); - pushError(`Log Rate Analysis failed to finish.`); + responseStream.pushError(`Log Rate Analysis failed to finish.`); } - end(); + responseStream.end(); } } diff --git a/x-pack/plugins/aiops/tsconfig.json b/x-pack/plugins/aiops/tsconfig.json index 67e8908f5c421..31d68a5a4ab0f 100644 --- a/x-pack/plugins/aiops/tsconfig.json +++ b/x-pack/plugins/aiops/tsconfig.json @@ -23,7 +23,6 @@ "@kbn/data-views-plugin", "@kbn/datemath", "@kbn/es-query", - "@kbn/es-types", "@kbn/field-formats-plugin", "@kbn/field-types", "@kbn/i18n-react", @@ -66,6 +65,7 @@ "@kbn/ml-chi2test", "@kbn/usage-collection-plugin", "@kbn/analytics", + "@kbn/core-http-server", ], "exclude": [ "target/**/*", 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_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/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/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/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/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_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/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/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/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/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/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/cases/common/constants/index.ts b/x-pack/plugins/cases/common/constants/index.ts index f2c2dcef9bb2e..5a540b610135c 100644 --- a/x-pack/plugins/cases/common/constants/index.ts +++ b/x-pack/plugins/cases/common/constants/index.ts @@ -202,6 +202,7 @@ export const SEARCH_DEBOUNCE_MS = 500; export const LOCAL_STORAGE_KEYS = { casesQueryParams: 'cases.list.queryParams', casesFilterOptions: 'cases.list.filterOptions', + casesTableColumns: 'cases.list.tableColumns', }; /** diff --git a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.test.tsx b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.test.tsx index 10b55c0e979b3..4bd497a3c76f3 100644 --- a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.test.tsx @@ -25,7 +25,7 @@ import { useGetCasesMockState, connectorsMock } from '../../containers/mock'; import { SortFieldCase, StatusAll } from '../../../common/ui/types'; import { CaseSeverity, CaseStatuses } from '../../../common/types/domain'; import { SECURITY_SOLUTION_OWNER } from '../../../common/constants'; -import { getEmptyTagValue } from '../empty_value'; +import { getEmptyCellValue } from '../empty_value'; import { useKibana } from '../../common/lib/kibana'; import { AllCasesList } from './all_cases_list'; import type { GetCasesColumn, UseCasesColumnsReturnValue } from './use_cases_columns'; @@ -48,7 +48,10 @@ import { userProfiles, userProfilesMap } from '../../containers/user_profiles/ap import { useBulkGetUserProfiles } from '../../containers/user_profiles/use_bulk_get_user_profiles'; import { useLicense } from '../../common/use_license'; import * as api from '../../containers/api'; +import { useGetCaseConfiguration } from '../../containers/configure/use_get_case_configuration'; +import { useCaseConfigureResponse } from '../configure_cases/__mock__'; +jest.mock('../../containers/configure/use_get_case_configuration'); jest.mock('../../containers/use_get_cases'); jest.mock('../../containers/use_get_action_license'); jest.mock('../../containers/use_get_tags'); @@ -64,6 +67,7 @@ jest.mock('../app/use_available_owners', () => ({ jest.mock('../../containers/use_update_case'); jest.mock('../../common/use_license'); +const useGetCaseConfigurationMock = useGetCaseConfiguration as jest.Mock; const useGetCasesMock = useGetCases as jest.Mock; const useGetTagsMock = useGetTags as jest.Mock; const useGetCurrentUserProfileMock = useGetCurrentUserProfile as jest.Mock; @@ -89,7 +93,7 @@ describe('AllCasesListGeneric', () => { const onRowClick = jest.fn(); const updateCaseProperty = jest.fn(); - const emptyTag = getEmptyTagValue().props.children; + const emptyTag = getEmptyCellValue().props.children; const defaultGetCases = { ...useGetCasesMockState, @@ -99,9 +103,11 @@ describe('AllCasesListGeneric', () => { filterStatus: CaseStatuses.open, handleIsLoading: jest.fn(), isLoadingCases: [], + isLoadingColumns: false, isSelectorView: false, userProfiles: new Map(), currentUserProfile: undefined, + selectedColumns: [], }; const removeMsFromDate = (value: string) => moment(value).format('YYYY-MM-DDTHH:mm:ss[Z]'); @@ -156,8 +162,9 @@ describe('AllCasesListGeneric', () => { useGetTagsMock.mockReturnValue({ data: ['coke', 'pepsi'], isLoading: false }); useGetCategoriesMock.mockReturnValue({ data: ['twix', 'snickers'], isLoading: false }); useGetCurrentUserProfileMock.mockReturnValue({ data: userProfiles[0], isLoading: false }); - useBulkGetUserProfilesMock.mockReturnValue({ data: userProfilesMap }); useGetConnectorsMock.mockImplementation(() => ({ data: connectorsMock, isLoading: false })); + useGetCaseConfigurationMock.mockImplementation(() => useCaseConfigureResponse); + useBulkGetUserProfilesMock.mockReturnValue({ data: userProfilesMap }); useUpdateCaseMock.mockReturnValue({ mutate: updateCaseProperty }); useLicenseMock.mockReturnValue({ isAtLeastPlatinum: () => false }); mockKibana(); @@ -1119,4 +1126,18 @@ describe('AllCasesListGeneric', () => { }); }); }); + + describe('Columns Popover', () => { + it('renders the columns popover correctly', async () => { + appMockRenderer.render(); + + expect(await screen.findByTestId('column-selection-popover-button')).toBeInTheDocument(); + }); + + it('does not render the columns popover when isSelectorView=true', () => { + appMockRenderer.render(); + + expect(screen.queryByTestId('column-selection-popover-button')).not.toBeInTheDocument(); + }); + }); }); diff --git a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx index f915dbe0b7e38..75fe22f8e53b6 100644 --- a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx @@ -37,6 +37,7 @@ import { useGetCurrentUserProfile } from '../../containers/user_profiles/use_get import { getAllPermissionsExceptFrom, isReadOnlyPermissions } from '../../utils/permissions'; import { useIsLoadingCases } from './use_is_loading_cases'; import { useAllCasesState } from './use_all_cases_state'; +import { useCasesColumnsSelection } from './use_cases_columns_selection'; const ProgressLoader = styled(EuiProgress)` ${({ $isShow }: { $isShow: boolean }) => @@ -209,14 +210,16 @@ export const AllCasesList = React.memo( ] ); - const { columns } = useCasesColumns({ + const { selectedColumns, setSelectedColumns } = useCasesColumnsSelection(); + + const { columns, isLoadingColumns } = useCasesColumns({ filterStatus: filterOptions.status ?? StatusAll, userProfiles: userProfiles ?? new Map(), isSelectorView, connectors, onRowClick, - showSolutionColumn: !hasOwner && availableSolutions.length > 1, disableActions: selectedCases.length > 0, + selectedColumns, }); const pagination = useMemo( @@ -260,7 +263,7 @@ export const AllCasesList = React.memo( size="xs" color="accent" className="essentialAnimation" - $isShow={isLoading || isLoadingCases} + $isShow={isLoading || isLoadingCases || isLoadingColumns} /> {!isSelectorView ? : null} ( data={data} goToCreateCase={onRowClick ? onCreateCasePressed : undefined} isCasesLoading={isLoadingCases} + isLoadingColumns={isLoadingColumns} isCommentUpdating={isLoadingCases} isDataEmpty={isDataEmpty} isSelectorView={isSelectorView} @@ -302,6 +306,8 @@ export const AllCasesList = React.memo( tableRef={tableRef} tableRowProps={tableRowProps} deselectCases={deselectCases} + selectedColumns={selectedColumns} + onSelectedColumnsChange={setSelectedColumns} /> ); diff --git a/x-pack/plugins/cases/public/components/all_cases/assignees_column.tsx b/x-pack/plugins/cases/public/components/all_cases/assignees_column.tsx index 41e936a7021c0..c11c5a9d6a602 100644 --- a/x-pack/plugins/cases/public/components/all_cases/assignees_column.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/assignees_column.tsx @@ -9,7 +9,7 @@ import React, { useCallback, useMemo, useState } from 'react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import type { UserProfileWithAvatar } from '@kbn/user-profile-components'; import type { CaseUI } from '../../../common/ui/types'; -import { getEmptyTagValue } from '../empty_value'; +import { getEmptyCellValue } from '../empty_value'; import { UserToolTip } from '../user_profiles/user_tooltip'; import { useAssignees } from '../../containers/user_profiles/use_assignees'; import { getUsernameDataTestSubj } from '../user_profiles/data_test_subject'; @@ -58,7 +58,7 @@ const AssigneesColumnComponent: React.FC = ({ }, [allAssignees, isAvatarListExpanded, limitedAvatars, shouldShowExpandListButton]); if (allAssignees.length <= 0) { - return getEmptyTagValue(); + return getEmptyCellValue(); } return ( diff --git a/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx b/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx new file mode 100644 index 0000000000000..062ed4dd131f4 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import type { AppMockRenderer } from '../../common/mock'; +import { createAppMockRenderer } from '../../common/mock'; +import { ColumnsPopover } from './columns_popover'; + +describe('ColumnsPopover', () => { + let appMockRenderer: AppMockRenderer; + + beforeEach(() => { + appMockRenderer = createAppMockRenderer(); + jest.clearAllMocks(); + }); + + const selectedColumns = [ + { field: 'title', name: 'Title', isChecked: true }, + { field: 'category', name: 'Category', isChecked: false }, + { field: 'tags', name: 'Tags', isChecked: false }, + ]; + + it('renders correctly a list of selected columns', async () => { + appMockRenderer.render( + {}} /> + ); + + userEvent.click(await screen.findByTestId('column-selection-popover-button')); + + expect(await screen.findByTestId('column-selection-popover')).toBeInTheDocument(); + + selectedColumns.forEach(({ field, name, isChecked }) => { + expect(screen.getByTestId(`column-selection-switch-${field}`)).toHaveAttribute( + 'aria-checked', + isChecked.toString() + ); + expect(screen.getByText(name)).toBeInTheDocument(); + }); + }); + + it('clicking a switch calls onSelectedColumnsChange with the right params', async () => { + const onSelectedColumnsChange = jest.fn(); + + appMockRenderer.render( + + ); + + userEvent.click(await screen.findByTestId('column-selection-popover-button')); + userEvent.click( + await screen.findByTestId(`column-selection-switch-${selectedColumns[0].field}`), + undefined, + { skipPointerEventsCheck: true } + ); + + await waitFor(() => { + expect(onSelectedColumnsChange).toHaveBeenCalledWith([ + { ...selectedColumns[0], isChecked: false }, + selectedColumns[1], + selectedColumns[2], + ]); + }); + }); + + it('clicking Show All calls onSelectedColumnsChange with the right params', async () => { + const onSelectedColumnsChange = jest.fn(); + + appMockRenderer.render( + + ); + + userEvent.click(await screen.findByTestId('column-selection-popover-button')); + userEvent.click(await screen.findByTestId('column-selection-popover-show-all-button')); + + const onSelectedColumnsChangeCallParams = selectedColumns.map((column) => ({ + ...column, + isChecked: true, + })); + + await waitFor(() => { + expect(onSelectedColumnsChange).toHaveBeenCalledWith(onSelectedColumnsChangeCallParams); + }); + }); + + it('clicking Hide All calls onSelectedColumnsChange with the right params', async () => { + const onSelectedColumnsChange = jest.fn(); + + appMockRenderer.render( + + ); + + userEvent.click(await screen.findByTestId('column-selection-popover-button')); + userEvent.click(await screen.findByTestId('column-selection-popover-hide-all-button')); + + await waitFor(() => { + expect(onSelectedColumnsChange).toHaveBeenCalledWith( + selectedColumns.map((column) => ({ ...column, isChecked: false })) + ); + }); + }); + + it('searching for text changes the column list correctly', async () => { + appMockRenderer.render( + {}} /> + ); + + userEvent.click(await screen.findByTestId('column-selection-popover-button')); + userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Title'); + + expect(await screen.findByTestId('column-selection-switch-title')).toBeInTheDocument(); + expect(screen.queryByTestId('column-selection-switch-category')).not.toBeInTheDocument(); + expect(screen.queryByTestId('column-selection-switch-tags')).not.toBeInTheDocument(); + }); + + it('searching for text does not change the list of selected columns', async () => { + const onSelectedColumnsChange = jest.fn(); + + appMockRenderer.render( + + ); + + userEvent.click(await screen.findByTestId('column-selection-popover-button')); + userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Category'); + + expect(onSelectedColumnsChange).not.toHaveBeenCalled(); + }); + + it('searching for text hides the drag and drop icons', async () => { + appMockRenderer.render( + {}} /> + ); + + userEvent.click(await screen.findByTestId('column-selection-popover-button')); + + expect(await screen.findAllByTestId('column-selection-popover-draggable-icon')).toHaveLength(3); + + userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Foobar'); + + expect( + await screen.queryByTestId('column-selection-popover-draggable-icon') + ).not.toBeInTheDocument(); + }); + + it('searching for text disables hideAll and showAll buttons', async () => { + appMockRenderer.render( + {}} /> + ); + + userEvent.click(await screen.findByTestId('column-selection-popover-button')); + userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Foobar'); + + expect(await screen.findByTestId('column-selection-popover-show-all-button')).toBeDisabled(); + expect(await screen.findByTestId('column-selection-popover-hide-all-button')).toBeDisabled(); + }); +}); 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 new file mode 100644 index 0000000000000..e95afcc159e98 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/columns_popover.tsx @@ -0,0 +1,232 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { ChangeEvent } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; + +import type { DropResult } from '@elastic/eui'; + +import { + EuiFieldSearch, + EuiHighlight, + EuiPopoverFooter, + EuiPopoverTitle, + EuiFlexGroup, + EuiFlexItem, + EuiPopover, + EuiDragDropContext, + EuiButtonEmpty, + EuiDraggable, + EuiDroppable, + EuiPanel, + euiDragDropReorder, + EuiIcon, + EuiSwitch, + useEuiTheme, +} from '@elastic/eui'; + +import type { CasesColumnSelection } from './types'; + +import * as i18n from './translations'; + +interface Props { + selectedColumns: CasesColumnSelection[]; + onSelectedColumnsChange: (columns: CasesColumnSelection[]) => void; +} + +interface ToggleColumnsParams { + isChecked: boolean; + field?: string; +} + +export const ColumnsPopover: React.FC = ({ + selectedColumns, + onSelectedColumnsChange, +}: Props) => { + const { euiTheme } = useEuiTheme(); + + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const togglePopover = useCallback(() => setIsPopoverOpen((prevValue) => !prevValue), []); + const closePopover = useCallback(() => setIsPopoverOpen(false), []); + + const [columnSearchText, setColumnSearchText] = useState(''); + + const isDragEnabled = columnSearchText.length === 0; + + const toggleColumns = useCallback( + ({ isChecked, field }: ToggleColumnsParams) => { + const newSelectedColumns = selectedColumns.map((column) => { + if (column.field === field || !field) { + return { ...column, isChecked }; + } + return column; + }); + + onSelectedColumnsChange(newSelectedColumns); + }, + [selectedColumns, onSelectedColumnsChange] + ); + + const showAll = useCallback(() => toggleColumns({ isChecked: true }), [toggleColumns]); + const hideAll = useCallback(() => toggleColumns({ isChecked: false }), [toggleColumns]); + + const onDragEnd = ({ source, destination }: DropResult) => { + if (source && destination) { + const reorderedColumns = euiDragDropReorder(selectedColumns, source.index, destination.index); + + onSelectedColumnsChange(reorderedColumns); + } + }; + + const filteredColumns = useMemo( + () => + selectedColumns.filter( + ({ name }) => name.toLowerCase().indexOf(columnSearchText.toLowerCase()) !== -1 + ), + [selectedColumns, columnSearchText] + ); + + return ( + + {i18n.COLUMNS} + + } + > + + ) => + setColumnSearchText(e.currentTarget.value) + } + data-test-subj="column-selection-popover-search" + /> + + + + + + {filteredColumns.map(({ field, name, isChecked }, idx) => ( + + {(provided) => ( + + + + {name} + + } + checked={isChecked} + data-test-subj={`column-selection-switch-${field}`} + onChange={(e) => toggleColumns({ field, isChecked: e.target.checked })} + compressed + labelProps={{ + style: { + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + width: '190px', + overflow: 'hidden', + }, + }} + /> + + {isDragEnabled && ( + + + + + + )} + + )} + + ))} + + + + + + + + + {i18n.SHOW_ALL} + + + + + {i18n.HIDE_ALL} + + + + + + ); +}; +ColumnsPopover.displayName = 'ColumnsPopover'; diff --git a/x-pack/plugins/cases/public/components/all_cases/table.tsx b/x-pack/plugins/cases/public/components/all_cases/table.tsx index ae60e942dc75a..e50d54b8a9d6f 100644 --- a/x-pack/plugins/cases/public/components/all_cases/table.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/table.tsx @@ -14,7 +14,10 @@ import styled from 'styled-components'; import { CasesTableUtilityBar } from './utility_bar'; import { LinkButton } from '../links'; + import type { CasesFindResponseUI, CasesUI, CaseUI } from '../../../common/ui/types'; +import type { CasesColumnSelection } from './types'; + import * as i18n from './translations'; import { useCreateCaseNavigation } from '../../common/navigation'; import { useCasesContext } from '../cases_context/use_cases_context'; @@ -35,6 +38,9 @@ interface CasesTableProps { tableRef: MutableRefObject; tableRowProps: EuiBasicTableProps['rowProps']; deselectCases: () => void; + selectedColumns: CasesColumnSelection[]; + onSelectedColumnsChange: (columns: CasesColumnSelection[]) => void; + isLoadingColumns: boolean; } const Div = styled.div` @@ -57,6 +63,9 @@ export const CasesTable: FunctionComponent = ({ tableRef, tableRowProps, deselectCases, + selectedColumns, + onSelectedColumnsChange, + isLoadingColumns, }) => { const { permissions } = useCasesContext(); const { getCreateCaseUrl, navigateToCreateCase } = useCreateCaseNavigation(); @@ -72,7 +81,7 @@ export const CasesTable: FunctionComponent = ({ [goToCreateCase, navigateToCreateCase] ); - return isCasesLoading && isDataEmpty ? ( + return (isCasesLoading && isDataEmpty) || isLoadingColumns ? (
@@ -84,6 +93,8 @@ export const CasesTable: FunctionComponent = ({ totalCases={data.total ?? 0} selectedCases={selectedCases} deselectCases={deselectCases} + selectedColumns={selectedColumns} + onSelectedColumnsChange={onSelectedColumnsChange} /> { let appMockRender: AppMockRenderer; @@ -26,24 +46,35 @@ describe('useCasesColumns ', () => { filterStatus: CaseStatuses.open, userProfiles: userProfilesMap, isSelectorView: false, - showSolutionColumn: true, + selectedColumns: DEFAULT_SELECTED_COLUMNS, }; beforeEach(() => { jest.clearAllMocks(); appMockRender = createAppMockRenderer(); + useGetCaseConfigurationMock.mockImplementation(() => useCaseConfigureResponse); }); - it('return all columns correctly', async () => { + it('return all selected columns correctly', async () => { const license = licensingMock.createLicense({ license: { type: 'platinum' }, }); appMockRender = createAppMockRenderer({ license }); - const { result } = renderHook(() => useCasesColumns(useCasesColumnsProps), { - wrapper: appMockRender.AppWrapper, - }); + const { result } = renderHook( + () => + useCasesColumns({ + ...useCasesColumnsProps, + selectedColumns: DEFAULT_SELECTED_COLUMNS.map((element) => ({ + ...element, + isChecked: true, + })), + }), + { + wrapper: appMockRender.AppWrapper, + } + ); expect(result.current).toMatchInlineSnapshot(` Object { @@ -74,12 +105,6 @@ describe('useCasesColumns ', () => { "render": [Function], "width": "80px", }, - Object { - "align": "right", - "field": "owner", - "name": "Solution", - "render": [Function], - }, Object { "align": "right", "field": "totalComment", @@ -105,6 +130,12 @@ describe('useCasesColumns ', () => { "render": [Function], "sortable": true, }, + Object { + "field": "closedAt", + "name": "Closed on", + "render": [Function], + "sortable": true, + }, Object { "name": "External incident", "render": [Function], @@ -129,77 +160,22 @@ describe('useCasesColumns ', () => { "render": [Function], }, ], + "isLoadingColumns": false, } `); }); - it('returns the assignees column without the width specified when in the modal view', async () => { + it('only returns selected columns', async () => { const license = licensingMock.createLicense({ license: { type: 'platinum' }, }); appMockRender = createAppMockRenderer({ license }); - const { result } = renderHook( - () => useCasesColumns({ ...useCasesColumnsProps, isSelectorView: true }), - { - wrapper: appMockRender.AppWrapper, - } - ); - - expect(result.current).toMatchInlineSnapshot(` - Object { - "columns": Array [ - Object { - "field": "title", - "name": "Name", - "render": [Function], - "sortable": true, - "width": "55%", - }, - Object { - "field": "category", - "name": "Category", - "render": [Function], - "sortable": true, - "width": "100px", - }, - Object { - "field": "createdAt", - "name": "Created on", - "render": [Function], - "sortable": true, - }, - Object { - "field": "severity", - "name": "Severity", - "render": [Function], - "sortable": true, - "width": "90px", - }, - Object { - "align": "right", - "render": [Function], - }, - ], - } - `); - }); - - it('does not render the solution columns', async () => { - const license = licensingMock.createLicense({ - license: { type: 'platinum' }, + const { result } = renderHook(() => useCasesColumns(useCasesColumnsProps), { + wrapper: appMockRender.AppWrapper, }); - appMockRender = createAppMockRenderer({ license }); - - const { result } = renderHook( - () => useCasesColumns({ ...useCasesColumnsProps, showSolutionColumn: false }), - { - wrapper: appMockRender.AppWrapper, - } - ); - expect(result.current).toMatchInlineSnapshot(` Object { "columns": Array [ @@ -278,20 +254,24 @@ describe('useCasesColumns ', () => { "render": [Function], }, ], + "isLoadingColumns": false, } `); }); - it('does not return the alerts column', async () => { + it('returns the assignees column without the width specified when in the modal view', async () => { const license = licensingMock.createLicense({ license: { type: 'platinum' }, }); - appMockRender = createAppMockRenderer({ license, features: { alerts: { enabled: false } } }); + appMockRender = createAppMockRenderer({ license }); - const { result } = renderHook(() => useCasesColumns(useCasesColumnsProps), { - wrapper: appMockRender.AppWrapper, - }); + const { result } = renderHook( + () => useCasesColumns({ ...useCasesColumnsProps, isSelectorView: true }), + { + wrapper: appMockRender.AppWrapper, + } + ); expect(result.current).toMatchInlineSnapshot(` Object { @@ -301,31 +281,7 @@ describe('useCasesColumns ', () => { "name": "Name", "render": [Function], "sortable": true, - "width": "20%", - }, - Object { - "field": "assignees", - "name": "Assignees", - "render": [Function], - "width": "180px", - }, - Object { - "field": "tags", - "name": "Tags", - "render": [Function], - "width": "15%", - }, - Object { - "align": "right", - "field": "owner", - "name": "Solution", - "render": [Function], - }, - Object { - "align": "right", - "field": "totalComment", - "name": "Comments", - "render": [Function], + "width": "55%", }, Object { "field": "category", @@ -340,23 +296,6 @@ describe('useCasesColumns ', () => { "render": [Function], "sortable": true, }, - Object { - "field": "updatedAt", - "name": "Updated on", - "render": [Function], - "sortable": true, - }, - Object { - "name": "External incident", - "render": [Function], - "width": undefined, - }, - Object { - "field": "status", - "name": "Status", - "render": [Function], - "sortable": true, - }, Object { "field": "severity", "name": "Severity", @@ -366,18 +305,21 @@ describe('useCasesColumns ', () => { }, Object { "align": "right", - "name": "Actions", "render": [Function], }, ], + "isLoadingColumns": false, } `); }); - it('does not return the assignees column', async () => { - const { result } = renderHook(() => useCasesColumns(useCasesColumnsProps), { - wrapper: appMockRender.AppWrapper, - }); + it('shows the select button if isSelectorView=true', async () => { + const { result } = renderHook( + () => useCasesColumns({ ...useCasesColumnsProps, isSelectorView: true }), + { + wrapper: appMockRender.AppWrapper, + } + ); expect(result.current).toMatchInlineSnapshot(` Object { @@ -387,33 +329,56 @@ describe('useCasesColumns ', () => { "name": "Name", "render": [Function], "sortable": true, - "width": "20%", + "width": "55%", }, Object { - "field": "tags", - "name": "Tags", + "field": "category", + "name": "Category", "render": [Function], - "width": "15%", + "sortable": true, + "width": "100px", }, Object { - "align": "right", - "field": "totalAlerts", - "name": "Alerts", + "field": "createdAt", + "name": "Created on", "render": [Function], - "width": "80px", + "sortable": true, }, Object { - "align": "right", - "field": "owner", - "name": "Solution", + "field": "severity", + "name": "Severity", "render": [Function], + "sortable": true, + "width": "90px", }, Object { "align": "right", - "field": "totalComment", - "name": "Comments", "render": [Function], }, + ], + "isLoadingColumns": false, + } + `); + }); + + it('shows the correct columns if isSelectorView=true', async () => { + const { result } = renderHook( + () => useCasesColumns({ ...useCasesColumnsProps, isSelectorView: true }), + { + wrapper: appMockRender.AppWrapper, + } + ); + + expect(result.current).toMatchInlineSnapshot(` + Object { + "columns": Array [ + Object { + "field": "title", + "name": "Name", + "render": [Function], + "sortable": true, + "width": "55%", + }, Object { "field": "category", "name": "Category", @@ -427,23 +392,6 @@ describe('useCasesColumns ', () => { "render": [Function], "sortable": true, }, - Object { - "field": "updatedAt", - "name": "Updated on", - "render": [Function], - "sortable": true, - }, - Object { - "name": "External incident", - "render": [Function], - "width": undefined, - }, - Object { - "field": "status", - "name": "Status", - "render": [Function], - "sortable": true, - }, Object { "field": "severity", "name": "Severity", @@ -453,23 +401,20 @@ describe('useCasesColumns ', () => { }, Object { "align": "right", - "name": "Actions", "render": [Function], }, ], + "isLoadingColumns": false, } `); }); - it('shows the closedAt column if the filterStatus=closed', async () => { - appMockRender = createAppMockRenderer(); + it('does not shows the actions if the user does not have the right permissions', async () => { + appMockRender = createAppMockRenderer({ permissions: readCasesPermissions() }); - const { result } = renderHook( - () => useCasesColumns({ ...useCasesColumnsProps, filterStatus: CaseStatuses.closed }), - { - wrapper: appMockRender.AppWrapper, - } - ); + const { result } = renderHook(() => useCasesColumns(useCasesColumnsProps), { + wrapper: appMockRender.AppWrapper, + }); expect(result.current).toMatchInlineSnapshot(` Object { @@ -494,12 +439,6 @@ describe('useCasesColumns ', () => { "render": [Function], "width": "80px", }, - Object { - "align": "right", - "field": "owner", - "name": "Solution", - "render": [Function], - }, Object { "align": "right", "field": "totalComment", @@ -514,8 +453,8 @@ describe('useCasesColumns ', () => { "width": "100px", }, Object { - "field": "closedAt", - "name": "Closed on", + "field": "createdAt", + "name": "Created on", "render": [Function], "sortable": true, }, @@ -543,117 +482,46 @@ describe('useCasesColumns ', () => { "sortable": true, "width": "90px", }, - Object { - "align": "right", - "name": "Actions", - "render": [Function], - }, ], + "isLoadingColumns": false, } `); }); - it('shows the select button if isSelectorView=true', async () => { - const { result } = renderHook( - () => useCasesColumns({ ...useCasesColumnsProps, isSelectorView: true }), - { - wrapper: appMockRender.AppWrapper, - } - ); + it('returns custom field columns', async () => { + const textKey = 'text_key'; + const toggleKey = 'toggle_key'; - expect(result.current).toMatchInlineSnapshot(` - Object { - "columns": Array [ - Object { - "field": "title", - "name": "Name", - "render": [Function], - "sortable": true, - "width": "55%", - }, - Object { - "field": "category", - "name": "Category", - "render": [Function], - "sortable": true, - "width": "100px", - }, - Object { - "field": "createdAt", - "name": "Created on", - "render": [Function], - "sortable": true, - }, - Object { - "field": "severity", - "name": "Severity", - "render": [Function], - "sortable": true, - "width": "90px", - }, - Object { - "align": "right", - "render": [Function], - }, + const textLabel = 'Text Label'; + const toggleLabel = 'Toggle Label'; + + appMockRender = createAppMockRenderer({ permissions: readCasesPermissions() }); + useGetCaseConfigurationMock.mockImplementation(() => ({ + data: { + ...useCaseConfigureResponse.data, + customFields: [ + { key: textKey, label: textLabel, type: CustomFieldTypes.TEXT }, + { key: toggleKey, label: toggleLabel, type: CustomFieldTypes.TOGGLE }, ], - } - `); - }); + }, + isFetching: false, + })); - it('does not shows the actions if isSelectorView=true', async () => { const { result } = renderHook( - () => useCasesColumns({ ...useCasesColumnsProps, isSelectorView: true }), + () => + useCasesColumns({ + ...useCasesColumnsProps, + selectedColumns: [ + ...DEFAULT_SELECTED_COLUMNS, + { field: textKey, name: textLabel, isChecked: true }, + { field: toggleKey, name: toggleLabel, isChecked: true }, + ], + }), { wrapper: appMockRender.AppWrapper, } ); - expect(result.current).toMatchInlineSnapshot(` - Object { - "columns": Array [ - Object { - "field": "title", - "name": "Name", - "render": [Function], - "sortable": true, - "width": "55%", - }, - Object { - "field": "category", - "name": "Category", - "render": [Function], - "sortable": true, - "width": "100px", - }, - Object { - "field": "createdAt", - "name": "Created on", - "render": [Function], - "sortable": true, - }, - Object { - "field": "severity", - "name": "Severity", - "render": [Function], - "sortable": true, - "width": "90px", - }, - Object { - "align": "right", - "render": [Function], - }, - ], - } - `); - }); - - it('does not shows the actions if the user does not have the right permissions', async () => { - appMockRender = createAppMockRenderer({ permissions: readCasesPermissions() }); - - const { result } = renderHook(() => useCasesColumns(useCasesColumnsProps), { - wrapper: appMockRender.AppWrapper, - }); - expect(result.current).toMatchInlineSnapshot(` Object { "columns": Array [ @@ -677,12 +545,6 @@ describe('useCasesColumns ', () => { "render": [Function], "width": "80px", }, - Object { - "align": "right", - "field": "owner", - "name": "Solution", - "render": [Function], - }, Object { "align": "right", "field": "totalComment", @@ -726,7 +588,20 @@ describe('useCasesColumns ', () => { "sortable": true, "width": "90px", }, + Object { + "data-test-subj": "text-custom-field-column", + "name": "Text Label", + "render": [Function], + "width": "250px", + }, + Object { + "data-test-subj": "toggle-custom-field-column", + "name": "Toggle Label", + "render": [Function], + "width": "100px", + }, ], + "isLoadingColumns": false, } `); }); 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 0863e51daef5c..6ef5dcae9fe6b 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 @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useMemo } from 'react'; import type { EuiTableActionsColumnType, EuiTableComputedColumnType, @@ -27,22 +27,22 @@ import type { UserProfileWithAvatar } from '@kbn/user-profile-components'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; import type { ActionConnector } from '../../../common/types/domain'; -import { CaseSeverity, CaseStatuses } from '../../../common/types/domain'; +import { CaseSeverity } from '../../../common/types/domain'; import type { CaseUI } from '../../../common/ui/types'; -import { OWNER_INFO } from '../../../common/constants'; -import { getEmptyTagValue } from '../empty_value'; +import type { CasesColumnSelection } from './types'; +import { getEmptyCellValue } from '../empty_value'; import { FormattedRelativePreferenceDate } from '../formatted_date'; import { CaseDetailsLink } from '../links'; import * as i18n from './translations'; -import { ALERTS } from '../../common/translations'; import { useActions } from './use_actions'; +import { useCasesColumnsConfiguration } from './use_cases_columns_configuration'; import { useApplicationCapabilities, useKibana } from '../../common/lib/kibana'; import { TruncatedText } from '../truncated_text'; import { getConnectorIcon } from '../utils'; -import type { CasesOwners } from '../../client/helpers/can_use_cases'; import { severities } from '../severity/config'; -import { useCasesFeatures } from '../../common/use_cases_features'; import { AssigneesColumn } from './assignees_column'; +import { builderMap as customFieldsBuilderMap } from '../custom_fields/builder'; +import { useGetCaseConfiguration } from '../../containers/configure/use_get_case_configuration'; type CasesColumns = | EuiTableActionsColumnType @@ -67,34 +67,39 @@ const StyledEuiBadge = euiStyled(EuiBadge)` `; // to allow for ellipsis const renderStringField = (field: string, dataTestSubj: string) => - field != null ? {field} : getEmptyTagValue(); + field != null ? {field} : getEmptyCellValue(); export interface GetCasesColumn { filterStatus: string; userProfiles: Map; isSelectorView: boolean; + selectedColumns: CasesColumnSelection[]; connectors?: ActionConnector[]; onRowClick?: (theCase: CaseUI) => void; - showSolutionColumn?: boolean; disableActions?: boolean; } export interface UseCasesColumnsReturnValue { columns: CasesColumns[]; + isLoadingColumns: boolean; } export const useCasesColumns = ({ - filterStatus, userProfiles, isSelectorView, connectors = [], onRowClick, - showSolutionColumn, disableActions = false, + selectedColumns, }: GetCasesColumn): UseCasesColumnsReturnValue => { - const { isAlertsEnabled, caseAssignmentAuthorized } = useCasesFeatures(); + const casesColumnsConfig = useCasesColumnsConfiguration(isSelectorView); const { actions } = useActions({ disableActions }); + const { + data: { customFields }, + isFetching: isLoadingColumns, + } = useGetCaseConfiguration(); + const assignCaseAction = useCallback( async (theCase: CaseUI) => { if (onRowClick) { @@ -104,275 +109,270 @@ export const useCasesColumns = ({ [onRowClick] ); - const columns: CasesColumns[] = [ - { - field: 'title', - name: i18n.NAME, - sortable: true, - render: (title: string, theCase: CaseUI) => { - if (theCase.id != null && theCase.title != null) { - const caseDetailsLinkComponent = isSelectorView ? ( - theCase.title - ) : ( - - - - ); - - return caseDetailsLinkComponent; - } - return getEmptyTagValue(); + const columnsDict: Record = useMemo( + () => ({ + title: { + field: casesColumnsConfig.title.field, + name: casesColumnsConfig.title.name, + sortable: true, + render: (title: string, theCase: CaseUI) => { + if (theCase.id != null && theCase.title != null) { + const caseDetailsLinkComponent = isSelectorView ? ( + theCase.title + ) : ( + + + + ); + + return caseDetailsLinkComponent; + } + return getEmptyCellValue(); + }, + width: !isSelectorView ? '20%' : '55%', }, - width: !isSelectorView ? '20%' : '55%', - }, - ]; - - if (caseAssignmentAuthorized && !isSelectorView) { - columns.push({ - field: 'assignees', - name: i18n.ASSIGNEES, - render: (assignees: CaseUI['assignees']) => ( - - ), - width: '180px', - }); - } - - if (!isSelectorView) { - columns.push({ - field: 'tags', - name: i18n.TAGS, - render: (tags: CaseUI['tags']) => { - if (tags != null && tags.length > 0) { - const clampedBadges = ( - - {tags.map((tag: string, i: number) => ( - - {tag} - - ))} - - ); - - const unclampedBadges = ( - - {tags.map((tag: string, i: number) => ( - - {tag} - - ))} - - ); - - return ( - - {clampedBadges} - - ); - } - return getEmptyTagValue(); + assignees: { + field: casesColumnsConfig.assignees.field, + name: casesColumnsConfig.assignees.name, + render: (assignees: CaseUI['assignees']) => ( + + ), + width: '180px', }, - width: '15%', - }); - } - - if (isAlertsEnabled && !isSelectorView) { - columns.push({ - align: RIGHT_ALIGNMENT, - field: 'totalAlerts', - name: ALERTS, - render: (totalAlerts: CaseUI['totalAlerts']) => - totalAlerts != null - ? renderStringField(`${totalAlerts}`, `case-table-column-alertsCount`) - : getEmptyTagValue(), - width: !isSelectorView ? '80px' : '55px', - }); - } - - if (showSolutionColumn && !isSelectorView) { - columns.push({ - align: RIGHT_ALIGNMENT, - field: 'owner', - name: i18n.SOLUTION, - render: (caseOwner: CasesOwners) => { - const ownerInfo = OWNER_INFO[caseOwner]; - return ownerInfo ? ( - - ) : ( - getEmptyTagValue() - ); + tags: { + field: casesColumnsConfig.tags.field, + name: casesColumnsConfig.tags.name, + render: (tags: CaseUI['tags']) => { + if (tags != null && tags.length > 0) { + const clampedBadges = ( + + {tags.map((tag: string, i: number) => ( + + {tag} + + ))} + + ); + + const unclampedBadges = ( + + {tags.map((tag: string, i: number) => ( + + {tag} + + ))} + + ); + + return ( + + {clampedBadges} + + ); + } + return getEmptyCellValue(); + }, + width: '15%', }, - }); - } - - if (!isSelectorView) { - columns.push({ - align: RIGHT_ALIGNMENT, - field: 'totalComment', - name: i18n.COMMENTS, - render: (totalComment: CaseUI['totalComment']) => - totalComment != null - ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) - : getEmptyTagValue(), - }); - } - - columns.push({ - field: 'category', - name: i18n.CATEGORY, - sortable: true, - render: (category: CaseUI['category']) => { - if (category != null) { - return {category}; - } - return getEmptyTagValue(); - }, - width: '100px', - }); - - if (filterStatus === CaseStatuses.closed) { - columns.push({ - field: 'closedAt', - name: i18n.CLOSED_ON, - sortable: true, - render: (closedAt: CaseUI['closedAt']) => { - if (closedAt != null) { - return ( - - - - ); - } - return getEmptyTagValue(); + totalAlerts: { + field: casesColumnsConfig.totalAlerts.field, + name: casesColumnsConfig.totalAlerts.name, + align: RIGHT_ALIGNMENT, + render: (totalAlerts: CaseUI['totalAlerts']) => + totalAlerts != null + ? renderStringField(`${totalAlerts}`, `case-table-column-alertsCount`) + : getEmptyCellValue(), + width: !isSelectorView ? '80px' : '55px', }, - }); - } else { - columns.push({ - field: 'createdAt', - name: i18n.CREATED_ON, - sortable: true, - render: (createdAt: CaseUI['createdAt']) => { - if (createdAt != null) { - return ( - - - - ); - } - return getEmptyTagValue(); + totalComment: { + field: casesColumnsConfig.totalComment.field, + name: casesColumnsConfig.totalComment.name, + align: RIGHT_ALIGNMENT, + render: (totalComment: CaseUI['totalComment']) => + totalComment != null + ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) + : getEmptyCellValue(), }, - }); - } - - if (!isSelectorView) { - columns.push({ - field: 'updatedAt', - name: i18n.UPDATED_ON, - sortable: true, - render: (updatedAt: CaseUI['updatedAt']) => { - if (updatedAt != null) { - return ( - - - - ); - } - return getEmptyTagValue(); + category: { + field: casesColumnsConfig.category.field, + name: casesColumnsConfig.category.name, + sortable: true, + render: (category: CaseUI['category']) => { + if (category != null) { + return ( + {category} + ); + } + return getEmptyCellValue(); + }, + width: '100px', }, - }); - } - - if (!isSelectorView) { - columns.push( - { - name: i18n.EXTERNAL_INCIDENT, + closedAt: { + field: casesColumnsConfig.closedAt.field, + name: casesColumnsConfig.closedAt.name, + sortable: true, + render: (closedAt: CaseUI['closedAt']) => { + if (closedAt != null) { + return ( + + + + ); + } + return getEmptyCellValue(); + }, + }, + createdAt: { + field: casesColumnsConfig.createdAt.field, + name: casesColumnsConfig.createdAt.name, + sortable: true, + render: (createdAt: CaseUI['createdAt']) => { + if (createdAt != null) { + return ( + + + + ); + } + return getEmptyCellValue(); + }, + }, + updatedAt: { + field: casesColumnsConfig.updatedAt.field, + name: casesColumnsConfig.updatedAt.name, + sortable: true, + render: (updatedAt: CaseUI['updatedAt']) => { + if (updatedAt != null) { + return ( + + + + ); + } + return getEmptyCellValue(); + }, + }, + externalIncident: { + // no field + name: casesColumnsConfig.externalIncident.name, render: (theCase: CaseUI) => { if (theCase.id != null) { return ; } - return getEmptyTagValue(); + return getEmptyCellValue(); }, width: isSelectorView ? '80px' : undefined, }, - { - field: 'status', - name: i18n.STATUS, + status: { + field: casesColumnsConfig.status.field, + name: casesColumnsConfig.status.name, sortable: true, render: (status: CaseUI['status']) => { if (status != null) { return ; } - return getEmptyTagValue(); + return getEmptyCellValue(); }, - } - ); - } - columns.push({ - field: 'severity', - name: i18n.SEVERITY, - sortable: true, - render: (severity: CaseUI['severity']) => { - if (severity != null) { - const severityData = severities[severity ?? CaseSeverity.LOW]; - return ( - - {severityData.label} - - ); - } - return getEmptyTagValue(); - }, - width: '90px', - }); + }, + severity: { + field: casesColumnsConfig.severity.field, + name: casesColumnsConfig.severity.name, + sortable: true, + render: (severity: CaseUI['severity']) => { + if (severity != null) { + const severityData = severities[severity ?? CaseSeverity.LOW]; + return ( + + {severityData.label} + + ); + } + return getEmptyCellValue(); + }, + width: '90px', + }, + assignCaseAction: { + // no field + align: RIGHT_ALIGNMENT, + render: (theCase: CaseUI) => { + if (theCase.id != null) { + return ( + { + assignCaseAction(theCase); + }} + size="s" + > + {i18n.SELECT} + + ); + } + return getEmptyCellValue(); + }, + }, + }), + [assignCaseAction, casesColumnsConfig, connectors, isSelectorView, userProfiles] + ); - if (isSelectorView) { - columns.push({ - align: RIGHT_ALIGNMENT, - render: (theCase: CaseUI) => { - if (theCase.id != null) { - return ( - { - assignCaseAction(theCase); - }} - size="s" - > - {i18n.SELECT} - + // we need to extend the columnsDict with the columns of + // the customFields + customFields.forEach(({ key, type, label }) => { + if (type in customFieldsBuilderMap) { + const columnDefinition = customFieldsBuilderMap[type]().getEuiTableColumn({ label }); + + columnsDict[key] = { + ...columnDefinition, + render: (theCase: CaseUI) => { + const customField = theCase.customFields.find( + (element) => element.key === key && element.value !== null ); - } - return getEmptyTagValue(); - }, - }); - } - if (!isSelectorView && actions) { + if (!customField) { + return getEmptyCellValue(); + } + + return columnDefinition.render(customField); + }, + }; + } + }); + + const columns: CasesColumns[] = []; + + selectedColumns.forEach(({ field, isChecked }) => { + if ( + field in columnsDict && + (isChecked || isSelectorView) && + casesColumnsConfig[field].canDisplay + ) { + columns.push(columnsDict[field]); + } + }); + + if (isSelectorView) { + columns.push(columnsDict.assignCaseAction); + } else if (actions) { columns.push(actions); } - return { columns }; + return { columns, isLoadingColumns }; }; interface Props { diff --git a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_configuration.test.tsx b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_configuration.test.tsx new file mode 100644 index 0000000000000..761da1d6316e8 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_configuration.test.tsx @@ -0,0 +1,199 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { licensingMock } from '@kbn/licensing-plugin/public/mocks'; +import { renderHook } from '@testing-library/react-hooks'; + +import type { AppMockRenderer } from '../../common/mock'; +import { createAppMockRenderer } from '../../common/mock'; +import { useCasesFeatures } from '../../common/use_cases_features'; + +import { useCasesColumnsConfiguration } from './use_cases_columns_configuration'; +import { useGetCaseConfiguration } from '../../containers/configure/use_get_case_configuration'; +import { useCaseConfigureResponse } from '../configure_cases/__mock__'; +import { CustomFieldTypes } from '../../../common/types/domain'; + +jest.mock('../../common/use_cases_features'); +jest.mock('../../containers/configure/use_get_case_configuration'); + +const useGetCaseConfigurationMock = useGetCaseConfiguration as jest.Mock; +const useCasesFeaturesMock = useCasesFeatures as jest.Mock; + +describe('useCasesColumnsConfiguration ', () => { + let appMockRender: AppMockRenderer; + const license = licensingMock.createLicense({ + license: { type: 'platinum' }, + }); + + beforeEach(() => { + jest.clearAllMocks(); + appMockRender = createAppMockRenderer({ license }); + useCasesFeaturesMock.mockReturnValue({ + caseAssignmentAuthorized: true, + isAlertsEnabled: true, + }); + useGetCaseConfigurationMock.mockImplementation(() => useCaseConfigureResponse); + }); + + it('returns all columns correctly', async () => { + const { result } = renderHook(() => useCasesColumnsConfiguration(), { + wrapper: appMockRender.AppWrapper, + }); + + expect(result.current).toMatchInlineSnapshot(` + Object { + "assignees": Object { + "canDisplay": true, + "field": "assignees", + "isCheckedDefault": true, + "name": "Assignees", + }, + "category": Object { + "canDisplay": true, + "field": "category", + "isCheckedDefault": true, + "name": "Category", + }, + "closedAt": Object { + "canDisplay": true, + "field": "closedAt", + "isCheckedDefault": false, + "name": "Closed on", + }, + "createdAt": Object { + "canDisplay": true, + "field": "createdAt", + "isCheckedDefault": true, + "name": "Created on", + }, + "externalIncident": Object { + "canDisplay": true, + "field": "externalIncident", + "isCheckedDefault": true, + "name": "External incident", + }, + "severity": Object { + "canDisplay": true, + "field": "severity", + "isCheckedDefault": true, + "name": "Severity", + }, + "status": Object { + "canDisplay": true, + "field": "status", + "isCheckedDefault": true, + "name": "Status", + }, + "tags": Object { + "canDisplay": true, + "field": "tags", + "isCheckedDefault": true, + "name": "Tags", + }, + "title": Object { + "canDisplay": true, + "field": "title", + "isCheckedDefault": true, + "name": "Name", + }, + "totalAlerts": Object { + "canDisplay": true, + "field": "totalAlerts", + "isCheckedDefault": true, + "name": "Alerts", + }, + "totalComment": Object { + "canDisplay": true, + "field": "totalComment", + "isCheckedDefault": true, + "name": "Comments", + }, + "updatedAt": Object { + "canDisplay": true, + "field": "updatedAt", + "isCheckedDefault": true, + "name": "Updated on", + }, + } + `); + }); + + it('cannot display assignees when case assignment is not authorized', async () => { + useCasesFeaturesMock.mockReturnValue({ + caseAssignmentAuthorized: false, + isAlertsEnabled: true, + }); + + const { result } = renderHook(() => useCasesColumnsConfiguration(), { + wrapper: appMockRender.AppWrapper, + }); + + expect(result.current.assignees).toMatchInlineSnapshot(` + Object { + "canDisplay": false, + "field": "assignees", + "isCheckedDefault": true, + "name": "Assignees", + } + `); + }); + + it('cannot display alerts if alerts are not enabled', async () => { + useCasesFeaturesMock.mockReturnValue({ + caseAssignmentAuthorized: true, + isAlertsEnabled: false, + }); + + const { result } = renderHook(() => useCasesColumnsConfiguration(), { + wrapper: appMockRender.AppWrapper, + }); + + expect(result.current.totalAlerts).toMatchInlineSnapshot(` + Object { + "canDisplay": false, + "field": "totalAlerts", + "isCheckedDefault": true, + "name": "Alerts", + } + `); + }); + + it('includes custom field columns correctly', async () => { + const textKey = 'text_key'; + const toggleKey = 'toggle_key'; + + const textLabel = 'Text Label'; + const toggleLabel = 'Toggle Label'; + + useGetCaseConfigurationMock.mockImplementation(() => ({ + data: { + ...useCaseConfigureResponse.data, + customFields: [ + { key: textKey, label: textLabel, type: CustomFieldTypes.TEXT }, + { key: toggleKey, label: toggleLabel, type: CustomFieldTypes.TOGGLE }, + ], + }, + })); + + const { result } = renderHook(() => useCasesColumnsConfiguration(), { + wrapper: appMockRender.AppWrapper, + }); + + expect(result.current[textKey]).toEqual({ + field: textKey, + name: textLabel, + canDisplay: true, + isCheckedDefault: false, + }); + expect(result.current[toggleKey]).toEqual({ + field: toggleKey, + name: toggleLabel, + canDisplay: true, + isCheckedDefault: false, + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_configuration.tsx b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_configuration.tsx new file mode 100644 index 0000000000000..fd795320bcf99 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_configuration.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as i18n from './translations'; +import { ALERTS } from '../../common/translations'; +import { useCasesFeatures } from '../../common/use_cases_features'; +import { useGetCaseConfiguration } from '../../containers/configure/use_get_case_configuration'; + +export type CasesColumnsConfiguration = Record< + string, + { + field: string; + name: string; + canDisplay: boolean; + isCheckedDefault: boolean; + } +>; + +export const useCasesColumnsConfiguration = ( + isSelectorView?: boolean +): CasesColumnsConfiguration => { + const { isAlertsEnabled, caseAssignmentAuthorized } = useCasesFeatures(); + const { + data: { customFields }, + } = useGetCaseConfiguration(); + + const canDisplayDefault = true; + + const result: CasesColumnsConfiguration = { + title: { + field: 'title', + name: i18n.NAME, + canDisplay: canDisplayDefault, + isCheckedDefault: true, + }, + assignees: { + field: 'assignees', + name: i18n.ASSIGNEES, + canDisplay: caseAssignmentAuthorized && !isSelectorView, + isCheckedDefault: true, + }, + tags: { + field: 'tags', + name: i18n.TAGS, + canDisplay: canDisplayDefault && !isSelectorView, + isCheckedDefault: true, + }, + totalAlerts: { + field: 'totalAlerts', + name: ALERTS, + canDisplay: isAlertsEnabled && !isSelectorView, + isCheckedDefault: true, + }, + totalComment: { + field: 'totalComment', + name: i18n.COMMENTS, + canDisplay: canDisplayDefault && !isSelectorView, + isCheckedDefault: true, + }, + category: { + field: 'category', + name: i18n.CATEGORY, + canDisplay: canDisplayDefault, + isCheckedDefault: true, + }, + closedAt: { + field: 'closedAt', + name: i18n.CLOSED_ON, + canDisplay: canDisplayDefault && !isSelectorView, + isCheckedDefault: false, + }, + createdAt: { + field: 'createdAt', + name: i18n.CREATED_ON, + canDisplay: canDisplayDefault, + isCheckedDefault: true, + }, + updatedAt: { + field: 'updatedAt', + name: i18n.UPDATED_ON, + canDisplay: canDisplayDefault && !isSelectorView, + isCheckedDefault: true, + }, + externalIncident: { + field: 'externalIncident', + name: i18n.EXTERNAL_INCIDENT, + canDisplay: canDisplayDefault && !isSelectorView, + isCheckedDefault: true, + }, + status: { + field: 'status', + name: i18n.STATUS, + canDisplay: canDisplayDefault && !isSelectorView, + isCheckedDefault: true, + }, + severity: { + field: 'severity', + name: i18n.SEVERITY, + canDisplay: canDisplayDefault, + isCheckedDefault: true, + }, + }; + + // we need to extend the configuration with the customFields + customFields.forEach(({ key, label }) => { + result[key] = { + field: key, + name: label, + canDisplay: canDisplayDefault && !isSelectorView, + isCheckedDefault: false, + }; + }); + + return result; +}; diff --git a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_selection.test.tsx b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_selection.test.tsx new file mode 100644 index 0000000000000..98f4e33ee9132 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_selection.test.tsx @@ -0,0 +1,125 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { licensingMock } from '@kbn/licensing-plugin/public/mocks'; +import { renderHook } from '@testing-library/react-hooks'; + +import type { AppMockRenderer } from '../../common/mock'; + +import { createAppMockRenderer } from '../../common/mock'; +import { useCasesColumnsSelection } from './use_cases_columns_selection'; +import { useCasesColumnsConfiguration } from './use_cases_columns_configuration'; + +jest.mock('./use_cases_columns_configuration'); + +const useCasesColumnsConfigurationMock = useCasesColumnsConfiguration as jest.Mock; + +const localStorageKey = 'testAppId.cases.list.tableColumns'; +const casesColumnsConfig = { + title: { + field: 'title', + name: 'Name', + canDisplay: true, + }, + assignees: { + field: 'assignees', + name: 'Assignees', + canDisplay: true, + }, + tags: { + field: 'tags', + name: 'Tags', + canDisplay: true, + }, +}; + +describe('useCasesColumnsSelection ', () => { + let appMockRender: AppMockRenderer; + const license = licensingMock.createLicense({ + license: { type: 'platinum' }, + }); + + beforeEach(() => { + appMockRender = createAppMockRenderer({ license }); + + useCasesColumnsConfigurationMock.mockReturnValue(casesColumnsConfig); + + localStorage.clear(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('returns the expected selectedColumns when the localstorage is empty', async () => { + const { result } = renderHook(() => useCasesColumnsSelection(), { + wrapper: appMockRender.AppWrapper, + }); + + expect(result.current).toMatchInlineSnapshot(` + Object { + "selectedColumns": Array [ + Object { + "field": "title", + "isChecked": undefined, + "name": "Name", + }, + Object { + "field": "assignees", + "isChecked": undefined, + "name": "Assignees", + }, + Object { + "field": "tags", + "isChecked": undefined, + "name": "Tags", + }, + ], + "setSelectedColumns": [Function], + } + `); + }); + + it('calls mergeSelectedColumnsWithConfiguration with existing localstorage value', async () => { + const selectedColumns = [ + { + field: 'title', + name: 'Name', + isChecked: false, + }, + ]; + + localStorage.setItem(localStorageKey, JSON.stringify(selectedColumns)); + + const { result } = renderHook(() => useCasesColumnsSelection(), { + wrapper: appMockRender.AppWrapper, + }); + + expect(result.current).toMatchInlineSnapshot(` + Object { + "selectedColumns": Array [ + Object { + "field": "title", + "isChecked": false, + "name": "Name", + }, + Object { + "field": "assignees", + "isChecked": undefined, + "name": "Assignees", + }, + Object { + "field": "tags", + "isChecked": undefined, + "name": "Tags", + }, + ], + "setSelectedColumns": [Function], + } + `); + }); +}); diff --git a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_selection.tsx b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_selection.tsx new file mode 100644 index 0000000000000..a7c32ee939a19 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns_selection.tsx @@ -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 useLocalStorage from 'react-use/lib/useLocalStorage'; + +import type { CasesColumnSelection } from './types'; + +import { LOCAL_STORAGE_KEYS } from '../../../common/constants'; +import { useCasesContext } from '../cases_context/use_cases_context'; +import { useCasesColumnsConfiguration } from './use_cases_columns_configuration'; +import { mergeSelectedColumnsWithConfiguration } from './utils'; + +const getTableColumnsLocalStorageKey = (appId: string) => { + const filteringKey = LOCAL_STORAGE_KEYS.casesTableColumns; + return `${appId}.${filteringKey}`; +}; + +export function useCasesColumnsSelection() { + const { appId } = useCasesContext(); + const casesColumnsConfig = useCasesColumnsConfiguration(); + + const [selectedColumns, setSelectedColumns] = useLocalStorage( + getTableColumnsLocalStorageKey(appId) + ); + + const columns = selectedColumns || []; + + return { + selectedColumns: mergeSelectedColumnsWithConfiguration({ + selectedColumns: columns, + casesColumnsConfig, + }), + setSelectedColumns, + }; +} diff --git a/x-pack/plugins/cases/public/components/all_cases/utility_bar.test.tsx b/x-pack/plugins/cases/public/components/all_cases/utility_bar.test.tsx index 4d740c2fb9552..ce776e77e8304 100644 --- a/x-pack/plugins/cases/public/components/all_cases/utility_bar.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/utility_bar.test.tsx @@ -34,6 +34,8 @@ describe('Severity form field', () => { pageSize: 10, totalItemCount: 5, }, + selectedColumns: [], + onSelectedColumnsChange: jest.fn(), }; beforeEach(() => { @@ -88,11 +90,23 @@ describe('Severity form field', () => { pageIndex: 1, totalItemCount: 0, }, + selectedColumns: [], + onSelectedColumnsChange: jest.fn(), }; appMockRender.render(); expect(screen.getByText('Showing 0 of 0 cases')).toBeInTheDocument(); }); + it('renders columns popover button when isSelectorView=False', async () => { + appMockRender.render(); + expect(screen.getByTestId('column-selection-popover-button')).toBeInTheDocument(); + }); + + it('does not render columns popover button when isSelectorView=True', async () => { + appMockRender.render(); + expect(screen.queryByTestId('column-selection-popover-button')).not.toBeInTheDocument(); + }); + it('opens the bulk actions correctly', async () => { appMockRender.render(); diff --git a/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx b/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx index 2c2aebdb30bb2..ee80e0ffb38b1 100644 --- a/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx @@ -23,10 +23,12 @@ import { } from '@elastic/eui'; import * as i18n from './translations'; import type { CasesUI } from '../../../common/ui/types'; +import type { CasesColumnSelection } from './types'; import { MAX_DOCS_PER_PAGE } from '../../../common/constants'; import { useRefreshCases } from './use_on_refresh_cases'; import { useBulkActions } from './use_bulk_actions'; import { useCasesContext } from '../cases_context/use_cases_context'; +import { ColumnsPopover } from './columns_popover'; interface Props { isSelectorView?: boolean; @@ -34,10 +36,20 @@ interface Props { selectedCases: CasesUI; deselectCases: () => void; pagination: Pagination; + selectedColumns: CasesColumnSelection[]; + onSelectedColumnsChange: (columns: CasesColumnSelection[]) => void; } export const CasesTableUtilityBar: FunctionComponent = React.memo( - ({ isSelectorView, totalCases, selectedCases, deselectCases, pagination }) => { + ({ + isSelectorView, + totalCases, + selectedCases, + deselectCases, + pagination, + selectedColumns, + onSelectedColumnsChange, + }) => { const { euiTheme } = useEuiTheme(); const refreshCases = useRefreshCases(); const { permissions, appId } = useCasesContext(); @@ -126,8 +138,8 @@ export const CasesTableUtilityBar: FunctionComponent = React.memo( return ( <> = React.memo( paddingBottom: euiTheme.size.s, }} > - - - {i18n.SHOWING_CASES(totalCases, visibleCases)} - - - - - {!isSelectorView && showBulkActions && ( - <> - - - {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} - - - - + + + + {i18n.SHOWING_CASES(totalCases, visibleCases)} + + + + + {!isSelectorView && showBulkActions && ( + <> + + + {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} + + + + + {i18n.BULK_ACTIONS} + + } > - {i18n.BULK_ACTIONS} - - } + + + + + )} + + - - + {i18n.REFRESH} + - - )} - - - {i18n.REFRESH} - +
+ {!isSelectorView && ( + + + + )}
{modals} {flyouts} diff --git a/x-pack/plugins/cases/public/components/all_cases/utils.test.tsx b/x-pack/plugins/cases/public/components/all_cases/utils.test.tsx index 6606f2e18d735..5e5d91e9a5926 100644 --- a/x-pack/plugins/cases/public/components/all_cases/utils.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/utils.test.tsx @@ -5,7 +5,10 @@ * 2.0. */ -import { parseUrlQueryParams } from './utils'; +import type { CasesColumnsConfiguration } from './use_cases_columns_configuration'; +import type { CasesColumnSelection } from './types'; + +import { mergeSelectedColumnsWithConfiguration, parseUrlQueryParams } from './utils'; import { DEFAULT_QUERY_PARAMS } from '../../containers/use_get_cases'; const DEFAULT_STRING_QUERY_PARAMS = { @@ -68,4 +71,78 @@ describe('utils', () => { ).toStrictEqual(DEFAULT_QUERY_PARAMS); }); }); + + describe('mergeSelectedColumnsWithConfiguration', () => { + const mockConfiguration: CasesColumnsConfiguration = { + foo: { field: 'foo', name: 'foo', canDisplay: true, isCheckedDefault: true }, + bar: { field: 'bar', name: 'bar', canDisplay: true, isCheckedDefault: true }, + }; + const mockSelectedColumns: CasesColumnSelection[] = [ + { field: 'foo', name: 'foo', isChecked: true }, + { field: 'bar', name: 'bar', isChecked: true }, + ]; + + it('does not return selectedColumns without a matching configuration', () => { + expect( + mergeSelectedColumnsWithConfiguration({ + selectedColumns: [ + ...mockSelectedColumns, + { field: 'foobar', name: 'foobar', isChecked: true }, + ], + casesColumnsConfig: mockConfiguration, + }) + ).toStrictEqual(mockSelectedColumns); + }); + + it('does not return selectedColumns with canDisplay value false in configuration', () => { + expect( + mergeSelectedColumnsWithConfiguration({ + selectedColumns: mockSelectedColumns, + casesColumnsConfig: { + ...mockConfiguration, + bar: { ...mockConfiguration.bar, canDisplay: false }, + }, + }) + ).toStrictEqual([mockSelectedColumns[0]]); + }); + + it('does not return selectedColumns without a field in the configuration', () => { + expect( + mergeSelectedColumnsWithConfiguration({ + selectedColumns: mockSelectedColumns, + casesColumnsConfig: { + ...mockConfiguration, + bar: { ...mockConfiguration.bar, field: '' }, + }, + }) + ).toStrictEqual([mockSelectedColumns[0]]); + }); + + it('result contains columns missing in the selectedColumns with isChecked false', () => { + expect( + mergeSelectedColumnsWithConfiguration({ + selectedColumns: [], + casesColumnsConfig: mockConfiguration, + }) + ).toStrictEqual([ + { field: 'foo', name: 'foo', isChecked: true }, + { field: 'bar', name: 'bar', isChecked: true }, + ]); + }); + + it('result does not include columns missing in the selectedColumns when canDisplay=false', () => { + expect( + mergeSelectedColumnsWithConfiguration({ + selectedColumns: [], + casesColumnsConfig: { + ...mockConfiguration, + foobar: { field: 'foobar', name: 'foobar', canDisplay: false, isCheckedDefault: false }, + }, + }) + ).toStrictEqual([ + { field: 'foo', name: 'foo', isChecked: true }, + { field: 'bar', name: 'bar', isChecked: true }, + ]); + }); + }); }); diff --git a/x-pack/plugins/cases/public/components/all_cases/utils.ts b/x-pack/plugins/cases/public/components/all_cases/utils.ts index 834bfa1085755..82ba4484701a8 100644 --- a/x-pack/plugins/cases/public/components/all_cases/utils.ts +++ b/x-pack/plugins/cases/public/components/all_cases/utils.ts @@ -5,7 +5,10 @@ * 2.0. */ +import { difference } from 'lodash'; import type { ParsedUrlQueryParams, PartialQueryParams } from '../../../common/ui/types'; +import type { CasesColumnSelection } from './types'; +import type { CasesColumnsConfiguration } from './use_cases_columns_configuration'; export const parseUrlQueryParams = (parsedUrlParams: ParsedUrlQueryParams): PartialQueryParams => { const urlParams: PartialQueryParams = { @@ -28,3 +31,45 @@ export const parseUrlQueryParams = (parsedUrlParams: ParsedUrlQueryParams): Part return urlParams; }; + +export const mergeSelectedColumnsWithConfiguration = ({ + selectedColumns, + casesColumnsConfig, +}: { + selectedColumns: CasesColumnSelection[]; + casesColumnsConfig: CasesColumnsConfiguration; +}): CasesColumnSelection[] => { + const result = selectedColumns.reduce((accumulator, { field, isChecked }) => { + if ( + field in casesColumnsConfig && + casesColumnsConfig[field].field !== '' && + casesColumnsConfig[field].canDisplay + ) { + accumulator.push({ + field: casesColumnsConfig[field].field, + name: casesColumnsConfig[field].name, + isChecked, + }); + } + return accumulator; + }, [] as CasesColumnSelection[]); + + // This will include any new customFields and/or changes to the case attributes + const missingColumns = difference( + Object.keys(casesColumnsConfig), + selectedColumns.map(({ field }) => field) + ); + + missingColumns.forEach((field) => { + // can be an empty string + if (casesColumnsConfig[field].field && casesColumnsConfig[field].canDisplay) { + result.push({ + field: casesColumnsConfig[field].field, + name: casesColumnsConfig[field].name, + isChecked: casesColumnsConfig[field].isCheckedDefault, + }); + } + }); + + return result; +}; diff --git a/x-pack/plugins/cases/public/components/case_view/metrics/status.tsx b/x-pack/plugins/cases/public/components/case_view/metrics/status.tsx index d77d6466a102e..d6c93417cbcd9 100644 --- a/x-pack/plugins/cases/public/components/case_view/metrics/status.tsx +++ b/x-pack/plugins/cases/public/components/case_view/metrics/status.tsx @@ -21,7 +21,7 @@ import { } from './translations'; import { getMaybeDate } from '../../formatted_date/maybe_date'; import { FormattedRelativePreferenceDate } from '../../formatted_date'; -import { getEmptyTagValue } from '../../empty_value'; +import { getEmptyCellValue } from '../../empty_value'; export const CaseStatusMetrics = React.memo( ({ metrics, features }: { metrics: SingleCaseMetrics; features: SingleCaseMetricsFeature[] }) => { @@ -112,7 +112,7 @@ const useGetLifespanMetrics = ( const CreationDate: React.FC<{ date: string }> = React.memo(({ date }) => { const creationDate = getMaybeDate(date); if (!creationDate.isValid()) { - return getEmptyTagValue(); + return getEmptyCellValue(); } return ( @@ -127,7 +127,7 @@ CreationDate.displayName = 'CreationDate'; const getInProgressDuration = (duration: number) => { if (duration <= 0) { - return getEmptyTagValue(); + return getEmptyCellValue(); } return formatDuration(duration); @@ -190,7 +190,7 @@ CaseStatusMetricsOpenCloseDuration.displayName = 'OpenCloseDuration'; const getOpenCloseDurationText = (value: string | undefined, reopens: string[]) => { if (value == null) { - return getEmptyTagValue(); + return getEmptyCellValue(); } else if (reopens.length > 0) { return `${value} ${CASE_REOPENED}`; } diff --git a/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx index 908d270d9cc1e..c44e5fbc22312 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx @@ -32,6 +32,7 @@ export const useCaseConfigureResponse = { id: '', }, isLoading: false, + isFetching: false, refetch: jest.fn(), }; diff --git a/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.test.ts b/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.test.ts index 0b5a4966ee730..9ce931b1fa293 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.test.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.test.ts @@ -18,6 +18,7 @@ describe('configureTextCustomFieldFactory ', () => { expect(builder).toEqual({ id: 'text', label: 'Text', + getEuiTableColumn: expect.any(Function), build: expect.any(Function), }); }); diff --git a/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.ts b/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.ts index 0081a2449a3f8..908d7c678d3dd 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.ts @@ -4,11 +4,12 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - import type { CustomFieldFactory } from '../types'; import type { CaseCustomFieldText } from '../../../../common/types/domain'; + import { CustomFieldTypes } from '../../../../common/types/domain'; import * as i18n from '../translations'; +import { getEuiTableColumn } from './get_eui_table_column'; import { Edit } from './edit'; import { View } from './view'; import { Configure } from './configure'; @@ -17,6 +18,7 @@ import { Create } from './create'; export const configureTextCustomFieldFactory: CustomFieldFactory = () => ({ id: CustomFieldTypes.TEXT, label: i18n.TEXT_LABEL, + getEuiTableColumn, build: () => ({ Configure, Edit, diff --git a/x-pack/plugins/cases/public/components/custom_fields/text/get_eui_table_column.test.tsx b/x-pack/plugins/cases/public/components/custom_fields/text/get_eui_table_column.test.tsx new file mode 100644 index 0000000000000..4330452fddeef --- /dev/null +++ b/x-pack/plugins/cases/public/components/custom_fields/text/get_eui_table_column.test.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; + +import { screen } from '@testing-library/react'; + +import { CustomFieldTypes } from '../../../../common/types/domain'; +import type { AppMockRenderer } from '../../../common/mock'; +import { createAppMockRenderer } from '../../../common/mock'; +import { getEuiTableColumn } from './get_eui_table_column'; + +describe('getEuiTableColumn ', () => { + let appMockRender: AppMockRenderer; + + beforeEach(() => { + appMockRender = createAppMockRenderer(); + + jest.clearAllMocks(); + }); + + it('returns a name and a render function', async () => { + const label = 'MockLabel'; + + expect(getEuiTableColumn({ label })).toEqual({ + name: label, + render: expect.any(Function), + width: '250px', + 'data-test-subj': 'text-custom-field-column', + }); + }); + + it('render function renders a text column correctly', async () => { + const key = 'test_key_1'; + const value = 'foobar'; + const column = getEuiTableColumn({ label: 'MockLabel' }); + + appMockRender.render(
{column.render({ key, type: CustomFieldTypes.TEXT, value })}
); + + expect(screen.getByTestId(`text-custom-field-column-view-${key}`)).toBeInTheDocument(); + expect(screen.getByTestId(`text-custom-field-column-view-${key}`)).toHaveTextContent(value); + }); +}); diff --git a/x-pack/plugins/cases/public/components/custom_fields/text/get_eui_table_column.tsx b/x-pack/plugins/cases/public/components/custom_fields/text/get_eui_table_column.tsx new file mode 100644 index 0000000000000..ceef3b821d356 --- /dev/null +++ b/x-pack/plugins/cases/public/components/custom_fields/text/get_eui_table_column.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import type { CaseCustomField } from '../../../../common/types/domain'; +import type { CustomFieldEuiTableColumn } from '../types'; + +export const getEuiTableColumn = ({ label }: { label: string }): CustomFieldEuiTableColumn => ({ + name: label, + width: '250px', + render: (customField: CaseCustomField) => ( +

+ {customField.value} +

+ ), + 'data-test-subj': 'text-custom-field-column', +}); diff --git a/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_text_field.test.ts b/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_text_field.test.ts index c32dac659adfe..2cebda62800a3 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_text_field.test.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_text_field.test.ts @@ -18,6 +18,7 @@ describe('configureToggleCustomFieldFactory ', () => { expect(builder).toEqual({ id: 'toggle', label: 'Toggle', + getEuiTableColumn: expect.any(Function), build: expect.any(Function), }); }); diff --git a/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_toggle_field.ts b/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_toggle_field.ts index 00f103fcfdd6a..5076cff23a21a 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_toggle_field.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_toggle_field.ts @@ -7,8 +7,10 @@ import type { CustomFieldFactory } from '../types'; import type { CaseCustomFieldToggle } from '../../../../common/types/domain'; + import { CustomFieldTypes } from '../../../../common/types/domain'; import * as i18n from '../translations'; +import { getEuiTableColumn } from './get_eui_table_column'; import { Edit } from './edit'; import { View } from './view'; import { Configure } from './configure'; @@ -17,6 +19,7 @@ import { Create } from './create'; export const configureToggleCustomFieldFactory: CustomFieldFactory = () => ({ id: CustomFieldTypes.TOGGLE, label: i18n.TOGGLE_LABEL, + getEuiTableColumn, build: () => ({ Configure, Edit, diff --git a/x-pack/plugins/cases/public/components/custom_fields/toggle/get_eui_table_column.test.tsx b/x-pack/plugins/cases/public/components/custom_fields/toggle/get_eui_table_column.test.tsx new file mode 100644 index 0000000000000..157159342bee2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/custom_fields/toggle/get_eui_table_column.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; + +import { screen } from '@testing-library/react'; + +import { CustomFieldTypes } from '../../../../common/types/domain'; +import type { AppMockRenderer } from '../../../common/mock'; +import { createAppMockRenderer } from '../../../common/mock'; +import { getEuiTableColumn } from './get_eui_table_column'; + +describe('getEuiTableColumn ', () => { + let appMockRender: AppMockRenderer; + const key = 'test_key_1'; + + beforeEach(() => { + appMockRender = createAppMockRenderer(); + jest.clearAllMocks(); + }); + + it('returns a name and a render function', async () => { + const label = 'MockLabel'; + + expect(getEuiTableColumn({ label })).toEqual({ + name: label, + render: expect.any(Function), + width: '100px', + 'data-test-subj': 'toggle-custom-field-column', + }); + }); + + it.each([ + ['true', 'check', { key, type: CustomFieldTypes.TOGGLE as const, value: true }], + ['false', 'cross', { key, type: CustomFieldTypes.TOGGLE as const, value: false }], + ['null', 'cross', { key, type: CustomFieldTypes.TOGGLE as const, value: null }], + ])( + 'render function renders a toggle column with value %s correctly', + async (_, expectedResult, customField) => { + const label = 'MockLabel'; + const column = getEuiTableColumn({ label }); + + appMockRender.render(
{column.render(customField)}
); + + expect( + screen.getByTestId(`toggle-custom-field-column-view-${key}-${expectedResult}`) + ).toBeInTheDocument(); + } + ); +}); diff --git a/x-pack/plugins/cases/public/components/custom_fields/toggle/get_eui_table_column.tsx b/x-pack/plugins/cases/public/components/custom_fields/toggle/get_eui_table_column.tsx new file mode 100644 index 0000000000000..b60c034cdd8e9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/custom_fields/toggle/get_eui_table_column.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 React from 'react'; + +import { EuiIcon } from '@elastic/eui'; + +import type { CaseCustomField } from '../../../../common/types/domain'; +import type { CustomFieldEuiTableColumn } from '../types'; + +export const getEuiTableColumn = ({ label }: { label: string }): CustomFieldEuiTableColumn => ({ + name: label, + width: '100px', + render: (customField: CaseCustomField) => ( + + ), + 'data-test-subj': 'toggle-custom-field-column', +}); diff --git a/x-pack/plugins/cases/public/components/custom_fields/types.ts b/x-pack/plugins/cases/public/components/custom_fields/types.ts index e4cddebe59821..6e87cbb8c6cd0 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/types.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/types.ts @@ -6,8 +6,14 @@ */ import type React from 'react'; -import type { CustomFieldTypes } from '../../../common/types/domain'; -import type { CasesConfigurationUICustomField, CaseUICustomField } from '../../containers/types'; +import type { EuiTableComputedColumnType } from '@elastic/eui'; + +import type { CaseCustomField, CustomFieldTypes } from '../../../common/types/domain'; +import type { + CasesConfigurationUICustomField, + CaseUI, + CaseUICustomField, +} from '../../containers/types'; export interface CustomFieldType { Configure: React.FC; @@ -27,9 +33,17 @@ export interface CustomFieldType { }>; } +export type CustomFieldEuiTableColumn = Pick< + EuiTableComputedColumnType, + 'name' | 'width' | 'data-test-subj' +> & { + render: (customField: CaseCustomField) => React.ReactNode; +}; + export type CustomFieldFactory = () => { id: string; label: string; + getEuiTableColumn: (params: { label: string }) => CustomFieldEuiTableColumn; build: () => CustomFieldType; }; diff --git a/x-pack/plugins/cases/public/components/empty_value/empty_value.test.tsx b/x-pack/plugins/cases/public/components/empty_value/empty_value.test.tsx index 47e6ec259640c..04863cc558bed 100644 --- a/x-pack/plugins/cases/public/components/empty_value/empty_value.test.tsx +++ b/x-pack/plugins/cases/public/components/empty_value/empty_value.test.tsx @@ -14,7 +14,7 @@ import { defaultToEmptyTag, getEmptyString, getEmptyStringTag, - getEmptyTagValue, + getEmptyCellValue, getEmptyValue, getOrEmptyTag, } from '.'; @@ -43,10 +43,10 @@ describe('EmptyValue', () => { }); }); - describe('#getEmptyTagValue', () => { + describe('#getEmptyCellValue', () => { const wrapper = mount( -

{getEmptyTagValue()}

+

{getEmptyCellValue()}

); test('should return an empty tag value', () => expect(wrapper.text()).toBe('—')); diff --git a/x-pack/plugins/cases/public/components/empty_value/index.tsx b/x-pack/plugins/cases/public/components/empty_value/index.tsx index 86efb4a78277a..c11ac37a304e7 100644 --- a/x-pack/plugins/cases/public/components/empty_value/index.tsx +++ b/x-pack/plugins/cases/public/components/empty_value/index.tsx @@ -20,12 +20,12 @@ EmptyWrapper.displayName = 'EmptyWrapper'; export const getEmptyValue = () => '—'; export const getEmptyString = () => `(${i18n.EMPTY_STRING})`; -export const getEmptyTagValue = () => {getEmptyValue()}; +export const getEmptyCellValue = () => {getEmptyValue()}; export const getEmptyStringTag = () => {getEmptyString()}; export const defaultToEmptyTag = (item: T): JSX.Element => { if (item == null) { - return getEmptyTagValue(); + return getEmptyCellValue(); } else if (isString(item) && item === '') { return getEmptyStringTag(); } else { @@ -40,7 +40,7 @@ export const getOrEmptyTag = (path: string, item: unknown): JSX.Element => { export const getOrEmptyTagFromValue = (value: string | number | null | undefined): JSX.Element => { if (value == null) { - return getEmptyTagValue(); + return getEmptyCellValue(); } else if (value === '') { return getEmptyStringTag(); } else { diff --git a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts b/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts index 0b01724870e8c..21f25edf17783 100644 --- a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts +++ b/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts @@ -38,6 +38,7 @@ export const latestFindingsTransform: TransformPutTransformRequest = { sort: '@timestamp', unique_key: ['resource.id', 'rule.id'], }, + settings: { unattended: true }, _meta: { package: { name: CLOUD_SECURITY_POSTURE_PACKAGE_NAME, diff --git a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts b/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts index fcd3faee437a2..13f130784892c 100644 --- a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts +++ b/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts @@ -40,6 +40,7 @@ export const latestVulnerabilitiesTransform: TransformPutTransformRequest = { sort: '@timestamp', unique_key: ['vulnerability.id', 'resource.id', 'package.name', 'package.version'], }, + settings: { unattended: true }, _meta: { package: { name: CLOUD_SECURITY_POSTURE_PACKAGE_NAME, diff --git a/x-pack/plugins/dataset_quality/README.md b/x-pack/plugins/dataset_quality/README.md index cd5bfc30658d4..fd38679a2d778 100755 --- a/x-pack/plugins/dataset_quality/README.md +++ b/x-pack/plugins/dataset_quality/README.md @@ -1,3 +1,53 @@ # Dataset Quality In order to make ongoing maintenance of log collection easy we want to introduce the concept of dataset quality, where users can easily get an overview on the datasets they have with information such as integration, size, last activity, among others. + +## Development + +### Tests + +#### Unit tests + +Kibana primarily uses Jest for unit testing. Each plugin or package defines a `jest.config.js` that extends a preset provided by the `@kbn/test` package. The following command runs all Dataset quality unit tests: + +``` +yarn jest --config x-pack/plugins/dataset_quality/jest.config.js +``` + +You can also run a specific test by passing the filepath as an argument, e.g.: + +``` +yarn jest --config x-pack/plugins/dataset_quality/jest.config.js x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/get_data_streams.test.ts +``` + +#### API integration tests + +| Option | Description | +| ------------ | ----------------------------------------------- | +| --server | Only start ES and Kibana | +| --runner | Only run tests | +| --grep | Specify the specs to run | +| --grep-files | Specify the files to run | +| --inspect | Add --inspect-brk flag to the ftr for debugging | +| --times | Repeat the test n number of times | + +The API tests are located in [`x-pack/test/dataset_quality_api_integration/`](/x-pack/test/dataset_quality_api_integration/). + +#### Start server and run test (single process) + +``` +node x-pack/plugins/dataset_quality/scripts/api [--help] +``` + +The above command will start an ES instance on http://localhost:9220, a Kibana instance on http://localhost:5620 and run the api tests. +Once the tests finish, the instances will be terminated. + +#### Start server and run test (separate processes) + +```sh +# start server +node x-pack/plugins/dataset_quality/scripts/api --server + +# run tests +node x-pack/plugins/dataset_quality/scripts/api --runner --grep-files=error_group_list +``` diff --git a/x-pack/plugins/dataset_quality/common/fetch_options.ts b/x-pack/plugins/dataset_quality/common/fetch_options.ts new file mode 100644 index 0000000000000..3a72a72762dee --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/fetch_options.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { HttpFetchOptions } from '@kbn/core/public'; + +export type FetchOptions = Omit & { + pathname: string; + method?: string; + body?: any; +}; diff --git a/x-pack/plugins/dataset_quality/common/index.ts b/x-pack/plugins/dataset_quality/common/index.ts index 440e8780e6bf5..2022b51685043 100644 --- a/x-pack/plugins/dataset_quality/common/index.ts +++ b/x-pack/plugins/dataset_quality/common/index.ts @@ -6,3 +6,4 @@ */ export type { DatasetQualityConfig } from './plugin_config'; +export type { FetchOptions } from './fetch_options'; diff --git a/x-pack/plugins/dataset_quality/public/services/rest/call_api.ts b/x-pack/plugins/dataset_quality/public/services/rest/call_api.ts new file mode 100644 index 0000000000000..1b39bfc905730 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/services/rest/call_api.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 { CoreSetup, CoreStart } from '@kbn/core/public'; +import { FetchOptions } from '../../../common'; + +function getFetchOptions(fetchOptions: FetchOptions) { + const { body, ...rest } = fetchOptions; + + return { + ...rest, + ...(body !== undefined ? { body: JSON.stringify(body) } : {}), + query: { + ...fetchOptions.query, + }, + }; +} + +export type CallApi = typeof callApi; + +export async function callApi( + { http }: CoreStart | CoreSetup, + fetchOptions: FetchOptions +): Promise { + const { pathname, method = 'get', ...options } = getFetchOptions(fetchOptions); + + const lowercaseMethod = method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch'; + + const res = await http[lowercaseMethod](pathname, options); + + return res; +} diff --git a/x-pack/plugins/dataset_quality/public/services/rest/create_call_dataset_quality_api.ts b/x-pack/plugins/dataset_quality/public/services/rest/create_call_dataset_quality_api.ts new file mode 100644 index 0000000000000..47d04b309817f --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/services/rest/create_call_dataset_quality_api.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 { CoreSetup, CoreStart } from '@kbn/core/public'; +import type { + ClientRequestParamsOf, + ReturnOf, + 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 { CallApi, callApi } from './call_api'; + +export type DatasetQualityClientOptions = Omit< + FetchOptions, + 'query' | 'body' | 'pathname' | 'signal' +> & { + signal: AbortSignal | null; +}; + +export type DatasetQualityClient = RouteRepositoryClient< + DatasetQualityServerRouteRepository, + DatasetQualityClientOptions +>; + +export type AutoAbortedClient = RouteRepositoryClient< + DatasetQualityServerRouteRepository, + Omit +>; + +export type APIReturnType = ReturnOf< + DatasetQualityServerRouteRepository, + TEndpoint +>; + +export type APIClientRequestParamsOf = ClientRequestParamsOf< + DatasetQualityServerRouteRepository, + TEndpoint +>; + +export let callDatasetQualityApi: DatasetQualityClient = () => { + throw new Error( + 'callDatasetQualityApi has to be initialized before used. Call createCallApi first.' + ); +}; + +export function createCallDatasetQualityApi(core: CoreStart | CoreSetup) { + callDatasetQualityApi = ((endpoint, options) => { + const { params } = options as unknown as { + params?: Partial>; + }; + + const { method, pathname } = formatRequest(endpoint, params?.path); + + return callApi(core, { + ...options, + method, + pathname, + body: params?.body, + query: params?.query, + } as unknown as Parameters[1]); + }) as DatasetQualityClient; +} diff --git a/x-pack/plugins/dataset_quality/scripts/api.js b/x-pack/plugins/dataset_quality/scripts/api.js new file mode 100644 index 0000000000000..343a1d2c29944 --- /dev/null +++ b/x-pack/plugins/dataset_quality/scripts/api.js @@ -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. + */ + +/* eslint-disable no-console */ +const { times } = require('lodash'); +const yargs = require('yargs'); +const path = require('path'); +const childProcess = require('child_process'); + +const { argv } = yargs(process.argv.slice(2)) + .option('server', { + default: false, + type: 'boolean', + description: 'Only start ES and Kibana', + }) + .option('runner', { + default: false, + type: 'boolean', + description: 'Only run tests', + }) + .option('grep', { + alias: 'spec', + type: 'string', + description: 'Specify the specs to run', + }) + .option('grep-files', { + alias: 'files', + type: 'array', + string: true, + description: 'Specify the files to run', + }) + .option('times', { + type: 'number', + description: 'Repeat the test n number of times', + }) + .check((argv) => { + const { inspect, runner } = argv; + if (inspect && !runner) { + throw new Error('--inspect can only be used with --runner'); + } else { + return true; + } + }) + .help(); + +const { server, runner, grep, grepFiles } = argv; + +const license = 'basic'; + +let ftrScript = 'functional_tests'; +if (server) { + ftrScript = 'functional_tests_server'; +} else if (runner) { + ftrScript = 'functional_test_runner'; +} + +const cmd = [ + 'node', + `../../../../scripts/${ftrScript}`, + ...(grep ? [`--grep "${grep}"`] : []), + `--config ../../../test/dataset_quality_api_integration/${license}/config.ts`, +].join(' '); + +console.log(`Running: "${cmd}"`); + +function runTests() { + childProcess.execSync(cmd, { + cwd: path.join(__dirname), + stdio: 'inherit', + env: { + ...process.env, + DATASET_QUALITY_TEST_GREP_FILES: JSON.stringify(grepFiles), + }, + }); +} + +if (argv.times) { + const runCounter = { succeeded: 0, failed: 0, remaining: argv.times }; + let exitStatus = 0; + times(argv.times, () => { + try { + runTests(); + runCounter.succeeded++; + } catch (e) { + exitStatus = 1; + runCounter.failed++; + } + runCounter.remaining--; + if (argv.times > 1) { + console.log(runCounter); + } + }); + process.exit(exitStatus); +} else { + runTests(); +} diff --git a/x-pack/plugins/dataset_quality/server/index.ts b/x-pack/plugins/dataset_quality/server/index.ts index 17b028aa19431..4a5e3ce0747c9 100644 --- a/x-pack/plugins/dataset_quality/server/index.ts +++ b/x-pack/plugins/dataset_quality/server/index.ts @@ -5,6 +5,9 @@ * 2.0. */ -import { DatasetQualityServerPlugin } from './plugin'; +import { PluginInitializerContext } from '@kbn/core-plugins-server'; -export const plugin = () => new DatasetQualityServerPlugin(); +export async function plugin(initializerContext: PluginInitializerContext) { + const { DatasetQualityServerPlugin } = await import('./plugin'); + return new DatasetQualityServerPlugin(initializerContext); +} diff --git a/x-pack/plugins/dataset_quality/server/plugin.ts b/x-pack/plugins/dataset_quality/server/plugin.ts index b673fed3ad622..c34409d697988 100644 --- a/x-pack/plugins/dataset_quality/server/plugin.ts +++ b/x-pack/plugins/dataset_quality/server/plugin.ts @@ -5,10 +5,54 @@ * 2.0. */ -import { Plugin } from '@kbn/core/server'; +import { CoreSetup, Logger, Plugin, PluginInitializerContext } from '@kbn/core/server'; +import { mapValues } from 'lodash'; +import { getDatasetQualityServerRouteRepository } from './routes'; +import { registerRoutes } from './routes/register_routes'; +import { DatasetQualityRouteHandlerResources } from './routes/types'; +import { + DatasetQualityPluginSetupDependencies, + DatasetQualityPluginStart, + DatasetQualityPluginStartDependencies, +} from './types'; export class DatasetQualityServerPlugin implements Plugin { - setup() {} + private readonly logger: Logger; - start() {} + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + setup( + core: CoreSetup, + plugins: DatasetQualityPluginSetupDependencies + ) { + this.logger.debug('dataset_quality: Setup'); + + const resourcePlugins = mapValues(plugins, (value, key) => { + return { + setup: value, + start: () => + core.getStartServices().then((services) => { + const [, pluginsStartContracts] = services; + return pluginsStartContracts[key as keyof DatasetQualityPluginStartDependencies]; + }), + }; + }) as DatasetQualityRouteHandlerResources['plugins']; + + registerRoutes({ + core, + logger: this.logger, + repository: getDatasetQualityServerRouteRepository(), + plugins: resourcePlugins, + }); + + return {}; + } + + start() { + this.logger.debug('dataset_quality: Started'); + + return {}; + } } diff --git a/x-pack/plugins/dataset_quality/server/routes/create_datasets_quality_server_route.ts b/x-pack/plugins/dataset_quality/server/routes/create_datasets_quality_server_route.ts new file mode 100644 index 0000000000000..c76d1d800de9c --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/routes/create_datasets_quality_server_route.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { createServerRouteFactory } from '@kbn/server-route-repository'; +import { DatasetQualityRouteCreateOptions, DatasetQualityRouteHandlerResources } from './types'; + +export const createDatasetQualityServerRoute = createServerRouteFactory< + DatasetQualityRouteHandlerResources, + DatasetQualityRouteCreateOptions +>(); 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 new file mode 100644 index 0000000000000..ef1ecdbccb1d1 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/get_data_streams.test.ts @@ -0,0 +1,201 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; +import { dataStreamService } from '../../../services'; + +import { getDataStreams } from '.'; + +jest.mock('../../../services/data_stream', () => { + return { + dataStreamService: { + getMatchingDataStreams: jest.fn().mockImplementation(() => { + return [ + { + name: 'logs-elastic_agent-default', + timestamp_field: { name: '@timestamp' }, + indices: [ + { + index_name: '.ds-logs-elastic_agent-default-2023.05.17-000001', + index_uuid: 'EcqQR36PTNCKVnfAftq_Rw', + }, + ], + generation: 1, + _meta: { managed_by: 'fleet', managed: true, package: { name: 'elastic_agent' } }, + status: 'YELLOW', + template: 'logs-elastic_agent', + ilm_policy: 'logs', + hidden: false, + system: false, + allow_custom_routing: false, + replicated: false, + }, + { + name: 'logs-elastic_agent.filebeat-default', + timestamp_field: { name: '@timestamp' }, + indices: [ + { + index_name: '.ds-logs-elastic_agent.filebeat-default-2023.05.17-000001', + index_uuid: 'v5uEn55TRrurU3Bf4CBtzw', + }, + ], + generation: 1, + _meta: { managed_by: 'fleet', managed: true, package: { name: 'elastic_agent' } }, + status: 'YELLOW', + template: 'logs-elastic_agent.filebeat', + ilm_policy: 'logs', + hidden: false, + system: false, + allow_custom_routing: false, + replicated: false, + }, + { + name: 'logs-elastic_agent.fleet_server-default', + timestamp_field: { name: '@timestamp' }, + indices: [ + { + index_name: '.ds-logs-elastic_agent.fleet_server-default-2023.05.17-000001', + index_uuid: 'nThe6dkaQnagAlyNsAyYsA', + }, + ], + generation: 1, + _meta: { managed_by: 'fleet', managed: true, package: { name: 'elastic_agent' } }, + status: 'YELLOW', + template: 'logs-elastic_agent.fleet_server', + ilm_policy: 'logs', + hidden: false, + system: false, + allow_custom_routing: false, + replicated: false, + }, + { + name: 'logs-elastic_agent.metricbeat-default', + timestamp_field: { name: '@timestamp' }, + indices: [ + { + index_name: '.ds-logs-elastic_agent.metricbeat-default-2023.05.17-000001', + index_uuid: 'Y5vQ7V6-QSSMM-CPdqOkCg', + }, + ], + generation: 1, + _meta: { managed_by: 'fleet', managed: true, package: { name: 'elastic_agent' } }, + status: 'YELLOW', + template: 'logs-elastic_agent.metricbeat', + ilm_policy: 'logs', + hidden: false, + system: false, + allow_custom_routing: false, + replicated: false, + }, + { + name: 'logs-test.test-default', + timestamp_field: { name: '@timestamp' }, + indices: [ + { + index_name: '.ds-logs-elastic_agent.metricbeat-default-2023.05.17-000001', + index_uuid: 'Y5vQ7V6-QSSMM-CPdqOkCg', + }, + ], + }, + ]; + }), + }, + }; +}); + +describe('getDataStreams', () => { + it('Passes the correct parameters to the DataStreamService', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); + await getDataStreams({ + esClient: esClientMock, + type: 'logs', + datasetQuery: 'nginx', + sortOrder: 'asc', + uncategorisedOnly: true, + }); + expect(dataStreamService.getMatchingDataStreams).toHaveBeenCalledWith(expect.anything(), { + type: 'logs', + dataset: '*nginx*', + }); + }); + describe('uncategorisedOnly option', () => { + it('Returns the correct number of results when true', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); + const results = await getDataStreams({ + esClient: esClientMock, + type: 'logs', + datasetQuery: 'nginx', + sortOrder: 'asc', + uncategorisedOnly: true, + }); + expect(results.items.length).toBe(1); + }); + it('Returns the correct number of results when false', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); + const results = await 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' }, + { + name: 'logs-elastic_agent.metricbeat-default', + integration: { name: 'elastic_agent', managed_by: 'fleet' }, + }, + { + name: 'logs-elastic_agent.fleet_server-default', + integration: { name: 'elastic_agent', managed_by: 'fleet' }, + }, + { + name: 'logs-elastic_agent.filebeat-default', + integration: { name: 'elastic_agent', managed_by: 'fleet' }, + }, + { + name: 'logs-elastic_agent-default', + integration: { name: 'elastic_agent', managed_by: 'fleet' }, + }, + ]); + }); +}); 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 new file mode 100644 index 0000000000000..37181d8b8a731 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/index.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ElasticsearchClient } from '@kbn/core/server'; +import { dataStreamService } from '../../../services'; +import { DataStreamTypes } from '../../../types/data_stream'; + +export async function getDataStreams(options: { + esClient: ElasticsearchClient; + type?: DataStreamTypes; + datasetQuery?: string; + sortOrder: 'asc' | 'desc'; + uncategorisedOnly: boolean; +}) { + const { esClient, type, datasetQuery, uncategorisedOnly, sortOrder } = options; + + const allDataStreams = await dataStreamService.getMatchingDataStreams(esClient, { + type: type ?? '*', + dataset: datasetQuery ? `*${datasetQuery}*` : '*', + }); + + const filteredDataStreams = uncategorisedOnly + ? allDataStreams.filter((stream) => { + return !stream._meta || !stream._meta.managed_by || stream._meta.managed_by !== 'fleet'; + }) + : allDataStreams; + + const mappedDataStreams = filteredDataStreams.map((dataStream) => ({ + name: dataStream.name, + ...(dataStream._meta + ? { + integration: { + name: dataStream._meta?.package?.name, + managed_by: dataStream._meta?.managed_by, + }, + } + : {}), + })); + + const sortedDataStreams = mappedDataStreams.sort((a, b) => { + if (sortOrder === 'desc') { + return b.name.localeCompare(a.name); + } + + return a.name.localeCompare(b.name); + }); + + return { + items: sortedDataStreams, + }; +} 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 new file mode 100644 index 0000000000000..c078cb24d3d28 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/get_data_streams_stats.test.ts @@ -0,0 +1,133 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; +import { dataStreamService } from '../../../services'; + +import { getDataStreamsStats } from '.'; + +jest.mock('../../../services/data_stream', () => { + return { + dataStreamService: { + getMatchingDataStreamsStats: jest.fn().mockImplementation(() => { + return [ + { + data_stream: 'logs-elastic_agent-default', + backing_indices: 1, + store_size: '1gb', + store_size_bytes: 1170805528, + maximum_timestamp: 1698916071000, + }, + { + data_stream: 'logs-elastic_agent.filebeat-default', + backing_indices: 1, + store_size: '1.3mb', + store_size_bytes: 1459100, + maximum_timestamp: 1698902209996, + }, + { + data_stream: 'logs-elastic_agent.fleet_server-default', + backing_indices: 1, + store_size: '2.9mb', + store_size_bytes: 3052148, + maximum_timestamp: 1698914110010, + }, + { + data_stream: 'logs-elastic_agent.metricbeat-default', + backing_indices: 1, + store_size: '1.6mb', + store_size_bytes: 1704807, + maximum_timestamp: 1698672046707, + }, + { + data_stream: 'logs-test.test-default', + backing_indices: 1, + store_size: '6.2mb', + store_size_bytes: 6570447, + maximum_timestamp: 1698913802000, + }, + ]; + }), + }, + }; +}); + +describe('getDataStreams', () => { + it('Passes the correct parameters to the DataStreamService', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); + await getDataStreamsStats({ + 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([ + { + name: 'logs-test.test-default', + size: '6.2mb', + size_bytes: 6570447, + last_activity: 1698913802000, + }, + { + name: 'logs-elastic_agent.metricbeat-default', + size: '1.6mb', + size_bytes: 1704807, + last_activity: 1698672046707, + }, + { + name: 'logs-elastic_agent.fleet_server-default', + size: '2.9mb', + size_bytes: 3052148, + last_activity: 1698914110010, + }, + { + name: 'logs-elastic_agent.filebeat-default', + size: '1.3mb', + size_bytes: 1459100, + last_activity: 1698902209996, + }, + { + name: 'logs-elastic_agent-default', + size: '1gb', + size_bytes: 1170805528, + last_activity: 1698916071000, + }, + ]); + }); +}); 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 new file mode 100644 index 0000000000000..2f0f8057cddef --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/index.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ElasticsearchClient } from '@kbn/core/server'; +import { dataStreamService } from '../../../services'; +import { DataStreamTypes } from '../../../types/data_stream'; + +export async function getDataStreamsStats(options: { + esClient: ElasticsearchClient; + type?: DataStreamTypes; + datasetQuery?: string; + sortOrder: 'asc' | 'desc'; +}) { + const { esClient, type, datasetQuery, sortOrder } = options; + + const matchingDataStreamsStats = await dataStreamService.getMatchingDataStreamsStats(esClient, { + type: type ?? '*', + dataset: datasetQuery ? `*${datasetQuery}*` : '*', + }); + + const mappedDataStreams = matchingDataStreamsStats.map((dataStream) => { + return { + name: dataStream.data_stream, + size: dataStream.store_size, + size_bytes: dataStream.store_size_bytes, + last_activity: dataStream.maximum_timestamp, + }; + }); + + const sortedDataStreams = mappedDataStreams.sort((a, b) => { + if (sortOrder === 'desc') { + return b.name.localeCompare(a.name); + } + + return a.name.localeCompare(b.name); + }); + + return { + items: sortedDataStreams, + }; +} 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 new file mode 100644 index 0000000000000..f973211cc7341 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/routes.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 * as t from 'io-ts'; +import { keyBy, merge, values } from 'lodash'; +import { dataStreamTypesRt, sortOrderRt } from '../../types/api_types'; +import { DataStreamsStatResponse } from '../../types/data_stream'; +import { createDatasetQualityServerRoute } from '../create_datasets_quality_server_route'; +import { getDataStreams } from './get_data_streams'; +import { getDataStreamsStats } from './get_data_streams_stats'; + +const statsRoute = createDatasetQualityServerRoute({ + endpoint: 'GET /internal/dataset_quality/data_streams/stats', + params: t.type({ + query: t.intersection([ + dataStreamTypesRt, + t.partial({ + datasetQuery: t.string, + }), + sortOrderRt, + ]), + }), + options: { + tags: [], + }, + async handler(resources): Promise { + const { context, params } = 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 [dataStreams, dataStreamsStats] = await Promise.all([ + getDataStreams({ + esClient, + ...params.query, + uncategorisedOnly: false, + }), + getDataStreamsStats({ esClient, ...params.query }), + ]); + + return { + items: values(merge(keyBy(dataStreams.items, 'name'), keyBy(dataStreamsStats.items, 'name'))), + }; + }, +}); + +export const dataStreamsRouteRepository = { + ...statsRoute, +}; diff --git a/x-pack/plugins/dataset_quality/server/routes/index.ts b/x-pack/plugins/dataset_quality/server/routes/index.ts new file mode 100644 index 0000000000000..bb242e0db8721 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/routes/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { EndpointOf, ServerRouteRepository } from '@kbn/server-route-repository'; +import { dataStreamsRouteRepository } from './data_streams/routes'; + +function getTypedDatasetQualityServerRouteRepository() { + const repository = { + ...dataStreamsRouteRepository, + }; + + return repository; +} + +export const getDatasetQualityServerRouteRepository = (): ServerRouteRepository => { + return getTypedDatasetQualityServerRouteRepository(); +}; + +export type DatasetQualityServerRouteRepository = ReturnType< + typeof getTypedDatasetQualityServerRouteRepository +>; + +export type APIEndpoint = EndpointOf; diff --git a/x-pack/plugins/dataset_quality/server/routes/register_routes.ts b/x-pack/plugins/dataset_quality/server/routes/register_routes.ts new file mode 100644 index 0000000000000..7ebecaa1346f3 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/routes/register_routes.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 { errors } from '@elastic/elasticsearch'; +import Boom from '@hapi/boom'; +import { CoreSetup, Logger, RouteRegistrar } from '@kbn/core/server'; +import { + ServerRouteRepository, + decodeRequestParams, + parseEndpoint, + routeValidationObject, +} from '@kbn/server-route-repository'; +import * as t from 'io-ts'; +import { DatasetQualityRequestHandlerContext } from '../types'; +import { DatasetQualityRouteHandlerResources } from './types'; + +interface RegisterRoutes { + core: CoreSetup; + repository: ServerRouteRepository; + logger: Logger; + plugins: DatasetQualityRouteHandlerResources['plugins']; +} + +export function registerRoutes({ repository, core, logger, plugins }: RegisterRoutes) { + const routes = Object.values(repository); + + const router = core.http.createRouter(); + + routes.forEach((route) => { + const { endpoint, options, handler, params } = route; + const { pathname, method } = parseEndpoint(endpoint); + + (router[method] as RouteRegistrar)( + { + path: pathname, + validate: routeValidationObject, + options, + }, + async (context, request, response) => { + try { + const decodedParams = decodeRequestParams( + { + params: request.params, + body: request.body, + query: request.query, + }, + params ?? t.strict({}) + ); + + const data = (await handler({ + context, + request, + logger, + params: decodedParams, + plugins, + })) as any; + + if (data === undefined) { + return response.noContent(); + } + + return response.ok({ body: data }); + } catch (error) { + if (Boom.isBoom(error)) { + logger.error(error.output.payload.message); + return response.customError({ + statusCode: error.output.statusCode, + body: { message: error.output.payload.message }, + }); + } + + logger.error(error); + const opts = { + statusCode: 500, + body: { + message: error.message, + }, + }; + + if (error instanceof errors.RequestAbortedError) { + opts.statusCode = 499; + opts.body.message = 'Client closed request'; + } + + return response.customError(opts); + } + } + ); + }); +} diff --git a/x-pack/plugins/dataset_quality/server/routes/types.ts b/x-pack/plugins/dataset_quality/server/routes/types.ts new file mode 100644 index 0000000000000..8507bcde5763e --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/routes/types.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { KibanaRequest, Logger } from '@kbn/core/server'; +import { DatasetQualityServerRouteRepository } from '.'; +import { + DatasetQualityPluginSetupDependencies, + DatasetQualityPluginStartDependencies, + DatasetQualityRequestHandlerContext, +} from '../types'; + +export type { DatasetQualityServerRouteRepository }; + +export interface DatasetQualityRouteHandlerResources { + context: DatasetQualityRequestHandlerContext; + logger: Logger; + request: KibanaRequest; + plugins: { + [key in keyof DatasetQualityPluginSetupDependencies]: { + setup: Required[key]; + start: () => Promise[key]>; + }; + }; +} + +export interface DatasetQualityRouteCreateOptions { + options: { + tags: string[]; + }; +} diff --git a/x-pack/plugins/dataset_quality/server/services/data_stream.ts b/x-pack/plugins/dataset_quality/server/services/data_stream.ts new file mode 100644 index 0000000000000..e0fc6e6748829 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/services/data_stream.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + IndicesDataStream, + IndicesDataStreamsStatsDataStreamsStatsItem, +} from '@elastic/elasticsearch/lib/api/types'; +import type { ElasticsearchClient } from '@kbn/core/server'; + +class DataStreamService { + public streamPartsToIndexPattern({ type, dataset }: { dataset: string; type: string }) { + return `${type}-${dataset}`; + } + + public async getMatchingDataStreams( + esClient: ElasticsearchClient, + dataStreamParts: { + dataset: string; + type: string; + } + ): Promise { + try { + const { data_streams: dataStreamsInfo } = await esClient.indices.getDataStream({ + name: this.streamPartsToIndexPattern(dataStreamParts), + }); + + return dataStreamsInfo; + } catch (e) { + if (e.statusCode === 404) { + return []; + } + throw e; + } + } + + public async getMatchingDataStreamsStats( + esClient: ElasticsearchClient, + dataStreamParts: { + dataset: string; + type: string; + } + ): Promise { + try { + const { data_streams: dataStreamsStats } = await esClient.indices.dataStreamsStats({ + name: this.streamPartsToIndexPattern(dataStreamParts), + human: true, + }); + + return dataStreamsStats; + } catch (e) { + if (e.statusCode === 404) { + return []; + } + throw e; + } + } +} + +export const dataStreamService = new DataStreamService(); diff --git a/x-pack/plugins/dataset_quality/server/services/index.ts b/x-pack/plugins/dataset_quality/server/services/index.ts new file mode 100644 index 0000000000000..86173c476dd0e --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/services/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 { dataStreamService } from './data_stream'; diff --git a/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/authentication.ts b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/authentication.ts new file mode 100644 index 0000000000000..4b30ccbf00d9b --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/authentication.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export enum DatasetQualityUsername { + noAccessUser = 'no_access_user', + viewerUser = 'viewer', + editorUser = 'editor', + datasetQualityLogsUser = 'dataset_quality_logs_user', +} + +export enum DatasetQualityCustomRolename { + datasetQualityLogsUser = 'dataset_quality_logs_user', +} + +export const customRoles = { + [DatasetQualityCustomRolename.datasetQualityLogsUser]: { + elasticsearch: { + indices: [ + { + names: ['logs-*-*'], + privileges: ['monitor'], + }, + ], + }, + }, +}; + +export const users: Record< + DatasetQualityUsername, + { + builtInRoleNames?: string[]; + customRoleNames?: DatasetQualityCustomRolename[]; + } +> = { + [DatasetQualityUsername.noAccessUser]: {}, + [DatasetQualityUsername.viewerUser]: { + builtInRoleNames: ['viewer'], + }, + [DatasetQualityUsername.editorUser]: { + builtInRoleNames: ['editor'], + }, + [DatasetQualityUsername.datasetQualityLogsUser]: { + builtInRoleNames: ['editor'], + customRoleNames: [DatasetQualityCustomRolename.datasetQualityLogsUser], + }, +}; + +export const DATASET_QUALITY_TEST_PASSWORD = 'changeme'; diff --git a/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/helpers/call_kibana.ts b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/helpers/call_kibana.ts new file mode 100644 index 0000000000000..879b02f8a93c5 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/helpers/call_kibana.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 axios, { AxiosRequestConfig, AxiosError } from 'axios'; +import { once } from 'lodash'; +import { Elasticsearch, Kibana } from '..'; + +export async function callKibana({ + elasticsearch, + kibana, + options, +}: { + elasticsearch: Omit; + kibana: Kibana; + options: AxiosRequestConfig; +}): Promise { + const baseUrl = await getBaseUrl(kibana.hostname); + const { username, password } = elasticsearch; + + const { data } = await axios.request({ + ...options, + baseURL: baseUrl, + auth: { username, password }, + headers: { 'kbn-xsrf': 'true', ...options.headers }, + }); + return data; +} + +const getBaseUrl = once(async (kibanaHostname: string) => { + try { + await axios.request({ url: kibanaHostname, maxRedirects: 0 }); + } catch (e) { + if (isAxiosError(e)) { + const location = e.response?.headers?.location ?? ''; + const hasBasePath = RegExp(/^\/\w{3}$/).test(location); + const basePath = hasBasePath ? location : ''; + return `${kibanaHostname}${basePath}`; + } + + throw e; + } + return kibanaHostname; +}); + +export function isAxiosError(e: AxiosError | Error): e is AxiosError { + return 'isAxiosError' in e; +} + +export class AbortError extends Error { + constructor(message: string) { + super(message); + } +} diff --git a/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/helpers/create_custom_role.ts b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/helpers/create_custom_role.ts new file mode 100644 index 0000000000000..141f5333c28b7 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/helpers/create_custom_role.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 { Elasticsearch, Kibana } from '..'; +import { customRoles, DatasetQualityCustomRolename } from '../authentication'; +import { callKibana } from './call_kibana'; + +export async function createCustomRole({ + elasticsearch, + kibana, + roleName, +}: { + elasticsearch: Elasticsearch; + kibana: Kibana; + roleName: DatasetQualityCustomRolename; +}) { + const role = customRoles[roleName]; + + await callKibana({ + elasticsearch, + kibana, + options: { + method: 'PUT', + url: `/api/security/role/${roleName}`, + data: role, + }, + }); +} diff --git a/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/helpers/create_or_update_user.ts b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/helpers/create_or_update_user.ts new file mode 100644 index 0000000000000..57e9e6a64c0df --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/helpers/create_or_update_user.ts @@ -0,0 +1,133 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable no-console */ + +import { difference, union } from 'lodash'; +import { Elasticsearch, Kibana } from '..'; +import { callKibana, isAxiosError } from './call_kibana'; + +interface User { + username: string; + roles: string[]; + full_name?: string; + email?: string; + enabled?: boolean; +} + +export async function createOrUpdateUser({ + elasticsearch, + kibana, + user, +}: { + elasticsearch: Elasticsearch; + kibana: Kibana; + user: User; +}) { + const existingUser = await getUser({ + elasticsearch, + kibana, + username: user.username, + }); + if (!existingUser) { + return createUser({ elasticsearch, kibana, newUser: user }); + } + + return updateUser({ + elasticsearch, + kibana, + existingUser, + newUser: user, + }); +} + +async function createUser({ + elasticsearch, + kibana, + newUser, +}: { + elasticsearch: Elasticsearch; + kibana: Kibana; + newUser: User; +}) { + const user = await callKibana({ + elasticsearch, + kibana, + options: { + method: 'POST', + url: `/internal/security/users/${newUser.username}`, + data: { + ...newUser, + enabled: true, + password: elasticsearch.password, + }, + }, + }); + + console.log(`User "${newUser.username}" was created`); + return user; +} + +async function updateUser({ + elasticsearch, + kibana, + existingUser, + newUser, +}: { + elasticsearch: Elasticsearch; + kibana: Kibana; + existingUser: User; + newUser: User; +}) { + const { username } = newUser; + const allRoles = union(existingUser.roles, newUser.roles); + const hasAllRoles = difference(allRoles, existingUser.roles).length === 0; + if (hasAllRoles) { + console.log(`Skipping: User "${username}" already has necessary roles: "${newUser.roles}"`); + return; + } + + // assign role to user + await callKibana({ + elasticsearch, + kibana, + options: { + method: 'POST', + url: `/internal/security/users/${username}`, + data: { ...existingUser, roles: allRoles }, + }, + }); + + console.log(`User "${username}" was updated`); +} + +async function getUser({ + elasticsearch, + kibana, + username, +}: { + elasticsearch: Elasticsearch; + kibana: Kibana; + username: string; +}) { + try { + return await callKibana({ + elasticsearch, + kibana, + options: { + url: `/internal/security/users/${username}`, + }, + }); + } catch (e) { + // return empty if user doesn't exist + if (isAxiosError(e) && e.response?.status === 404) { + return null; + } + + throw e; + } +} diff --git a/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/index.ts b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/index.ts new file mode 100644 index 0000000000000..9cfb2f1dc66d0 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/test_helpers/create_dataset_quality_users/index.ts @@ -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 { asyncForEach } from '@kbn/std'; +import { AbortError, callKibana } from './helpers/call_kibana'; +import { createOrUpdateUser } from './helpers/create_or_update_user'; +import { DatasetQualityUsername, users } from './authentication'; +import { createCustomRole } from './helpers/create_custom_role'; + +export interface Elasticsearch { + node: string; + username: string; + password: string; +} + +export interface Kibana { + hostname: string; +} + +export async function createDatasetQualityUsers({ + kibana, + elasticsearch, +}: { + kibana: Kibana; + elasticsearch: Elasticsearch; +}) { + const isCredentialsValid = await getIsCredentialsValid({ + elasticsearch, + kibana, + }); + + if (!isCredentialsValid) { + throw new AbortError('Invalid username/password'); + } + + const isSecurityEnabled = await getIsSecurityEnabled({ + elasticsearch, + kibana, + }); + + if (!isSecurityEnabled) { + throw new AbortError('Security must be enabled!'); + } + + const datasetQualityUsers = Object.values(DatasetQualityUsername); + await asyncForEach(datasetQualityUsers, async (username) => { + const user = users[username]; + const { builtInRoleNames = [], customRoleNames = [] } = user; + + // create custom roles + await Promise.all( + customRoleNames.map(async (roleName) => createCustomRole({ elasticsearch, kibana, roleName })) + ); + + // create user + const roles = builtInRoleNames.concat(customRoleNames); + await createOrUpdateUser({ + elasticsearch, + kibana, + user: { username, roles }, + }); + }); + + return datasetQualityUsers; +} + +async function getIsSecurityEnabled({ + elasticsearch, + kibana, +}: { + elasticsearch: Elasticsearch; + kibana: Kibana; +}) { + try { + await callKibana({ + elasticsearch, + kibana, + options: { + url: `/internal/security/me`, + }, + }); + return true; + } catch (err) { + return false; + } +} + +async function getIsCredentialsValid({ + elasticsearch, + kibana, +}: { + elasticsearch: Elasticsearch; + kibana: Kibana; +}) { + try { + await callKibana({ + elasticsearch, + kibana, + options: { + validateStatus: (status) => status >= 200 && status < 400, + url: `/`, + }, + }); + return true; + } catch (err) { + return false; + } +} diff --git a/x-pack/plugins/dataset_quality/server/types.ts b/x-pack/plugins/dataset_quality/server/types.ts new file mode 100644 index 0000000000000..f9a184cfb768c --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/types.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CustomRequestHandlerContext } from '@kbn/core/server'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DatasetQualityPluginSetupDependencies {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DatasetQualityPluginStartDependencies {} + +// 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 type DatasetQualityRequestHandlerContext = CustomRequestHandlerContext<{}>; diff --git a/x-pack/plugins/dataset_quality/server/types/api_types.ts b/x-pack/plugins/dataset_quality/server/types/api_types.ts new file mode 100644 index 0000000000000..077cb94aa3493 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/types/api_types.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 * as t from 'io-ts'; + +export const dataStreamTypesRt = t.partial({ + type: t.union([ + t.literal('logs'), + t.literal('metrics'), + t.literal('traces'), + t.literal('synthetics'), + 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/server/types/data_stream.ts b/x-pack/plugins/dataset_quality/server/types/data_stream.ts new file mode 100644 index 0000000000000..582746755ac51 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/types/data_stream.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 { ByteSize } from '@elastic/elasticsearch/lib/api/types'; + +export interface DataStreamsStatResponse { + items: DataStreamStat[]; +} + +export interface DataStreamStat { + name: string; + size?: ByteSize; + size_bytes?: number; + last_activity?: number; + integration?: { + name?: string; + managed_by?: string; + }; +} + +export type DataStreamTypes = 'logs' | 'metrics' | 'traces' | 'synthetics' | 'profiling'; diff --git a/x-pack/plugins/dataset_quality/tsconfig.json b/x-pack/plugins/dataset_quality/tsconfig.json index efe7ece5983ac..8e3ebcdb7e741 100644 --- a/x-pack/plugins/dataset_quality/tsconfig.json +++ b/x-pack/plugins/dataset_quality/tsconfig.json @@ -4,14 +4,19 @@ "outDir": "target/types" }, "include": [ - "../../../typings/**/*", "common/**/*", "public/**/*", - "server/**/*.ts", - "../../typings/**/*" + "server/**/*", + "../../../typings/**/*", ], "kbn_references": [ "@kbn/core", + "@kbn/server-route-repository", + "@kbn/core-plugins-server", + "@kbn/core-elasticsearch-server-mocks", + "@kbn/std", ], - "exclude": ["target/**/*"] + "exclude": [ + "target/**/*", + ] } diff --git a/x-pack/plugins/elastic_assistant/server/lib/executor.ts b/x-pack/plugins/elastic_assistant/server/lib/executor.ts index 88266914f36ed..27064f3fb1961 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/executor.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/executor.ts @@ -31,15 +31,7 @@ export const executeAction = async ({ const actionResult = await actionsClient.execute({ actionId: connectorId, - params: { - ...request.body.params, - subActionParams: - // TODO: Remove in part 2 of streaming work for security solution - // tracked here: https://github.com/elastic/security-team/issues/7363 - request.body.params.subAction === 'invokeAI' - ? request.body.params.subActionParams - : { body: JSON.stringify(request.body.params.subActionParams), stream: true }, - }, + params: request.body.params, }); if (actionResult.status === 'error') { 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/.storybook/context/ui_settings.ts b/x-pack/plugins/fleet/.storybook/context/ui_settings.ts index b5757c84875f7..6dec0c3764d59 100644 --- a/x-pack/plugins/fleet/.storybook/context/ui_settings.ts +++ b/x-pack/plugins/fleet/.storybook/context/ui_settings.ts @@ -26,6 +26,9 @@ const uiSettings: IUiSettingsClient = { set: async () => true, getUpdate$: () => of({ key: 'setting', newValue: get('setting'), oldValue: get('setting') }), getUpdateErrors$: () => of(new Error()), + validateValue: async () => { + return { successfulValidation: true, valid: true }; + }, }; export const getUiSettings = () => uiSettings; diff --git a/x-pack/plugins/fleet/common/services/is_agent_upgradeable.test.ts b/x-pack/plugins/fleet/common/services/is_agent_upgradeable.test.ts index ad8138abbce7f..7ab016239702d 100644 --- a/x-pack/plugins/fleet/common/services/is_agent_upgradeable.test.ts +++ b/x-pack/plugins/fleet/common/services/is_agent_upgradeable.test.ts @@ -5,23 +5,29 @@ * 2.0. */ -import type { Agent } from '../types/models/agent'; +import type { Agent, AgentUpgradeDetails } from '../types/models/agent'; -import { getRecentUpgradeInfoForAgent, isAgentUpgradeable } from './is_agent_upgradeable'; +import { + getRecentUpgradeInfoForAgent, + isAgentUpgradeable, + isAgentUpgrading, +} from './is_agent_upgradeable'; const getAgent = ({ version, upgradeable = false, unenrolling = false, unenrolled = false, - updating = false, + upgrading = false, + upgradeDetails, minutesSinceUpgrade, }: { version: string; upgradeable?: boolean; unenrolling?: boolean; unenrolled?: boolean; - updating?: boolean; + upgrading?: boolean; + upgradeDetails?: AgentUpgradeDetails; minutesSinceUpgrade?: number; }): Agent => { const agent: Agent = { @@ -98,9 +104,12 @@ const getAgent = ({ if (unenrolled) { agent.unenrolled_at = '2020-10-01T14:43:27.255Z'; } - if (updating) { + if (upgrading) { agent.upgrade_started_at = new Date(Date.now()).toISOString(); } + if (upgradeDetails) { + agent.upgrade_details = upgradeDetails; + } if (minutesSinceUpgrade) { agent.upgraded_at = new Date(Date.now() - minutesSinceUpgrade * 6e4).toISOString(); } @@ -171,11 +180,49 @@ describe('Fleet - isAgentUpgradeable', () => { isAgentUpgradeable(getAgent({ version: '7.9.0', upgradeable: true }), '8.0.0', '7.9.0') ).toBe(false); }); - it('returns false if agent reports upgradeable, but is already updating', () => { + it('returns false if agent with no upgrade details reports upgradeable, but is already upgrading', () => { + expect( + isAgentUpgradeable( + getAgent({ version: '7.9.0', upgradeable: true, upgrading: true }), + '8.0.0' + ) + ).toBe(false); + }); + it('returns false if agent reports upgradeable, but has an upgrade status other than failed', () => { expect( - isAgentUpgradeable(getAgent({ version: '7.9.0', upgradeable: true, updating: true }), '8.0.0') + isAgentUpgradeable( + getAgent({ + version: '7.9.0', + upgradeable: true, + upgradeDetails: { + target_version: '8.0.0', + action_id: 'XXX', + state: 'UPG_REQUESTED', + }, + }), + '8.0.0' + ) ).toBe(false); }); + it('returns true if agent reports upgradeable and has a failed upgrade status', () => { + expect( + isAgentUpgradeable( + getAgent({ + version: '7.9.0', + upgradeable: true, + upgradeDetails: { + target_version: '8.0.0', + action_id: 'XXX', + state: 'UPG_FAILED', + metadata: { + error_msg: 'Upgrade timed out', + }, + }, + }), + '8.0.0' + ) + ).toBe(true); + }); it('returns false if the agent reports upgradeable but was upgraded less than 10 minutes ago', () => { expect( isAgentUpgradeable( @@ -215,3 +262,49 @@ describe('hasAgentBeenUpgradedRecently', () => { ).toBe(false); }); }); + +describe('isAgentUpgrading', () => { + it('returns true if the agent has an upgrade status other than failed', () => { + expect( + isAgentUpgrading( + getAgent({ + version: '7.9.0', + upgradeDetails: { + target_version: '8.0.0', + action_id: 'XXX', + state: 'UPG_REQUESTED', + }, + }) + ) + ).toBe(true); + }); + + it('returns false if the agent has a failed upgrade status', () => { + expect( + isAgentUpgrading( + getAgent({ + version: '7.9.0', + upgradeDetails: { + target_version: '8.0.0', + action_id: 'XXX', + state: 'UPG_FAILED', + metadata: { + error_msg: 'Upgrade timed out', + }, + }, + }) + ) + ).toBe(false); + }); + + it('returns true if the agent is upgrading but has no upgrade details', () => { + expect( + isAgentUpgrading( + getAgent({ + version: '7.9.0', + upgrading: true, + }) + ) + ).toBe(true); + }); +}); diff --git a/x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts b/x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts index c7bd21c45af4a..ac21e24520c76 100644 --- a/x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts +++ b/x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts @@ -30,11 +30,9 @@ export function isAgentUpgradeable( if (!agent.local_metadata.elastic.agent.upgradeable) { return false; } - // check that the agent is not already in the process of updating - if (agent.upgrade_started_at && !agent.upgraded_at) { + if (isAgentUpgrading(agent)) { return false; } - // check that the agent has not been upgraded more recently than the monitoring period if (getRecentUpgradeInfoForAgent(agent).hasBeenUpgradedRecently) { return false; } @@ -80,3 +78,10 @@ export function getRecentUpgradeInfoForAgent(agent: Agent): { return { hasBeenUpgradedRecently, timeToWaitMs }; } + +export function isAgentUpgrading(agent: Agent) { + if (agent.upgrade_details) { + return agent.upgrade_details.state !== 'UPG_FAILED'; + } + return agent.upgrade_started_at && !agent.upgraded_at; +} diff --git a/x-pack/plugins/fleet/common/types/models/agent.ts b/x-pack/plugins/fleet/common/types/models/agent.ts index 934ca7ecd2641..120f0bc883e1d 100644 --- a/x-pack/plugins/fleet/common/types/models/agent.ts +++ b/x-pack/plugins/fleet/common/types/models/agent.ts @@ -443,7 +443,7 @@ export interface AgentUpgradeDetails { target_version: string; action_id: string; state: AgentUpgradeStateType; - metadata: { + metadata?: { scheduled_at?: string; download_percent?: number; failed_state?: AgentUpgradeStateType; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx index 1deb84143d2a2..c2517c245839d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx @@ -23,11 +23,16 @@ import { EuiFlexGroup, EuiFlexItem, EuiButtonEmpty, + EuiLink, + EuiToolTip, + EuiIcon, } from '@elastic/eui'; import styled from 'styled-components'; import { CodeEditor } from '@kbn/kibana-react-plugin/public'; +import { useStartServices } from '../../../../../../../../hooks'; + import { ExperimentalFeaturesService } from '../../../../../../services'; import { DATASET_VAR_NAME } from '../../../../../../../../../common/constants'; @@ -41,6 +46,16 @@ const FixedHeightDiv = styled.div` height: 300px; `; +const FormRow = styled(EuiFormRow)` + .euiFormRow__label { + flex: 1; + } + + .euiFormRow__fieldWrapper > .euiPanel { + padding: ${(props) => props.theme.eui.euiSizeXS}; + } +`; + interface InputFieldProps { varDef: RegistryVarsEntry; value: any; @@ -125,11 +140,11 @@ export const PackagePolicyInputVarField: React.FunctionComponent : fieldLabel} labelAppend={ isOptional ? ( @@ -138,13 +153,16 @@ export const PackagePolicyInputVarField: React.FunctionComponent - ) : null + ) : undefined } helpText={description && } + fullWidth > {field} - + ); + + return varDef.secret ? {formRow} : formRow; } ); @@ -296,6 +314,53 @@ function getInputComponent({ } } +const SecretFieldWrapper = ({ children }: { children: React.ReactNode }) => { + const { docLinks } = useStartServices(); + + return ( + + {children} + + + + + + + + + + ); +}; + +const SecretFieldLabel = ({ fieldLabel }: { fieldLabel: string }) => { + return ( + <> + + + {fieldLabel} + + + + } + > + + + + + + + + ); +}; + function SecretInputField({ varDef, value, @@ -313,10 +378,12 @@ function SecretInputField({ }: InputComponentProps) { const [editMode, setEditMode] = useState(isEditPage && !value); const valueOnFirstRender = useRef(value); + const lowercaseTitle = varDef.title?.toLowerCase(); + if (isEditPage && !editMode) { return ( - + <> - + ); } diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/upgrade.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/upgrade.tsx index 99eba56ea6a9e..8f10a53afcf2d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/upgrade.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/upgrade.tsx @@ -24,10 +24,18 @@ import { EuiFlyoutBody, EuiFlyoutHeader, EuiTitle, + EuiSpacer, } from '@elastic/eui'; import styled from 'styled-components'; +import type { + DryRunPackagePolicy, + PackagePolicy, + RegistryVarsEntry, +} from '../../../../../../../common'; + import type { UpgradePackagePolicyDryRunResponse } from '../../../../../../../common/types/rest_spec'; +import { useStartServices } from '../../../../hooks'; const FlyoutBody = styled(EuiFlyoutBody)` .euiFlyoutBody__overflowContent { @@ -35,18 +43,125 @@ const FlyoutBody = styled(EuiFlyoutBody)` } `; +const HasNewSecretsCallOut = ({ newSecrets }: { newSecrets: RegistryVarsEntry[] }) => { + const { docLinks } = useStartServices(); + + return ( + + + Learn more. + + ), + }} + /> + + + + + {newSecrets.map((secret) => ( +
  • {secret.title}
  • + ))} + + ), + }} + /> +
    + ); +}; + +const HasConflictsCallout = ({ + currentPackagePolicy, + proposedUpgradePackagePolicy, + onPreviousConfigurationClick, +}: { + currentPackagePolicy?: PackagePolicy; + proposedUpgradePackagePolicy?: DryRunPackagePolicy; + onPreviousConfigurationClick?: () => void; +}) => { + return ( + + + + + ), + }} + /> + + ); +}; + +const ReadyToUpgradeCallOut = ({ + currentPackagePolicy, + proposedUpgradePackagePolicy, +}: { + currentPackagePolicy?: PackagePolicy; + proposedUpgradePackagePolicy?: DryRunPackagePolicy; +}) => { + return ( + + + + ); +}; + export const UpgradeStatusCallout: React.FunctionComponent<{ dryRunData: UpgradePackagePolicyDryRunResponse; -}> = ({ dryRunData }) => { + newSecrets: RegistryVarsEntry[]; +}> = ({ dryRunData, newSecrets }) => { const [isPreviousVersionFlyoutOpen, setIsPreviousVersionFlyoutOpen] = useState(false); if (!dryRunData) { return null; } - const isReadyForUpgrade = !dryRunData[0].hasErrors; - + const hasNewSecrets = newSecrets.length > 0; const [currentPackagePolicy, proposedUpgradePackagePolicy] = dryRunData[0].diff || []; + const isReadyForUpgrade = currentPackagePolicy && !dryRunData[0].hasErrors; return ( <> @@ -73,48 +188,23 @@ export const UpgradeStatusCallout: React.FunctionComponent<{ )} - {isReadyForUpgrade && currentPackagePolicy ? ( - - - + {isReadyForUpgrade ? ( + ) : ( - - setIsPreviousVersionFlyoutOpen(true)}> - - - ), - }} - /> - + setIsPreviousVersionFlyoutOpen(true)} + /> + )} + {hasNewSecrets && ( + <> + + + )} ); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_package_policy.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_package_policy.tsx index 2f66c590ae3f5..36b1134f9151c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_package_policy.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_package_policy.tsx @@ -99,7 +99,9 @@ export function usePackagePolicyWithRelatedData( policy: { elasticsearch, ...restPackagePolicy }, } = await prepareInputPackagePolicyDataset(packagePolicy); const result = await sendUpdatePackagePolicy(packagePolicyId, restPackagePolicy); + setFormState('SUBMITTED'); + return result; }; // Update package policy validation diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx index e3b36999ed0b6..033c083882f45 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx @@ -19,7 +19,6 @@ import { EuiErrorBoundary, } from '@elastic/eui'; -import type { PackageInfo } from '../../../types'; import { useLink, useBreadcrumbs, @@ -55,6 +54,7 @@ import { generateUpdatePackagePolicyDevToolsRequest } from '../services'; import { UpgradeStatusCallout } from './components'; import { usePackagePolicyWithRelatedData, useHistoryBlock } from './hooks'; +import { getNewSecrets } from './utils'; export const EditPackagePolicyPage = memo(() => { const { @@ -91,7 +91,6 @@ export const EditPackagePolicyForm = memo<{ } = useConfig(); const { getHref } = useLink(); - const [] = useState(); const { // data agentPolicy, @@ -117,6 +116,14 @@ export const EditPackagePolicyForm = memo<{ const canWriteIntegrationPolicies = useAuthz().integrations.writeIntegrationPolicies; + const newSecrets = useMemo(() => { + if (!packageInfo) { + return []; + } + + return getNewSecrets({ packageInfo, packagePolicy }); + }, [packageInfo, packagePolicy]); + const policyId = agentPolicy?.id ?? ''; // Retrieve agent count @@ -418,7 +425,7 @@ export const EditPackagePolicyForm = memo<{ )} {isUpgrade && upgradeDryRunData && ( <> - + )} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/get_new_secrets.test.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/get_new_secrets.test.ts new file mode 100644 index 0000000000000..80ae49ed36260 --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/get_new_secrets.test.ts @@ -0,0 +1,143 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PackageInfo, UpdatePackagePolicy } from '../../../../types'; + +import { getNewSecrets } from './get_new_secrets'; + +describe('getNewSecrets', () => { + it('does not find new secrets when there are no secrets configured', () => { + const packageInfo = { + name: 'mock-package', + title: 'Mock package', + version: '0.0.0', + vars: [ + { + name: 'package-var', + type: 'string', + secret: false, + }, + ], + policy_templates: [ + { + name: 'test-policy-template', + inputs: [ + { + type: 'test-input', + title: 'Test input', + description: 'Test input', + vars: [ + { + name: 'policy-template-var', + type: 'string', + secret: false, + }, + ], + }, + ], + }, + ], + } as unknown as PackageInfo; + + const packagePolicy = { + vars: [ + { + name: 'package-var', + value: 'test', + }, + ], + inputs: [ + { + name: 'test-input', + vars: { + 'policy-template-var': { + value: 'test', + }, + }, + }, + ], + } as unknown as UpdatePackagePolicy; + + expect( + getNewSecrets({ + packageInfo, + packagePolicy, + }) + ).toEqual([]); + }); + + it('finds new secrets when they exist', () => { + const packageInfo = { + name: 'mock-package', + title: 'Mock package', + version: '0.0.0', + vars: [ + { + name: 'package-var', + type: 'string', + secret: true, + }, + ], + policy_templates: [ + { + name: 'test-policy-template', + inputs: [ + { + type: 'test-input', + title: 'Test input', + description: 'Test input', + vars: [ + { + name: 'policy-template-var', + type: 'string', + secret: true, + }, + ], + }, + ], + }, + ], + } as unknown as PackageInfo; + + const packagePolicy = { + vars: [ + { + name: 'package-var', + value: 'test', + }, + ], + inputs: [ + { + name: 'test-input', + vars: { + 'policy-template-var': { + value: 'test', + }, + }, + }, + ], + } as unknown as UpdatePackagePolicy; + + expect( + getNewSecrets({ + packageInfo, + packagePolicy, + }) + ).toEqual([ + { + name: 'package-var', + secret: true, + type: 'string', + }, + { + name: 'policy-template-var', + secret: true, + type: 'string', + }, + ]); + }); +}); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/get_new_secrets.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/get_new_secrets.ts new file mode 100644 index 0000000000000..68f677bbfb894 --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/get_new_secrets.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 { isInputOnlyPolicyTemplate } from '../../../../../../../common/services'; + +import type { PackageInfo, UpdatePackagePolicy } from '../../../../types'; + +export const getNewSecrets = ({ + packageInfo, + packagePolicy, +}: { + packageInfo: PackageInfo; + packagePolicy: UpdatePackagePolicy; +}) => { + const result = []; + + for (const packageVar of packageInfo.vars ?? []) { + const isVarSecretOnPolicy = packagePolicy.vars?.[packageVar.name]?.value?.isSecretRef; + + if (packageVar.secret && !isVarSecretOnPolicy) { + result.push(packageVar); + } + } + + for (const policyTemplate of packageInfo.policy_templates ?? []) { + if (isInputOnlyPolicyTemplate(policyTemplate)) { + for (const packageVar of policyTemplate.vars ?? []) { + const isVarSecretOnPolicy = + packagePolicy.inputs?.[0]?.vars?.[packageVar.name]?.value?.isSecretRef; + + if (packageVar.secret && !isVarSecretOnPolicy) { + result.push(packageVar); + } + } + } else { + for (const input of policyTemplate.inputs ?? []) { + for (const packageVar of input.vars ?? []) { + const isVarSecretOnPolicy = + packagePolicy.inputs?.[0]?.vars?.[packageVar.name]?.value?.isSecretRef; + + if (packageVar.secret && !isVarSecretOnPolicy) { + result.push(packageVar); + } + } + } + } + } + + return result; +}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/index.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/index.ts index be01b9834a7dc..5aa227e55bad8 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/index.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/utils/index.ts @@ -7,3 +7,4 @@ export * from './has_upgrade_available'; export { fixApmDurationVars } from './fix_apm_duration_vars'; +export * from './get_new_secrets'; 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 de9767c2f0b54..572b86d62c73d 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 @@ -77,7 +77,7 @@ function getStatusComponents(agentUpgradeDetails?: AgentUpgradeDetails) { id="xpack.fleet.agentUpgradeStatusTooltip.upgradeScheduled" defaultMessage="The agent has been instructed to upgrade.{upgradeStartDelay}" values={{ - upgradeStartDelay: getUpgradeStartDelay(agentUpgradeDetails.metadata.scheduled_at), + upgradeStartDelay: getUpgradeStartDelay(agentUpgradeDetails.metadata?.scheduled_at), }} /> ), @@ -97,7 +97,9 @@ function getStatusComponents(agentUpgradeDetails?: AgentUpgradeDetails) { id="xpack.fleet.agentUpgradeStatusTooltip.upgradeDownloading" defaultMessage="Downloading the new agent artifact version{downloadEstimate}." values={{ - downloadEstimate: getDownloadEstimate(agentUpgradeDetails?.metadata.download_percent), + downloadEstimate: getDownloadEstimate( + agentUpgradeDetails?.metadata?.download_percent + ), }} /> ), @@ -202,7 +204,7 @@ function getStatusComponents(agentUpgradeDetails?: AgentUpgradeDetails) { id="xpack.fleet.agentUpgradeStatusTooltip.upgradeFailed" defaultMessage="Upgrade failed: {errorMsg}." values={{ - errorMsg: agentUpgradeDetails?.metadata.error_msg, + errorMsg: agentUpgradeDetails?.metadata?.error_msg, }} /> ), 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..0346986f3abbe 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' }, diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/overview/overview.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/overview/overview.tsx index 517c0552f925b..8844a0cb128a5 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/overview/overview.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/overview/overview.tsx @@ -327,7 +327,7 @@ export const OverviewPage: React.FC = memo( />
    ) : null} - +
    diff --git a/x-pack/plugins/fleet/server/routes/agent/upgrade_handler.ts b/x-pack/plugins/fleet/server/routes/agent/upgrade_handler.ts index 78ca30ea1c71f..547fda566a95f 100644 --- a/x-pack/plugins/fleet/server/routes/agent/upgrade_handler.ts +++ b/x-pack/plugins/fleet/server/routes/agent/upgrade_handler.ts @@ -24,6 +24,7 @@ import { getRecentUpgradeInfoForAgent, isAgentUpgradeable, AGENT_UPGRADE_COOLDOWN_IN_MIN, + isAgentUpgrading, } from '../../../common/services'; import { getMaxVersion } from '../../../common/services/get_min_max_version'; import { getAgentById } from '../../services/agents'; @@ -99,6 +100,16 @@ export const postAgentUpgradeHandler: RequestHandler< }, }); } + + if (!force && isAgentUpgrading(agent)) { + return response.customError({ + statusCode: 400, + body: { + message: `agent ${request.params.agentId} is already upgrading`, + }, + }); + } + if (!force && !isAgentUpgradeable(agent, latestAgentVersion, version)) { return response.customError({ statusCode: 400, 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/agents/upgrade_action_runner.ts b/x-pack/plugins/fleet/server/services/agents/upgrade_action_runner.ts index c03fe7da3c668..157eaa688c746 100644 --- a/x-pack/plugins/fleet/server/services/agents/upgrade_action_runner.ts +++ b/x-pack/plugins/fleet/server/services/agents/upgrade_action_runner.ts @@ -76,7 +76,12 @@ export async function upgradeBatch( const latestAgentVersion = await getLatestAvailableVersion(); const upgradeableResults = await Promise.allSettled( agentsToCheckUpgradeable.map(async (agent) => { - // Filter out agents currently unenrolling, unenrolled, recently upgraded or not upgradeable b/c of version check + // Filter out agents that are: + // - currently unenrolling + // - unenrolled + // - recently upgraded + // - currently upgrading + // - upgradeable b/c of version check const isNotAllowed = getRecentUpgradeInfoForAgent(agent).hasBeenUpgradedRecently || (!options.force && !isAgentUpgradeable(agent, latestAgentVersion, options.version)); diff --git a/x-pack/plugins/index_management/public/application/sections/home/enrich_policies_list/policies_table/policies_table.tsx b/x-pack/plugins/index_management/public/application/sections/home/enrich_policies_list/policies_table/policies_table.tsx index 9f5629696d55f..87002e6042270 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/enrich_policies_list/policies_table/policies_table.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/enrich_policies_list/policies_table/policies_table.tsx @@ -58,7 +58,6 @@ export const PoliciesTable: FunctionComponent = ({ fill iconType="plusInCircle" {...reactRouterNavigate(history, '/enrich_policies/create')} - data-test-subj="enrichPoliciesPoliciesTableCreateButton" > ; + +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/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/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/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/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..66c65428833ac 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'; @@ -45,6 +46,7 @@ export const initInfraServer = (libs: InfraBackendLibs) => { initSnapshotRoute(libs); initNodeDetailsRoute(libs); initMetricsSourceConfigurationRoutes(libs); + initGetLogAnalysisIdFormatsRoute(libs); initValidateLogAnalysisDatasetsRoute(libs); initValidateLogAnalysisIndicesRoute(libs); initGetLogEntryExamplesRoute(libs); 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/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/tsconfig.json b/x-pack/plugins/infra/tsconfig.json index e3b71afa57001..ea4fa7be6565f 100644 --- a/x-pack/plugins/infra/tsconfig.json +++ b/x-pack/plugins/infra/tsconfig.json @@ -74,7 +74,8 @@ "@kbn/expressions-plugin", "@kbn/chart-icons", "@kbn/advanced-settings-plugin", - "@kbn/cloud-plugin" + "@kbn/cloud-plugin", + "@kbn/custom-icons" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/lens/public/app_plugin/save_modal.tsx b/x-pack/plugins/lens/public/app_plugin/save_modal.tsx index 1a4d7c5bfb028..508e8409eb269 100644 --- a/x-pack/plugins/lens/public/app_plugin/save_modal.tsx +++ b/x-pack/plugins/lens/public/app_plugin/save_modal.tsx @@ -24,6 +24,7 @@ export interface Props { savingToLibraryPermitted?: boolean; originatingApp?: string; + getOriginatingPath?: (dashboardId: string) => string; allowByValueEmbeddables: boolean; savedObjectsTagging?: SavedObjectTaggingPluginStart; @@ -35,7 +36,7 @@ export interface Props { getAppNameFromId: () => string | undefined; returnToOriginSwitchLabel?: string; - + returnToOrigin?: boolean; onClose: () => void; onSave: (props: SaveProps, options: { saveToLibrary: boolean }) => void; } @@ -43,6 +44,7 @@ export interface Props { export const SaveModal = (props: Props) => { const { originatingApp, + getOriginatingPath, savingToLibraryPermitted, savedObjectsTagging, tagsIds, @@ -54,10 +56,11 @@ export const SaveModal = (props: Props) => { getAppNameFromId, onClose, onSave, + returnToOrigin, } = props; // Use the modal with return-to-origin features if we're in an app's edit flow or if by-value embeddables are disabled - if (originatingApp || !allowByValueEmbeddables) { + if ((originatingApp || !allowByValueEmbeddables) && returnToOrigin !== false) { return ( { defaultMessage: 'Lens visualization', })} data-test-subj="lnsApp_saveModalDashboard" + getOriginatingPath={getOriginatingPath} /> ); }; 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 9a9fb2661f308..e01f68d9e4b30 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 @@ -25,11 +25,12 @@ type ExtraProps = Pick & export type SaveModalContainerProps = { originatingApp?: string; + getOriginatingPath?: (dashboardId: string) => string; persistedDoc?: Document; lastKnownDoc?: Document; returnToOriginSwitchLabel?: string; onClose: () => void; - onSave?: () => void; + onSave?: (saveProps: SaveProps) => void; runSave?: (saveProps: SaveProps, options: { saveToLibrary: boolean }) => void; isSaveable?: boolean; getAppNameFromId?: () => string | undefined; @@ -44,6 +45,7 @@ export function SaveModalContainer({ runSave, persistedDoc, originatingApp, + getOriginatingPath, initialInput, redirectTo, redirectToOrigin, @@ -119,6 +121,7 @@ export function SaveModalContainer({ redirectTo, redirectToOrigin, originatingApp, + getOriginatingPath, getIsByValueMode: () => false, onAppLeave: () => {}, savedObjectStore: lensServices.savedObjectStore, @@ -126,7 +129,7 @@ export function SaveModalContainer({ saveProps, options ).then(() => { - onSave?.(); + onSave?.(saveProps); onClose(); }); } @@ -137,6 +140,7 @@ export function SaveModalContainer({ return ( ); } @@ -158,11 +163,15 @@ const redirectToDashboard = ({ embeddableInput, dashboardFeatureFlag, dashboardId, + originatingApp, + getOriginatingPath, stateTransfer, }: { embeddableInput: LensEmbeddableInput; dashboardId: string; dashboardFeatureFlag: LensAppServices['dashboardFeatureFlag']; + originatingApp?: string; + getOriginatingPath?: (dashboardId: string) => string | undefined; stateTransfer: LensAppServices['stateTransfer']; }) => { if (!dashboardFeatureFlag.allowByValueEmbeddables) { @@ -174,8 +183,11 @@ const redirectToDashboard = ({ type: LENS_EMBEDDABLE_TYPE, }; - const path = dashboardId === 'new' ? '#/create' : `#/view/${dashboardId}`; - stateTransfer.navigateToWithEmbeddablePackage('dashboards', { + const path = + getOriginatingPath?.(dashboardId) ?? + (dashboardId === 'new' ? '#/create' : `#/view/${dashboardId}`); + const appId = originatingApp ?? 'dashboards'; + stateTransfer.navigateToWithEmbeddablePackage(appId, { state, path, }); @@ -208,6 +220,7 @@ export const runSaveLensVisualization = async ( getIsByValueMode: () => boolean; persistedDoc?: Document; originatingApp?: string; + getOriginatingPath?: (dashboardId: string) => string; textBasedLanguageSave?: boolean; switchDatasource?: () => void; savedObjectStore: SavedObjectIndexStore; @@ -248,7 +261,6 @@ export const runSaveLensVisualization = async ( persistedDoc && savedObjectsTagging ? savedObjectsTagging.ui.getTagIdsFromReferences(persistedDoc.references) : []; - references = savedObjectsTagging.ui.updateTagsReferences( references, saveProps.newTags || tagsIds @@ -305,7 +317,6 @@ export const runSaveLensVisualization = async ( timeRange: saveProps.panelTimeRange, }; } - if (saveProps.returnToOrigin && redirectToOrigin) { // disabling the validation on app leave because the document has been saved. onAppLeave?.((actions) => { @@ -323,6 +334,8 @@ export const runSaveLensVisualization = async ( dashboardId: saveProps.dashboardId, stateTransfer, dashboardFeatureFlag, + originatingApp: props.originatingApp, + getOriginatingPath: props.getOriginatingPath, }); return; } diff --git a/x-pack/plugins/lens/public/app_plugin/tags_saved_object_save_modal_dashboard_wrapper.tsx b/x-pack/plugins/lens/public/app_plugin/tags_saved_object_save_modal_dashboard_wrapper.tsx index 39c2f55bdd676..9f932d0b23fd8 100644 --- a/x-pack/plugins/lens/public/app_plugin/tags_saved_object_save_modal_dashboard_wrapper.tsx +++ b/x-pack/plugins/lens/public/app_plugin/tags_saved_object_save_modal_dashboard_wrapper.tsx @@ -28,6 +28,7 @@ export type TagEnhancedSavedObjectSaveModalDashboardProps = Omit< initialTags: string[]; savedObjectsTagging?: SavedObjectTaggingPluginStart; onSave: (props: DashboardSaveProps) => void; + getOriginatingPath?: (dashboardId: string) => string; }; const SavedObjectSaveModalDashboard = withSuspense(LazySavedObjectSaveModalDashboard); diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index b9d0bae197909..bb99e061893f2 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 = { @@ -1110,7 +1109,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/plugin.ts b/x-pack/plugins/lens/public/plugin.ts index 63eab92016d50..460864d1c86f2 100644 --- a/x-pack/plugins/lens/public/plugin.ts +++ b/x-pack/plugins/lens/public/plugin.ts @@ -127,6 +127,8 @@ import { downloadCsvShareProvider } from './app_plugin/csv_download_provider/csv import { CONTENT_ID, LATEST_VERSION } from '../common/content_management'; import type { EditLensConfigurationProps } from './app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration'; +export type { SaveProps } from './app_plugin'; + export interface LensPluginSetupDependencies { urlForwarding: UrlForwardingSetup; expressions: ExpressionsSetup; diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 6ac2b98569d7f..25b637aebf071 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -1416,6 +1416,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/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/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index 12f737244bcb0..6cb071d18352a 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -91,7 +91,8 @@ "@kbn/logging", "@kbn/core-plugins-server", "@kbn/field-utils", - "@kbn/shared-ux-button-toolbar" + "@kbn/shared-ux-button-toolbar", + "@kbn/cell-actions" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/maps/common/descriptor_types/data_request_descriptor_types.ts b/x-pack/plugins/maps/common/descriptor_types/data_request_descriptor_types.ts index aa4c30fc1cb40..1977173a0207c 100644 --- a/x-pack/plugins/maps/common/descriptor_types/data_request_descriptor_types.ts +++ b/x-pack/plugins/maps/common/descriptor_types/data_request_descriptor_types.ts @@ -11,6 +11,7 @@ import type { KibanaExecutionContext } from '@kbn/core/public'; import type { Query } from '@kbn/data-plugin/common'; import type { Filter } from '@kbn/es-query'; import type { TimeRange } from '@kbn/es-query'; +import type { SearchResponseWarning } from '@kbn/search-response-warnings'; import { MapExtent } from './map_descriptor'; export type Timeslice = { @@ -91,6 +92,7 @@ export type VectorTileLayerMeta = { export type DataRequestMeta = { // request stop time in milliseconds since epoch requestStopTime?: number; + warnings?: SearchResponseWarning[]; } & Partial< SourceRequestMeta & VectorSourceRequestMeta & diff --git a/x-pack/plugins/maps/common/mvt_request_body.test.ts b/x-pack/plugins/maps/common/mvt_request_body.test.ts index bb8945231b701..3a8c654b2979d 100644 --- a/x-pack/plugins/maps/common/mvt_request_body.test.ts +++ b/x-pack/plugins/maps/common/mvt_request_body.test.ts @@ -52,6 +52,26 @@ describe('getHitsTileRequest', () => { expect(path).toEqual('/my%20index/_mvt/my%20location/0/0/0'); }); + test(`Should use requestBody.size to set both track_total_hits and size parameters`, () => { + const searchRequest = { + size: 20000, + runtime_mappings: {}, + query: {}, + }; + const { body } = getHitsTileRequest({ + buffer: 5, + risonRequestBody: rison.encode(searchRequest), + geometryFieldName: 'my location', + hasLabels: true, + index: 'my index', + x: 0, + y: 0, + z: 0, + }); + expect(body?.track_total_hits).toEqual(20001); + expect(body?.size).toEqual(20000); + }); + describe('sort', () => { test(`Should include sort`, () => { const searchRequest = { diff --git a/x-pack/plugins/maps/common/mvt_request_body.ts b/x-pack/plugins/maps/common/mvt_request_body.ts index 9a765505960ef..d87707ad6b908 100644 --- a/x-pack/plugins/maps/common/mvt_request_body.ts +++ b/x-pack/plugins/maps/common/mvt_request_body.ts @@ -83,6 +83,7 @@ export function getHitsTileRequest({ if (!requestBody) { throw new Error('Required requestBody parameter not provided'); } + const size = typeof requestBody.size === 'number' ? requestBody.size : 10000; const tileRequestBody = { buffer, grid_precision: 0, // no aggs @@ -90,7 +91,12 @@ export function getHitsTileRequest({ extent: 4096, // full resolution, query: requestBody.query, runtime_mappings: requestBody.runtime_mappings, - track_total_hits: typeof requestBody.size === 'number' ? requestBody.size + 1 : false, + // Number of hits matching the query to count accurately + // Used to notify users of truncated results + track_total_hits: size + 1, + // Maximum number of features to return in the hits layer + // Used to fetch number of hits that correspondes with track_total_hits + size, with_labels: hasLabels, } as SearchMvtRequest['body']; if (requestBody.fields) { diff --git a/x-pack/plugins/maps/public/classes/layers/layer.tsx b/x-pack/plugins/maps/public/classes/layers/layer.tsx index d93348dd8ef85..70cdc8ace4cf1 100644 --- a/x-pack/plugins/maps/public/classes/layers/layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/layer.tsx @@ -10,12 +10,18 @@ import { i18n } from '@kbn/i18n'; import type { Map as MbMap } from '@kbn/mapbox-gl'; import type { Query } from '@kbn/es-query'; +import { + getWarningsTitle, + type SearchResponseWarning, + ViewDetailsPopover, +} from '@kbn/search-response-warnings'; import _ from 'lodash'; import React, { ReactElement, ReactNode } from 'react'; import { EuiIcon } from '@elastic/eui'; import { v4 as uuidv4 } from 'uuid'; import { FeatureCollection } from 'geojson'; import { DataRequest } from '../util/data_request'; +import { hasIncompleteResults } from '../util/tile_meta_feature_utils'; import { LAYER_TYPE, MAX_ZOOM, @@ -41,9 +47,16 @@ import { LICENSED_FEATURES } from '../../licensed_features'; import { IESSource } from '../sources/es_source'; import { TileErrorsList } from './tile_errors_list'; -export interface LayerError { +export const INCOMPLETE_RESULTS_WARNING = i18n.translate( + 'xpack.maps.layer.incompleteResultsWarning', + { + defaultMessage: `Layer had issues returning data and results might be incomplete.`, + } +); + +export interface LayerMessage { title: string; - error: ReactNode; + body: ReactNode; } export interface ILayer { @@ -77,7 +90,9 @@ export interface ILayer { isLayerLoading(zoom: number): boolean; isFilteredByGlobalTime(): Promise; hasErrors(): boolean; - getErrors(): LayerError[]; + getErrors(): LayerMessage[]; + hasWarnings(): boolean; + getWarnings(): LayerMessage[]; /* * ILayer.getMbLayerIds returns a list of all mapbox layers assoicated with this layer. @@ -405,14 +420,14 @@ export class AbstractLayer implements ILayer { }); } - getErrors(): LayerError[] { - const errors: LayerError[] = []; + getErrors(): LayerMessage[] { + const errors: LayerMessage[] = []; const sourceError = this.getSourceDataRequest()?.renderError(); if (sourceError) { errors.push({ title: this._getSourceErrorTitle(), - error: sourceError, + body: sourceError, }); } @@ -421,13 +436,59 @@ export class AbstractLayer implements ILayer { title: i18n.translate('xpack.maps.layer.tileErrorTitle', { defaultMessage: `An error occurred when loading layer tiles`, }), - error: , + body: , }); } return errors; } + hasWarnings(): boolean { + const hasDataRequestWarnings = this._dataRequests.some((dataRequest) => { + const dataRequestMeta = dataRequest.getMeta(); + return dataRequestMeta?.warnings?.length; + }); + + if (hasDataRequestWarnings) { + return true; + } + + return this._isTiled() ? this._getTileMetaFeatures().some(hasIncompleteResults) : false; + } + + getWarnings(): LayerMessage[] { + const warningMessages: LayerMessage[] = []; + + const dataRequestWarnings: SearchResponseWarning[] = []; + this._dataRequests.forEach((dataRequest) => { + const dataRequestMeta = dataRequest.getMeta(); + if (dataRequestMeta?.warnings?.length) { + dataRequestWarnings.push(...dataRequestMeta.warnings); + } + }); + + if (dataRequestWarnings.length) { + warningMessages.push({ + title: getWarningsTitle(dataRequestWarnings), + body: ( + <> + {INCOMPLETE_RESULTS_WARNING}{' '} + + + ), + }); + } + + if (this._isTiled() && this._getTileMetaFeatures().some(hasIncompleteResults)) { + warningMessages.push({ + title: '', + body: INCOMPLETE_RESULTS_WARNING, + }); + } + + return warningMessages; + } + async syncData(syncContext: DataRequestContext) { // no-op by default } diff --git a/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx b/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx index 7b7ac229f154e..7bdab791f59f9 100644 --- a/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx +++ b/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx @@ -28,7 +28,7 @@ import { import { ISource, SourceEditorArgs } from '../../sources/source'; import { type DataRequestContext } from '../../../actions'; import { getLayersExtent } from '../../../actions/get_layers_extent'; -import { ILayer, LayerIcon, LayerError } from '../layer'; +import { ILayer, LayerIcon, LayerMessage } from '../layer'; import { IStyle } from '../../styles/style'; import { LICENSED_FEATURES } from '../../../licensed_features'; @@ -299,14 +299,33 @@ export class LayerGroup implements ILayer { }); } - getErrors(): LayerError[] { + getErrors(): LayerMessage[] { return this.hasErrors() ? [ { title: i18n.translate('xpack.maps.layerGroup.childrenErrorMessage', { defaultMessage: `An error occurred when loading nested layers`, }), - error: '', + body: '', + }, + ] + : []; + } + + hasWarnings(): boolean { + return this._children.some((child) => { + return child.hasWarnings(); + }); + } + + getWarnings(): LayerMessage[] { + return this.hasWarnings() + ? [ + { + title: i18n.translate('xpack.maps.layerGroup.incompleteResultsWarning', { + defaultMessage: `Nested layer(s) had issues returning data and results might be incomplete.`, + }), + body: '', }, ] : []; diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/blended_vector_layer/blended_vector_layer.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/blended_vector_layer/blended_vector_layer.ts index a1f2ed1792e05..fec564c838bd6 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/blended_vector_layer/blended_vector_layer.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/blended_vector_layer/blended_vector_layer.ts @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import type { SearchResponseWarning } from '@kbn/search-response-warnings'; import { IVectorLayer } from '../vector_layer'; import { GeoJsonVectorLayer } from '../geojson_vector_layer'; import { IVectorStyle, VectorStyle } from '../../../styles/vector/vector_style'; @@ -183,7 +184,7 @@ export class BlendedVectorLayer extends GeoJsonVectorLayer implements IVectorLay return layerDescriptor; } - private readonly _isClustered: boolean; + private _isClustered: boolean; private readonly _clusterSource: ESGeoGridSource; private readonly _clusterStyle: VectorStyle; private readonly _documentSource: ESSearchSource; @@ -313,11 +314,22 @@ export class BlendedVectorLayer extends GeoJsonVectorLayer implements IVectorLay let isSyncClustered; try { syncContext.startLoading(dataRequestId, requestToken, requestMeta); + const warnings: SearchResponseWarning[] = []; isSyncClustered = !(await this._documentSource.canLoadAllDocuments( + await this.getDisplayName(this._documentSource), requestMeta, - syncContext.registerCancelCallback.bind(null, requestToken) + syncContext.registerCancelCallback.bind(null, requestToken), + syncContext.inspectorAdapters, + (warning) => { + warnings.push(warning); + } )); - syncContext.stopLoading(dataRequestId, requestToken, { isSyncClustered }, requestMeta); + syncContext.stopLoading( + dataRequestId, + requestToken, + { isSyncClustered }, + { ...requestMeta, warnings } + ); } catch (error) { if (!(error instanceof DataRequestAbortError) || !isSearchSourceAbortError(error)) { syncContext.onLoadError(dataRequestId, requestToken, error); @@ -325,9 +337,11 @@ export class BlendedVectorLayer extends GeoJsonVectorLayer implements IVectorLay return; } if (isSyncClustered) { + this._isClustered = true; activeSource = this._clusterSource; activeStyle = this._clusterStyle; } else { + this._isClustered = false; activeSource = this._documentSource; activeStyle = this._documentStyle; } diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx index 4faa32668f7de..30272f5038377 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx @@ -28,7 +28,7 @@ import { DataRequestContext } from '../../../../actions'; import { IVectorStyle, VectorStyle } from '../../../styles/vector/vector_style'; import { ISource } from '../../../sources/source'; import { IVectorSource } from '../../../sources/vector_source'; -import { AbstractLayer, LayerError, LayerIcon } from '../../layer'; +import { AbstractLayer, LayerMessage, LayerIcon } from '../../layer'; import { AbstractVectorLayer, noResultsIcon, @@ -158,7 +158,7 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { ); } - getErrors(): LayerError[] { + getErrors(): LayerMessage[] { const errors = super.getErrors(); this.getValidJoins().forEach((join) => { @@ -168,7 +168,7 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { title: i18n.translate('xpack.maps.geojsonVectorLayer.joinErrorTitle', { defaultMessage: `An error occurred when adding join metrics to layer features`, }), - error: joinDescriptor.error, + body: joinDescriptor.error, }); } }); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.test.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.test.ts index 70049304c9d9f..0fceb0729f818 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.test.ts @@ -81,8 +81,8 @@ const mockVectorSource = { }, } as unknown as IVectorSource; const innerJoin = new InnerJoin(joinDescriptor, mockVectorSource); -const propertiesMap = new Map>(); -propertiesMap.set('alpha', { [COUNT_PROPERTY_NAME]: 1 }); +const joinMetrics = new Map>(); +joinMetrics.set('alpha', { [COUNT_PROPERTY_NAME]: 1 }); test('should skip join when no state has changed', async () => { const updateSourceData = sinon.spy(); @@ -170,7 +170,7 @@ test('should call updateSourceData with feature collection with updated feature dataHasChanged: false, join: innerJoin, joinIndex: 0, - propertiesMap, + joinMetrics, }, ], updateSourceData, @@ -277,7 +277,7 @@ test('should call updateSourceData when no results returned from terms aggregati dataHasChanged: true, join: innerJoin, joinIndex: 0, - propertiesMap: new Map>(), + joinMetrics: new Map>(), }, ], updateSourceData, @@ -321,8 +321,8 @@ test('should call onJoinError when there are no matching features', async () => const setJoinError = sinon.spy(); // instead of returning military alphabet like "alpha" or "bravo", mismatched key returns numbers, like '1' - const propertiesMapFromMismatchedKey = new Map>(); - propertiesMapFromMismatchedKey.set('1', { [COUNT_PROPERTY_NAME]: 1 }); + const joinMetricsFromMismatchedKey = new Map>(); + joinMetricsFromMismatchedKey.set('1', { [COUNT_PROPERTY_NAME]: 1 }); await performInnerJoins( { @@ -334,7 +334,7 @@ test('should call onJoinError when there are no matching features', async () => dataHasChanged: true, join: innerJoin, joinIndex: 0, - propertiesMap: propertiesMapFromMismatchedKey, + joinMetrics: joinMetricsFromMismatchedKey, }, ], updateSourceData, diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.ts index 55401c8edcb72..947aed099c9d9 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.ts @@ -59,8 +59,8 @@ export async function performInnerJoins( if (joinKey !== null) { joinStatus.keys.push(joinKey); } - const canJoinOnCurrent = joinState.propertiesMap - ? innerJoin.joinPropertiesToFeature(feature, joinState.propertiesMap) + const canJoinOnCurrent = joinState.joinMetrics + ? innerJoin.joinPropertiesToFeature(feature, joinState.joinMetrics) : false; if (canJoinOnCurrent && !joinStatus.joinedWithAtLeastOneFeature) { joinStatus.joinedWithAtLeastOneFeature = true; @@ -108,8 +108,7 @@ async function getJoinError(joinStatus: { return; } - const hasTerms = - joinStatus.joinState.propertiesMap && joinStatus.joinState.propertiesMap.size > 0; + const hasTerms = joinStatus.joinState.joinMetrics && joinStatus.joinState.joinMetrics.size > 0; if (!hasTerms || joinStatus.joinedWithAtLeastOneFeature) { return; @@ -129,9 +128,7 @@ async function getJoinError(joinStatus: { leftFieldName, leftFieldValues: prettyPrintArray(joinStatus.keys), rightFieldName, - rightFieldValues: prettyPrintArray( - Array.from(joinStatus.joinState.propertiesMap!.keys()) - ), + rightFieldValues: prettyPrintArray(Array.from(joinStatus.joinState.joinMetrics!.keys())), }, }); } diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/types.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/types.ts index 05fc9dd98eacc..930d32fa53552 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/types.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/types.ts @@ -12,5 +12,5 @@ export interface JoinState { dataHasChanged: boolean; join: InnerJoin; joinIndex: number; - propertiesMap?: PropertiesMap; + joinMetrics?: PropertiesMap; } diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx index b3974bdc67f47..0d60b2dc1b6bd 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx @@ -50,7 +50,7 @@ import { VectorStyleRequestMeta, } from '../../../../common/descriptor_types'; import { IVectorSource } from '../../sources/vector_source'; -import { LayerIcon, ILayer, LayerError } from '../layer'; +import { LayerIcon, ILayer, LayerMessage } from '../layer'; import { InnerJoin } from '../../joins/inner_join'; import { isSpatialJoin } from '../../joins/is_spatial_join'; import { IField } from '../../fields/field'; @@ -274,7 +274,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { }); } - getErrors(): LayerError[] { + getErrors(): LayerMessage[] { const errors = super.getErrors(); this.getValidJoins().forEach((join) => { @@ -285,7 +285,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { title: i18n.translate('xpack.maps.vectorLayer.joinFetchErrorTitle', { defaultMessage: `An error occurred when loading join metrics`, }), - error: joinError, + body: joinError, }); } }); @@ -469,7 +469,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { startLoading(dataRequestId, requestToken, nextMeta); const layerName = await this.getDisplayName(source); - const styleMeta = await (source as IESSource).loadStylePropsMeta({ + const { styleMeta, warnings } = await (source as IESSource).loadStylePropsMeta({ layerName, style, dynamicStyleProps, @@ -481,7 +481,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { executionContext: dataFilters.executionContext, }); - stopLoading(dataRequestId, requestToken, styleMeta, nextMeta); + stopLoading(dataRequestId, requestToken, styleMeta, { ...nextMeta, warnings }); } catch (error) { if (!(error instanceof DataRequestAbortError)) { onLoadError(dataRequestId, requestToken, error); @@ -605,27 +605,25 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { dataHasChanged: false, join, joinIndex, - propertiesMap: prevDataRequest?.getData() as PropertiesMap, + joinMetrics: prevDataRequest?.getData() as PropertiesMap, }; } try { startLoading(sourceDataId, requestToken, joinRequestMeta); - const leftSourceName = await this._source.getDisplayName(); - const propertiesMap = await joinSource.getPropertiesMap( + const { joinMetrics, warnings } = await joinSource.getJoinMetrics( joinRequestMeta, - leftSourceName, - join.getLeftField().getName(), + await this.getDisplayName(), registerCancelCallback.bind(null, requestToken), inspectorAdapters, featureCollection ); - stopLoading(sourceDataId, requestToken, propertiesMap); + stopLoading(sourceDataId, requestToken, joinMetrics, { warnings }); return { dataHasChanged: true, join, joinIndex, - propertiesMap, + joinMetrics, }; } catch (error) { if (!(error instanceof DataRequestAbortError)) { 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 85cfbd48a2a07..4acb400807ad0 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 @@ -14,6 +14,7 @@ import type { AggregationsCompositeAggregate, SearchResponse, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { SearchResponseWarning } from '@kbn/search-response-warnings'; import type { KibanaExecutionContext } from '@kbn/core/public'; import { ISearchSource } from '@kbn/data-plugin/common/search/search_source'; import { DataView } from '@kbn/data-plugin/common'; @@ -43,7 +44,12 @@ import { DataRequestAbortError } from '../../util/data_request'; import { LICENSED_FEATURES } from '../../../licensed_features'; import { getHttp } from '../../../kibana_services'; -import { GetFeatureActionsArgs, GeoJsonWithMeta, IMvtVectorSource } from '../vector_source'; +import { + GetFeatureActionsArgs, + GeoJsonWithMeta, + IMvtVectorSource, + getLayerFeaturesRequestName, +} from '../vector_source'; import { DataFilters, ESGeoGridSourceDescriptor, @@ -281,6 +287,7 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo bufferedExtent, inspectorAdapters, executionContext, + onWarning, }: { searchSource: ISearchSource; searchSessionId?: string; @@ -293,6 +300,7 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo bufferedExtent: MapExtent; inspectorAdapters: Adapters; executionContext: KibanaExecutionContext; + onWarning: (warning: SearchResponseWarning) => void; }) { const gridsPerRequest: number = Math.floor(DEFAULT_MAX_BUCKETS_LIMIT / bucketsPerGrid); const aggs: any = { @@ -352,34 +360,16 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo : this.getId(); const esResponse: SearchResponse = await this._runEsQuery({ requestId, - requestName: i18n.translate('xpack.maps.source.esGrid.compositeInspector.requestName', { - defaultMessage: '{layerName} {bucketsName} composite request ({requestCount})', - values: { - bucketsName: this.getBucketsName(), - layerName, - requestCount, - }, - }), + requestName: getLayerFeaturesRequestName(`${layerName} (${requestCount})`), searchSource, registerCancelCallback, - requestDescription: i18n.translate( - 'xpack.maps.source.esGrid.compositeInspectorDescription', - { - defaultMessage: - 'Get {bucketsName} from data view: {dataViewName}, geospatial field: {geoFieldName}', - values: { - bucketsName: this.getBucketsName(), - dataViewName: indexPattern.getName(), - geoFieldName: this._descriptor.geoField, - }, - } - ), searchSessionId, executionContext: mergeExecutionContext( { description: 'es_geo_grid_source:cluster_composite' }, executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning, }); features.push(...convertCompositeRespToGeoJson(esResponse, this._descriptor.requestType)); @@ -406,6 +396,7 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo tooManyBuckets, inspectorAdapters, executionContext, + onWarning, }: { searchSource: ISearchSource; searchSessionId?: string; @@ -417,6 +408,7 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo tooManyBuckets: boolean; inspectorAdapters: Adapters; executionContext: KibanaExecutionContext; + onWarning: (warning: SearchResponseWarning) => void; }): Promise { const valueAggsDsl = tooManyBuckets ? this.getValueAggsDsl(indexPattern, (metric) => { @@ -446,30 +438,16 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo const esResponse = await this._runEsQuery({ requestId: this.getId(), - requestName: i18n.translate('xpack.maps.source.esGrid.inspector.requestName', { - defaultMessage: '{layerName} {bucketsName} request', - values: { - bucketsName: this.getBucketsName(), - layerName, - }, - }), + requestName: getLayerFeaturesRequestName(layerName), searchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.source.esGrid.inspector.requestDescription', { - defaultMessage: - 'Get {bucketsName} from data view: {dataViewName}, geospatial field: {geoFieldName}', - values: { - bucketsName: this.getBucketsName(), - dataViewName: indexPattern.getName(), - geoFieldName: this._descriptor.geoField, - }, - }), searchSessionId, executionContext: mergeExecutionContext( { description: 'es_geo_grid_source:cluster' }, executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning, }); return convertRegularRespToGeoJson(esResponse, this._descriptor.requestType); @@ -516,6 +494,10 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo const supportsCompositeAgg = !(await this._isGeoShape()); const precision = this.getGeoGridPrecision(requestMeta.zoom); + const warnings: SearchResponseWarning[] = []; + const onWarning = (warning: SearchResponseWarning) => { + warnings.push(warning); + }; const features: Feature[] = supportsCompositeAgg && tooManyBuckets ? await this._compositeAggRequest({ @@ -530,6 +512,7 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo bufferedExtent: requestMeta.buffer, inspectorAdapters, executionContext: requestMeta.executionContext, + onWarning, }) : await this._nonCompositeAggRequest({ searchSource, @@ -542,6 +525,7 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo tooManyBuckets, inspectorAdapters, executionContext: requestMeta.executionContext, + onWarning, }); return { @@ -551,6 +535,7 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo }, meta: { areResultsTrimmed: false, + warnings, }, } as GeoJsonWithMeta; } diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx index 24cafe66de35c..82bb8fec43234 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx @@ -11,6 +11,7 @@ import React from 'react'; import { GeoJsonProperties } from 'geojson'; import { i18n } from '@kbn/i18n'; import { type Filter, buildPhraseFilter } from '@kbn/es-query'; +import type { SearchResponseWarning } from '@kbn/search-response-warnings'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; import { EMPTY_FEATURE_COLLECTION, @@ -33,7 +34,7 @@ import { ESDocField } from '../../fields/es_doc_field'; import { InlineField } from '../../fields/inline_field'; import { UpdateSourceEditor } from './update_source_editor'; import { ImmutableSourceProperty, SourceEditorArgs } from '../source'; -import { GeoJsonWithMeta } from '../vector_source'; +import { GeoJsonWithMeta, getLayerFeaturesRequestName } from '../vector_source'; import { isValidStringConfig } from '../../util/valid_string_config'; import { IField } from '../../fields/field'; import { ITooltipProperty, TooltipProperty } from '../../tooltips/tooltip_property'; @@ -261,33 +262,21 @@ export class ESGeoLineSource extends AbstractESAggSource { }, }); + const warnings: SearchResponseWarning[] = []; const resp = await this._runEsQuery({ requestId: `${this.getId()}_tracks`, - requestName: i18n.translate('xpack.maps.source.esGeoLine.timeSeriesTrackRequestName', { - defaultMessage: `'{layerName}' tracks request (time series)`, - values: { - layerName, - }, - }), + requestName: getLayerFeaturesRequestName(layerName), searchSource, registerCancelCallback, - requestDescription: i18n.translate( - 'xpack.maps.source.esGeoLine.timeSeriesTrackRequestDescription', - { - defaultMessage: - 'Get tracks from data view: {dataViewName}, geospatial field: {geoFieldName}', - values: { - dataViewName: indexPattern.getName(), - geoFieldName: this._descriptor.geoField, - }, - } - ), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_geo_line:time_series_tracks' }, requestMeta.executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning: (warning: SearchResponseWarning) => { + warnings.push(warning); + }, }); const { featureCollection } = convertToGeoJson(resp, TIME_SERIES_ID_FIELD_NAME); @@ -303,7 +292,8 @@ export class ESGeoLineSource extends AbstractESAggSource { entityCount, numTrimmedTracks: 0, // geo_line by time series never truncates tracks and instead simplifies tracks totalEntities: resp?.aggregations?.totalEntities?.value ?? 0, - } as ESGeoLineSourceResponseMeta, + warnings, + }, }; } @@ -333,6 +323,7 @@ export class ESGeoLineSource extends AbstractESAggSource { } const indexPattern = await this.getIndexPattern(); + const warnings: SearchResponseWarning[] = []; // Request is broken into 2 requests // 1) fetch entities: filtered by buffer so that top entities in view are returned @@ -367,27 +358,22 @@ export class ESGeoLineSource extends AbstractESAggSource { const entityResp = await this._runEsQuery({ requestId: `${this.getId()}_entities`, requestName: i18n.translate('xpack.maps.source.esGeoLine.entityRequestName', { - defaultMessage: `'{layerName}' entities request`, + defaultMessage: `load track entities ({layerName})`, values: { layerName, }, }), searchSource: entitySearchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.source.esGeoLine.entityRequestDescription', { - defaultMessage: - 'Get entities within map buffer from data view: {dataViewName}, entities: {splitFieldName}', - values: { - dataViewName: indexPattern.getName(), - splitFieldName: this._descriptor.splitField, - }, - }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_geo_line:entities' }, requestMeta.executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning: (warning: SearchResponseWarning) => { + warnings.push(warning); + }, }); const entityBuckets: Array<{ key: string; doc_count: number }> = _.get( entityResp, @@ -446,29 +432,18 @@ export class ESGeoLineSource extends AbstractESAggSource { }); const tracksResp = await this._runEsQuery({ requestId: `${this.getId()}_tracks`, - requestName: i18n.translate('xpack.maps.source.esGeoLine.trackRequestName', { - defaultMessage: `'{layerName}' tracks request (terms)`, - values: { - layerName, - }, - }), + requestName: getLayerFeaturesRequestName(layerName), searchSource: tracksSearchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.source.esGeoLine.trackRequestDescription', { - defaultMessage: - 'Get tracks for {numEntities} entities from data view: {dataViewName}, geospatial field: {geoFieldName}', - values: { - dataViewName: indexPattern.getName(), - geoFieldName: this._descriptor.geoField, - numEntities: entityBuckets.length, - }, - }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_geo_line:terms_tracks' }, requestMeta.executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning: (warning: SearchResponseWarning) => { + warnings.push(warning); + }, }); const { featureCollection, numTrimmedTracks } = convertToGeoJson( tracksResp, @@ -487,7 +462,8 @@ export class ESGeoLineSource extends AbstractESAggSource { entityCount: entityBuckets.length, numTrimmedTracks, totalEntities, - } as ESGeoLineSourceResponseMeta, + warnings, + }, }; } diff --git a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.tsx index eaa6f0c716e19..9540a22bf6a4e 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.tsx @@ -9,6 +9,7 @@ import React from 'react'; import turfBbox from '@turf/bbox'; import { multiPoint } from '@turf/helpers'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; +import type { SearchResponseWarning } from '@kbn/search-response-warnings'; import { type Filter, buildExistsFilter } from '@kbn/es-query'; import { lastValueFrom } from 'rxjs'; import type { @@ -34,7 +35,7 @@ import { VectorSourceRequestMeta, } from '../../../../common/descriptor_types'; import { isValidStringConfig } from '../../util/valid_string_config'; -import { BoundsRequestMeta, GeoJsonWithMeta } from '../vector_source'; +import { BoundsRequestMeta, GeoJsonWithMeta, getLayerFeaturesRequestName } from '../vector_source'; const MAX_GEOTILE_LEVEL = 29; @@ -188,29 +189,21 @@ export class ESPewPewSource extends AbstractESAggSource { buildExistsFilter({ name: this._descriptor.sourceGeoField, type: 'geo_point' }, indexPattern), ]); + const warnings: SearchResponseWarning[] = []; const esResponse = await this._runEsQuery({ requestId: this.getId(), - requestName: i18n.translate('xpack.maps.pewPew.requestName', { - defaultMessage: '{layerName} paths request', - values: { layerName }, - }), + requestName: getLayerFeaturesRequestName(layerName), searchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.source.pewPew.inspectorDescription', { - defaultMessage: - 'Get paths from data view: {dataViewName}, source: {sourceFieldName}, destination: {destFieldName}', - values: { - dataViewName: indexPattern.getName(), - destFieldName: this._descriptor.destGeoField, - sourceFieldName: this._descriptor.sourceGeoField, - }, - }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_pew_pew_source:connections' }, requestMeta.executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning: (warning: SearchResponseWarning) => { + warnings.push(warning); + }, }); const { featureCollection } = convertToLines(esResponse); @@ -219,6 +212,7 @@ export class ESPewPewSource extends AbstractESAggSource { data: featureCollection, meta: { areResultsTrimmed: false, + warnings, }, }; } 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 f56155284232d..77f4b684caf1f 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 @@ -9,6 +9,7 @@ import _ from 'lodash'; import React, { ReactElement } from 'react'; import type { QueryDslFieldLookup } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; 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'; @@ -58,6 +59,7 @@ import { import { ImmutableSourceProperty, SourceEditorArgs } from '../source'; import { IField } from '../../fields/field'; import { + getLayerFeaturesRequestName, GetFeatureActionsArgs, GeoJsonWithMeta, IMvtVectorSource, @@ -377,29 +379,21 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource } } + const warnings: SearchResponseWarning[] = []; const resp = await this._runEsQuery({ requestId: this.getId(), - requestName: i18n.translate('xpack.maps.esSearchSource.topHits.requestName', { - defaultMessage: '{layerName} top hits request', - values: { layerName }, - }), + requestName: getLayerFeaturesRequestName(layerName), searchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.esSearchSource.topHits.requestDescription', { - defaultMessage: - 'Get top hits from data view: {dataViewName}, entities: {entitiesFieldName}, geospatial field: {geoFieldName}', - values: { - dataViewName: indexPattern.getName(), - entitiesFieldName: topHitsGroupByTimeseries ? '_tsid' : topHitsSplitFieldName, - geoFieldName: this._descriptor.geoField, - }, - }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_search_source:top_hits' }, requestMeta.executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning: (warning: SearchResponseWarning) => { + warnings.push(warning); + }, }); const allHits: any[] = []; @@ -424,6 +418,7 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource areEntitiesTrimmed, entityCount: entityBuckets.length, totalEntities, + warnings, }, }; } @@ -435,6 +430,7 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource registerCancelCallback: (callback: () => void) => void, inspectorAdapters: Adapters ) { + const warnings: SearchResponseWarning[] = []; const indexPattern = await this.getIndexPattern(); const { docValueFields, sourceOnlyFields } = getDocValueAndSourceFields( @@ -451,7 +447,15 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource delete requestMetaWithoutTimeslice.timeslice; const useRequestMetaWithoutTimeslice = requestMeta.timeslice !== undefined && - (await this.canLoadAllDocuments(requestMetaWithoutTimeslice, registerCancelCallback)); + (await this.canLoadAllDocuments( + layerName, + requestMetaWithoutTimeslice, + registerCancelCallback, + inspectorAdapters, + (warning) => { + warnings.push(warning); + } + )); const maxResultWindow = await this.getMaxResultWindow(); const searchSource = await this.makeSearchSource( @@ -473,26 +477,18 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource const resp = await this._runEsQuery({ requestId: this.getId(), - requestName: i18n.translate('xpack.maps.esSearchSource.requestName', { - defaultMessage: '{layerName} documents request', - values: { layerName }, - }), + requestName: getLayerFeaturesRequestName(layerName), searchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.esSearchSource.requestDescription', { - defaultMessage: - 'Get documents from data view: {dataViewName}, geospatial field: {geoFieldName}', - values: { - dataViewName: indexPattern.getName(), - geoFieldName: this._descriptor.geoField, - }, - }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_search_source:doc_search' }, requestMeta.executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning: (warning: SearchResponseWarning) => { + warnings.push(warning); + }, }); const isTimeExtentForTimeslice = @@ -506,6 +502,7 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource ? requestMeta.timeslice : timerangeToTimeextent(requestMeta.timeFilters), isTimeExtentForTimeslice, + warnings, }, }; } @@ -990,25 +987,31 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource } async canLoadAllDocuments( + layerName: string, requestMeta: VectorSourceRequestMeta, - registerCancelCallback: (callback: () => void) => void + registerCancelCallback: (callback: () => void) => void, + inspectorAdapters: Adapters, + onWarning: (warning: SearchResponseWarning) => void ) { - const abortController = new AbortController(); - registerCancelCallback(() => abortController.abort()); const maxResultWindow = await this.getMaxResultWindow(); const searchSource = await this.makeSearchSource(requestMeta, 0); searchSource.setField('trackTotalHits', maxResultWindow + 1); - const { rawResponse: resp } = await lastValueFrom( - searchSource.fetch$({ - abortSignal: abortController.signal, - sessionId: requestMeta.searchSessionId, - legacyHitsTotal: false, - executionContext: mergeExecutionContext( - { description: 'es_search_source:all_doc_counts' }, - requestMeta.executionContext - ), - }) - ); + const resp = await this._runEsQuery({ + requestId: this.getId() + 'features_count', + requestName: i18n.translate('xpack.maps.vectorSource.featuresCountRequestName', { + defaultMessage: 'load features count ({layerName})', + values: { layerName }, + }), + searchSource, + registerCancelCallback, + searchSessionId: requestMeta.searchSessionId, + executionContext: mergeExecutionContext( + { description: 'es_search_source:all_doc_counts' }, + requestMeta.executionContext + ), + requestsAdapter: inspectorAdapters.requests, + onWarning, + }); return !isTotalHitsGreaterThan(resp.hits.total as unknown as TotalHits, maxResultWindow); } diff --git a/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts b/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts index cfde9257ca3be..2b5ec413ba6ec 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts @@ -15,13 +15,15 @@ import type { KibanaExecutionContext } from '@kbn/core/public'; import { RequestAdapter } from '@kbn/inspector-plugin/common/adapters/request'; import { lastValueFrom } from 'rxjs'; import type { TimeRange } from '@kbn/es-query'; +import { extractWarnings, type SearchResponseWarning } from '@kbn/search-response-warnings'; import type { IESAggSource } from '../es_agg_source'; import { AbstractVectorSource, BoundsRequestMeta } from '../vector_source'; import { getAutocompleteService, getIndexPatternService, - getTimeFilter, + getInspector, getSearchService, + getTimeFilter, } from '../../../kibana_services'; import { getDataViewNotFoundMessage } from '../../../../common/i18n_getters'; import { createExtentFilter } from '../../../../common/elasticsearch_util'; @@ -34,6 +36,7 @@ import { AbstractSourceDescriptor, DynamicStylePropertyOptions, MapExtent, + StyleMetaData, VectorSourceRequestMeta, } from '../../../../common/descriptor_types'; import { IVectorStyle } from '../../styles/vector/vector_style'; @@ -78,7 +81,7 @@ export interface IESSource extends IVectorSource { searchSessionId?: string; inspectorAdapters: Adapters; executionContext: KibanaExecutionContext; - }): Promise; + }): Promise<{ styleMeta: StyleMetaData; warnings: SearchResponseWarning[] }>; } export class AbstractESSource extends AbstractVectorSource implements IESSource { @@ -157,26 +160,28 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource async _runEsQuery({ registerCancelCallback, - requestDescription, requestId, requestName, searchSessionId, searchSource, executionContext, requestsAdapter, + onWarning, }: { registerCancelCallback: (callback: () => void) => void; - requestDescription: string; requestId: string; requestName: string; searchSessionId?: string; searchSource: ISearchSource; executionContext: KibanaExecutionContext; requestsAdapter: RequestAdapter | undefined; + onWarning?: (warning: SearchResponseWarning) => void; }): Promise { const abortController = new AbortController(); registerCancelCallback(() => abortController.abort()); + const disableWarningToasts = onWarning !== undefined && requestsAdapter !== undefined; + try { const { rawResponse: resp } = await lastValueFrom( searchSource.fetch$({ @@ -187,11 +192,18 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource adapter: requestsAdapter, id: requestId, title: requestName, - description: requestDescription, }, executionContext, + disableWarningToasts, }) ); + + if (disableWarningToasts) { + extractWarnings(resp, getInspector(), requestsAdapter, requestName, requestId).forEach( + onWarning + ); + } + return resp; } catch (error) { if (isSearchSourceAbortError(error)) { @@ -462,7 +474,7 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource searchSessionId?: string; inspectorAdapters: Adapters; executionContext: KibanaExecutionContext; - }): Promise { + }) { const promises = dynamicStyleProps.map((dynamicStyleProp) => { return dynamicStyleProp.getFieldMetaRequest(); }); @@ -495,30 +507,30 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource } } + const warnings: SearchResponseWarning[] = []; const resp = await this._runEsQuery({ requestId: `${this.getId()}_styleMeta`, requestName: i18n.translate('xpack.maps.source.esSource.stylePropsMetaRequestName', { - defaultMessage: '{layerName} - metadata', + defaultMessage: 'load symbolization ranges ({layerName})', values: { layerName }, }), searchSource, registerCancelCallback, - requestDescription: i18n.translate( - 'xpack.maps.source.esSource.stylePropsMetaRequestDescription', - { - defaultMessage: - 'Elasticsearch request retrieving field metadata used for calculating symbolization bands.', - } - ), searchSessionId, executionContext: mergeExecutionContext( { description: 'es_source:style_meta' }, executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning: (warning: SearchResponseWarning) => { + warnings.push(warning); + }, }); - return resp.aggregations; + return { + styleMeta: resp.aggregations, + warnings, + }; } getValueSuggestions = async (field: IField, query: string): Promise => { diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/es_distance_source.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/es_distance_source.ts index 8bb3d903d61fe..e3cf6f7a1fda8 100644 --- a/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/es_distance_source.ts +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/es_distance_source.ts @@ -7,6 +7,7 @@ import { FeatureCollection } from 'geojson'; import { i18n } from '@kbn/i18n'; +import type { SearchResponseWarning } from '@kbn/search-response-warnings'; import type { Query } from '@kbn/es-query'; import { ISearchSource } from '@kbn/data-plugin/public'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; @@ -19,7 +20,6 @@ import { ESDistanceSourceDescriptor, VectorSourceRequestMeta, } from '../../../../../common/descriptor_types'; -import { PropertiesMap } from '../../../../../common/elasticsearch_util'; import { isValidStringConfig } from '../../../util/valid_string_config'; import { IJoinSource } from '../types'; import type { IESAggSource, ESAggsSourceSyncMeta } from '../../es_agg_source'; @@ -27,6 +27,7 @@ import { IField } from '../../../fields/field'; import { mergeExecutionContext } from '../../execution_context_utils'; import { processDistanceResponse } from './process_distance_response'; import { isSpatialSourceComplete } from '../is_spatial_source_complete'; +import { getJoinMetricsRequestName } from '../i18n_utils'; export const DEFAULT_WITHIN_DISTANCE = 5; @@ -80,14 +81,13 @@ export class ESDistanceSource extends AbstractESAggSource implements IJoinSource }); } - async getPropertiesMap( + async getJoinMetrics( requestMeta: VectorSourceRequestMeta, - leftSourceName: string, - leftFieldName: string, + layerName: string, registerCancelCallback: (callback: () => void) => void, inspectorAdapters: Adapters, featureCollection?: FeatureCollection - ): Promise { + ) { if (featureCollection === undefined) { throw new Error( i18n.translate('xpack.maps.esDistanceSource.noFeatureCollectionMsg', { @@ -97,7 +97,10 @@ export class ESDistanceSource extends AbstractESAggSource implements IJoinSource } if (!this.hasCompleteConfig()) { - return new Map(); + return { + joinMetrics: new Map(), + warnings: [], + }; } const distance = `${this._descriptor.distance}km`; @@ -119,7 +122,10 @@ export class ESDistanceSource extends AbstractESAggSource implements IJoinSource } if (!hasFilters) { - return new Map(); + return { + joinMetrics: new Map(), + warnings: [], + }; } const indexPattern = await this.getIndexPattern(); @@ -133,31 +139,27 @@ export class ESDistanceSource extends AbstractESAggSource implements IJoinSource aggs: this.getValueAggsDsl(indexPattern), }, }); + const warnings: SearchResponseWarning[] = []; const rawEsData = await this._runEsQuery({ requestId: this.getId(), - requestName: i18n.translate('xpack.maps.distanceSource.requestName', { - defaultMessage: '{leftSourceName} within distance join request', - values: { leftSourceName }, - }), + requestName: getJoinMetricsRequestName(layerName), searchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.distanceSource.requestDescription', { - defaultMessage: - 'Get metrics from data view: {dataViewName}, geospatial field: {geoFieldName}', - values: { - dataViewName: indexPattern.getName(), - geoFieldName: this._descriptor.geoField, - }, - }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_distance_source:distance_join_request' }, requestMeta.executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning: (warning: SearchResponseWarning) => { + warnings.push(warning); + }, }); - return processDistanceResponse(rawEsData, this.getAggKey(AGG_TYPE.COUNT)); + return { + joinMetrics: processDistanceResponse(rawEsData, this.getAggKey(AGG_TYPE.COUNT)), + warnings, + }; } isFilterByMapBounds(): boolean { diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/es_term_source.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/es_term_source.ts index da477c76baab8..8a1978f6e7d96 100644 --- a/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/es_term_source.ts +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/es_term_source.ts @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import type { SearchResponseWarning } from '@kbn/search-response-warnings'; import type { Query } from '@kbn/es-query'; import { ISearchSource } from '@kbn/data-plugin/public'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; @@ -36,6 +37,7 @@ import type { IESAggSource, ESAggsSourceSyncMeta } from '../../es_agg_source'; import { IField } from '../../../fields/field'; import { mergeExecutionContext } from '../../execution_context_utils'; import { isTermSourceComplete } from './is_term_source_complete'; +import { getJoinMetricsRequestName } from '../i18n_utils'; const TERMS_AGG_NAME = 'join'; const TERMS_BUCKET_KEYS_TO_IGNORE = ['key', 'doc_count']; @@ -125,15 +127,17 @@ export class ESTermSource extends AbstractESAggSource implements ITermJoinSource : super.getAggLabel(aggType, fieldLabel); } - async getPropertiesMap( + async getJoinMetrics( requestMeta: VectorSourceRequestMeta, - leftSourceName: string, - leftFieldName: string, + layerName: string, registerCancelCallback: (callback: () => void) => void, inspectorAdapters: Adapters - ): Promise { + ) { if (!this.hasCompleteConfig()) { - return new Map(); + return { + joinMetrics: new Map(), + warnings: [], + }; } const indexPattern = await this.getIndexPattern(); @@ -150,31 +154,28 @@ export class ESTermSource extends AbstractESAggSource implements ITermJoinSource }, }); + const warnings: SearchResponseWarning[] = []; const rawEsData = await this._runEsQuery({ requestId: this.getId(), - requestName: i18n.translate('xpack.maps.termSource.requestName', { - defaultMessage: '{leftSourceName} term join request', - values: { leftSourceName }, - }), + requestName: getJoinMetricsRequestName(layerName), searchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.termSource.requestDescription', { - defaultMessage: 'Get metrics from data view: {dataViewName}, term field: {termFieldName}', - values: { - dataViewName: indexPattern.getName(), - termFieldName: this._termField.getName(), - }, - }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_term_source:terms' }, requestMeta.executionContext ), requestsAdapter: inspectorAdapters.requests, + onWarning: (warning: SearchResponseWarning) => { + warnings.push(warning); + }, }); const countPropertyName = this.getAggKey(AGG_TYPE.COUNT); - return extractPropertiesMap(rawEsData, countPropertyName); + return { + joinMetrics: extractPropertiesMap(rawEsData, countPropertyName), + warnings, + }; } isFilterByMapBounds(): boolean { diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/i18n_utils.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/i18n_utils.ts new file mode 100644 index 0000000000000..354fcae53c3ae --- /dev/null +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/i18n_utils.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 { i18n } from '@kbn/i18n'; + +export const getJoinMetricsRequestName = (layerName: string) => { + return i18n.translate('xpack.maps.joinSource.joinMetricsRequestName', { + defaultMessage: 'load join metrics ({layerName})', + values: { layerName }, + }); +}; diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/table_source/table_source.test.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/table_source/table_source.test.ts index df9c11a99daa4..95b2b6fae1cd2 100644 --- a/x-pack/plugins/maps/public/classes/sources/join_sources/table_source/table_source.test.ts +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/table_source/table_source.test.ts @@ -17,7 +17,7 @@ describe('TableSource', () => { }); }); - describe('getPropertiesMap', () => { + describe('getJoinMetrics', () => { it('should roll up results', async () => { const tableSource = new TableSource({ term: 'iso', @@ -53,18 +53,17 @@ describe('TableSource', () => { ], }); - const propertiesMap = await tableSource.getPropertiesMap( + const { joinMetrics } = await tableSource.getJoinMetrics( {} as unknown as VectorSourceRequestMeta, - 'a', - 'b', + 'layer1', () => {} ); - expect(propertiesMap.size).toEqual(2); - expect(propertiesMap.get('US')).toEqual({ + expect(joinMetrics.size).toEqual(2); + expect(joinMetrics.get('US')).toEqual({ population: 100, }); - expect(propertiesMap.get('CN')).toEqual({ + expect(joinMetrics.get('CN')).toEqual({ population: 400, }); }); diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/table_source/table_source.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/table_source/table_source.ts index c1321649168a2..0fb24d198bf78 100644 --- a/x-pack/plugins/maps/public/classes/sources/join_sources/table_source/table_source.ts +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/table_source/table_source.ts @@ -54,12 +54,11 @@ export class TableSource extends AbstractVectorSource implements ITermJoinSource return `table source ${uuidv4()}`; } - async getPropertiesMap( + async getJoinMetrics( requestMeta: VectorSourceRequestMeta, - leftSourceName: string, - leftFieldName: string, + layerName: string, registerCancelCallback: (callback: () => void) => void - ): Promise { + ) { const propertiesMap: PropertiesMap = new Map(); const columnNames = this._descriptor.__columns.map((column) => { @@ -86,7 +85,10 @@ export class TableSource extends AbstractVectorSource implements ITermJoinSource } } - return propertiesMap; + return { + joinMetrics: propertiesMap, + warnings: [], + }; } getTermField(): IField { diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/types.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/types.ts index 06c87f3469ec8..74d124c6b979f 100644 --- a/x-pack/plugins/maps/public/classes/sources/join_sources/types.ts +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/types.ts @@ -6,6 +6,7 @@ */ import { FeatureCollection, GeoJsonProperties } from 'geojson'; +import type { SearchResponseWarning } from '@kbn/search-response-warnings'; import type { KibanaExecutionContext } from '@kbn/core/public'; import { Query } from '@kbn/data-plugin/common/query'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; @@ -18,14 +19,16 @@ import { ISource } from '../source'; export interface IJoinSource extends ISource { hasCompleteConfig(): boolean; getWhereQuery(): Query | undefined; - getPropertiesMap( + getJoinMetrics( requestMeta: VectorSourceRequestMeta, - leftSourceName: string, - leftFieldName: string, + layerName: string, registerCancelCallback: (callback: () => void) => void, inspectorAdapters: Adapters, featureCollection?: FeatureCollection - ): Promise; + ): Promise<{ + joinMetrics: PropertiesMap; + warnings: SearchResponseWarning[]; + }>; /* * Use getSyncMeta to expose join configurations that require join data re-fetch when changed. diff --git a/x-pack/plugins/maps/public/classes/sources/vector_source/index.ts b/x-pack/plugins/maps/public/classes/sources/vector_source/index.ts index f2f834d1d55d0..e33a7c63ad246 100644 --- a/x-pack/plugins/maps/public/classes/sources/vector_source/index.ts +++ b/x-pack/plugins/maps/public/classes/sources/vector_source/index.ts @@ -6,4 +6,12 @@ */ export * from './vector_source'; +import { i18n } from '@kbn/i18n'; export type { IMvtVectorSource } from './mvt_vector_source'; + +export const getLayerFeaturesRequestName = (layerName: string) => { + return i18n.translate('xpack.maps.vectorSource.featuresRequestName', { + defaultMessage: 'load layer features ({layerName})', + values: { layerName }, + }); +}; diff --git a/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx b/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx index c4da68816d262..5adaf6ec20c42 100644 --- a/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx @@ -29,7 +29,7 @@ import { AbstractSource, ISource } from '../source'; import { IField } from '../../fields/field'; import { DataFilters, - ESSearchSourceResponseMeta, + DataRequestMeta, MapExtent, Timeslice, VectorSourceRequestMeta, @@ -43,11 +43,9 @@ export interface SourceStatus { isDeprecated?: boolean; } -export type GeoJsonFetchMeta = ESSearchSourceResponseMeta; - export interface GeoJsonWithMeta { data: FeatureCollection; - meta?: GeoJsonFetchMeta; + meta?: DataRequestMeta; } export interface BoundsRequestMeta { diff --git a/x-pack/plugins/maps/public/classes/util/tile_meta_feature_utils.test.ts b/x-pack/plugins/maps/public/classes/util/tile_meta_feature_utils.test.ts index c812dfa6b94f2..f8843c22f3893 100644 --- a/x-pack/plugins/maps/public/classes/util/tile_meta_feature_utils.test.ts +++ b/x-pack/plugins/maps/public/classes/util/tile_meta_feature_utils.test.ts @@ -6,7 +6,12 @@ */ import { TileMetaFeature } from '../../../common/descriptor_types'; -import { getAggsMeta, getAggRange, getHitsMeta } from './tile_meta_feature_utils'; +import { + getAggsMeta, + getAggRange, + getHitsMeta, + hasIncompleteResults, +} from './tile_meta_feature_utils'; describe('getAggsMeta', () => { test('should extract doc_count = 0 from meta features when there are no matches', () => { @@ -376,3 +381,73 @@ describe('getHitsMeta', () => { }); }); }); + +describe('hasIncompleteResults', () => { + const metaFeature = { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [0, 0], + }, + properties: { + '_clusters.skipped': 0, + '_clusters.partial': 0, + '_shards.failed': 0, + timed_out: false, + 'hits.total.relation': 'eq', + 'hits.total.value': 28, + }, + } as TileMetaFeature; + + test('should return false when all shards and clusters are successful', () => { + expect(hasIncompleteResults(metaFeature)).toBe(false); + }); + + test('should return true when local cluster has time out', () => { + expect( + hasIncompleteResults({ + ...metaFeature, + properties: { + ...metaFeature.properties, + timed_out: true, + }, + }) + ).toBe(true); + }); + + test('should return true when local cluster has shard failure', () => { + expect( + hasIncompleteResults({ + ...metaFeature, + properties: { + ...metaFeature.properties, + '_shards.failed': 1, + }, + }) + ).toBe(true); + }); + + test('should return true when remote cluster is skipped', () => { + expect( + hasIncompleteResults({ + ...metaFeature, + properties: { + ...metaFeature.properties, + '_clusters.skipped': 1, + }, + }) + ).toBe(true); + }); + + test('should return true when remote cluster has shard failure', () => { + expect( + hasIncompleteResults({ + ...metaFeature, + properties: { + ...metaFeature.properties, + '_clusters.partial': 1, + }, + }) + ).toBe(true); + }); +}); diff --git a/x-pack/plugins/maps/public/classes/util/tile_meta_feature_utils.ts b/x-pack/plugins/maps/public/classes/util/tile_meta_feature_utils.ts index ac12399a2e011..0af0b64b77a53 100644 --- a/x-pack/plugins/maps/public/classes/util/tile_meta_feature_utils.ts +++ b/x-pack/plugins/maps/public/classes/util/tile_meta_feature_utils.ts @@ -68,3 +68,35 @@ export function getAggRange( } : null; } + +export function hasIncompleteResults(tileMetaFeature: TileMetaFeature) { + if ( + typeof tileMetaFeature.properties?.timed_out === 'boolean' && + tileMetaFeature.properties.timed_out + ) { + return true; + } + + if ( + typeof tileMetaFeature.properties?.['_shards.failed'] === 'number' && + tileMetaFeature.properties['_shards.failed'] > 0 + ) { + return true; + } + + if ( + typeof tileMetaFeature.properties?.['_clusters.skipped'] === 'number' && + tileMetaFeature.properties['_clusters.skipped'] > 0 + ) { + return true; + } + + if ( + typeof tileMetaFeature.properties?.['_clusters.partial'] === 'number' && + tileMetaFeature.properties['_clusters.partial'] > 0 + ) { + return true; + } + + return false; +} diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/__snapshots__/layer_control.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/__snapshots__/layer_control.test.tsx.snap index 20395d0674511..81e0f8500451c 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/__snapshots__/layer_control.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/__snapshots__/layer_control.test.tsx.snap @@ -120,7 +120,7 @@ exports[`LayerControl isLayerTOCOpen Should render expand button 1`] = ` position="left" > @@ -135,7 +135,7 @@ exports[`LayerControl isLayerTOCOpen Should render expand button with error icon position="left" > @@ -150,7 +150,7 @@ exports[`LayerControl isLayerTOCOpen Should render expand button with loading ic position="left" > diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/expand_button.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/expand_button.tsx index f80a84dc6782d..75116d10bbf1a 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/expand_button.tsx +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/expand_button.tsx @@ -10,12 +10,12 @@ import { EuiButtonEmpty, EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; interface Props { - hasErrors: boolean; + hasErrorsOrWarnings: boolean; isLoading: boolean; onClick: () => void; } -export function ExpandButton({ hasErrors, isLoading, onClick }: Props) { +export function ExpandButton({ hasErrorsOrWarnings, isLoading, onClick }: Props) { // isLoading indicates at least one layer is loading. // Expand button should never be disabled. // Not using EuiButton* with iconType props because EuiButton* disables button when isLoading prop is true. @@ -34,7 +34,7 @@ export function ExpandButton({ hasErrors, isLoading, onClick }: Props) { ) : ( - + )} ); diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.test.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.test.tsx index c0b0c13ada2d7..ed3235bf7af3b 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.test.tsx @@ -71,6 +71,9 @@ describe('LayerControl', () => { hasErrors: () => { return false; }, + hasWarnings: () => { + return false; + }, isLayerLoading: () => { return true; }, @@ -86,6 +89,9 @@ describe('LayerControl', () => { hasErrors: () => { return true; }, + hasWarnings: () => { + return false; + }, isLayerLoading: () => { return false; }, diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.tsx index e1c34223483c8..b0fc2a7620bd4 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.tsx +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.tsx @@ -52,8 +52,8 @@ export function LayerControl({ if (isScreenshotMode()) { return null; } - const hasErrors = layerList.some((layer) => { - return layer.hasErrors(); + const hasErrorsOrWarnings = layerList.some((layer) => { + return layer.hasErrors() || layer.hasWarnings(); }); const isLoading = layerList.some((layer) => { return layer.isLayerLoading(zoom); @@ -67,7 +67,11 @@ export function LayerControl({ })} position="left" > - + ); } diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/__snapshots__/toc_entry.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/__snapshots__/toc_entry.test.tsx.snap index 9a7816a6de39c..f770aeed87494 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/__snapshots__/toc_entry.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/__snapshots__/toc_entry.test.tsx.snap @@ -478,9 +478,22 @@ exports[`TOCEntry props should display layer details when isLegendDetailsOpen is className="mapTocEntry__layerDetails" data-test-subj="mapLayerTOCDetailslayer_1" > -
    - TOC details mock -
    + { + const mockLayer = { + getErrors: () => { + return [ + { + title: 'simulated error', + body:
    , + }, + ]; + }, + getWarnings: () => { + return [ + { + title: 'simulated warning', + body:
    , + }, + ]; + }, + renderLegendDetails: () => { + return
    ; + }, + } as unknown as ILayer; + + test('Should only render errors when layer contains errors', () => { + render(); + screen.getByTestId('layer-error'); + const error = screen.queryByTestId('layer-error'); + expect(error).not.toBeNull(); + const warning = screen.queryByTestId('layer-warning'); + expect(warning).toBeNull(); + const legend = screen.queryByTestId('layer-legend'); + expect(legend).toBeNull(); + }); + + test('Should render warnings and legend when layer contains warnings', () => { + render( + { + return []; + }, + }} + /> + ); + const error = screen.queryByTestId('layer-error'); + expect(error).toBeNull(); + const warning = screen.queryByTestId('layer-warning'); + expect(warning).not.toBeNull(); + const legend = screen.queryByTestId('layer-legend'); + expect(legend).not.toBeNull(); + }); +}); diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/legend_details.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/legend_details.tsx new file mode 100644 index 0000000000000..1561d47aa4945 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/legend_details.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 { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import type { ILayer } from '../../../../../classes/layers/layer'; + +interface Props { + layer: ILayer; +} + +export function LegendDetails({ layer }: Props) { + const errors = layer.getErrors(); + if (errors.length) { + return ( + <> + {errors.map(({ title, body }, index) => ( +
    + + {body} + + +
    + ))} + + ); + } + + const warnings = layer.getWarnings(); + return warnings.length ? ( + <> + {warnings.map(({ title, body }, index) => ( +
    + + {body} + + +
    + ))} + {layer.renderLegendDetails()} + + ) : ( + layer.renderLegendDetails() + ); +} diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.tsx index eb77812d5b62e..488f9a64083db 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.tsx +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.tsx @@ -9,14 +9,7 @@ import React, { Component } from 'react'; import classNames from 'classnames'; import type { DraggableProvidedDragHandleProps } from '@hello-pangea/dnd'; import { FormattedMessage } from '@kbn/i18n-react'; -import { - EuiIcon, - EuiButtonIcon, - EuiCallOut, - EuiConfirmModal, - EuiButtonEmpty, - EuiSpacer, -} from '@elastic/eui'; +import { EuiIcon, EuiButtonIcon, EuiConfirmModal, EuiButtonEmpty } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { TOCEntryActionsPopover } from './toc_entry_actions_popover'; import { @@ -25,6 +18,7 @@ import { EDIT_LAYER_SETTINGS_LABEL, FIT_TO_DATA_LABEL, } from './action_labels'; +import { LegendDetails } from './legend_details'; import { ILayer } from '../../../../../classes/layers/layer'; import { isLayerGroup } from '../../../../../classes/layers/layer_group'; @@ -111,7 +105,9 @@ export class TOCEntry extends Component { async _loadHasLegendDetails() { const hasLegendDetails = - (await this.props.layer.hasLegendDetails()) && + ((await this.props.layer.hasLegendDetails()) || + this.props.layer.hasErrors() || + this.props.layer.hasWarnings()) && this.props.layer.isVisible() && this.props.layer.showAtZoomLevel(this.props.zoom); if (this._isMounted && hasLegendDetails !== this.state.hasLegendDetails) { @@ -150,10 +146,6 @@ export class TOCEntry extends Component { this.props.toggleVisible(this.props.layer.getId()); }; - _getLayerErrors = () => { - return isLayerGroup(this.props.layer) ? [] : this.props.layer.getErrors(); - }; - _renderCancelModal() { if (!this.state.shouldShowModal) { return null; @@ -240,8 +232,7 @@ export class TOCEntry extends Component { } _renderDetailsToggle() { - const errors = this._getLayerErrors(); - if (this.props.isDragging || (!this.state.hasLegendDetails && errors.length === 0)) { + if (this.props.isDragging || !this.state.hasLegendDetails) { return null; } @@ -304,32 +295,6 @@ export class TOCEntry extends Component { ); } - _renderLegendDetails = () => { - if (!this.props.isLegendDetailsOpen) { - return null; - } - - const errors = this._getLayerErrors(); - - return this.state.hasLegendDetails || errors.length ? ( -
    - {errors.length - ? errors.map(({ title, error }, index) => ( -
    - - {error} - - -
    - )) - : this.props.layer.renderLegendDetails()} -
    - ) : null; - }; - _hightlightAsSelectedLayer() { if (this.props.isCombineLayer) { return false; @@ -365,7 +330,16 @@ export class TOCEntry extends Component { > {this._renderLayerHeader()} - {this._renderLegendDetails()} + {this.props.isLegendDetailsOpen && + this.state.hasLegendDetails && + !isLayerGroup(this.props.layer) ? ( +
    + +
    + ) : null} {this._renderDetailsToggle()} diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry_button/toc_entry_button.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry_button/toc_entry_button.tsx index 71d5a9f708497..ba832f2aa3210 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry_button/toc_entry_button.tsx +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry_button/toc_entry_button.tsx @@ -9,7 +9,7 @@ import React, { Component, Fragment, ReactNode } from 'react'; import { EuiButtonEmpty, EuiIcon, EuiToolTip, EuiLoadingSpinner } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ILayer } from '../../../../../../classes/layers/layer'; +import { type ILayer, INCOMPLETE_RESULTS_WARNING } from '../../../../../../classes/layers/layer'; import { IVectorSource } from '../../../../../../classes/sources/vector_source'; import { isLayerGroup } from '../../../../../../classes/layers/layer_group'; @@ -18,12 +18,6 @@ interface Footnote { message?: string | null; } -interface IconAndTooltipContent { - icon?: ReactNode; - tooltipContent?: ReactNode; - footnotes: Footnote[]; -} - export interface ReduxStateProps { isUsingSearch: boolean; zoom: number; @@ -69,22 +63,35 @@ export class TOCEntryButton extends Component { } } - getIconAndTooltipContent(): IconAndTooltipContent { - if (this.props.layer.hasErrors()) { - return { - icon: ( - - ), - tooltipContent: this.props.layer - .getErrors() - .map(({ title }) =>
    {title}
    ), - footnotes: [], - }; + getIconAndTooltipContent(): { + icon?: ReactNode; + tooltipContent?: ReactNode; + footnotes: Footnote[]; + postScript?: string; + } { + const errors = this.props.layer.getErrors(); + if (errors.length) { + const errorIcon = ( + + ); + return isLayerGroup(this.props.layer) + ? { + icon: errorIcon, + footnotes: [], + postScript: errors[0].title, + } + : { + icon: errorIcon, + tooltipContent: this.props.layer + .getErrors() + .map(({ title }) =>
    {title}
    ), + footnotes: [], + }; } if (!this.props.layer.isVisible()) { @@ -118,10 +125,26 @@ export class TOCEntryButton extends Component { }; } - const { icon, tooltipContent } = this.props.layer.getLayerIcon(true); + const { icon: layerIcon, tooltipContent } = this.props.layer.getLayerIcon(true); + const warnings = this.props.layer.getWarnings(); + const icon = warnings.length ? ( + + ) : ( + layerIcon + ); if (isLayerGroup(this.props.layer)) { - return { icon, tooltipContent, footnotes: [] }; + return { + icon, + tooltipContent, + footnotes: [], + postScript: warnings.length ? warnings[0].title : undefined, + }; } const footnotes = []; @@ -158,11 +181,12 @@ export class TOCEntryButton extends Component { icon, tooltipContent, footnotes, + postScript: warnings.length ? INCOMPLETE_RESULTS_WARNING : undefined, }; } render() { - const { icon, tooltipContent, footnotes } = this.getIconAndTooltipContent(); + const { icon, tooltipContent, footnotes, postScript } = this.getIconAndTooltipContent(); const footnoteIcons = footnotes.map((footnote, index) => { return ( @@ -189,6 +213,9 @@ export class TOCEntryButton extends Component { {tooltipContent} {footnoteTooltipContent} + {postScript ? ( +

    {postScript}

    + ) : null}
    } data-test-subj="layerTocTooltip" diff --git a/x-pack/plugins/maps/public/inspector/vector_tile_adapter/components/get_tile_request.test.ts b/x-pack/plugins/maps/public/inspector/vector_tile_adapter/components/get_tile_request.test.ts index 922d45b2effc7..c8bb1a8fb81bc 100644 --- a/x-pack/plugins/maps/public/inspector/vector_tile_adapter/components/get_tile_request.test.ts +++ b/x-pack/plugins/maps/public/inspector/vector_tile_adapter/components/get_tile_request.test.ts @@ -126,6 +126,7 @@ test('Should return elasticsearch vector tile request for hits tiles', () => { type: 'long', }, }, + size: 10000, sort: [ { '@timestamp': { diff --git a/x-pack/plugins/maps/tsconfig.json b/x-pack/plugins/maps/tsconfig.json index 364a6d24473d6..86955eeea584a 100644 --- a/x-pack/plugins/maps/tsconfig.json +++ b/x-pack/plugins/maps/tsconfig.json @@ -74,6 +74,7 @@ "@kbn/content-management-table-list-view", "@kbn/serverless", "@kbn/logging", + "@kbn/search-response-warnings", ], "exclude": [ "target/**/*", 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/monitoring/server/config.test.ts b/x-pack/plugins/monitoring/server/config.test.ts index 0b4a4e1bb57db..64dcf3489a7f9 100644 --- a/x-pack/plugins/monitoring/server/config.test.ts +++ b/x-pack/plugins/monitoring/server/config.test.ts @@ -22,6 +22,7 @@ describe('config schema', () => { }, "enabled": true, }, + "enabled": true, "kibana": Object { "collection": Object { "enabled": true, diff --git a/x-pack/plugins/monitoring/server/config.ts b/x-pack/plugins/monitoring/server/config.ts index 70253f6d4690f..e5670bda2c82f 100644 --- a/x-pack/plugins/monitoring/server/config.ts +++ b/x-pack/plugins/monitoring/server/config.ts @@ -82,6 +82,7 @@ export const configSchema = schema.object({ enabled: schema.boolean({ defaultValue: true }), }), }), + enabled: schema.boolean({ defaultValue: true }), }); export class MonitoringElasticsearchConfig extends ElasticsearchConfig { diff --git a/x-pack/plugins/observability/docs/openapi/slo/bundled.json b/x-pack/plugins/observability/docs/openapi/slo/bundled.json index fbc6c0bb2e522..b4f52b032a9fc 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/bundled.json +++ b/x-pack/plugins/observability/docs/openapi/slo/bundled.json @@ -143,7 +143,7 @@ { "name": "page", "in": "query", - "description": "The page to use for pagination, must be greater or equal than 1", + "description": "The page number to return", "schema": { "type": "integer", "default": 1 @@ -153,7 +153,7 @@ { "name": "perPage", "in": "query", - "description": "Number of SLOs returned by page", + "description": "The number of SLOs to return per page", "schema": { "type": "integer", "default": 25, @@ -280,7 +280,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/slo_with_summary_response" + "$ref": "#/components/schemas/slo_response" } } } @@ -361,7 +361,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/slo_definition_response" + "$ref": "#/components/schemas/slo_response" } } } @@ -605,79 +605,6 @@ } } }, - "/s/{spaceId}/api/observability/slos/{sloId}/_reset": { - "post": { - "summary": "Resets an SLO.", - "operationId": "resetSloOp", - "description": "You must have the `write` privileges for the **SLOs** feature in the **Observability** section of the Kibana feature privileges.\n", - "tags": [ - "slo" - ], - "parameters": [ - { - "$ref": "#/components/parameters/kbn_xsrf" - }, - { - "$ref": "#/components/parameters/space_id" - }, - { - "$ref": "#/components/parameters/slo_id" - } - ], - "responses": { - "204": { - "description": "Successful request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/slo_definition_response" - } - } - } - }, - "400": { - "description": "Bad request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/400_response" - } - } - } - }, - "401": { - "description": "Unauthorized response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/401_response" - } - } - } - }, - "403": { - "description": "Unauthorized response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/403_response" - } - } - } - }, - "404": { - "description": "Not found response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/404_response" - } - } - } - } - } - } - }, "/s/{spaceId}/internal/observability/slos/_historical_summary": { "post": { "summary": "Retrieves the historical summary for a list of SLOs", @@ -748,104 +675,6 @@ } } }, - "/s/{spaceId}/internal/observability/slos/_definitions": { - "get": { - "summary": "Get the SLO definitions", - "operationId": "getDefinitionsOp", - "description": "You must have the `read` privileges for the **SLOs** feature in the **Observability** section of the Kibana feature privileges.\n", - "tags": [ - "slo" - ], - "parameters": [ - { - "$ref": "#/components/parameters/kbn_xsrf" - }, - { - "$ref": "#/components/parameters/space_id" - }, - { - "name": "includeOutdatedOnly", - "in": "query", - "description": "Indicates if the API returns only outdated SLO or all SLO definitions", - "schema": { - "type": "boolean" - }, - "example": true - }, - { - "name": "search", - "in": "query", - "description": "Filters the SLOs by name", - "schema": { - "type": "string" - }, - "example": "my service availability" - }, - { - "name": "page", - "in": "query", - "description": "The page to use for pagination, must be greater or equal than 1", - "schema": { - "type": "number" - }, - "example": 1 - }, - { - "name": "perPage", - "in": "query", - "description": "Number of SLOs returned by page", - "schema": { - "type": "integer", - "default": 100, - "maximum": 1000 - }, - "example": 100 - } - ], - "responses": { - "200": { - "description": "Successful request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/find_slo_definitions_response" - } - } - } - }, - "400": { - "description": "Bad request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/400_response" - } - } - } - }, - "401": { - "description": "Unauthorized response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/401_response" - } - } - } - }, - "403": { - "description": "Unauthorized response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/403_response" - } - } - } - } - } - } - }, "/s/{spaceId}/api/observability/slos/_delete_instances": { "post": { "summary": "Batch delete rollup and summary data for the matching list of sloId and instanceId", @@ -1757,7 +1586,7 @@ } } }, - "slo_with_summary_response": { + "slo_response": { "title": "SLO response", "type": "object", "required": [ @@ -1776,8 +1605,7 @@ "instanceId", "tags", "createdAt", - "updatedAt", - "version" + "updatedAt" ], "properties": { "id": { @@ -1879,11 +1707,6 @@ "description": "The last update date", "type": "string", "example": "2023-01-12T10:03:19.000Z" - }, - "version": { - "description": "The internal SLO version", - "type": "number", - "example": 2 } } }, @@ -1907,7 +1730,7 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/slo_with_summary_response" + "$ref": "#/components/schemas/slo_response" } } } @@ -2170,126 +1993,6 @@ } } }, - "slo_definition_response": { - "title": "SLO definition response", - "type": "object", - "required": [ - "id", - "name", - "description", - "indicator", - "timeWindow", - "budgetingMethod", - "objective", - "settings", - "revision", - "enabled", - "groupBy", - "tags", - "createdAt", - "updatedAt", - "version" - ], - "properties": { - "id": { - "description": "The identifier of the SLO.", - "type": "string", - "example": "8853df00-ae2e-11ed-90af-09bb6422b258" - }, - "name": { - "description": "The name of the SLO.", - "type": "string", - "example": "My Service SLO" - }, - "description": { - "description": "The description of the SLO.", - "type": "string", - "example": "My SLO description" - }, - "indicator": { - "discriminator": { - "propertyName": "type", - "mapping": { - "sli.apm.transactionErrorRate": "#/components/schemas/indicator_properties_apm_availability", - "sli.kql.custom": "#/components/schemas/indicator_properties_custom_kql", - "sli.apm.transactionDuration": "#/components/schemas/indicator_properties_apm_latency", - "sli.metric.custom": "#/components/schemas/indicator_properties_custom_metric", - "sli.histogram.custom": "#/components/schemas/indicator_properties_histogram", - "sli.metric.timeslice": "#/components/schemas/indicator_properties_timeslice_metric" - } - }, - "oneOf": [ - { - "$ref": "#/components/schemas/indicator_properties_custom_kql" - }, - { - "$ref": "#/components/schemas/indicator_properties_apm_availability" - }, - { - "$ref": "#/components/schemas/indicator_properties_apm_latency" - }, - { - "$ref": "#/components/schemas/indicator_properties_custom_metric" - }, - { - "$ref": "#/components/schemas/indicator_properties_histogram" - }, - { - "$ref": "#/components/schemas/indicator_properties_timeslice_metric" - } - ] - }, - "timeWindow": { - "$ref": "#/components/schemas/time_window" - }, - "budgetingMethod": { - "$ref": "#/components/schemas/budgeting_method" - }, - "objective": { - "$ref": "#/components/schemas/objective" - }, - "settings": { - "$ref": "#/components/schemas/settings" - }, - "revision": { - "description": "The SLO revision", - "type": "number", - "example": 2 - }, - "enabled": { - "description": "Indicate if the SLO is enabled", - "type": "boolean", - "example": true - }, - "groupBy": { - "description": "optional group by field to use to generate an SLO per distinct value", - "type": "string", - "example": "some.field" - }, - "tags": { - "description": "List of tags", - "type": "array", - "items": { - "type": "string" - } - }, - "createdAt": { - "description": "The creation date", - "type": "string", - "example": "2023-01-12T10:03:19.000Z" - }, - "updatedAt": { - "description": "The last update date", - "type": "string", - "example": "2023-01-12T10:03:19.000Z" - }, - "version": { - "description": "The internal SLO version", - "type": "number", - "example": 2 - } - } - }, "historical_summary_request": { "title": "Historical summary request", "type": "object", @@ -2333,31 +2036,6 @@ } } }, - "find_slo_definitions_response": { - "title": "Find SLO definitions response", - "description": "A paginated response of SLO definitions matching the query.\n", - "type": "object", - "properties": { - "page": { - "type": "number", - "example": 2 - }, - "perPage": { - "type": "number", - "example": 100 - }, - "total": { - "type": "number", - "example": 123 - }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/slo_definition_response" - } - } - } - }, "delete_slo_instances_request": { "title": "Delete SLO instances request", "description": "The delete SLO instances request takes a list of SLO id and instance id, then delete the rollup and summary data. This API can be used to remove the staled data of an instance SLO that no longer get updated.\n", diff --git a/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml b/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml index c5b75cdaf73c0..8efdbd9dfe2c2 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml @@ -86,14 +86,14 @@ paths: example: 'slo.name:latency* and slo.tags : "prod"' - name: page in: query - description: The page to use for pagination, must be greater or equal than 1 + description: The page number to return schema: type: integer default: 1 example: 1 - name: perPage in: query - description: Number of SLOs returned by page + description: The number of SLOs to return per page schema: type: integer default: 25 @@ -176,7 +176,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/slo_with_summary_response' + $ref: '#/components/schemas/slo_response' '400': description: Bad request content: @@ -224,7 +224,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/slo_definition_response' + $ref: '#/components/schemas/slo_response' '400': description: Bad request content: @@ -365,49 +365,6 @@ paths: application/json: schema: $ref: '#/components/schemas/404_response' - /s/{spaceId}/api/observability/slos/{sloId}/_reset: - post: - summary: Resets an SLO. - operationId: resetSloOp - description: | - You must have the `write` privileges for the **SLOs** feature in the **Observability** section of the Kibana feature privileges. - tags: - - slo - parameters: - - $ref: '#/components/parameters/kbn_xsrf' - - $ref: '#/components/parameters/space_id' - - $ref: '#/components/parameters/slo_id' - responses: - '204': - description: Successful request - content: - application/json: - schema: - $ref: '#/components/schemas/slo_definition_response' - '400': - description: Bad request - content: - application/json: - schema: - $ref: '#/components/schemas/400_response' - '401': - description: Unauthorized response - content: - application/json: - schema: - $ref: '#/components/schemas/401_response' - '403': - description: Unauthorized response - content: - application/json: - schema: - $ref: '#/components/schemas/403_response' - '404': - description: Not found response - content: - application/json: - schema: - $ref: '#/components/schemas/404_response' /s/{spaceId}/internal/observability/slos/_historical_summary: post: summary: Retrieves the historical summary for a list of SLOs @@ -450,68 +407,6 @@ paths: application/json: schema: $ref: '#/components/schemas/403_response' - /s/{spaceId}/internal/observability/slos/_definitions: - get: - summary: Get the SLO definitions - operationId: getDefinitionsOp - description: | - You must have the `read` privileges for the **SLOs** feature in the **Observability** section of the Kibana feature privileges. - tags: - - slo - parameters: - - $ref: '#/components/parameters/kbn_xsrf' - - $ref: '#/components/parameters/space_id' - - name: includeOutdatedOnly - in: query - description: Indicates if the API returns only outdated SLO or all SLO definitions - schema: - type: boolean - example: true - - name: search - in: query - description: Filters the SLOs by name - schema: - type: string - example: my service availability - - name: page - in: query - description: The page to use for pagination, must be greater or equal than 1 - schema: - type: number - example: 1 - - name: perPage - in: query - description: Number of SLOs returned by page - schema: - type: integer - default: 100 - maximum: 1000 - example: 100 - responses: - '200': - description: Successful request - content: - application/json: - schema: - $ref: '#/components/schemas/find_slo_definitions_response' - '400': - description: Bad request - content: - application/json: - schema: - $ref: '#/components/schemas/400_response' - '401': - description: Unauthorized response - content: - application/json: - schema: - $ref: '#/components/schemas/401_response' - '403': - description: Unauthorized response - content: - application/json: - schema: - $ref: '#/components/schemas/403_response' /s/{spaceId}/api/observability/slos/_delete_instances: post: summary: Batch delete rollup and summary data for the matching list of sloId and instanceId @@ -1207,7 +1102,7 @@ components: example: 0.9836 errorBudget: $ref: '#/components/schemas/error_budget' - slo_with_summary_response: + slo_response: title: SLO response type: object required: @@ -1227,7 +1122,6 @@ components: - tags - createdAt - updatedAt - - version properties: id: description: The identifier of the SLO. @@ -1297,10 +1191,6 @@ components: description: The last update date type: string example: '2023-01-12T10:03:19.000Z' - version: - description: The internal SLO version - type: number - example: 2 find_slo_response: title: Find SLO response description: | @@ -1319,7 +1209,7 @@ components: results: type: array items: - $ref: '#/components/schemas/slo_with_summary_response' + $ref: '#/components/schemas/slo_response' 400_response: title: Bad request type: object @@ -1495,92 +1385,6 @@ components: type: array items: type: string - slo_definition_response: - title: SLO definition response - type: object - required: - - id - - name - - description - - indicator - - timeWindow - - budgetingMethod - - objective - - settings - - revision - - enabled - - groupBy - - tags - - createdAt - - updatedAt - - version - properties: - id: - description: The identifier of the SLO. - type: string - example: 8853df00-ae2e-11ed-90af-09bb6422b258 - name: - description: The name of the SLO. - type: string - example: My Service SLO - description: - description: The description of the SLO. - type: string - example: My SLO description - indicator: - discriminator: - propertyName: type - mapping: - sli.apm.transactionErrorRate: '#/components/schemas/indicator_properties_apm_availability' - sli.kql.custom: '#/components/schemas/indicator_properties_custom_kql' - sli.apm.transactionDuration: '#/components/schemas/indicator_properties_apm_latency' - sli.metric.custom: '#/components/schemas/indicator_properties_custom_metric' - sli.histogram.custom: '#/components/schemas/indicator_properties_histogram' - sli.metric.timeslice: '#/components/schemas/indicator_properties_timeslice_metric' - oneOf: - - $ref: '#/components/schemas/indicator_properties_custom_kql' - - $ref: '#/components/schemas/indicator_properties_apm_availability' - - $ref: '#/components/schemas/indicator_properties_apm_latency' - - $ref: '#/components/schemas/indicator_properties_custom_metric' - - $ref: '#/components/schemas/indicator_properties_histogram' - - $ref: '#/components/schemas/indicator_properties_timeslice_metric' - timeWindow: - $ref: '#/components/schemas/time_window' - budgetingMethod: - $ref: '#/components/schemas/budgeting_method' - objective: - $ref: '#/components/schemas/objective' - settings: - $ref: '#/components/schemas/settings' - revision: - description: The SLO revision - type: number - example: 2 - enabled: - description: Indicate if the SLO is enabled - type: boolean - example: true - groupBy: - description: optional group by field to use to generate an SLO per distinct value - type: string - example: some.field - tags: - description: List of tags - type: array - items: - type: string - createdAt: - description: The creation date - type: string - example: '2023-01-12T10:03:19.000Z' - updatedAt: - description: The last update date - type: string - example: '2023-01-12T10:03:19.000Z' - version: - description: The internal SLO version - type: number - example: 2 historical_summary_request: title: Historical summary request type: object @@ -1611,25 +1415,6 @@ components: example: 0.9836 errorBudget: $ref: '#/components/schemas/error_budget' - find_slo_definitions_response: - title: Find SLO definitions response - description: | - A paginated response of SLO definitions matching the query. - type: object - properties: - page: - type: number - example: 2 - perPage: - type: number - example: 100 - total: - type: number - example: 123 - results: - type: array - items: - $ref: '#/components/schemas/slo_definition_response' delete_slo_instances_request: title: Delete SLO instances request description: | diff --git a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/find_slo_definitions_response.yaml b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/find_slo_definitions_response.yaml deleted file mode 100644 index 274bdc7016a04..0000000000000 --- a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/find_slo_definitions_response.yaml +++ /dev/null @@ -1,18 +0,0 @@ -title: Find SLO definitions response -description: > - A paginated response of SLO definitions matching the query. -type: object -properties: - page: - type: number - example: 2 - perPage: - type: number - example: 100 - total: - type: number - example: 123 - results: - type: array - items: - $ref: 'slo_definition_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/find_slo_response.yaml b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/find_slo_response.yaml index b94aa6e6dc1c5..36a701efa34f4 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/find_slo_response.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/find_slo_response.yaml @@ -15,4 +15,4 @@ properties: results: type: array items: - $ref: 'slo_with_summary_response.yaml' \ No newline at end of file + $ref: 'slo_response.yaml' \ No newline at end of file diff --git a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/slo_definition_response.yaml b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/slo_definition_response.yaml deleted file mode 100644 index 0b4ffa774d10f..0000000000000 --- a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/slo_definition_response.yaml +++ /dev/null @@ -1,85 +0,0 @@ -title: SLO definition response -type: object -required: - - id - - name - - description - - indicator - - timeWindow - - budgetingMethod - - objective - - settings - - revision - - enabled - - groupBy - - tags - - createdAt - - updatedAt - - version -properties: - id: - description: The identifier of the SLO. - type: string - example: 8853df00-ae2e-11ed-90af-09bb6422b258 - name: - description: The name of the SLO. - type: string - example: My Service SLO - description: - description: The description of the SLO. - type: string - example: My SLO description - indicator: - discriminator: - propertyName: type - mapping: - sli.apm.transactionErrorRate: './indicator_properties_apm_availability.yaml' - sli.kql.custom: './indicator_properties_custom_kql.yaml' - sli.apm.transactionDuration: './indicator_properties_apm_latency.yaml' - sli.metric.custom: './indicator_properties_custom_metric.yaml' - sli.histogram.custom: './indicator_properties_histogram.yaml' - sli.metric.timeslice: './indicator_properties_timeslice_metric.yaml' - oneOf: - - $ref: "indicator_properties_custom_kql.yaml" - - $ref: "indicator_properties_apm_availability.yaml" - - $ref: "indicator_properties_apm_latency.yaml" - - $ref: "indicator_properties_custom_metric.yaml" - - $ref: "indicator_properties_histogram.yaml" - - $ref: "indicator_properties_timeslice_metric.yaml" - timeWindow: - $ref: "time_window.yaml" - budgetingMethod: - $ref: "budgeting_method.yaml" - objective: - $ref: "objective.yaml" - settings: - $ref: "settings.yaml" - revision: - description: The SLO revision - type: number - example: 2 - enabled: - description: Indicate if the SLO is enabled - type: boolean - example: true - groupBy: - description: optional group by field to use to generate an SLO per distinct value - type: string - example: "some.field" - tags: - description: List of tags - type: array - items: - type: string - createdAt: - description: The creation date - type: string - example: "2023-01-12T10:03:19.000Z" - updatedAt: - description: The last update date - type: string - example: "2023-01-12T10:03:19.000Z" - version: - description: The internal SLO version - type: number - example: 2 \ No newline at end of file diff --git a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/slo_with_summary_response.yaml b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/slo_response.yaml similarity index 96% rename from x-pack/plugins/observability/docs/openapi/slo/components/schemas/slo_with_summary_response.yaml rename to x-pack/plugins/observability/docs/openapi/slo/components/schemas/slo_response.yaml index df8e35996feb3..bd58e88c7b641 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/components/schemas/slo_with_summary_response.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/components/schemas/slo_response.yaml @@ -17,7 +17,6 @@ required: - tags - createdAt - updatedAt - - version properties: id: description: The identifier of the SLO. @@ -87,7 +86,3 @@ properties: description: The last update date type: string example: "2023-01-12T10:03:19.000Z" - version: - description: The internal SLO version - type: number - example: 2 \ No newline at end of file diff --git a/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml b/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml index b951be467e006..687fd94f006a4 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml @@ -20,15 +20,11 @@ paths: "/s/{spaceId}/api/observability/slos/{sloId}": $ref: "paths/s@{spaceid}@api@slos@{sloid}.yaml" "/s/{spaceId}/api/observability/slos/{sloId}/enable": - $ref: "paths/s@{spaceid}@api@slos@{sloid}@enable.yaml" + $ref: "paths/s@{spaceid}@api@slos@{sloid}@{enable}.yaml" "/s/{spaceId}/api/observability/slos/{sloId}/disable": - $ref: "paths/s@{spaceid}@api@slos@{sloid}@disable.yaml" - "/s/{spaceId}/api/observability/slos/{sloId}/_reset": - $ref: "paths/s@{spaceid}@api@slos@{sloid}@_reset.yaml" + $ref: "paths/s@{spaceid}@api@slos@{sloid}@{disable}.yaml" "/s/{spaceId}/internal/observability/slos/_historical_summary": $ref: "paths/s@{spaceid}@api@slos@_historical_summary.yaml" - "/s/{spaceId}/internal/observability/slos/_definitions": - $ref: "paths/s@{spaceid}@api@slos@_definitions.yaml" "/s/{spaceId}/api/observability/slos/_delete_instances": $ref: "paths/s@{spaceid}@api@slos@_delete_instances.yaml" components: diff --git a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos.yaml b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos.yaml index 782e8fb477f94..b606a0aac05fb 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos.yaml @@ -68,14 +68,14 @@ get: example: 'slo.name:latency* and slo.tags : "prod"' - name: page in: query - description: The page to use for pagination, must be greater or equal than 1 + description: The page number to return schema: type: integer default: 1 example: 1 - name: perPage in: query - description: Number of SLOs returned by page + description: The number of SLOs to return per page schema: type: integer default: 25 diff --git a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@_definitions.yaml b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@_definitions.yaml deleted file mode 100644 index 508c3cc86f8fe..0000000000000 --- a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@_definitions.yaml +++ /dev/null @@ -1,62 +0,0 @@ -get: - summary: Get the SLO definitions - operationId: getDefinitionsOp - description: > - You must have the `read` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - tags: - - slo - parameters: - - $ref: ../components/headers/kbn_xsrf.yaml - - $ref: ../components/parameters/space_id.yaml - - name: includeOutdatedOnly - in: query - description: Indicates if the API returns only outdated SLO or all SLO definitions - schema: - type: boolean - example: true - - name: search - in: query - description: Filters the SLOs by name - schema: - type: string - example: 'my service availability' - - name: page - in: query - description: The page to use for pagination, must be greater or equal than 1 - schema: - type: number - example: 1 - - name: perPage - in: query - description: Number of SLOs returned by page - schema: - type: integer - default: 100 - maximum: 1000 - example: 100 - responses: - '200': - description: Successful request - content: - application/json: - schema: - $ref: '../components/schemas/find_slo_definitions_response.yaml' - '400': - description: Bad request - content: - application/json: - schema: - $ref: '../components/schemas/400_response.yaml' - '401': - description: Unauthorized response - content: - application/json: - schema: - $ref: '../components/schemas/401_response.yaml' - '403': - description: Unauthorized response - content: - application/json: - schema: - $ref: '../components/schemas/403_response.yaml' diff --git a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}.yaml b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}.yaml index 76d8f0eb640da..a7740b7517464 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}.yaml @@ -22,7 +22,7 @@ get: content: application/json: schema: - $ref: '../components/schemas/slo_with_summary_response.yaml' + $ref: '../components/schemas/slo_response.yaml' '400': description: Bad request content: @@ -72,7 +72,7 @@ put: content: application/json: schema: - $ref: '../components/schemas/slo_definition_response.yaml' + $ref: '../components/schemas/slo_response.yaml' '400': description: Bad request content: diff --git a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@_reset.yaml b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@_reset.yaml deleted file mode 100644 index 6739d3df78328..0000000000000 --- a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@_reset.yaml +++ /dev/null @@ -1,43 +0,0 @@ -post: - summary: Resets an SLO. - operationId: resetSloOp - description: > - You must have the `write` privileges for the **SLOs** feature in the - **Observability** section of the Kibana feature privileges. - tags: - - slo - parameters: - - $ref: ../components/headers/kbn_xsrf.yaml - - $ref: ../components/parameters/space_id.yaml - - $ref: ../components/parameters/slo_id.yaml - responses: - '204': - description: Successful request - content: - application/json: - schema: - $ref: '../components/schemas/slo_definition_response.yaml' - '400': - description: Bad request - content: - application/json: - schema: - $ref: '../components/schemas/400_response.yaml' - '401': - description: Unauthorized response - content: - application/json: - schema: - $ref: '../components/schemas/401_response.yaml' - '403': - description: Unauthorized response - content: - application/json: - schema: - $ref: '../components/schemas/403_response.yaml' - '404': - description: Not found response - content: - application/json: - schema: - $ref: '../components/schemas/404_response.yaml' diff --git a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@disable.yaml b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@{disable}.yaml similarity index 100% rename from x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@disable.yaml rename to x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@{disable}.yaml diff --git a/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@enable.yaml b/x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@{enable}.yaml similarity index 100% rename from x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@enable.yaml rename to x-pack/plugins/observability/docs/openapi/slo/paths/s@{spaceid}@api@slos@{sloid}@{enable}.yaml diff --git a/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.tsx b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.tsx index 6e35ce265bad5..5ec21da2efc1c 100644 --- a/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.tsx +++ b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.tsx @@ -22,7 +22,7 @@ function SloSelector({ initialSlo, onSelected, errors }: Props) { const [options, setOptions] = useState>>([]); const [selectedOptions, setSelectedOptions] = useState>>(); const [searchValue, setSearchValue] = useState(''); - const { isLoading, data } = useFetchSloDefinitions({ name: searchValue }); + const { isLoading, data: sloList } = useFetchSloDefinitions({ name: searchValue }); const hasError = errors !== undefined && errors.length > 0; useEffect(() => { @@ -30,17 +30,17 @@ function SloSelector({ initialSlo, onSelected, errors }: Props) { }, [initialSlo]); useEffect(() => { - const isLoadedWithData = !isLoading && !!data?.results; + const isLoadedWithData = !isLoading && sloList !== undefined; const opts: Array> = isLoadedWithData - ? data?.results?.map((slo) => ({ value: slo.id, label: slo.name })) + ? sloList.map((slo) => ({ value: slo.id, label: slo.name })) : []; setOptions(opts); - }, [isLoading, data]); + }, [isLoading, sloList]); const onChange = (opts: Array>) => { setSelectedOptions(opts); const selectedSlo = - opts.length === 1 ? data?.results?.find((slo) => slo.id === opts[0].value) : undefined; + opts.length === 1 ? sloList?.find((slo) => slo.id === opts[0].value) : undefined; onSelected(selectedSlo); }; 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 44cac014d25f7..0f53594bd49e9 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 @@ -19,6 +19,7 @@ import { euiStyled } from '@kbn/kibana-react-plugin/common'; import { AggregationType, builtInComparators, + COMPARATORS, IErrorObject, ThresholdExpression, } from '@kbn/triggers-actions-ui-plugin/public'; @@ -30,8 +31,12 @@ import { CustomEquationEditor } from './custom_equation'; import { CUSTOM_EQUATION, LABEL_HELP_MESSAGE, LABEL_LABEL } from '../i18n_strings'; import { decimalToPct, pctToDecimal } from '../helpers/corrected_percent_convert'; +// Create a new object with COMPARATORS.NOT_BETWEEN removed as we use OUTSIDE_RANGE +const updatedBuiltInComparators = { ...builtInComparators }; +delete updatedBuiltInComparators[COMPARATORS.NOT_BETWEEN]; + const customComparators = { - ...builtInComparators, + ...updatedBuiltInComparators, [Comparator.OUTSIDE_RANGE]: { text: i18n.translate('xpack.observability.customThreshold.rule.alertFlyout.outsideRangeLabel', { defaultMessage: 'Is not between', diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/painless_tinymath_parser.test.ts b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/painless_tinymath_parser.test.ts new file mode 100644 index 0000000000000..bfc8cb955a2b8 --- /dev/null +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/painless_tinymath_parser.test.ts @@ -0,0 +1,205 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { PainlessTinyMathParser } from './painless_tinymath_parser'; + +describe('PainlessTinyMathParser', () => { + it('should parse a simple equation without aggregations A-Z ', () => { + const equation = '1 + 1'; + const parser = new PainlessTinyMathParser({ equation }); + expect(parser.parse()).toEqual('1+1'); + }); + it('should parse a simple equation with one aggregations A', () => { + const equation = '100 * A'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual('100*average(system.cpu.system.pct)'); + }); + it('should parse a simple equation with two aggregations A and B', () => { + const equation = '100 * A + B / 100'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + '100*average(system.cpu.system.pct)+average(system.cpu.user.pct)/100' + ); + }); + it('should parse an equation with three aggregations A, B and C with parentheses', () => { + const equation = '100 * (A + B / 100) - C'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + C: 'average(system.cpu.cores)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + '100*(average(system.cpu.system.pct)+average(system.cpu.user.pct)/100)-average(system.cpu.cores)' + ); + }); + it('should parse an equation with one condition', () => { + const equation = 'A > 0 ? 10 : 20'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual('ifelse(average(system.cpu.system.pct)>0, 10, 20)'); + }); + + it('should parse an equation with two condition one of them is a single chart', () => { + const equation = 'A > B || A ? 20 : 30'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + 'ifelse(ifelse(average(system.cpu.system.pct)>average(system.cpu.user.pct),1,0) + ifelse(average(system.cpu.system.pct) > 0,1,0) > 0, 20, 30)' + ); + }); + it('should parse an equation with one condition that when TRUE is a condition', () => { + const equation = 'A > 0 ? B > 0 ? 10 : 20 : 30'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + 'ifelse(average(system.cpu.system.pct)>0, ifelse(average(system.cpu.user.pct)>0, 10, 20), 30)' + ); + }); + it('should parse an equation with two condition with OR', () => { + const equation = 'A > 0 || B > 10 ? 100 : 30'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + 'ifelse(ifelse(average(system.cpu.system.pct)>0,1,0) + ifelse(average(system.cpu.user.pct)>10,1,0) > 0, 100, 30)' + ); + }); + it('should parse an equation with two condition with AND', () => { + const equation = 'A > 0 && B > 10 ? 100 : 30'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + 'ifelse(ifelse(average(system.cpu.system.pct)>0,1,0) * ifelse(average(system.cpu.user.pct)>10,1,0) > 0, 100, 30)' + ); + }); + it('should parse an equation with two condition with OR and NOT with parentheses', () => { + const equation = '!(A > 0) || B == 10 ? 100 : 30'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + 'ifelse(ifelse(average(system.cpu.system.pct)>0,0,1) + ifelse(average(system.cpu.user.pct)==10,1,0) > 0, 100, 30)' + ); + }); + it('should parse an equation with three conditions with mix of OR and AND with parentheses', () => { + const equation = '(A > 0 || B == 10) && A < 200 ? 100 : 30'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + 'ifelse(ifelse(average(system.cpu.system.pct)>0,1,0) + ifelse(average(system.cpu.user.pct)==10,1,0) * ifelse(average(system.cpu.system.pct)<200,1,0) > 0, 100, 30)' + ); + }); + it('should parse an equation with four conditions with mix of OR and AND with NOT and NOT EQUAL and parentheses where FALSE is a condition', () => { + const equation = '!(A > 0) || B !== 10 && !(A < 200 || B == 2) ? 100 : A == 10 ? 200 : 300'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + 'ifelse(ifelse(average(system.cpu.system.pct)>0,0,1) + ifelse(average(system.cpu.user.pct)==10,0,1) * ifelse(average(system.cpu.system.pct)<200,0,1) + ifelse(average(system.cpu.user.pct)==2,1,0) > 0, 100, ifelse(average(system.cpu.system.pct)==10, 200, 300))' + ); + }); + + it('should parse a complex equation with many nested conditions and many aggregations', () => { + const equation = + 'A == 10 && F == 10 ? B == 20 ? C < 200 ? D > 200 ? 300 : A - D : B/C : 20 : A * C > C * D ? (A+B)/C > 100 ? D !== 20 ? 200 : 100 : 200 : B/C'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + C: 'average(system.cpu.total.pct)', + D: 'average(system.cpu.cores)', + E: 'count()', + F: 'sum(system.cpu.total.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + 'ifelse(ifelse(average(system.cpu.system.pct)==10,1,0) * ifelse(sum(system.cpu.total.pct)==10,1,0) > 0, ifelse(average(system.cpu.user.pct)==20, ifelse(average(system.cpu.total.pct)<200, ifelse(average(system.cpu.cores)>200, 300, average(system.cpu.system.pct)-average(system.cpu.cores)), average(system.cpu.user.pct)/average(system.cpu.total.pct)), 20), ifelse(average(system.cpu.system.pct)*average(system.cpu.total.pct)>average(system.cpu.total.pct)*average(system.cpu.cores), ifelse((average(system.cpu.system.pct)+average(system.cpu.user.pct))/average(system.cpu.total.pct)>100, ifelse(ifelse(average(system.cpu.cores)==20,0,1) > 0, 200, 100), 200), average(system.cpu.user.pct)/average(system.cpu.total.pct)))' + ); + }); + + it('should parse a complex equation with deeply nested conditions and many aggregations with parentheses', () => { + const equation = + 'A == 10 && (F == 10 || (B > 20 && B ==20) || D > 20) ? B == 20 ? C < 200 ? D > 200 ? 300 : A - D : B/C : 20 : A * C > C * D ? (A+B)/C > 100 ? D !== 20 ? 200 : 100 : 200 : B/C'; + const parser = new PainlessTinyMathParser({ + equation, + aggMap: { + A: 'average(system.cpu.system.pct)', + B: 'average(system.cpu.user.pct)', + C: 'average(system.cpu.total.pct)', + D: 'average(system.cpu.cores)', + E: 'count()', + F: 'sum(system.cpu.total.pct)', + }, + }); + // ✅ checked with Lens Formula editor + expect(parser.parse()).toEqual( + 'ifelse(ifelse(average(system.cpu.system.pct)==10,1,0) * ifelse(sum(system.cpu.total.pct)==10,1,0) + ifelse(average(system.cpu.user.pct)>20,1,0) * ifelse(average(system.cpu.user.pct)==20,1,0) + ifelse(average(system.cpu.cores)>20,1,0) > 0, ifelse(average(system.cpu.user.pct)==20, ifelse(average(system.cpu.total.pct)<200, ifelse(average(system.cpu.cores)>200, 300, average(system.cpu.system.pct)-average(system.cpu.cores)), average(system.cpu.user.pct)/average(system.cpu.total.pct)), 20), ifelse(average(system.cpu.system.pct)*average(system.cpu.total.pct)>average(system.cpu.total.pct)*average(system.cpu.cores), ifelse((average(system.cpu.system.pct)+average(system.cpu.user.pct))/average(system.cpu.total.pct)>100, ifelse(ifelse(average(system.cpu.cores)==20,0,1) > 0, 200, 100), 200), average(system.cpu.user.pct)/average(system.cpu.total.pct)))' + ); + }); +}); diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/painless_tinymath_parser.ts b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/painless_tinymath_parser.ts new file mode 100644 index 0000000000000..0bbcab23948ba --- /dev/null +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/painless_tinymath_parser.ts @@ -0,0 +1,208 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// This is a parser of a subset operations/expression/statement of Painless A-Z, +, -, /, *, (, ), ?, !, &, :, |, >, <, = to be used in Lens formula editor that uses TinyMath +// The goal is to parse painless expressions to a format that can be used in Lens formula editor +// The parser will also replace the characters A-Z with the values from aggMap +// Example: "A > 0 ? 10 : 20" will be parsed to "ifelse(average(system.cpu.system.pct) > 0, 10, 20)" +// Technically, this parser is NOT following the normal rules of parsing, means building AST, grammar file, tokenizer, and handling function, because it is a subset of Painless +// This parser is using a simple recursive function to parse the expression and replace the characters with the values from aggMap + +export interface AggMap { + [key: string]: string; +} +interface PainlessTinyMathParserProps { + equation: string; + aggMap?: AggMap; +} +export class PainlessTinyMathParser { + private IF = '?'; + private ELSE = ':'; + private AND = '&'; + private OR = '|'; + private NOT_EQUAL = '!='; + private NOT = '!'; + private openParenthesesRegex = /^\(*/g; + private notRegex = /^\!/g; + private closeParenthesesRegex = /\)*$/g; + private logicalConditionRegex = /(\s*[|&]{2})/g; + + private aggMap = {}; + private equation = ''; + + constructor({ equation, aggMap }: PainlessTinyMathParserProps) { + this.aggMap = aggMap || this.aggMap; + this.equation = this.clean(equation) || this.equation; + return this; + } + + clean(expression: string): string { + return expression + .replace(/(\s|\n)/g, '') + .replace('===', '==') + .replace('!==', '!='); + } + + diveIntoString( + expression: string, + levelDownChar: string, + levelUpChar: string + ): number | undefined { + // Search for the first ? and then start count the depth of the nest IFs + const expressionLength = expression.length; + let currentDepth = 0; + for (let i = expression.indexOf(levelDownChar); i < expressionLength; i++) { + const char = expression.charAt(i); + + if (char === levelDownChar) { + currentDepth += 1; + } + if (char === levelUpChar) { + currentDepth -= 1; + } + if (currentDepth === 0) { + return i; + } + // IT IS THE LAST CHAR AND THE DEPTH IS NOT 0, SO IT IS INVALID IF ELSE EXPRESSION + if (i === expressionLength - 1 && currentDepth !== 0) { + throw new Error('Invalid expression'); + } + } + } + + replaceCharactersWithAggMap(inputString: string, aggMap: AggMap): string { + // Use a regular expression to match any character from 'A' to 'Z' + const regex = /[A-Z]/g; + + return inputString.replace(regex, (match) => { + const replacement = aggMap[match]; // Get the replacement from the map + return replacement ? replacement : match; // Use the replacement or the original character + }); + } + + parseCondition(condition: string): string { + // If the condition does not contain any logical operators, return it as it is + if ( + !condition.includes(this.AND) && + !condition.includes(this.OR) && + !condition.includes(this.NOT_EQUAL) + ) { + return condition; + } + + const parts = condition.split(this.logicalConditionRegex); + const filteredParts = parts.filter((part) => part.trim() !== '' || part.includes(this.IF)); + const res = filteredParts.map((part) => { + // Handle the OR and AND cases and replace them with + and * + if (part.includes('||')) { + return part.replace('||', '+').trim(); + } + if (part.includes('&&')) { + return part.replace('&&', '*').trim(); + } + + // Handle the NOT and NOT_EQUAL cases and replace them with == and != + let isNOT = false; + if (part.includes(this.NOT)) isNOT = true; + if (part.includes(this.NOT_EQUAL)) { + part = part.replace('!=', '=='); + } + // Strip the part from the parentheses and the NOT characters + let stripedPart = part + .replace(this.notRegex, '') + .replace(this.openParenthesesRegex, '') + .replace(this.closeParenthesesRegex, '') + .replace(this.NOT, '') + .trim(); + // Build the ifelse function and switch the true/false position if it is a NOT case + // Every condition will be evaluated to 0 or 1 and then we will use the ifelse function to return the correct value + // example: ifelse(A > 0, 1, 0) example for NOT: ifelse(A > 0, 0, 1) + // If the condition is a single character e.g. A || B, we will add > 0 to it + if (/^[A-Z]$/.test(stripedPart)) { + stripedPart = stripedPart + ' > 0'; + } + let result = `ifelse(${stripedPart},${isNOT ? '0,1' : '1,0'})`; + + const openParentheses = part.match(this.openParenthesesRegex); + const closeParentheses = part.match(this.closeParenthesesRegex); + + // Ignore parentheses if they are opened and closed in the same condition as we put them using ifelse function + // Extra parentheses will throw error in Lens + // We keep the open parentheses and the closing parentheses that are not part of the same condition + if ( + openParentheses && + openParentheses.length > 0 && + closeParentheses && + closeParentheses.length > 0 + ) { + return result; + } + // Put back the open parentheses + if (openParentheses && openParentheses.length > 0) { + result = openParentheses[0] + result; + } + // Put back the closing parentheses + if (closeParentheses && closeParentheses.length > 0) { + result = result + closeParentheses[0]; + } + return result; + }); + + // At the end of the loop, we will have an array of conditions with AND(*) and OR(+) + // And to evaluate the whole condition, by wrapping them with ifelse and check if all the conditions are true (>0) + const conditions = res.join(' ') + ' > 0'; + return conditions; + } + + getTrueBranch(expression: string) { + const lastColonPosition = this.diveIntoString(expression, this.IF, this.ELSE); + if (lastColonPosition !== undefined) { + return expression.substring(expression.indexOf(this.IF) + 1, lastColonPosition); + } + return ''; + } + + getFalseBrach(expression: string) { + const lastColonPosition = this.diveIntoString(expression, this.IF, this.ELSE); + if (lastColonPosition !== undefined) { + return expression.substring(lastColonPosition + 1); + } + return ''; + } + + getCondition(expression: string): string { + return expression.substring(0, expression.indexOf(this.IF)); + } + + parse(): string { + const recursiveParseConditions = (expression: string): string => { + const condition = this.parseCondition(this.getCondition(expression)); + const trueBranch = this.getTrueBranch(expression); + const falseBranch = this.getFalseBrach(expression); + + let fullCondition = `ifelse(${condition}, ${trueBranch}, ${falseBranch})`; + + if (trueBranch.includes(this.IF)) { + const parsedTrueBranch = recursiveParseConditions(trueBranch); + fullCondition = fullCondition.replace(trueBranch, parsedTrueBranch); + } + if (falseBranch.includes(this.IF)) { + const parsedFalseBranch = recursiveParseConditions(falseBranch); + fullCondition = fullCondition.replace(falseBranch, parsedFalseBranch); + } + const result = this.replaceCharactersWithAggMap(fullCondition, this.aggMap); + return result; + }; + + if (!this.equation || this.equation === '') throw new Error('Invalid Equation'); + + if (this.equation.includes(this.IF)) { + return recursiveParseConditions(this.equation); + } + return this.replaceCharactersWithAggMap(this.equation, this.aggMap); + } +} 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 new file mode 100644 index 0000000000000..9226da0ca2370 --- /dev/null +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.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 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'; + +jest.mock('../../../../utils/kibana_react'); + +const useKibanaMock = useKibana as jest.Mock; + +const mockKibana = () => { + useKibanaMock.mockReturnValue({ + ...kibanaStartMock.startContract(), + }); +}; + +describe('Preview chart', () => { + beforeEach(() => { + jest.clearAllMocks(); + mockKibana(); + }); + async function setup(expression: MetricExpression, dataView?: DataView) { + const wrapper = mountWithIntl( + + ); + + const update = async () => + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + await update(); + + return { wrapper, update }; + } + + it('should display no data message', async () => { + const expression: MetricExpression = { + aggType: CUSTOM_AGGREGATOR, + metrics: [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + ], + timeSize: 1, + timeUnit: 'm', + sourceId: 'default', + threshold: [1], + comparator: Comparator.GT_OR_EQ, + }; + const { wrapper } = await setup(expression); + expect(wrapper.find('[data-test-subj="thresholdRuleNoChartData"]').exists()).toBeTruthy(); + }); +}); 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 new file mode 100644 index 0000000000000..d5a8b763ca7b5 --- /dev/null +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.tsx @@ -0,0 +1,339 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React, { useState, useEffect } from 'react'; +import { EuiEmptyPrompt, useEuiTheme } from '@elastic/eui'; +import { FillStyle, OperationType } from '@kbn/lens-plugin/public'; +import { DataView } from '@kbn/data-views-plugin/common'; +import { FormattedMessage } from '@kbn/i18n-react'; +import useAsync from 'react-use/lib/useAsync'; +import { + LensAttributes, + LensAttributesBuilder, + XYChart, + XYDataLayer, + XYLayerOptions, + XYReferenceLinesLayer, +} from '@kbn/lens-embeddable-utils'; + +import { IErrorObject } from '@kbn/triggers-actions-ui-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { + Aggregators, + Comparator, + AggType, +} from '../../../../../common/custom_threshold_rule/types'; +import { useKibana } from '../../../../utils/kibana_react'; +import { MetricExpression } from '../../types'; +import { AggMap, PainlessTinyMathParser } from './painless_tinymath_parser'; + +interface PreviewChartPros { + metricExpression: MetricExpression; + dataView?: DataView; + filterQuery?: string; + groupBy?: string | string[]; + error?: IErrorObject; +} + +const getOperationTypeFromRuleAggType = (aggType: AggType): OperationType => { + if (aggType === Aggregators.AVERAGE) return 'average'; + if (aggType === Aggregators.CARDINALITY) return 'unique_count'; + return aggType; +}; + +export function PreviewChart({ + metricExpression, + dataView, + filterQuery, + groupBy, + error, +}: PreviewChartPros) { + const { + services: { lens }, + } = useKibana(); + const { euiTheme } = useEuiTheme(); + const { metrics, timeSize, timeUnit, threshold, comparator, equation } = metricExpression; + const [attributes, setAttributes] = useState(); + const [aggMap, setAggMap] = useState(); + const [formula, setFormula] = useState(''); + const [thresholdReferenceLine, setThresholdReferenceLine] = useState(); + const [chartLoading, setChartLoading] = useState(false); + const formulaAsync = useAsync(() => { + return lens.stateHelperApi(); + }, [lens]); + + // Handle Lens error + useEffect(() => { + // Lens does not expose or provide a way to check if there is an error in the chart, yet. + // To work around this, we check if the element with class 'lnsEmbeddedError' is found in the DOM. + setTimeout(function () { + const errorDiv = document.querySelector('.lnsEmbeddedError'); + if (errorDiv) { + const paragraphElements = errorDiv.querySelectorAll('p'); + if (!paragraphElements || paragraphElements.length < 2) return; + paragraphElements[0].innerText = i18n.translate( + 'xpack.observability.customThreshold.rule..charts.error_equation.title', + { + defaultMessage: 'An error occurred while rendering the chart', + } + ); + paragraphElements[1].innerText = i18n.translate( + 'xpack.observability.customThreshold.rule..charts.error_equation.description', + { + defaultMessage: 'Check the rule equation.', + } + ); + } + }); + }, [chartLoading, attributes]); + + // Build the threshold reference line + useEffect(() => { + if (!threshold) return; + const refLayers = []; + const isPercent = Boolean(metrics.length === 1 && metrics[0].field?.endsWith('.pct')); + const format = { + id: isPercent ? 'percent' : 'number', + params: { + decimals: isPercent ? 0 : 2, + }, + }; + + if ( + comparator === Comparator.OUTSIDE_RANGE || + (comparator === Comparator.BETWEEN && threshold.length === 2) + ) { + const refLineStart = new XYReferenceLinesLayer({ + data: [ + { + value: (threshold[0] || 0).toString(), + color: euiTheme.colors.danger, + fill: comparator === Comparator.OUTSIDE_RANGE ? 'below' : 'above', + format, + }, + ], + }); + const refLineEnd = new XYReferenceLinesLayer({ + data: [ + { + value: (threshold[1] || 0).toString(), + color: euiTheme.colors.danger, + fill: comparator === Comparator.OUTSIDE_RANGE ? 'above' : 'below', + format, + }, + ], + }); + + refLayers.push(refLineStart, refLineEnd); + } else { + let fill: FillStyle = 'above'; + if (comparator === Comparator.LT || comparator === Comparator.LT_OR_EQ) { + fill = 'below'; + } + const thresholdRefLine = new XYReferenceLinesLayer({ + data: [ + { + value: (threshold[0] || 0).toString(), + color: euiTheme.colors.danger, + fill, + format, + }, + ], + }); + // A transparent line to add extra buffer at the top of threshold + const bufferRefLine = new XYReferenceLinesLayer({ + data: [ + { + value: Math.round((threshold[0] || 0) * 1.1).toString(), + color: 'transparent', + fill, + format, + }, + ], + }); + refLayers.push(thresholdRefLine, bufferRefLine); + } + setThresholdReferenceLine(refLayers); + }, [threshold, comparator, euiTheme.colors.danger, metrics]); + + // Build the aggregation map from the metrics + useEffect(() => { + if (!metrics || metrics.length === 0) { + return; + } + const aggMapFromMetrics = metrics.reduce((acc, metric) => { + const operation = getOperationTypeFromRuleAggType(metric.aggType); + let sourceField = metric.field; + + if (metric.aggType === Aggregators.COUNT) { + sourceField = '___records___'; + } + let operationField = `${operation}(${sourceField})`; + if (metric?.filter) { + const aggFilter = JSON.stringify(metric.filter).replace(/"|\\/g, ''); + operationField = `${operation}(${sourceField},kql='${aggFilter}')`; + } + return { + ...acc, + [metric.name]: operationField, + }; + }, {} as AggMap); + + setAggMap(aggMapFromMetrics); + }, [metrics]); + + // Parse the equation + useEffect(() => { + try { + if (!aggMap) return; + const parser = new PainlessTinyMathParser({ + aggMap, + equation: equation || Object.keys(aggMap || {}).join(' + '), + }); + + setFormula(parser.parse()); + } catch (e) { + // The error will appear on Lens chart. + setAttributes(undefined); + return; + } + }, [aggMap, equation]); + + useEffect(() => { + if (!formulaAsync.value || !dataView || !formula) { + return; + } + const isPercent = Boolean(metrics.length === 1 && metrics[0].field?.endsWith('.pct')); + const baseLayer = { + type: 'formula', + value: formula, + label: 'Custom Threshold', + groupBy, + format: { + id: isPercent ? 'percent' : 'number', + params: { + decimals: isPercent ? 0 : 2, + }, + }, + filter: { + language: 'kuery', + query: filterQuery || '', + }, + }; + + const xYDataLayerOptions: XYLayerOptions = { + buckets: { + type: 'date_histogram', + params: { + interval: `${timeSize}${timeUnit}`, + }, + }, + seriesType: 'bar', + }; + + if (groupBy && groupBy?.length) { + xYDataLayerOptions.breakdown = { + type: 'top_values', + field: groupBy[0], + params: { + size: 3, + secondaryFields: (groupBy as string[]).slice(1), + accuracyMode: false, + }, + }; + } + + const xyDataLayer = new XYDataLayer({ + data: [baseLayer].map((layer) => ({ + type: layer.type, + value: layer.value, + label: layer.label, + format: layer.format, + filter: layer.filter, + })), + options: xYDataLayerOptions, + }); + + const layers: Array = [xyDataLayer]; + if (thresholdReferenceLine) { + layers.push(...thresholdReferenceLine); + } + const attributesLens = new LensAttributesBuilder({ + visualization: new XYChart({ + visualOptions: { + valueLabels: 'hide', + axisTitlesVisibilitySettings: { + x: true, + yLeft: false, + yRight: true, + }, + }, + layers, + formulaAPI: formulaAsync.value.formula, + dataView, + }), + }).build(); + const lensBuilderAtt = { ...attributesLens, type: 'lens' }; + setAttributes(lensBuilderAtt); + }, [ + comparator, + dataView, + equation, + filterQuery, + formula, + formulaAsync.value, + groupBy, + metrics, + threshold, + thresholdReferenceLine, + timeSize, + timeUnit, + ]); + + if ( + !dataView || + !attributes || + error?.equation || + Object.keys(error?.metrics || {}).length !== 0 || + !timeSize + ) { + return ( +
    + + } + /> +
    + ); + } + return ( +
    + +
    + ); +} 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 502f6a0ecd743..78fa6c3244427 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 @@ -18,6 +18,9 @@ import { kibanaStartMock } from '../../utils/kibana_react.mock'; import Expressions from './custom_threshold_rule_expression'; jest.mock('../../utils/kibana_react'); +jest.mock('./components/preview_chart/preview_chart', () => ({ + PreviewChart: jest.fn(() =>
    ), +})); const useKibanaMock = useKibana as jest.Mock; 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 330d1c931cd09..2c5f7438b048f 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 @@ -40,9 +40,9 @@ import { CUSTOM_AGGREGATOR } from '../../../common/custom_threshold_rule/constan import { Aggregators, Comparator } from '../../../common/custom_threshold_rule/types'; import { TimeUnitChar } from '../../../common/utils/formatters/duration'; import { AlertContextMeta, AlertParams, MetricExpression } from './types'; -import { ExpressionChart } from './components/expression_chart'; import { ExpressionRow } from './components/expression_row'; import { MetricsExplorerFields, GroupBy } from './components/group_by'; +import { PreviewChart } from './components/preview_chart/preview_chart'; const FILTER_TYPING_DEBOUNCE_MS = 500; @@ -318,7 +318,6 @@ export default function Expressions(props: Props) { defaultMessage: 'Search for observability data… (e.g. host.name:host-1)', } ); - return ( <> @@ -412,13 +411,12 @@ export default function Expressions(props: Props) { expression={e || {}} dataView={derivedIndexPattern} > - {/* Preview */} -
    diff --git a/x-pack/plugins/observability/public/components/slo/error_rate_chart/use_lens_definition.ts b/x-pack/plugins/observability/public/components/slo/error_rate_chart/use_lens_definition.ts index 36cea6b76404e..ce01ac20ee69d 100644 --- a/x-pack/plugins/observability/public/components/slo/error_rate_chart/use_lens_definition.ts +++ b/x-pack/plugins/observability/public/components/slo/error_rate_chart/use_lens_definition.ts @@ -555,7 +555,7 @@ export function useLensDefinition(slo: SLOResponse): TypedLensByValueInput['attr adHocDataViews: { '32ca1ad4-81c0-4daf-b9d1-07118044bdc5': { id: '32ca1ad4-81c0-4daf-b9d1-07118044bdc5', - title: '.slo-observability.sli-v3.*', + title: '.slo-observability.sli-v2.*', timeFieldName: '@timestamp', sourceFilters: [], fieldFormats: {}, diff --git a/x-pack/plugins/observability/public/constants.ts b/x-pack/plugins/observability/public/constants.ts index ec7c51f10c3cf..40d24b18340bc 100644 --- a/x-pack/plugins/observability/public/constants.ts +++ b/x-pack/plugins/observability/public/constants.ts @@ -7,3 +7,5 @@ export const DEFAULT_INTERVAL = '60s'; export const DEFAULT_DATE_FORMAT = 'YYYY-MM-DD HH:mm'; +export const SLO_LONG_REFETCH_INTERVAL = 60 * 1000; // 1 minute +export const SLO_SHORT_REFETCH_INTERVAL = 5 * 1000; // 5 seconds diff --git a/x-pack/plugins/observability/public/data/slo/slo.ts b/x-pack/plugins/observability/public/data/slo/slo.ts index c53d55a32839f..5e210526884fd 100644 --- a/x-pack/plugins/observability/public/data/slo/slo.ts +++ b/x-pack/plugins/observability/public/data/slo/slo.ts @@ -5,9 +5,9 @@ * 2.0. */ -import { ALL_VALUE, FindSLOResponse, SLOWithSummaryResponse } from '@kbn/slo-schema'; import { cloneDeep } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; +import { ALL_VALUE, FindSLOResponse, SLOWithSummaryResponse } from '@kbn/slo-schema'; import { buildDegradingSummary, buildHealthySummary, @@ -16,8 +16,8 @@ import { buildTimeslicesObjective, buildViolatedSummary, } from './common'; -import { buildApmAvailabilityIndicator, buildCustomKqlIndicator } from './indicator'; import { buildCalendarAlignedTimeWindow, buildRollingTimeWindow } from './time_window'; +import { buildApmAvailabilityIndicator, buildCustomKqlIndicator } from './indicator'; export const emptySloList: FindSLOResponse = { results: [], @@ -68,7 +68,6 @@ const baseSlo: Omit = { enabled: true, createdAt: now, updatedAt: now, - version: 2, }; export const sloList: FindSLOResponse = { diff --git a/x-pack/plugins/observability/public/hooks/slo/query_key_factory.ts b/x-pack/plugins/observability/public/hooks/slo/query_key_factory.ts index feec4d475e3a8..b56a0576396f9 100644 --- a/x-pack/plugins/observability/public/hooks/slo/query_key_factory.ts +++ b/x-pack/plugins/observability/public/hooks/slo/query_key_factory.ts @@ -32,7 +32,8 @@ export const sloKeys = { globalDiagnosis: () => [...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_definitions.ts b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_definitions.ts index b3b7f59dd37cf..e74b3570177e4 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_definitions.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_definitions.ts @@ -5,16 +5,24 @@ * 2.0. */ -import { FindSLODefinitionsResponse } from '@kbn/slo-schema'; -import { useQuery } from '@tanstack/react-query'; +import { FindSloDefinitionsResponse, SLOResponse } from '@kbn/slo-schema'; +import { + QueryObserverResult, + RefetchOptions, + RefetchQueryFilters, + useQuery, +} from '@tanstack/react-query'; import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; export interface UseFetchSloDefinitionsResponse { - data: FindSLODefinitionsResponse | undefined; isLoading: boolean; isSuccess: boolean; isError: boolean; + data: SLOResponse[] | undefined; + refetch: ( + options?: (RefetchOptions & RefetchQueryFilters) | undefined + ) => Promise>; } interface Params { @@ -25,13 +33,18 @@ export function useFetchSloDefinitions({ name = '' }: Params): UseFetchSloDefini const { http } = useKibana().services; const search = name.endsWith('*') ? name : `${name}*`; - const { isLoading, isError, isSuccess, data } = useQuery({ + const { isLoading, isError, isSuccess, data, refetch } = useQuery({ queryKey: sloKeys.definitions(search), queryFn: async ({ signal }) => { try { - const response = await http.get( - '/api/observability/slos/_definitions', - { query: { search }, signal } + const response = await http.get( + '/internal/observability/slos/_definitions', + { + query: { + search, + }, + signal, + } ); return response; @@ -43,5 +56,5 @@ export function useFetchSloDefinitions({ name = '' }: Params): UseFetchSloDefini refetchOnWindowFocus: false, }); - return { isLoading, isError, isSuccess, data }; + return { isLoading, isError, isSuccess, data, refetch }; } 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_edit.test.ts b/x-pack/plugins/observability/public/locators/slo_edit.test.ts index cb485ea3e3877..a01a988dcdb55 100644 --- a/x-pack/plugins/observability/public/locators/slo_edit.test.ts +++ b/x-pack/plugins/observability/public/locators/slo_edit.test.ts @@ -20,7 +20,7 @@ describe('SloEditLocator', () => { it('should return correct url when slo is provided', async () => { const location = await locator.getLocation(buildSlo({ id: 'foo' })); expect(location.path).toEqual( - "/slos/edit/foo?_a=(budgetingMethod:occurrences,createdAt:'2022-12-29T10:11:12.000Z',description:'some%20description%20useful',enabled:!t,groupBy:'*',id:foo,indicator:(params:(filter:'baz:%20foo%20and%20bar%20%3E%202',good:'http_status:%202xx',index:some-index,timestampField:custom_timestamp,total:'a%20query'),type:sli.kql.custom),instanceId:'*',name:'super%20important%20level%20service',objective:(target:0.98),revision:1,settings:(frequency:'1m',syncDelay:'1m'),summary:(errorBudget:(consumed:0.064,initial:0.02,isEstimated:!f,remaining:0.936),sliValue:0.99872,status:HEALTHY),tags:!(k8s,production,critical),timeWindow:(duration:'30d',type:rolling),updatedAt:'2022-12-29T10:11:12.000Z',version:2)" + "/slos/edit/foo?_a=(budgetingMethod:occurrences,createdAt:'2022-12-29T10:11:12.000Z',description:'some%20description%20useful',enabled:!t,groupBy:'*',id:foo,indicator:(params:(filter:'baz:%20foo%20and%20bar%20%3E%202',good:'http_status:%202xx',index:some-index,timestampField:custom_timestamp,total:'a%20query'),type:sli.kql.custom),instanceId:'*',name:'super%20important%20level%20service',objective:(target:0.98),revision:1,settings:(frequency:'1m',syncDelay:'1m'),summary:(errorBudget:(consumed:0.064,initial:0.02,isEstimated:!f,remaining:0.936),sliValue:0.99872,status:HEALTHY),tags:!(k8s,production,critical),timeWindow:(duration:'30d',type:rolling),updatedAt:'2022-12-29T10:11:12.000Z')" ); }); }); 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_details/slo_details.test.tsx b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx index 4f938a809a82d..f31d36c822264 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx @@ -252,7 +252,6 @@ describe('SLO Details Page', () => { settings, updatedAt, instanceId, - version, ...newSlo } = slo; 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/plugin.mock.tsx b/x-pack/plugins/observability/public/plugin.mock.tsx index 9732f67aac35f..6710b12dd6ca1 100644 --- a/x-pack/plugins/observability/public/plugin.mock.tsx +++ b/x-pack/plugins/observability/public/plugin.mock.tsx @@ -12,6 +12,7 @@ import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { contentManagementMock } from '@kbn/content-management-plugin/public/mocks'; import { sharePluginMock } from '@kbn/share-plugin/public/mocks'; import { unifiedSearchPluginMock } from '@kbn/unified-search-plugin/public/mocks'; +import { lensPluginMock } from '@kbn/lens-plugin/public/mocks'; const triggersActionsUiStartMock = { createStart() { @@ -103,7 +104,7 @@ export const observabilityPublicPluginsStartMock = { dataViewEditor: dataViewEditor.createStart(), dataViews: dataViews.createStart(), discover: null, - lens: null, + lens: lensPluginMock.createStartContract(), share: sharePluginMock.createStartContract(), triggersActionsUi: triggersActionsUiStartMock.createStart(), unifiedSearch: unifiedSearchPluginMock.createStartContract(), diff --git a/x-pack/plugins/observability/server/assets/component_templates/slo_mappings_template.ts b/x-pack/plugins/observability/server/assets/component_templates/slo_mappings_template.ts index 0da5408df6955..71896e2593f0a 100644 --- a/x-pack/plugins/observability/server/assets/component_templates/slo_mappings_template.ts +++ b/x-pack/plugins/observability/server/assets/component_templates/slo_mappings_template.ts @@ -12,14 +12,6 @@ export const getSLOMappingsTemplate = (name: string) => ({ template: { mappings: { properties: { - event: { - properties: { - ingested: { - type: 'date', - format: 'strict_date_optional_time', - }, - }, - }, '@timestamp': { type: 'date', format: 'date_optional_time||epoch_millis', @@ -58,10 +50,34 @@ export const getSLOMappingsTemplate = (name: string) => ({ revision: { type: 'long', }, + groupBy: { + type: 'keyword', + ignore_above: 256, + }, instanceId: { type: 'keyword', ignore_above: 256, }, + name: { + type: 'keyword', + ignore_above: 256, + }, + description: { + type: 'keyword', + ignore_above: 256, + }, + tags: { + type: 'keyword', + ignore_above: 256, + }, + indicator: { + properties: { + type: { + type: 'keyword', + ignore_above: 256, + }, + }, + }, objective: { properties: { target: { diff --git a/x-pack/plugins/observability/server/assets/component_templates/slo_summary_mappings_template.ts b/x-pack/plugins/observability/server/assets/component_templates/slo_summary_mappings_template.ts index bfdbe3b331125..fa8e803631181 100644 --- a/x-pack/plugins/observability/server/assets/component_templates/slo_summary_mappings_template.ts +++ b/x-pack/plugins/observability/server/assets/component_templates/slo_summary_mappings_template.ts @@ -55,10 +55,12 @@ export const getSLOSummaryMappingsTemplate = (name: string) => ({ ignore_above: 256, }, name: { - type: 'text', + type: 'keyword', + ignore_above: 256, }, description: { - type: 'text', + type: 'keyword', + ignore_above: 256, }, tags: { type: 'keyword', @@ -118,14 +120,6 @@ export const getSLOSummaryMappingsTemplate = (name: string) => ({ isTempDoc: { type: 'boolean', }, - latestSliTimestamp: { - type: 'date', - format: 'date_optional_time||epoch_millis', - }, - summaryUpdatedAt: { - type: 'date', - format: 'date_optional_time||epoch_millis', - }, }, }, }, diff --git a/x-pack/plugins/observability/server/assets/constants.ts b/x-pack/plugins/observability/server/assets/constants.ts index 5e1bedac6a6a6..0dd9df915eee4 100644 --- a/x-pack/plugins/observability/server/assets/constants.ts +++ b/x-pack/plugins/observability/server/assets/constants.ts @@ -5,9 +5,8 @@ * 2.0. */ -export const SLO_MODEL_VERSION = 2; -export const SLO_RESOURCES_VERSION = 3; -export const SLO_SUMMARY_TRANSFORMS_VERSION = 4; +export const SLO_RESOURCES_VERSION = 2; +export const SLO_SUMMARY_TRANSFORMS_VERSION = 3; export const SLO_COMPONENT_TEMPLATE_MAPPINGS_NAME = '.slo-observability.sli-mappings'; export const SLO_COMPONENT_TEMPLATE_SETTINGS_NAME = '.slo-observability.sli-settings'; @@ -33,7 +32,6 @@ export const SLO_SUMMARY_TEMP_INDEX_NAME = `.slo-observability.summary-v${SLO_RE export const SLO_SUMMARY_DESTINATION_INDEX_PATTERN = `.slo-observability.summary-v${SLO_RESOURCES_VERSION}*`; // include temp and non-temp summary indices export const SLO_SUMMARY_INGEST_PIPELINE_NAME = `.slo-observability.summary.pipeline`; -export const SLO_SUMMARY_ENRICH_POLICY_NAME = `slo-observability.summary.enrich_policy`; export const getSLOTransformId = (sloId: string, sloRevision: number) => `slo-${sloId}-${sloRevision}`; diff --git a/x-pack/plugins/observability/server/assets/enrich_policies/slo_summary_enrich_policy.ts b/x-pack/plugins/observability/server/assets/enrich_policies/slo_summary_enrich_policy.ts deleted file mode 100644 index fc089f8259f7d..0000000000000 --- a/x-pack/plugins/observability/server/assets/enrich_policies/slo_summary_enrich_policy.ts +++ /dev/null @@ -1,39 +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 { SO_SLO_TYPE } from '../../saved_objects'; -import { SLO_SUMMARY_ENRICH_POLICY_NAME } from '../constants'; - -export const getSLOSummaryEnrichPolicy = () => ({ - name: SLO_SUMMARY_ENRICH_POLICY_NAME, - match: { - indices: '.kibana', - match_field: 'slo.id', - enrich_fields: [ - 'slo.name', - 'slo.description', - 'slo.tags', - 'slo.indicator.type', - 'slo.objective.target', - 'slo.budgetingMethod', - 'slo.timeWindow.type', - 'slo.timeWindow.duration', - 'slo.groupBy', - ], - query: { - bool: { - filter: [ - { - match_phrase: { - type: SO_SLO_TYPE, - }, - }, - ], - }, - }, - }, -}); diff --git a/x-pack/plugins/observability/server/assets/ingest_templates/slo_pipeline_template.ts b/x-pack/plugins/observability/server/assets/ingest_templates/slo_pipeline_template.ts index e803a8011e2ea..eafa7399a7c35 100644 --- a/x-pack/plugins/observability/server/assets/ingest_templates/slo_pipeline_template.ts +++ b/x-pack/plugins/observability/server/assets/ingest_templates/slo_pipeline_template.ts @@ -5,48 +5,12 @@ * 2.0. */ -import { SLO_RESOURCES_VERSION, SLO_SUMMARY_ENRICH_POLICY_NAME } from '../constants'; +import { SLO_RESOURCES_VERSION } from '../constants'; export const getSLOPipelineTemplate = (id: string, indexNamePrefix: string) => ({ id, description: 'Monthly date-time index naming for SLO data', processors: [ - { - enrich: { - field: 'slo.id', - policy_name: SLO_SUMMARY_ENRICH_POLICY_NAME, - target_field: '_enrich', - }, - }, - { - set: { - field: 'slo.timeWindow', - copy_from: '_enrich.slo.timeWindow', - }, - }, - { - set: { - field: 'slo.budgetingMethod', - copy_from: '_enrich.slo.budgetingMethod', - }, - }, - { - set: { - field: 'slo.objective.target', - copy_from: '_enrich.slo.objective.target', - }, - }, - { - remove: { - field: '_enrich', - }, - }, - { - set: { - field: 'event.ingested', - value: '{{{_ingest.timestamp}}}', - }, - }, { date_index_name: { field: '@timestamp', diff --git a/x-pack/plugins/observability/server/assets/ingest_templates/slo_summary_pipeline_template.ts b/x-pack/plugins/observability/server/assets/ingest_templates/slo_summary_pipeline_template.ts index ccdcb24e61c13..d3c8e04b93730 100644 --- a/x-pack/plugins/observability/server/assets/ingest_templates/slo_summary_pipeline_template.ts +++ b/x-pack/plugins/observability/server/assets/ingest_templates/slo_summary_pipeline_template.ts @@ -5,12 +5,19 @@ * 2.0. */ -import { SLO_RESOURCES_VERSION, SLO_SUMMARY_ENRICH_POLICY_NAME } from '../constants'; +import { SLO_RESOURCES_VERSION } from '../constants'; export const getSLOSummaryPipelineTemplate = (id: string) => ({ id, description: 'SLO summary ingest pipeline', processors: [ + { + split: { + description: 'Split comma separated list of tags into an array', + field: 'slo.tags', + separator: ',', + }, + }, { set: { description: "if 'statusCode == 0', set status to NO_DATA", @@ -43,72 +50,6 @@ export const getSLOSummaryPipelineTemplate = (id: string) => ({ value: 'HEALTHY', }, }, - { - enrich: { - field: 'slo.id', - policy_name: SLO_SUMMARY_ENRICH_POLICY_NAME, - target_field: '_enrich', - }, - }, - { - set: { - field: 'slo.name', - copy_from: '_enrich.slo.name', - }, - }, - { - set: { - field: 'slo.description', - copy_from: '_enrich.slo.description', - }, - }, - { - set: { - field: 'slo.indicator', - copy_from: '_enrich.slo.indicator', - }, - }, - { - set: { - field: 'slo.timeWindow', - copy_from: '_enrich.slo.timeWindow', - }, - }, - { - set: { - field: 'slo.groupBy', - copy_from: '_enrich.slo.groupBy', - }, - }, - { - set: { - field: 'slo.tags', - copy_from: '_enrich.slo.tags', - }, - }, - { - set: { - field: 'slo.objective', - copy_from: '_enrich.slo.objective', - }, - }, - { - set: { - field: 'slo.budgetingMethod', - copy_from: '_enrich.slo.budgetingMethod', - }, - }, - { - remove: { - field: '_enrich', - }, - }, - { - set: { - field: 'summaryUpdatedAt', - value: '{{{_ingest.timestamp}}}', - }, - }, ], _meta: { description: 'SLO summary ingest pipeline', diff --git a/x-pack/plugins/observability/server/routes/slo/route.ts b/x-pack/plugins/observability/server/routes/slo/route.ts index d3bab20c436c3..ade3f1714ddfb 100644 --- a/x-pack/plugins/observability/server/routes/slo/route.ts +++ b/x-pack/plugins/observability/server/routes/slo/route.ts @@ -19,7 +19,6 @@ import { getSLOInstancesParamsSchema, getSLOParamsSchema, manageSLOParamsSchema, - resetSLOParamsSchema, updateSLOParamsSchema, } from '@kbn/slo-schema'; import type { IndicatorTypes } from '../../domain/models'; @@ -42,7 +41,6 @@ import { GetPreviewData } from '../../services/slo/get_preview_data'; import { GetSLOInstances } from '../../services/slo/get_slo_instances'; import { DefaultHistoricalSummaryClient } from '../../services/slo/historical_summary_client'; import { ManageSLO } from '../../services/slo/manage_slo'; -import { ResetSLO } from '../../services/slo/reset_slo'; import { DefaultSummarySearchClient } from '../../services/slo/summary_search_client'; import { ApmTransactionDurationTransformGenerator, @@ -50,8 +48,8 @@ import { HistogramTransformGenerator, KQLCustomTransformGenerator, MetricCustomTransformGenerator, - TimesliceMetricTransformGenerator, TransformGenerator, + TimesliceMetricTransformGenerator, } from '../../services/slo/transform_generators'; import type { ObservabilityRequestHandlerContext } from '../../types'; import { createObservabilityServerRoute } from '../create_observability_server_route'; @@ -85,11 +83,10 @@ const createSLORoute = createObservabilityServerRoute({ await assertPlatinumLicense(context); const esClient = (await context.core).elasticsearch.client.asCurrentUser; - const systemEsClient = (await context.core).elasticsearch.client.asInternalUser; const soClient = (await context.core).savedObjects.client; const repository = new KibanaSavedObjectsSLORepository(soClient); const transformManager = new DefaultTransformManager(transformGenerators, esClient, logger); - const createSLO = new CreateSLO(esClient, systemEsClient, repository, transformManager); + const createSLO = new CreateSLO(esClient, repository, transformManager); const response = await createSLO.execute(params.body); @@ -108,12 +105,11 @@ const updateSLORoute = createObservabilityServerRoute({ await assertPlatinumLicense(context); const esClient = (await context.core).elasticsearch.client.asCurrentUser; - const systemEsClient = (await context.core).elasticsearch.client.asInternalUser; const soClient = (await context.core).savedObjects.client; const repository = new KibanaSavedObjectsSLORepository(soClient); const transformManager = new DefaultTransformManager(transformGenerators, esClient, logger); - const updateSLO = new UpdateSLO(repository, transformManager, esClient, systemEsClient); + const updateSLO = new UpdateSLO(repository, transformManager, esClient); const response = await updateSLO.execute(params.path.id, params.body); @@ -138,20 +134,13 @@ const deleteSLORoute = createObservabilityServerRoute({ await assertPlatinumLicense(context); const esClient = (await context.core).elasticsearch.client.asCurrentUser; - const systemEsClient = (await context.core).elasticsearch.client.asInternalUser; const soClient = (await context.core).savedObjects.client; const rulesClient = getRulesClientWithRequest(request); const repository = new KibanaSavedObjectsSLORepository(soClient); const transformManager = new DefaultTransformManager(transformGenerators, esClient, logger); - const deleteSLO = new DeleteSLO( - repository, - transformManager, - esClient, - rulesClient, - systemEsClient - ); + const deleteSLO = new DeleteSLO(repository, transformManager, esClient, rulesClient); await deleteSLO.execute(params.path.id); }, @@ -225,29 +214,6 @@ const disableSLORoute = createObservabilityServerRoute({ }, }); -const resetSLORoute = createObservabilityServerRoute({ - endpoint: 'POST /api/observability/slos/{id}/_reset 2023-10-31', - options: { - tags: ['access:slo_write'], - access: 'public', - }, - params: resetSLOParamsSchema, - handler: async ({ context, params, logger }) => { - await assertPlatinumLicense(context); - - const soClient = (await context.core).savedObjects.client; - const esClient = (await context.core).elasticsearch.client.asCurrentUser; - - const repository = new KibanaSavedObjectsSLORepository(soClient); - const transformManager = new DefaultTransformManager(transformGenerators, esClient, logger); - const resetSLO = new ResetSLO(esClient, repository, transformManager); - - const response = await resetSLO.execute(params.path.id); - - return response; - }, -}); - const findSLORoute = createObservabilityServerRoute({ endpoint: 'GET /api/observability/slos 2023-10-31', options: { @@ -287,9 +253,10 @@ const deleteSloInstancesRoute = createObservabilityServerRoute({ }); const findSloDefinitionsRoute = createObservabilityServerRoute({ - endpoint: 'GET /api/observability/slos/_definitions 2023-10-31', + endpoint: 'GET /internal/observability/slos/_definitions', options: { tags: ['access:slo_read'], + access: 'internal', }, params: findSloDefinitionsParamsSchema, handler: async ({ context, params }) => { @@ -299,7 +266,7 @@ const findSloDefinitionsRoute = createObservabilityServerRoute({ const repository = new KibanaSavedObjectsSLORepository(soClient); const findSloDefinitions = new FindSLODefinitions(repository); - const response = await findSloDefinitions.execute(params?.query ?? {}); + const response = await findSloDefinitions.execute(params.query.search); return response; }, @@ -428,5 +395,4 @@ export const sloRouteRepository = { ...getSloBurnRates, ...getPreviewData, ...getSLOInstancesRoute, - ...resetSLORoute, }; diff --git a/x-pack/plugins/observability/server/saved_objects/slo.ts b/x-pack/plugins/observability/server/saved_objects/slo.ts index 058596e160fd7..41cb509d83755 100644 --- a/x-pack/plugins/observability/server/saved_objects/slo.ts +++ b/x-pack/plugins/observability/server/saved_objects/slo.ts @@ -17,6 +17,7 @@ type StoredSLOBefore890 = StoredSLO & { isCalendar?: boolean; }; }; + const migrateSlo890: SavedObjectMigrationFn = (doc) => { const { timeWindow, ...other } = doc.attributes; return { @@ -37,21 +38,6 @@ export const slo: SavedObjectsType = { name: SO_SLO_TYPE, hidden: false, namespaceType: 'multiple-isolated', - switchToModelVersionAt: '8.10.0', - modelVersions: { - 1: { - changes: [ - { type: 'mappings_addition', addedMappings: { version: { type: 'long' } } }, - { - type: 'data_backfill', - backfillFn: (doc) => { - // we explicitely set the version to 1, so we know which SLOs requires a migration to the following version. - return { attributes: { version: doc.attributes.version ?? 1 } }; - }, - }, - ], - }, - }, mappings: { dynamic: false, properties: { @@ -67,7 +53,6 @@ export const slo: SavedObjectsType = { budgetingMethod: { type: 'keyword' }, enabled: { type: 'boolean' }, tags: { type: 'keyword' }, - version: { type: 'long' }, }, }, management: { diff --git a/x-pack/plugins/observability/server/services/slo/__snapshots__/create_slo.test.ts.snap b/x-pack/plugins/observability/server/services/slo/__snapshots__/create_slo.test.ts.snap index c9e32e24f698c..e66f1f8124a11 100644 --- a/x-pack/plugins/observability/server/services/slo/__snapshots__/create_slo.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/__snapshots__/create_slo.test.ts.snap @@ -41,16 +41,8 @@ Array [ }, }, "id": "slo-unique-id", - "index": ".slo-observability.summary-v3.temp", + "index": ".slo-observability.summary-v2.temp", "refresh": true, }, ] `; - -exports[`CreateSLO happy path calls the expected services 2`] = ` -Array [ - Object { - "name": "slo-observability.summary.enrich_policy", - }, -] -`; diff --git a/x-pack/plugins/observability/server/services/slo/__snapshots__/get_slo_instances.test.ts.snap b/x-pack/plugins/observability/server/services/slo/__snapshots__/get_slo_instances.test.ts.snap index 8ad9792a22b24..be3b681db0af8 100644 --- a/x-pack/plugins/observability/server/services/slo/__snapshots__/get_slo_instances.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/__snapshots__/get_slo_instances.test.ts.snap @@ -11,7 +11,7 @@ Array [ }, }, }, - "index": ".slo-observability.sli-v3*", + "index": ".slo-observability.sli-v2*", "query": Object { "bool": Object { "filter": Array [ diff --git a/x-pack/plugins/observability/server/services/slo/__snapshots__/summary_search_client.test.ts.snap b/x-pack/plugins/observability/server/services/slo/__snapshots__/summary_search_client.test.ts.snap index daf5e47a0a66c..ea94e840aac0e 100644 --- a/x-pack/plugins/observability/server/services/slo/__snapshots__/summary_search_client.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/__snapshots__/summary_search_client.test.ts.snap @@ -3,7 +3,7 @@ exports[`Summary Search Client returns the summary documents without duplicate temporary summary documents 1`] = ` Array [ Object { - "index": ".slo-observability.summary-v3*", + "index": ".slo-observability.summary-v2*", "query": Object { "bool": Object { "filter": Array [ diff --git a/x-pack/plugins/observability/server/services/slo/__snapshots__/update_slo.test.ts.snap b/x-pack/plugins/observability/server/services/slo/__snapshots__/update_slo.test.ts.snap index 79e676bc13f51..ae7a966951f7c 100644 --- a/x-pack/plugins/observability/server/services/slo/__snapshots__/update_slo.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/__snapshots__/update_slo.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`UpdateSLO when the revision bumps indexes a temporary summary document 1`] = ` +exports[`UpdateSLO index a temporary summary document 1`] = ` Array [ Object { "document": Object { @@ -44,7 +44,7 @@ Array [ }, }, "id": "slo-unique-id", - "index": ".slo-observability.summary-v3.temp", + "index": ".slo-observability.summary-v2.temp", "refresh": true, }, ] diff --git a/x-pack/plugins/observability/server/services/slo/create_slo.test.ts b/x-pack/plugins/observability/server/services/slo/create_slo.test.ts index 504fa85b82aa1..bd34d652e5fa4 100644 --- a/x-pack/plugins/observability/server/services/slo/create_slo.test.ts +++ b/x-pack/plugins/observability/server/services/slo/create_slo.test.ts @@ -15,22 +15,15 @@ import { TransformManager } from './transform_manager'; describe('CreateSLO', () => { let esClientMock: ElasticsearchClientMock; - let esSystemClientMock: ElasticsearchClientMock; let mockRepository: jest.Mocked; let mockTransformManager: jest.Mocked; let createSLO: CreateSLO; beforeEach(() => { esClientMock = elasticsearchServiceMock.createElasticsearchClient(); - esSystemClientMock = elasticsearchServiceMock.createElasticsearchClient(); mockRepository = createSLORepositoryMock(); mockTransformManager = createTransformManagerMock(); - createSLO = new CreateSLO( - esClientMock, - esSystemClientMock, - mockRepository, - mockTransformManager - ); + createSLO = new CreateSLO(esClientMock, mockRepository, mockTransformManager); }); describe('happy path', () => { @@ -66,7 +59,6 @@ describe('CreateSLO', () => { expect(mockTransformManager.start).toHaveBeenCalledWith('slo-transform-id'); expect(response).toEqual(expect.objectContaining({ id: 'unique-id' })); expect(esClientMock.index.mock.calls[0]).toMatchSnapshot(); - expect(esSystemClientMock.enrich.executePolicy.mock.calls[0]).toMatchSnapshot(); }); it('overrides the default values when provided', async () => { diff --git a/x-pack/plugins/observability/server/services/slo/create_slo.ts b/x-pack/plugins/observability/server/services/slo/create_slo.ts index 659b04adb5629..51c3fbec71dc8 100644 --- a/x-pack/plugins/observability/server/services/slo/create_slo.ts +++ b/x-pack/plugins/observability/server/services/slo/create_slo.ts @@ -8,11 +8,7 @@ import { ElasticsearchClient } from '@kbn/core/server'; import { ALL_VALUE, CreateSLOParams, CreateSLOResponse } from '@kbn/slo-schema'; import { v4 as uuidv4 } from 'uuid'; -import { - SLO_MODEL_VERSION, - SLO_SUMMARY_ENRICH_POLICY_NAME, - SLO_SUMMARY_TEMP_INDEX_NAME, -} from '../../assets/constants'; +import { SLO_SUMMARY_TEMP_INDEX_NAME } from '../../assets/constants'; import { Duration, DurationUnit, SLO } from '../../domain/models'; import { validateSLO } from '../../domain/services'; import { SLORepository } from './slo_repository'; @@ -22,7 +18,6 @@ import { TransformManager } from './transform_manager'; export class CreateSLO { constructor( private esClient: ElasticsearchClient, - private systemClient: ElasticsearchClient, private repository: SLORepository, private transformManager: TransformManager ) {} @@ -59,8 +54,6 @@ export class CreateSLO { refresh: true, }); - await this.systemClient.enrich.executePolicy({ name: SLO_SUMMARY_ENRICH_POLICY_NAME }); - return this.toResponse(slo); } @@ -79,7 +72,6 @@ export class CreateSLO { createdAt: now, updatedAt: now, groupBy: !!params.groupBy ? params.groupBy : ALL_VALUE, - version: SLO_MODEL_VERSION, }; } diff --git a/x-pack/plugins/observability/server/services/slo/delete_slo.test.ts b/x-pack/plugins/observability/server/services/slo/delete_slo.test.ts index d1f9342c32ba6..a136945edcd2c 100644 --- a/x-pack/plugins/observability/server/services/slo/delete_slo.test.ts +++ b/x-pack/plugins/observability/server/services/slo/delete_slo.test.ts @@ -24,7 +24,6 @@ describe('DeleteSLO', () => { let mockRepository: jest.Mocked; let mockTransformManager: jest.Mocked; let mockEsClient: jest.Mocked; - let mockSystemEsClient: jest.Mocked; let mockRulesClient: jest.Mocked; let deleteSLO: DeleteSLO; @@ -32,15 +31,8 @@ describe('DeleteSLO', () => { mockRepository = createSLORepositoryMock(); mockTransformManager = createTransformManagerMock(); mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); - mockSystemEsClient = elasticsearchServiceMock.createElasticsearchClient(); mockRulesClient = rulesClientMock.create(); - deleteSLO = new DeleteSLO( - mockRepository, - mockTransformManager, - mockEsClient, - mockRulesClient, - mockSystemEsClient - ); + deleteSLO = new DeleteSLO(mockRepository, mockTransformManager, mockEsClient, mockRulesClient); }); describe('happy path', () => { @@ -80,7 +72,6 @@ describe('DeleteSLO', () => { }, }) ); - expect(mockSystemEsClient.enrich.executePolicy).toHaveBeenCalled(); expect(mockRulesClient.bulkDeleteRules).toHaveBeenCalledWith({ filter: `alert.attributes.params.sloId:${slo.id}`, }); diff --git a/x-pack/plugins/observability/server/services/slo/delete_slo.ts b/x-pack/plugins/observability/server/services/slo/delete_slo.ts index 6df784cd19f4c..de908ceac7842 100644 --- a/x-pack/plugins/observability/server/services/slo/delete_slo.ts +++ b/x-pack/plugins/observability/server/services/slo/delete_slo.ts @@ -11,7 +11,6 @@ import { getSLOTransformId, SLO_DESTINATION_INDEX_PATTERN, SLO_SUMMARY_DESTINATION_INDEX_PATTERN, - SLO_SUMMARY_ENRICH_POLICY_NAME, } from '../../assets/constants'; import { SLORepository } from './slo_repository'; import { TransformManager } from './transform_manager'; @@ -21,8 +20,7 @@ export class DeleteSLO { private repository: SLORepository, private transformManager: TransformManager, private esClient: ElasticsearchClient, - private rulesClient: RulesClientApi, - private systemClient: ElasticsearchClient + private rulesClient: RulesClientApi ) {} public async execute(sloId: string): Promise { @@ -36,7 +34,6 @@ export class DeleteSLO { await this.deleteSummaryData(slo.id); await this.deleteAssociatedRules(slo.id); await this.repository.deleteById(slo.id); - await this.systemClient.enrich.executePolicy({ name: SLO_SUMMARY_ENRICH_POLICY_NAME }); } private async deleteRollupData(sloId: string): Promise { diff --git a/x-pack/plugins/observability/server/services/slo/delete_slo_instances.test.ts b/x-pack/plugins/observability/server/services/slo/delete_slo_instances.test.ts index ca4eac790bd04..8a9c64a6b441c 100644 --- a/x-pack/plugins/observability/server/services/slo/delete_slo_instances.test.ts +++ b/x-pack/plugins/observability/server/services/slo/delete_slo_instances.test.ts @@ -43,7 +43,7 @@ describe('DeleteSLOInstances', () => { expect(mockEsClient.deleteByQuery).toHaveBeenCalledTimes(2); expect(mockEsClient.deleteByQuery.mock.calls[0][0]).toMatchInlineSnapshot(` Object { - "index": ".slo-observability.sli-v3*", + "index": ".slo-observability.sli-v2*", "query": Object { "bool": Object { "should": Array [ @@ -103,7 +103,7 @@ describe('DeleteSLOInstances', () => { `); expect(mockEsClient.deleteByQuery.mock.calls[1][0]).toMatchInlineSnapshot(` Object { - "index": ".slo-observability.summary-v3*", + "index": ".slo-observability.summary-v2*", "query": Object { "bool": Object { "should": Array [ diff --git a/x-pack/plugins/observability/server/services/slo/find_slo.test.ts b/x-pack/plugins/observability/server/services/slo/find_slo.test.ts index 93319e4e53fd1..10436bc0fad54 100644 --- a/x-pack/plugins/observability/server/services/slo/find_slo.test.ts +++ b/x-pack/plugins/observability/server/services/slo/find_slo.test.ts @@ -5,14 +5,13 @@ * 2.0. */ -import { ALL_VALUE, Paginated } from '@kbn/slo-schema'; -import { SLO_MODEL_VERSION } from '../../assets/constants'; +import { ALL_VALUE } from '@kbn/slo-schema'; import { SLO } from '../../domain/models'; import { FindSLO } from './find_slo'; import { createSLO } from './fixtures/slo'; import { createSLORepositoryMock, createSummarySearchClientMock } from './mocks'; import { SLORepository } from './slo_repository'; -import { SLOSummary, SummarySearchClient } from './summary_search_client'; +import { Paginated, SLOSummary, SummarySearchClient } from './summary_search_client'; describe('FindSLO', () => { let mockRepository: jest.Mocked; @@ -96,7 +95,6 @@ describe('FindSLO', () => { revision: slo.revision, groupBy: slo.groupBy, instanceId: ALL_VALUE, - version: SLO_MODEL_VERSION, }, ], }); diff --git a/x-pack/plugins/observability/server/services/slo/find_slo.ts b/x-pack/plugins/observability/server/services/slo/find_slo.ts index 6237b6e48832b..cf8150db3e627 100644 --- a/x-pack/plugins/observability/server/services/slo/find_slo.ts +++ b/x-pack/plugins/observability/server/services/slo/find_slo.ts @@ -5,11 +5,11 @@ * 2.0. */ -import { FindSLOParams, FindSLOResponse, findSLOResponseSchema, Pagination } from '@kbn/slo-schema'; +import { FindSLOParams, FindSLOResponse, findSLOResponseSchema } from '@kbn/slo-schema'; import { SLO, SLOWithSummary } from '../../domain/models'; import { IllegalArgumentError } from '../../errors'; import { SLORepository } from './slo_repository'; -import { SLOSummary, Sort, SummarySearchClient } from './summary_search_client'; +import { Pagination, SLOSummary, Sort, SummarySearchClient } from './summary_search_client'; const DEFAULT_PAGE = 1; const DEFAULT_PER_PAGE = 25; @@ -55,7 +55,7 @@ function toPagination(params: FindSLOParams): Pagination { const perPage = Number(params.perPage); if (!isNaN(perPage) && perPage > MAX_PER_PAGE) { - throw new IllegalArgumentError(`perPage limit to ${MAX_PER_PAGE}`); + throw new IllegalArgumentError('perPage limit to 5000'); } return { diff --git a/x-pack/plugins/observability/server/services/slo/find_slo_definitions.ts b/x-pack/plugins/observability/server/services/slo/find_slo_definitions.ts index a9a4b8bf61752..157e5b4be5696 100644 --- a/x-pack/plugins/observability/server/services/slo/find_slo_definitions.ts +++ b/x-pack/plugins/observability/server/services/slo/find_slo_definitions.ts @@ -5,40 +5,14 @@ * 2.0. */ -import { - FindSLODefinitionsParams, - FindSLODefinitionsResponse, - findSloDefinitionsResponseSchema, - Pagination, -} from '@kbn/slo-schema'; -import { IllegalArgumentError } from '../../errors'; +import { FindSloDefinitionsResponse, findSloDefinitionsResponseSchema } from '@kbn/slo-schema'; import { SLORepository } from './slo_repository'; -const MAX_PER_PAGE = 1000; -const DEFAULT_PER_PAGE = 100; -const DEFAULT_PAGE = 1; - export class FindSLODefinitions { constructor(private repository: SLORepository) {} - public async execute(params: FindSLODefinitionsParams): Promise { - const result = await this.repository.search(params.search ?? '', toPagination(params), { - includeOutdatedOnly: params.includeOutdatedOnly === true ? true : false, - }); - return findSloDefinitionsResponseSchema.encode(result); - } -} - -function toPagination(params: FindSLODefinitionsParams): Pagination { - const page = Number(params.page); - const perPage = Number(params.perPage); - - if (!isNaN(perPage) && perPage > MAX_PER_PAGE) { - throw new IllegalArgumentError(`perPage limit to ${MAX_PER_PAGE}`); + public async execute(search: string): Promise { + const sloList = await this.repository.search(search); + return findSloDefinitionsResponseSchema.encode(sloList); } - - return { - page: !isNaN(page) && page >= 1 ? page : DEFAULT_PAGE, - perPage: !isNaN(perPage) && perPage >= 1 ? perPage : DEFAULT_PER_PAGE, - }; } diff --git a/x-pack/plugins/observability/server/services/slo/fixtures/slo.ts b/x-pack/plugins/observability/server/services/slo/fixtures/slo.ts index 146900f646791..2bd320cbb8d65 100644 --- a/x-pack/plugins/observability/server/services/slo/fixtures/slo.ts +++ b/x-pack/plugins/observability/server/services/slo/fixtures/slo.ts @@ -15,7 +15,6 @@ import { } from '@kbn/slo-schema'; import { cloneDeep } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import { SLO_MODEL_VERSION } from '../../../assets/constants'; import { APMTransactionDurationIndicator, APMTransactionErrorRateIndicator, @@ -140,7 +139,7 @@ export const createHistogramIndicator = ( }, }); -const defaultSLO: Omit = { +const defaultSLO: Omit = { name: 'irrelevant', description: 'irrelevant', timeWindow: sevenDaysRolling(), @@ -191,7 +190,6 @@ export const createSLO = (params: Partial = {}): SLO => { revision: 1, createdAt: now, updatedAt: now, - version: SLO_MODEL_VERSION, ...params, }); }; 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/server/services/slo/get_slo.test.ts b/x-pack/plugins/observability/server/services/slo/get_slo.test.ts index 148db2479970e..1a5efccc9eb2a 100644 --- a/x-pack/plugins/observability/server/services/slo/get_slo.test.ts +++ b/x-pack/plugins/observability/server/services/slo/get_slo.test.ts @@ -6,7 +6,6 @@ */ import { ALL_VALUE } from '@kbn/slo-schema'; -import { SLO_MODEL_VERSION } from '../../assets/constants'; import { createAPMTransactionErrorRateIndicator, createSLO } from './fixtures/slo'; import { GetSLO } from './get_slo'; import { createSummaryClientMock, createSLORepositoryMock } from './mocks'; @@ -85,7 +84,6 @@ describe('GetSLO', () => { revision: slo.revision, groupBy: slo.groupBy, instanceId: ALL_VALUE, - version: SLO_MODEL_VERSION, }); }); }); diff --git a/x-pack/plugins/observability/server/services/slo/reset_slo.test.ts b/x-pack/plugins/observability/server/services/slo/reset_slo.test.ts deleted file mode 100644 index 9b10bd944666b..0000000000000 --- a/x-pack/plugins/observability/server/services/slo/reset_slo.test.ts +++ /dev/null @@ -1,80 +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 { ElasticsearchClient } from '@kbn/core/server'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -import { - getSLOTransformId, - SLO_DESTINATION_INDEX_PATTERN, - SLO_MODEL_VERSION, - SLO_SUMMARY_DESTINATION_INDEX_PATTERN, -} from '../../assets/constants'; -import { createSLO } from './fixtures/slo'; -import { createSLORepositoryMock, createTransformManagerMock } from './mocks'; -import { ResetSLO } from './reset_slo'; -import { SLORepository } from './slo_repository'; -import { TransformManager } from './transform_manager'; - -describe('ResetSLO', () => { - let mockRepository: jest.Mocked; - let mockTransformManager: jest.Mocked; - let mockEsClient: jest.Mocked; - let resetSLO: ResetSLO; - - beforeEach(() => { - mockRepository = createSLORepositoryMock(); - mockTransformManager = createTransformManagerMock(); - mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); - resetSLO = new ResetSLO(mockEsClient, mockRepository, mockTransformManager); - }); - - it('resets the SLO', async () => { - const slo = createSLO({ version: 1 }); - mockRepository.findById.mockResolvedValueOnce(slo); - mockRepository.save.mockImplementation((v) => Promise.resolve(v)); - - await resetSLO.execute(slo.id); - - const transformId = getSLOTransformId(slo.id, slo.revision); - expect(mockTransformManager.stop).toBeCalledWith(transformId); - expect(mockTransformManager.uninstall).toBeCalledWith(transformId); - - expect(mockEsClient.deleteByQuery).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - index: SLO_DESTINATION_INDEX_PATTERN, - query: { - bool: { - filter: [{ term: { 'slo.id': slo.id } }], - }, - }, - }) - ); - expect(mockEsClient.deleteByQuery).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - index: SLO_SUMMARY_DESTINATION_INDEX_PATTERN, - query: { - bool: { - filter: [{ term: { 'slo.id': slo.id } }], - }, - }, - }) - ); - - expect(mockTransformManager.install).toBeCalledWith(slo); - expect(mockTransformManager.preview).toBeCalledWith(transformId); - expect(mockTransformManager.start).toBeCalledWith(transformId); - - expect(mockRepository.save).toHaveBeenCalledWith({ - ...slo, - version: SLO_MODEL_VERSION, - updatedAt: expect.anything(), - }); - }); -}); diff --git a/x-pack/plugins/observability/server/services/slo/reset_slo.ts b/x-pack/plugins/observability/server/services/slo/reset_slo.ts deleted file mode 100644 index e91bd68e8aa9e..0000000000000 --- a/x-pack/plugins/observability/server/services/slo/reset_slo.ts +++ /dev/null @@ -1,96 +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 { ElasticsearchClient } from '@kbn/core/server'; -import { resetSLOResponseSchema } from '@kbn/slo-schema'; -import { - getSLOTransformId, - SLO_DESTINATION_INDEX_PATTERN, - SLO_MODEL_VERSION, - SLO_SUMMARY_DESTINATION_INDEX_PATTERN, - SLO_SUMMARY_TEMP_INDEX_NAME, -} from '../../assets/constants'; -import { SLORepository } from './slo_repository'; -import { createTempSummaryDocument } from './summary_transform/helpers/create_temp_summary'; -import { TransformManager } from './transform_manager'; - -export class ResetSLO { - constructor( - private esClient: ElasticsearchClient, - private repository: SLORepository, - private transformManager: TransformManager - ) {} - - public async execute(sloId: string) { - const slo = await this.repository.findById(sloId); - - const transformId = getSLOTransformId(slo.id, slo.revision); - await this.transformManager.stop(transformId); - await this.transformManager.uninstall(transformId); - - await Promise.all([this.deleteRollupData(slo.id), this.deleteSummaryData(slo.id)]); - - await this.transformManager.install(slo); - - try { - await this.transformManager.preview(transformId); - await this.transformManager.start(transformId); - } catch (err) { - await this.transformManager.uninstall(transformId); - throw err; - } - - await this.esClient.index({ - index: SLO_SUMMARY_TEMP_INDEX_NAME, - id: `slo-${slo.id}`, - document: createTempSummaryDocument(slo), - refresh: true, - }); - - const updatedSlo = await this.repository.save( - Object.assign({ ...slo, version: SLO_MODEL_VERSION, updatedAt: new Date() }) - ); - - return resetSLOResponseSchema.encode(updatedSlo); - } - - /** - * Deleting all SLI rollup data matching the sloId. All revision will be deleted in case of - * residual documents. - * - * @param sloId - */ - private async deleteRollupData(sloId: string): Promise { - await this.esClient.deleteByQuery({ - index: SLO_DESTINATION_INDEX_PATTERN, - refresh: true, - query: { - bool: { - filter: [{ term: { 'slo.id': sloId } }], - }, - }, - }); - } - - /** - * Deleting the summary documents matching the sloId. All revision will be deleted in case of - * residual documents. - * - * @param sloId - */ - private async deleteSummaryData(sloId: string): Promise { - await this.esClient.deleteByQuery({ - index: SLO_SUMMARY_DESTINATION_INDEX_PATTERN, - refresh: true, - query: { - bool: { - filter: [{ term: { 'slo.id': sloId } }], - }, - }, - }); - } -} diff --git a/x-pack/plugins/observability/server/services/slo/resource_installer.test.ts b/x-pack/plugins/observability/server/services/slo/resource_installer.test.ts index 4182c0ee9b683..8337c85b5f156 100644 --- a/x-pack/plugins/observability/server/services/slo/resource_installer.test.ts +++ b/x-pack/plugins/observability/server/services/slo/resource_installer.test.ts @@ -14,20 +14,15 @@ import { SLO_INGEST_PIPELINE_NAME, SLO_SUMMARY_COMPONENT_TEMPLATE_MAPPINGS_NAME, SLO_SUMMARY_COMPONENT_TEMPLATE_SETTINGS_NAME, - SLO_SUMMARY_ENRICH_POLICY_NAME, SLO_SUMMARY_INDEX_TEMPLATE_NAME, SLO_SUMMARY_INGEST_PIPELINE_NAME, } from '../../assets/constants'; -import { getSLOSummaryEnrichPolicy } from '../../assets/enrich_policies/slo_summary_enrich_policy'; import { DefaultResourceInstaller } from './resource_installer'; describe('resourceInstaller', () => { it('installs the common resources', async () => { const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); mockClusterClient.indices.getIndexTemplate.mockResponseOnce({ index_templates: [] }); - mockClusterClient.enrich.getPolicy.mockResponseOnce({ - policies: [], - }); const installer = new DefaultResourceInstaller(mockClusterClient, loggerMock.create()); await installer.ensureCommonResourcesInstalled(); @@ -59,21 +54,6 @@ describe('resourceInstaller', () => { expect.objectContaining({ name: SLO_SUMMARY_INDEX_TEMPLATE_NAME }) ); - expect(mockClusterClient.enrich.getPolicy).toHaveBeenCalledTimes(1); - expect(mockClusterClient.enrich.getPolicy).toHaveBeenNthCalledWith(1, { - name: SLO_SUMMARY_ENRICH_POLICY_NAME, - }); - - expect(mockClusterClient.enrich.putPolicy).toHaveBeenCalledTimes(1); - expect(mockClusterClient.enrich.putPolicy).toHaveBeenNthCalledWith( - 1, - getSLOSummaryEnrichPolicy() - ); - expect(mockClusterClient.enrich.executePolicy).toHaveBeenCalledTimes(1); - expect(mockClusterClient.enrich.executePolicy).toHaveBeenNthCalledWith(1, { - name: SLO_SUMMARY_ENRICH_POLICY_NAME, - }); - expect(mockClusterClient.ingest.putPipeline).toHaveBeenCalledTimes(2); expect(mockClusterClient.ingest.putPipeline).toHaveBeenNthCalledWith( 1, @@ -84,34 +64,4 @@ describe('resourceInstaller', () => { expect.objectContaining({ id: SLO_SUMMARY_INGEST_PIPELINE_NAME }) ); }); - it('skips installing the enrich policy if it exists', async () => { - const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); - mockClusterClient.indices.getIndexTemplate.mockResponseOnce({ index_templates: [] }); - mockClusterClient.enrich.getPolicy.mockResponseOnce({ - policies: [ - { - config: { - // Sigh.... the Elasticsarch type for an enrich policy has defined the - // query as a string which is completely wrong, it's a QueryDSLContainer! - // - // See: https://github.com/elastic/elasticsearch-js/issues/2074 - match: { - ...getSLOSummaryEnrichPolicy().match, - name: SLO_SUMMARY_ENRICH_POLICY_NAME, - } as any, - }, - }, - ], - }); - const installer = new DefaultResourceInstaller(mockClusterClient, loggerMock.create()); - - await installer.ensureCommonResourcesInstalled(); - - expect(mockClusterClient.enrich.getPolicy).toHaveBeenCalledTimes(1); - expect(mockClusterClient.enrich.getPolicy).toHaveBeenNthCalledWith(1, { - name: SLO_SUMMARY_ENRICH_POLICY_NAME, - }); - expect(mockClusterClient.enrich.putPolicy).not.toHaveBeenCalled(); - expect(mockClusterClient.enrich.executePolicy).not.toHaveBeenCalled(); - }); }); diff --git a/x-pack/plugins/observability/server/services/slo/resource_installer.ts b/x-pack/plugins/observability/server/services/slo/resource_installer.ts index dfc0960dc7b90..4fc77ea2399c7 100644 --- a/x-pack/plugins/observability/server/services/slo/resource_installer.ts +++ b/x-pack/plugins/observability/server/services/slo/resource_installer.ts @@ -7,7 +7,6 @@ import type { ClusterPutComponentTemplateRequest, - EnrichPutPolicyRequest, IndicesPutIndexTemplateRequest, IngestPutPipelineRequest, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; @@ -32,7 +31,6 @@ import { SLO_SUMMARY_INGEST_PIPELINE_NAME, SLO_SUMMARY_TEMP_INDEX_NAME, } from '../../assets/constants'; -import { getSLOSummaryEnrichPolicy } from '../../assets/enrich_policies/slo_summary_enrich_policy'; import { getSLOIndexTemplate } from '../../assets/index_templates/slo_index_templates'; import { getSLOSummaryIndexTemplate } from '../../assets/index_templates/slo_summary_index_templates'; import { getSLOPipelineTemplate } from '../../assets/ingest_templates/slo_pipeline_template'; @@ -86,8 +84,6 @@ export class DefaultResourceInstaller implements ResourceInstaller { await this.createIndex(SLO_SUMMARY_DESTINATION_INDEX_NAME); await this.createIndex(SLO_SUMMARY_TEMP_INDEX_NAME); - await this.createOrUpdateEnrichPolicy(getSLOSummaryEnrichPolicy()); - await this.createOrUpdateIngestPipelineTemplate( getSLOPipelineTemplate(SLO_INGEST_PIPELINE_NAME, SLO_INGEST_PIPELINE_INDEX_NAME_PREFIX) ); @@ -116,20 +112,6 @@ export class DefaultResourceInstaller implements ResourceInstaller { return this.execute(() => this.esClient.ingest.putPipeline(template)); } - private async createOrUpdateEnrichPolicy(policy: EnrichPutPolicyRequest) { - return this.execute(async () => { - const existingPolicy = await this.esClient.enrich.getPolicy({ name: policy.name }); - if (existingPolicy.policies.some(({ config }) => config.match?.name === policy.name)) { - this.logger.info(`SLO summary erich policy [${policy.name}] already exists.`); - return; - } - this.logger.info(`Installing SLO summary erich policy [${policy.name}]`); - return this.esClient.enrich - .putPolicy(policy) - .then(() => this.esClient.enrich.executePolicy({ name: policy.name })); - }); - } - private async createIndex(indexName: string) { try { await this.execute(() => this.esClient.indices.create({ index: indexName })); diff --git a/x-pack/plugins/observability/server/services/slo/slo_repository.test.ts b/x-pack/plugins/observability/server/services/slo/slo_repository.test.ts index 6956867b31c18..4b61bff04ea6f 100644 --- a/x-pack/plugins/observability/server/services/slo/slo_repository.test.ts +++ b/x-pack/plugins/observability/server/services/slo/slo_repository.test.ts @@ -8,7 +8,6 @@ import { SavedObjectsClientContract, SavedObjectsFindResponse } from '@kbn/core/server'; import { savedObjectsClientMock } from '@kbn/core/server/mocks'; import { sloSchema } from '@kbn/slo-schema'; -import { SLO_MODEL_VERSION } from '../../assets/constants'; import { SLO, StoredSLO } from '../../domain/models'; import { SLOIdConflict, SLONotFound } from '../../errors'; import { SO_SLO_TYPE } from '../../saved_objects'; @@ -165,42 +164,19 @@ describe('KibanaSavedObjectsSLORepository', () => { expect(soClientMock.delete).toHaveBeenCalledWith(SO_SLO_TYPE, SOME_SLO.id); }); - describe('search', () => { - it('searches by name', async () => { - const repository = new KibanaSavedObjectsSLORepository(soClientMock); - soClientMock.find.mockResolvedValueOnce(soFindResponse([SOME_SLO, ANOTHER_SLO])); - - const results = await repository.search(SOME_SLO.name, { page: 1, perPage: 100 }); - - expect(results.results).toEqual([SOME_SLO, ANOTHER_SLO]); - expect(soClientMock.find).toHaveBeenCalledWith({ - type: SO_SLO_TYPE, - page: 1, - perPage: 100, - search: SOME_SLO.name, - searchFields: ['name'], - }); - }); - - it('searches only the outdated ones', async () => { - const repository = new KibanaSavedObjectsSLORepository(soClientMock); - soClientMock.find.mockResolvedValueOnce(soFindResponse([SOME_SLO, ANOTHER_SLO])); + it('searches by name', async () => { + const repository = new KibanaSavedObjectsSLORepository(soClientMock); + soClientMock.find.mockResolvedValueOnce(soFindResponse([SOME_SLO, ANOTHER_SLO])); - const results = await repository.search( - SOME_SLO.name, - { page: 1, perPage: 100 }, - { includeOutdatedOnly: true } - ); + const results = await repository.search(SOME_SLO.name); - expect(results.results).toEqual([SOME_SLO, ANOTHER_SLO]); - expect(soClientMock.find).toHaveBeenCalledWith({ - type: SO_SLO_TYPE, - page: 1, - perPage: 100, - search: SOME_SLO.name, - searchFields: ['name'], - filter: `slo.attributes.version < ${SLO_MODEL_VERSION}`, - }); + expect(results).toEqual([SOME_SLO, ANOTHER_SLO]); + expect(soClientMock.find).toHaveBeenCalledWith({ + type: SO_SLO_TYPE, + page: 1, + perPage: 25, + search: SOME_SLO.name, + searchFields: ['name'], }); }); }); diff --git a/x-pack/plugins/observability/server/services/slo/slo_repository.ts b/x-pack/plugins/observability/server/services/slo/slo_repository.ts index 80d0e6368b4c7..cc595ed0b0099 100644 --- a/x-pack/plugins/observability/server/services/slo/slo_repository.ts +++ b/x-pack/plugins/observability/server/services/slo/slo_repository.ts @@ -7,11 +7,10 @@ import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; -import { Paginated, Pagination, sloSchema } from '@kbn/slo-schema'; +import { sloSchema } from '@kbn/slo-schema'; import { fold } from 'fp-ts/lib/Either'; import { pipe } from 'fp-ts/lib/pipeable'; import * as t from 'io-ts'; -import { SLO_MODEL_VERSION } from '../../assets/constants'; import { SLO, StoredSLO } from '../../domain/models'; import { SLOIdConflict, SLONotFound } from '../../errors'; import { SO_SLO_TYPE } from '../../saved_objects'; @@ -21,11 +20,7 @@ export interface SLORepository { findAllByIds(ids: string[]): Promise; findById(id: string): Promise; deleteById(id: string): Promise; - search( - search: string, - pagination: Pagination, - options?: { includeOutdatedOnly?: boolean } - ): Promise>; + search(search: string): Promise; } export class KibanaSavedObjectsSLORepository implements SLORepository { @@ -104,28 +99,19 @@ export class KibanaSavedObjectsSLORepository implements SLORepository { } } - async search( - search: string, - pagination: Pagination, - options: { includeOutdatedOnly?: boolean } = { includeOutdatedOnly: false } - ): Promise> { - const response = await this.soClient.find({ - type: SO_SLO_TYPE, - page: pagination.page, - perPage: pagination.perPage, - search, - searchFields: ['name'], - ...(!!options.includeOutdatedOnly && { - filter: `slo.attributes.version < ${SLO_MODEL_VERSION}`, - }), - }); - - return { - total: response.total, - perPage: response.per_page, - page: response.page, - results: response.saved_objects.map((slo) => toSLO(slo.attributes)), - }; + async search(search: string): Promise { + try { + const response = await this.soClient.find({ + type: SO_SLO_TYPE, + page: 1, + perPage: 25, + search, + searchFields: ['name'], + }); + return response.saved_objects.map((slo) => toSLO(slo.attributes)); + } catch (err) { + throw err; + } } } @@ -135,13 +121,7 @@ function toStoredSLO(slo: SLO): StoredSLO { function toSLO(storedSLO: StoredSLO): SLO { return pipe( - sloSchema.decode({ - ...storedSLO, - // version was added in 8.12.0. This is a safeguard against SO migration issue. - // if not present, we considered the version to be 1, e.g. not migrated. - // We would need to call the _reset api on this SLO. - version: storedSLO.version ?? 1, - }), + sloSchema.decode(storedSLO), fold(() => { throw new Error('Invalid Stored SLO'); }, t.identity) diff --git a/x-pack/plugins/observability/server/services/slo/summary_search_client.test.ts b/x-pack/plugins/observability/server/services/slo/summary_search_client.test.ts index 9036611b1feda..fc53bf1e7181b 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_search_client.test.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_search_client.test.ts @@ -7,13 +7,17 @@ import { ElasticsearchClientMock, elasticsearchServiceMock } from '@kbn/core/server/mocks'; import { loggerMock } from '@kbn/logging-mocks'; -import { Pagination } from '@kbn/slo-schema/src/models/pagination'; import { aHitFromSummaryIndex, aHitFromTempSummaryIndex, aSummaryDocument, } from './fixtures/summary_search_document'; -import { DefaultSummarySearchClient, Sort, SummarySearchClient } from './summary_search_client'; +import { + DefaultSummarySearchClient, + Pagination, + Sort, + SummarySearchClient, +} from './summary_search_client'; const defaultSort: Sort = { field: 'sli_value', diff --git a/x-pack/plugins/observability/server/services/slo/summary_search_client.ts b/x-pack/plugins/observability/server/services/slo/summary_search_client.ts index 7412e1e6e0f8a..f2bfa1ed29df3 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_search_client.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_search_client.ts @@ -6,7 +6,7 @@ */ import { ElasticsearchClient, Logger } from '@kbn/core/server'; -import { ALL_VALUE, Paginated, Pagination } from '@kbn/slo-schema'; +import { ALL_VALUE } from '@kbn/slo-schema'; import { assertNever } from '@kbn/std'; import _ from 'lodash'; import { SLO_SUMMARY_DESTINATION_INDEX_PATTERN } from '../../assets/constants'; @@ -30,6 +30,13 @@ interface EsSummaryDocument { isTempDoc: boolean; } +export interface Paginated { + total: number; + page: number; + perPage: number; + results: T[]; +} + export interface SLOSummary { id: SLOId; instanceId: string; @@ -42,6 +49,11 @@ export interface Sort { direction: 'asc' | 'desc'; } +export interface Pagination { + page: number; + perPage: number; +} + export interface SummarySearchClient { search(kqlQuery: string, sort: Sort, pagination: Pagination): Promise>; } diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/__snapshots__/summary_transform_installer.test.ts.snap b/x-pack/plugins/observability/server/services/slo/summary_transform/__snapshots__/summary_transform_installer.test.ts.snap index 4dba4a5b89880..5161c5e5cb51b 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/__snapshots__/summary_transform_installer.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/__snapshots__/summary_transform_installer.test.ts.snap @@ -7,11 +7,11 @@ Array [ "_meta": Object { "managed": true, "managed_by": "observability", - "version": 4, + "version": 3, }, "description": "Summarize every SLO with timeslices budgeting method and a 7 days rolling time window", "dest": Object { - "index": ".slo-observability.summary-v3", + "index": ".slo-observability.summary-v2", "pipeline": ".slo-observability.summary.pipeline", }, "frequency": "1m", @@ -52,11 +52,6 @@ Array [ "field": "slo.isGoodSlice", }, }, - "latestSliTimestamp": Object { - "max": Object { - "field": "@timestamp", - }, - }, "sliValue": Object { "bucket_script": Object { "buckets_path": Object { @@ -112,21 +107,46 @@ Array [ "field": "slo.budgetingMethod", }, }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, "slo.timeWindow.duration": Object { "terms": Object { "field": "slo.timeWindow.duration", @@ -156,7 +176,7 @@ Array [ "unattended": true, }, "source": Object { - "index": ".slo-observability.sli-v3*", + "index": ".slo-observability.sli-v2*", "query": Object { "bool": Object { "filter": Array [ @@ -199,8 +219,8 @@ Array [ }, "sync": Object { "time": Object { - "delay": "65s", - "field": "event.ingested", + "delay": "125s", + "field": "@timestamp", }, }, "transform_id": "slo-summary-timeslices-7d-rolling", @@ -216,11 +236,11 @@ Array [ "_meta": Object { "managed": true, "managed_by": "observability", - "version": 4, + "version": 3, }, "description": "Summarize every SLO with timeslices budgeting method and a 30 days rolling time window", "dest": Object { - "index": ".slo-observability.summary-v3", + "index": ".slo-observability.summary-v2", "pipeline": ".slo-observability.summary.pipeline", }, "frequency": "1m", @@ -261,11 +281,6 @@ Array [ "field": "slo.isGoodSlice", }, }, - "latestSliTimestamp": Object { - "max": Object { - "field": "@timestamp", - }, - }, "sliValue": Object { "bucket_script": Object { "buckets_path": Object { @@ -321,21 +336,46 @@ Array [ "field": "slo.budgetingMethod", }, }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, "slo.timeWindow.duration": Object { "terms": Object { "field": "slo.timeWindow.duration", @@ -365,7 +405,7 @@ Array [ "unattended": true, }, "source": Object { - "index": ".slo-observability.sli-v3*", + "index": ".slo-observability.sli-v2*", "query": Object { "bool": Object { "filter": Array [ @@ -408,8 +448,8 @@ Array [ }, "sync": Object { "time": Object { - "delay": "65s", - "field": "event.ingested", + "delay": "125s", + "field": "@timestamp", }, }, "transform_id": "slo-summary-timeslices-30d-rolling", @@ -425,11 +465,11 @@ Array [ "_meta": Object { "managed": true, "managed_by": "observability", - "version": 4, + "version": 3, }, "description": "Summarize every SLO with timeslices budgeting method and a 90 days rolling time window", "dest": Object { - "index": ".slo-observability.summary-v3", + "index": ".slo-observability.summary-v2", "pipeline": ".slo-observability.summary.pipeline", }, "frequency": "1m", @@ -470,11 +510,6 @@ Array [ "field": "slo.isGoodSlice", }, }, - "latestSliTimestamp": Object { - "max": Object { - "field": "@timestamp", - }, - }, "sliValue": Object { "bucket_script": Object { "buckets_path": Object { @@ -530,21 +565,46 @@ Array [ "field": "slo.budgetingMethod", }, }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, "slo.timeWindow.duration": Object { "terms": Object { "field": "slo.timeWindow.duration", @@ -574,7 +634,7 @@ Array [ "unattended": true, }, "source": Object { - "index": ".slo-observability.sli-v3*", + "index": ".slo-observability.sli-v2*", "query": Object { "bool": Object { "filter": Array [ @@ -617,8 +677,8 @@ Array [ }, "sync": Object { "time": Object { - "delay": "65s", - "field": "event.ingested", + "delay": "125s", + "field": "@timestamp", }, }, "transform_id": "slo-summary-timeslices-90d-rolling", @@ -634,11 +694,11 @@ Array [ "_meta": Object { "managed": true, "managed_by": "observability", - "version": 4, + "version": 3, }, "description": "Summarize every SLO with timeslices budgeting method and a weekly calendar aligned time window", "dest": Object { - "index": ".slo-observability.summary-v3", + "index": ".slo-observability.summary-v2", "pipeline": ".slo-observability.summary.pipeline", }, "frequency": "1m", @@ -694,11 +754,6 @@ Array [ "field": "slo.isGoodSlice", }, }, - "latestSliTimestamp": Object { - "max": Object { - "field": "@timestamp", - }, - }, "sliValue": Object { "bucket_script": Object { "buckets_path": Object { @@ -752,21 +807,46 @@ Array [ "field": "slo.budgetingMethod", }, }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, "slo.timeWindow.duration": Object { "terms": Object { "field": "slo.timeWindow.duration", @@ -796,7 +876,7 @@ Array [ "unattended": true, }, "source": Object { - "index": ".slo-observability.sli-v3*", + "index": ".slo-observability.sli-v2*", "query": Object { "bool": Object { "filter": Array [ @@ -839,8 +919,8 @@ Array [ }, "sync": Object { "time": Object { - "delay": "65s", - "field": "event.ingested", + "delay": "125s", + "field": "@timestamp", }, }, "transform_id": "slo-summary-timeslices-weekly-aligned", @@ -856,11 +936,11 @@ Array [ "_meta": Object { "managed": true, "managed_by": "observability", - "version": 4, + "version": 3, }, "description": "Summarize every SLO with timeslices budgeting method and a monthly calendar aligned time window", "dest": Object { - "index": ".slo-observability.summary-v3", + "index": ".slo-observability.summary-v2", "pipeline": ".slo-observability.summary.pipeline", }, "frequency": "1m", @@ -883,7 +963,7 @@ Array [ }, "script": Object { "source": " - Date d = new Date(); + Date d = new Date(); Instant instant = Instant.ofEpochMilli(d.getTime()); LocalDateTime now = LocalDateTime.ofInstant(instant, ZoneOffset.UTC); LocalDateTime startOfMonth = now @@ -893,7 +973,7 @@ Array [ .withSecond(0); LocalDateTime startOfNextMonth = startOfMonth.plusMonths(1); double sliceDurationInMinutes = params.sliceDurationInSeconds / 60; - + return Math.ceil(Duration.between(startOfMonth, startOfNextMonth).toMinutes() / sliceDurationInMinutes); ", }, @@ -931,11 +1011,6 @@ Array [ "field": "slo.isGoodSlice", }, }, - "latestSliTimestamp": Object { - "max": Object { - "field": "@timestamp", - }, - }, "sliValue": Object { "bucket_script": Object { "buckets_path": Object { @@ -989,21 +1064,46 @@ Array [ "field": "slo.budgetingMethod", }, }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, "slo.timeWindow.duration": Object { "terms": Object { "field": "slo.timeWindow.duration", @@ -1033,7 +1133,7 @@ Array [ "unattended": true, }, "source": Object { - "index": ".slo-observability.sli-v3*", + "index": ".slo-observability.sli-v2*", "query": Object { "bool": Object { "filter": Array [ @@ -1076,8 +1176,8 @@ Array [ }, "sync": Object { "time": Object { - "delay": "65s", - "field": "event.ingested", + "delay": "125s", + "field": "@timestamp", }, }, "transform_id": "slo-summary-timeslices-monthly-aligned", diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/common.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/common.ts index 9ae627b4cf202..c99a6c2be9d3c 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/common.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/common.ts @@ -16,11 +16,36 @@ export const groupBy = { field: 'slo.revision', }, }, + 'slo.groupBy': { + terms: { + field: 'slo.groupBy', + }, + }, 'slo.instanceId': { terms: { field: 'slo.instanceId', }, }, + 'slo.name': { + terms: { + field: 'slo.name', + }, + }, + 'slo.description': { + terms: { + field: 'slo.description', + }, + }, + 'slo.tags': { + terms: { + field: 'slo.tags', + }, + }, + 'slo.indicator.type': { + terms: { + field: 'slo.indicator.type', + }, + }, 'slo.budgetingMethod': { terms: { field: 'slo.budgetingMethod', diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_30d_rolling.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_30d_rolling.ts index b3ee6d1d9e51f..4fea113a54233 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_30d_rolling.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_30d_rolling.ts @@ -130,11 +130,6 @@ export const SUMMARY_OCCURRENCES_30D_ROLLING: TransformPutTransformRequest = { }, }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -142,8 +137,8 @@ export const SUMMARY_OCCURRENCES_30D_ROLLING: TransformPutTransformRequest = { frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_7d_rolling.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_7d_rolling.ts index 18fd235bfe11c..629f7b234843c 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_7d_rolling.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_7d_rolling.ts @@ -130,11 +130,6 @@ export const SUMMARY_OCCURRENCES_7D_ROLLING: TransformPutTransformRequest = { }, }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -142,8 +137,8 @@ export const SUMMARY_OCCURRENCES_7D_ROLLING: TransformPutTransformRequest = { frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_90d_rolling.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_90d_rolling.ts index 7dcf080beefbb..dfd77783ef3d2 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_90d_rolling.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_90d_rolling.ts @@ -130,11 +130,6 @@ export const SUMMARY_OCCURRENCES_90D_ROLLING: TransformPutTransformRequest = { }, }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -142,8 +137,8 @@ export const SUMMARY_OCCURRENCES_90D_ROLLING: TransformPutTransformRequest = { frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_monthly_aligned.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_monthly_aligned.ts index 172758eae8339..9d07bcf9cd5af 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_monthly_aligned.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_monthly_aligned.ts @@ -128,11 +128,6 @@ export const SUMMARY_OCCURRENCES_MONTHLY_ALIGNED: TransformPutTransformRequest = 'if (params.sliValue == -1) { return 0 } else if (params.sliValue >= params.objective) { return 4 } else if (params.errorBudgetRemaining > 0) { return 2 } else { return 1 }', }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -140,8 +135,8 @@ export const SUMMARY_OCCURRENCES_MONTHLY_ALIGNED: TransformPutTransformRequest = frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_weekly_aligned.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_weekly_aligned.ts index 923959a7db6e6..0fc3ec19d3cf2 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_weekly_aligned.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_occurrences_weekly_aligned.ts @@ -128,11 +128,6 @@ export const SUMMARY_OCCURRENCES_WEEKLY_ALIGNED: TransformPutTransformRequest = 'if (params.sliValue == -1) { return 0 } else if (params.sliValue >= params.objective) { return 4 } else if (params.errorBudgetRemaining > 0) { return 2 } else { return 1 }', }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -140,8 +135,8 @@ export const SUMMARY_OCCURRENCES_WEEKLY_ALIGNED: TransformPutTransformRequest = frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_30d_rolling.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_30d_rolling.ts index facaab299f5ee..5f48a86d0bca8 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_30d_rolling.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_30d_rolling.ts @@ -130,11 +130,6 @@ export const SUMMARY_TIMESLICES_30D_ROLLING: TransformPutTransformRequest = { }, }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -142,8 +137,8 @@ export const SUMMARY_TIMESLICES_30D_ROLLING: TransformPutTransformRequest = { frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_7d_rolling.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_7d_rolling.ts index 9edb2998dc1d2..7a491337fba65 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_7d_rolling.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_7d_rolling.ts @@ -130,11 +130,6 @@ export const SUMMARY_TIMESLICES_7D_ROLLING: TransformPutTransformRequest = { }, }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -142,8 +137,8 @@ export const SUMMARY_TIMESLICES_7D_ROLLING: TransformPutTransformRequest = { frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_90d_rolling.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_90d_rolling.ts index 38473989dcd21..c26c9f84e554f 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_90d_rolling.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_90d_rolling.ts @@ -130,11 +130,6 @@ export const SUMMARY_TIMESLICES_90D_ROLLING: TransformPutTransformRequest = { }, }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -142,8 +137,8 @@ export const SUMMARY_TIMESLICES_90D_ROLLING: TransformPutTransformRequest = { frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_monthly_aligned.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_monthly_aligned.ts index 370daa6e7b6ec..18fd40a729403 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_monthly_aligned.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_monthly_aligned.ts @@ -78,7 +78,7 @@ export const SUMMARY_TIMESLICES_MONTHLY_ALIGNED: TransformPutTransformRequest = }, script: { source: ` - Date d = new Date(); + Date d = new Date(); Instant instant = Instant.ofEpochMilli(d.getTime()); LocalDateTime now = LocalDateTime.ofInstant(instant, ZoneOffset.UTC); LocalDateTime startOfMonth = now @@ -88,7 +88,7 @@ export const SUMMARY_TIMESLICES_MONTHLY_ALIGNED: TransformPutTransformRequest = .withSecond(0); LocalDateTime startOfNextMonth = startOfMonth.plusMonths(1); double sliceDurationInMinutes = params.sliceDurationInSeconds / 60; - + return Math.ceil(Duration.between(startOfMonth, startOfNextMonth).toMinutes() / sliceDurationInMinutes); `, }, @@ -158,11 +158,6 @@ export const SUMMARY_TIMESLICES_MONTHLY_ALIGNED: TransformPutTransformRequest = 'if (params.sliValue == -1) { return 0 } else if (params.sliValue >= params.objective) { return 4 } else if (params.errorBudgetRemaining > 0) { return 2 } else { return 1 }', }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -170,8 +165,8 @@ export const SUMMARY_TIMESLICES_MONTHLY_ALIGNED: TransformPutTransformRequest = frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_weekly_aligned.ts b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_weekly_aligned.ts index e85a298a37619..af062b7b6abe6 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_weekly_aligned.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform/templates/summary_timeslices_weekly_aligned.ts @@ -143,11 +143,6 @@ export const SUMMARY_TIMESLICES_WEEKLY_ALIGNED: TransformPutTransformRequest = { 'if (params.sliValue == -1) { return 0 } else if (params.sliValue >= params.objective) { return 4 } else if (params.errorBudgetRemaining > 0) { return 2 } else { return 1 }', }, }, - latestSliTimestamp: { - max: { - field: '@timestamp', - }, - }, }, }, description: @@ -155,8 +150,8 @@ export const SUMMARY_TIMESLICES_WEEKLY_ALIGNED: TransformPutTransformRequest = { frequency: '1m', sync: { time: { - field: 'event.ingested', - delay: '65s', + field: '@timestamp', + delay: '125s', }, }, settings: { diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/apm_transaction_duration.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/apm_transaction_duration.test.ts.snap index 6b0214eee954e..d5ac57c80e40d 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/apm_transaction_duration.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/apm_transaction_duration.test.ts.snap @@ -190,21 +190,66 @@ Object { "field": "service.environment", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, } `; @@ -259,21 +304,66 @@ Object { "field": "service.name", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, } `; @@ -323,21 +413,66 @@ Object { "fixed_interval": "1m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, "transaction.name": Object { "terms": Object { "field": "transaction.name", @@ -392,21 +527,66 @@ Object { "fixed_interval": "1m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, "transaction.type": Object { "terms": Object { "field": "transaction.type", @@ -420,11 +600,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -480,26 +660,71 @@ Object { "field": "service.name", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.objective.sliceDurationInSeconds": Object { "terms": Object { "field": "slo.objective.sliceDurationInSeconds", }, }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, "transaction.name": Object { "terms": Object { "field": "transaction.name", @@ -569,30 +794,84 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('timeslices')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.apm.transactionDuration')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, "slo.objective.sliceDurationInSeconds": Object { "script": Object { "source": "emit(120)", }, "type": "long", }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.98)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { @@ -610,11 +889,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -661,21 +940,66 @@ Object { "field": "service.name", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, "transaction.name": Object { "terms": Object { "field": "transaction.name", @@ -745,24 +1069,78 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('occurrences')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.apm.transactionDuration')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.999)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/apm_transaction_error_rate.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/apm_transaction_error_rate.test.ts.snap index d84eb813c5e12..c8d687383b513 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/apm_transaction_error_rate.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/apm_transaction_error_rate.test.ts.snap @@ -178,21 +178,66 @@ Object { "field": "service.environment", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, } `; @@ -243,21 +288,66 @@ Object { "field": "service.name", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, } `; @@ -303,21 +393,66 @@ Object { "fixed_interval": "1m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, "transaction.name": Object { "terms": Object { "field": "transaction.name", @@ -368,21 +503,66 @@ Object { "fixed_interval": "1m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, "transaction.type": Object { "terms": Object { "field": "transaction.type", @@ -396,11 +576,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -449,26 +629,71 @@ Object { "field": "service.name", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.objective.sliceDurationInSeconds": Object { "terms": Object { "field": "slo.objective.sliceDurationInSeconds", }, }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, "transaction.name": Object { "terms": Object { "field": "transaction.name", @@ -534,30 +759,84 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('timeslices')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.apm.transactionErrorRate')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, "slo.objective.sliceDurationInSeconds": Object { "script": Object { "source": "emit(120)", }, "type": "long", }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.98)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { @@ -575,11 +854,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -619,21 +898,66 @@ Object { "field": "service.name", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, "transaction.name": Object { "terms": Object { "field": "transaction.name", @@ -699,24 +1023,78 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('occurrences')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.apm.transactionErrorRate')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.999)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/histogram.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/histogram.test.ts.snap index 900093be8f78e..cdbdd8c527043 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/histogram.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/histogram.test.ts.snap @@ -77,11 +77,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -151,26 +151,71 @@ Object { "fixed_interval": "2m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.objective.sliceDurationInSeconds": Object { "terms": Object { "field": "slo.objective.sliceDurationInSeconds", }, }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, }, }, "settings": Object { @@ -208,30 +253,84 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('timeslices')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.histogram.custom')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, "slo.objective.sliceDurationInSeconds": Object { "script": Object { "source": "emit(120)", }, "type": "long", }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.98)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { @@ -249,11 +348,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -314,21 +413,66 @@ Object { "fixed_interval": "1m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, }, }, "settings": Object { @@ -366,24 +510,78 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('occurrences')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.histogram.custom')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.999)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/kql_custom.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/kql_custom.test.ts.snap index c207f1c21c2a9..27da87629465d 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/kql_custom.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/kql_custom.test.ts.snap @@ -118,11 +118,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -166,26 +166,71 @@ Object { "fixed_interval": "2m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.objective.sliceDurationInSeconds": Object { "terms": Object { "field": "slo.objective.sliceDurationInSeconds", }, }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, }, }, "settings": Object { @@ -223,30 +268,84 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('timeslices')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.kql.custom')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, "slo.objective.sliceDurationInSeconds": Object { "script": Object { "source": "emit(120)", }, "type": "long", }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.98)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { @@ -264,11 +363,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -303,21 +402,66 @@ Object { "fixed_interval": "1m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, }, }, "settings": Object { @@ -355,24 +499,78 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('occurrences')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.kql.custom')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.999)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap index 6e633758bb3d6..55ed414bd2ec7 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap @@ -117,11 +117,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -203,26 +203,71 @@ Object { "fixed_interval": "2m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.objective.sliceDurationInSeconds": Object { "terms": Object { "field": "slo.objective.sliceDurationInSeconds", }, }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, }, }, "settings": Object { @@ -260,30 +305,84 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('timeslices')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.metric.custom')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, "slo.objective.sliceDurationInSeconds": Object { "script": Object { "source": "emit(120)", }, "type": "long", }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.98)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { @@ -301,11 +400,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -378,21 +477,66 @@ Object { "fixed_interval": "1m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, }, }, "settings": Object { @@ -430,24 +574,78 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('occurrences')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.metric.custom')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.999)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/timeslice_metric.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/timeslice_metric.test.ts.snap index eaba259a5992b..e2698ba3e1793 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/timeslice_metric.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/timeslice_metric.test.ts.snap @@ -33,11 +33,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -173,26 +173,71 @@ Object { "fixed_interval": "2m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.objective.sliceDurationInSeconds": Object { "terms": Object { "field": "slo.objective.sliceDurationInSeconds", }, }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, }, }, "settings": Object { @@ -227,30 +272,84 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('timeslices')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.metric.timeslice')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, "slo.objective.sliceDurationInSeconds": Object { "script": Object { "source": "emit(120)", }, "type": "long", }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.98)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { @@ -268,11 +367,11 @@ Object { "_meta": Object { "managed": true, "managed_by": "observability", - "version": 3, + "version": 2, }, "description": "Rolled-up SLI data for SLO: irrelevant", "dest": Object { - "index": ".slo-observability.sli-v3", + "index": ".slo-observability.sli-v2", "pipeline": ".slo-observability.sli.pipeline", }, "frequency": "1m", @@ -408,26 +507,71 @@ Object { "fixed_interval": "2m", }, }, + "slo.budgetingMethod": Object { + "terms": Object { + "field": "slo.budgetingMethod", + }, + }, + "slo.description": Object { + "terms": Object { + "field": "slo.description", + }, + }, + "slo.groupBy": Object { + "terms": Object { + "field": "slo.groupBy", + }, + }, "slo.id": Object { "terms": Object { "field": "slo.id", }, }, + "slo.indicator.type": Object { + "terms": Object { + "field": "slo.indicator.type", + }, + }, "slo.instanceId": Object { "terms": Object { "field": "slo.instanceId", }, }, + "slo.name": Object { + "terms": Object { + "field": "slo.name", + }, + }, "slo.objective.sliceDurationInSeconds": Object { "terms": Object { "field": "slo.objective.sliceDurationInSeconds", }, }, + "slo.objective.target": Object { + "terms": Object { + "field": "slo.objective.target", + }, + }, "slo.revision": Object { "terms": Object { "field": "slo.revision", }, }, + "slo.tags": Object { + "terms": Object { + "field": "slo.tags", + }, + }, + "slo.timeWindow.duration": Object { + "terms": Object { + "field": "slo.timeWindow.duration", + }, + }, + "slo.timeWindow.type": Object { + "terms": Object { + "field": "slo.timeWindow.type", + }, + }, }, }, "settings": Object { @@ -462,30 +606,84 @@ Object { }, }, "runtime_mappings": Object { + "slo.budgetingMethod": Object { + "script": Object { + "source": "emit('timeslices')", + }, + "type": "keyword", + }, + "slo.description": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, + "slo.groupBy": Object { + "script": Object { + "source": "emit('*')", + }, + "type": "keyword", + }, "slo.id": Object { "script": Object { "source": Any, }, "type": "keyword", }, + "slo.indicator.type": Object { + "script": Object { + "source": "emit('sli.metric.timeslice')", + }, + "type": "keyword", + }, "slo.instanceId": Object { "script": Object { "source": "emit('*')", }, "type": "keyword", }, + "slo.name": Object { + "script": Object { + "source": "emit('irrelevant')", + }, + "type": "keyword", + }, "slo.objective.sliceDurationInSeconds": Object { "script": Object { "source": "emit(120)", }, "type": "long", }, + "slo.objective.target": Object { + "script": Object { + "source": "emit(0.98)", + }, + "type": "double", + }, "slo.revision": Object { "script": Object { "source": "emit(1)", }, "type": "long", }, + "slo.tags": Object { + "script": Object { + "source": "emit('critical,k8s')", + }, + "type": "keyword", + }, + "slo.timeWindow.duration": Object { + "script": Object { + "source": "emit('7d')", + }, + "type": "keyword", + }, + "slo.timeWindow.type": Object { + "script": Object { + "source": "emit('rolling')", + }, + "type": "keyword", + }, }, }, "sync": Object { diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/transform_generator.ts b/x-pack/plugins/observability/server/services/slo/transform_generators/transform_generator.ts index 66d75467836e1..42572e61b38ab 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/transform_generator.ts +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/transform_generator.ts @@ -32,6 +32,12 @@ export abstract class TransformGenerator { source: `emit(${slo.revision})`, }, }, + 'slo.groupBy': { + type: 'keyword', + script: { + source: `emit('${!!slo.groupBy ? slo.groupBy : ALL_VALUE}')`, + }, + }, ...(mustIncludeAllInstanceId && { 'slo.instanceId': { type: 'keyword', @@ -40,6 +46,36 @@ export abstract class TransformGenerator { }, }, }), + 'slo.name': { + type: 'keyword', + script: { + source: `emit('${slo.name}')`, + }, + }, + 'slo.description': { + type: 'keyword', + script: { + source: `emit('${slo.description}')`, + }, + }, + 'slo.tags': { + type: 'keyword', + script: { + source: `emit('${slo.tags}')`, + }, + }, + 'slo.indicator.type': { + type: 'keyword', + script: { + source: `emit('${slo.indicator.type}')`, + }, + }, + 'slo.objective.target': { + type: 'double', + script: { + source: `emit(${slo.objective.target})`, + }, + }, ...(slo.objective.timesliceWindow && { 'slo.objective.sliceDurationInSeconds': { type: 'long', @@ -48,6 +84,24 @@ export abstract class TransformGenerator { }, }, }), + 'slo.budgetingMethod': { + type: 'keyword', + script: { + source: `emit('${slo.budgetingMethod}')`, + }, + }, + 'slo.timeWindow.duration': { + type: 'keyword', + script: { + source: `emit('${slo.timeWindow.duration.format()}')`, + }, + }, + 'slo.timeWindow.type': { + type: 'keyword', + script: { + source: `emit('${slo.timeWindow.type}')`, + }, + }, }; } @@ -71,12 +125,21 @@ export abstract class TransformGenerator { return { 'slo.id': { terms: { field: 'slo.id' } }, 'slo.revision': { terms: { field: 'slo.revision' } }, + 'slo.groupBy': { terms: { field: 'slo.groupBy' } }, 'slo.instanceId': { terms: { field: instanceIdField } }, + 'slo.name': { terms: { field: 'slo.name' } }, + 'slo.description': { terms: { field: 'slo.description' } }, + 'slo.tags': { terms: { field: 'slo.tags' } }, + 'slo.indicator.type': { terms: { field: 'slo.indicator.type' } }, + 'slo.objective.target': { terms: { field: 'slo.objective.target' } }, ...(slo.objective.timesliceWindow && { 'slo.objective.sliceDurationInSeconds': { terms: { field: 'slo.objective.sliceDurationInSeconds' }, }, }), + 'slo.budgetingMethod': { terms: { field: 'slo.budgetingMethod' } }, + 'slo.timeWindow.duration': { terms: { field: 'slo.timeWindow.duration' } }, + 'slo.timeWindow.type': { terms: { field: 'slo.timeWindow.type' } }, ...extraGroupByFields, // @timestamp field defined in the destination index '@timestamp': { diff --git a/x-pack/plugins/observability/server/services/slo/update_slo.test.ts b/x-pack/plugins/observability/server/services/slo/update_slo.test.ts index 2d1b588f215f3..797f6eb2218ee 100644 --- a/x-pack/plugins/observability/server/services/slo/update_slo.test.ts +++ b/x-pack/plugins/observability/server/services/slo/update_slo.test.ts @@ -8,7 +8,7 @@ import { ElasticsearchClient } from '@kbn/core/server'; import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; import { UpdateSLOParams } from '@kbn/slo-schema'; -import { cloneDeep, omit, pick } from 'lodash'; +import { cloneDeep, pick, omit } from 'lodash'; import { getSLOTransformId, @@ -16,14 +16,12 @@ import { SLO_SUMMARY_DESTINATION_INDEX_PATTERN, } from '../../assets/constants'; import { SLO } from '../../domain/models'; -import { fiveMinute, oneMinute, twoMinute } from './fixtures/duration'; +import { fiveMinute, oneMinute } from './fixtures/duration'; import { createAPMTransactionErrorRateIndicator, createSLO, createSLOWithTimeslicesBudgetingMethod, - createMetricCustomIndicator, } from './fixtures/slo'; -import { thirtyDaysRolling } from './fixtures/time_window'; import { createSLORepositoryMock, createTransformManagerMock } from './mocks'; import { SLORepository } from './slo_repository'; import { TransformManager } from './transform_manager'; @@ -33,23 +31,25 @@ describe('UpdateSLO', () => { let mockRepository: jest.Mocked; let mockTransformManager: jest.Mocked; let mockEsClient: jest.Mocked; - let mockSystemEsClient: jest.Mocked; let updateSLO: UpdateSLO; beforeEach(() => { mockRepository = createSLORepositoryMock(); mockTransformManager = createTransformManagerMock(); mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); - mockSystemEsClient = elasticsearchServiceMock.createElasticsearchClient(); - updateSLO = new UpdateSLO( - mockRepository, - mockTransformManager, - mockEsClient, - mockSystemEsClient - ); + updateSLO = new UpdateSLO(mockRepository, mockTransformManager, mockEsClient); }); describe('when the update payload does not change the original SLO', () => { + function expectNoCallsToAnyMocks() { + expect(mockTransformManager.stop).not.toBeCalled(); + expect(mockTransformManager.uninstall).not.toBeCalled(); + expect(mockTransformManager.install).not.toBeCalled(); + expect(mockTransformManager.preview).not.toBeCalled(); + expect(mockTransformManager.start).not.toBeCalled(); + expect(mockEsClient.deleteByQuery).not.toBeCalled(); + } + it('returns early with a full identical SLO payload', async () => { const slo = createSLO(); mockRepository.findById.mockResolvedValueOnce(slo); @@ -157,14 +157,11 @@ describe('UpdateSLO', () => { }); }); - it("bumps the revision when changing 'settings'", async () => { + it('updates the settings correctly', async () => { const slo = createSLO(); mockRepository.findById.mockResolvedValueOnce(slo); - const newSettings = { - syncDelay: twoMinute(), - frequency: fiveMinute(), - }; + const newSettings = { ...slo.settings, timestamp_field: 'newField' }; await updateSLO.execute(slo.id, { settings: newSettings }); expectDeletionOfOriginalSLO(slo); @@ -172,14 +169,14 @@ describe('UpdateSLO', () => { expect.objectContaining({ ...slo, settings: newSettings, - revision: slo.revision + 1, + revision: 2, updatedAt: expect.anything(), }) ); expectInstallationOfNewSLOTransform(); }); - it("bumps the revision when changing 'budgetingMethod'", async () => { + it('updates the budgeting method correctly', async () => { const slo = createSLO({ budgetingMethod: 'occurrences' }); mockRepository.findById.mockResolvedValueOnce(slo); @@ -193,23 +190,10 @@ describe('UpdateSLO', () => { }); expectDeletionOfOriginalSLO(slo); - expect(mockRepository.save).toBeCalledWith( - expect.objectContaining({ - ...slo, - budgetingMethod: 'timeslices', - objective: { - target: slo.objective.target, - timesliceTarget: 0.9, - timesliceWindow: oneMinute(), - }, - revision: slo.revision + 1, - updatedAt: expect.anything(), - }) - ); expectInstallationOfNewSLOTransform(); }); - it("bumps the revision when changing 'objective.timesliceTarget'", async () => { + it('updates the timeslice target correctly', async () => { const slo = createSLOWithTimeslicesBudgetingMethod(); mockRepository.findById.mockResolvedValueOnce(slo); @@ -222,22 +206,10 @@ describe('UpdateSLO', () => { }); expectDeletionOfOriginalSLO(slo); - expect(mockRepository.save).toBeCalledWith( - expect.objectContaining({ - ...slo, - objective: { - target: slo.objective.target, - timesliceTarget: 0.1, - timesliceWindow: slo.objective.timesliceWindow, - }, - revision: slo.revision + 1, - updatedAt: expect.anything(), - }) - ); expectInstallationOfNewSLOTransform(); }); - it("bumps the revision when changing 'objective.timesliceWindow'", async () => { + it('consideres a timeslice window change as a breaking change', async () => { const slo = createSLOWithTimeslicesBudgetingMethod(); mockRepository.findById.mockResolvedValueOnce(slo); @@ -250,165 +222,41 @@ describe('UpdateSLO', () => { }); expectDeletionOfOriginalSLO(slo); - expect(mockRepository.save).toBeCalledWith( - expect.objectContaining({ - ...slo, - objective: { - target: slo.objective.target, - timesliceTarget: slo.objective.timesliceTarget, - timesliceWindow: fiveMinute(), - }, - revision: slo.revision + 1, - updatedAt: expect.anything(), - }) - ); expectInstallationOfNewSLOTransform(); }); - it("bumps the revision when changing 'objective'", async () => { - const slo = createSLO(); - mockRepository.findById.mockResolvedValueOnce(slo); - - await updateSLO.execute(slo.id, { - objective: { - target: 0.5, - }, + it('index a temporary summary document', async () => { + const slo = createSLO({ + id: 'unique-id', + indicator: createAPMTransactionErrorRateIndicator({ environment: 'development' }), }); - - expectDeletionOfOriginalSLO(slo); - expect(mockRepository.save).toBeCalledWith( - expect.objectContaining({ - ...slo, - objective: { - target: 0.5, - }, - revision: slo.revision + 1, - updatedAt: expect.anything(), - }) - ); - expectInstallationOfNewSLOTransform(); - }); - - it("bumps the revision when changing 'timeWindow'", async () => { - const slo = createSLO(); mockRepository.findById.mockResolvedValueOnce(slo); - await updateSLO.execute(slo.id, { - timeWindow: thirtyDaysRolling(), - }); + const newIndicator = createAPMTransactionErrorRateIndicator({ environment: 'production' }); + await updateSLO.execute(slo.id, { indicator: newIndicator }); - expectDeletionOfOriginalSLO(slo); - expect(mockRepository.save).toBeCalledWith( - expect.objectContaining({ - ...slo, - timeWindow: thirtyDaysRolling(), - revision: slo.revision + 1, - updatedAt: expect.anything(), - }) - ); - expectInstallationOfNewSLOTransform(); + expect(mockEsClient.index.mock.calls[0]).toMatchSnapshot(); }); - it("bumps the revision when changing 'groupBy'", async () => { - const slo = createSLO({ groupBy: 'labels.projectId' }); - mockRepository.findById.mockResolvedValueOnce(slo); - - await updateSLO.execute(slo.id, { - groupBy: '*', + it('removes the original data from the original SLO', async () => { + const slo = createSLO({ + indicator: createAPMTransactionErrorRateIndicator({ environment: 'development' }), }); - - expectDeletionOfOriginalSLO(slo); - expect(mockRepository.save).toBeCalledWith( - expect.objectContaining({ - ...slo, - groupBy: '*', - revision: slo.revision + 1, - updatedAt: expect.anything(), - }) - ); - expectInstallationOfNewSLOTransform(); - }); - - it("bumps the revision when changing 'indicator'", async () => { - const slo = createSLO(); mockRepository.findById.mockResolvedValueOnce(slo); - await updateSLO.execute(slo.id, { - indicator: createMetricCustomIndicator(), - }); + const newIndicator = createAPMTransactionErrorRateIndicator({ environment: 'production' }); + await updateSLO.execute(slo.id, { indicator: newIndicator }); - expectDeletionOfOriginalSLO(slo); expect(mockRepository.save).toBeCalledWith( expect.objectContaining({ ...slo, - indicator: createMetricCustomIndicator(), - revision: slo.revision + 1, + indicator: newIndicator, + revision: 2, updatedAt: expect.anything(), }) ); expectInstallationOfNewSLOTransform(); - }); - - describe('when the revision does not bump', () => { - it('stores the updated SLO', async () => { - const slo = createSLO(); - mockRepository.findById.mockResolvedValueOnce(slo); - - await updateSLO.execute(slo.id, { - name: 'a new name', - description: 'a new description', - tags: ['some', 'new tags'], - }); - - expect(mockRepository.save).toBeCalledWith( - expect.objectContaining({ - ...slo, - name: 'a new name', - description: 'a new description', - tags: ['some', 'new tags'], - revision: slo.revision, - updatedAt: expect.anything(), - }) - ); - expectNoCallsToAnyMocks(); - }); - }); - - describe('when the revision bumps', () => { - it('indexes a temporary summary document', async () => { - const slo = createSLO({ - id: 'unique-id', - indicator: createAPMTransactionErrorRateIndicator({ environment: 'development' }), - }); - mockRepository.findById.mockResolvedValueOnce(slo); - - const newIndicator = createAPMTransactionErrorRateIndicator({ environment: 'production' }); - await updateSLO.execute(slo.id, { indicator: newIndicator }); - - expect(mockEsClient.index.mock.calls[0]).toMatchSnapshot(); - expect(mockSystemEsClient.enrich.executePolicy).toBeCalled(); - }); - - it('removes the original data from the original SLO', async () => { - const slo = createSLO({ - indicator: createAPMTransactionErrorRateIndicator({ environment: 'development' }), - }); - mockRepository.findById.mockResolvedValueOnce(slo); - - const newIndicator = createAPMTransactionErrorRateIndicator({ environment: 'production' }); - await updateSLO.execute(slo.id, { indicator: newIndicator }); - - expect(mockRepository.save).toBeCalledWith( - expect.objectContaining({ - ...slo, - indicator: newIndicator, - revision: 2, - updatedAt: expect.anything(), - }) - ); - expectInstallationOfNewSLOTransform(); - expectDeletionOfOriginalSLO(slo); - }); + expectDeletionOfOriginalSLO(slo); }); describe('when error happens during the transform installation step', () => { @@ -426,7 +274,6 @@ describe('UpdateSLO', () => { ); expect(mockRepository.save).toHaveBeenCalledWith(slo); - expect(mockSystemEsClient.enrich.executePolicy).toHaveBeenCalled(); expect(mockTransformManager.preview).not.toHaveBeenCalled(); expect(mockTransformManager.start).not.toHaveBeenCalled(); expect(mockTransformManager.stop).not.toHaveBeenCalled(); @@ -453,21 +300,11 @@ describe('UpdateSLO', () => { getSLOTransformId(slo.id, slo.revision + 1) ); expect(mockRepository.save).toHaveBeenCalledWith(slo); - expect(mockSystemEsClient.enrich.executePolicy).toHaveBeenCalled(); expect(mockTransformManager.stop).not.toHaveBeenCalled(); expect(mockEsClient.deleteByQuery).not.toHaveBeenCalled(); }); }); - function expectNoCallsToAnyMocks() { - expect(mockTransformManager.stop).not.toBeCalled(); - expect(mockTransformManager.uninstall).not.toBeCalled(); - expect(mockTransformManager.install).not.toBeCalled(); - expect(mockTransformManager.preview).not.toBeCalled(); - expect(mockTransformManager.start).not.toBeCalled(); - expect(mockEsClient.deleteByQuery).not.toBeCalled(); - } - function expectInstallationOfNewSLOTransform() { expect(mockTransformManager.install).toBeCalled(); expect(mockTransformManager.preview).toBeCalled(); diff --git a/x-pack/plugins/observability/server/services/slo/update_slo.ts b/x-pack/plugins/observability/server/services/slo/update_slo.ts index addf86584e47a..97f6ed2e7bba3 100644 --- a/x-pack/plugins/observability/server/services/slo/update_slo.ts +++ b/x-pack/plugins/observability/server/services/slo/update_slo.ts @@ -7,12 +7,11 @@ import { ElasticsearchClient } from '@kbn/core/server'; import { UpdateSLOParams, UpdateSLOResponse, updateSLOResponseSchema } from '@kbn/slo-schema'; -import { isEqual, pick } from 'lodash'; +import { isEqual } from 'lodash'; import { getSLOTransformId, SLO_DESTINATION_INDEX_PATTERN, SLO_SUMMARY_DESTINATION_INDEX_PATTERN, - SLO_SUMMARY_ENRICH_POLICY_NAME, SLO_SUMMARY_TEMP_INDEX_NAME, } from '../../assets/constants'; import { SLO } from '../../domain/models'; @@ -25,8 +24,7 @@ export class UpdateSLO { constructor( private repository: SLORepository, private transformManager: TransformManager, - private esClient: ElasticsearchClient, - private systemClient: ElasticsearchClient + private esClient: ElasticsearchClient ) {} public async execute(sloId: string, params: UpdateSLOParams): Promise { @@ -39,38 +37,23 @@ export class UpdateSLO { return this.toResponse(originalSlo); } - const fields = [ - 'indicator', - 'groupBy', - 'timeWindow', - 'objective', - 'budgetingMethod', - 'settings', - ]; - const requireRevisionBump = !isEqual(pick(originalSlo, fields), pick(updatedSlo, fields)); - updatedSlo = Object.assign(updatedSlo, { updatedAt: new Date(), - revision: requireRevisionBump ? originalSlo.revision + 1 : originalSlo.revision, + revision: originalSlo.revision + 1, }); validateSLO(updatedSlo); - await this.repository.save(updatedSlo); - await this.systemClient.enrich.executePolicy({ name: SLO_SUMMARY_ENRICH_POLICY_NAME }); - if (!requireRevisionBump) { - return this.toResponse(updatedSlo); - } + const updatedSloTransformId = getSLOTransformId(updatedSlo.id, updatedSlo.revision); + await this.repository.save(updatedSlo); try { await this.transformManager.install(updatedSlo); } catch (err) { await this.repository.save(originalSlo); - await this.systemClient.enrich.executePolicy({ name: SLO_SUMMARY_ENRICH_POLICY_NAME }); throw err; } - const updatedSloTransformId = getSLOTransformId(updatedSlo.id, updatedSlo.revision); try { await this.transformManager.preview(updatedSloTransformId); await this.transformManager.start(updatedSloTransformId); @@ -78,7 +61,6 @@ export class UpdateSLO { await Promise.all([ this.transformManager.uninstall(updatedSloTransformId), this.repository.save(originalSlo), - this.systemClient.enrich.executePolicy({ name: SLO_SUMMARY_ENRICH_POLICY_NAME }), ]); throw err; diff --git a/x-pack/plugins/observability/tsconfig.json b/x-pack/plugins/observability/tsconfig.json index 2eeefa1b3165a..f2bd514a4c4ef 100644 --- a/x-pack/plugins/observability/tsconfig.json +++ b/x-pack/plugins/observability/tsconfig.json @@ -92,8 +92,10 @@ "@kbn/react-kibana-context-theme", "@kbn/shared-ux-link-redirect-app", "@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/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/packs/queries/ecs_mapping_editor_field.tsx b/x-pack/plugins/osquery/public/packs/queries/ecs_mapping_editor_field.tsx index 9015836a93bcb..51f046768afac 100644 --- a/x-pack/plugins/osquery/public/packs/queries/ecs_mapping_editor_field.tsx +++ b/x-pack/plugins/osquery/public/packs/queries/ecs_mapping_editor_field.tsx @@ -47,8 +47,8 @@ import { convertECSMappingToArray, convertECSMappingToObject, } from '../../../common/utils/converters'; -import ECSSchema from '../../common/schemas/ecs/v8.7.0.json'; -import osquerySchema from '../../common/schemas/osquery/v5.7.0.json'; +import ECSSchema from '../../common/schemas/ecs/v8.11.0.json'; +import osquerySchema from '../../common/schemas/osquery/v5.10.2.json'; import { FieldIcon } from '../../common/lib/kibana'; import { OsqueryIcon } from '../../components/osquery_icon'; diff --git a/x-pack/plugins/security/public/management/role_mappings/role_mappings_management_app.test.tsx b/x-pack/plugins/security/public/management/role_mappings/role_mappings_management_app.test.tsx index 2f0910627be9b..8e11a1929ca16 100644 --- a/x-pack/plugins/security/public/management/role_mappings/role_mappings_management_app.test.tsx +++ b/x-pack/plugins/security/public/management/role_mappings/role_mappings_management_app.test.tsx @@ -89,7 +89,7 @@ describe('roleMappingsManagementApp', () => { expect(docTitle.reset).not.toHaveBeenCalled(); expect(container).toMatchInlineSnapshot(`
    - Role Mappings Page: {"notifications":{"toasts":{}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/","search":"","hash":""}},"readOnly":false} + Role Mappings Page: {"notifications":{"toasts":{}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/","search":"","hash":""}},"readOnly":false}
    `); @@ -111,7 +111,7 @@ describe('roleMappingsManagementApp', () => { expect(docTitle.reset).not.toHaveBeenCalled(); expect(container).toMatchInlineSnapshot(`
    - Role Mappings Page: {"notifications":{"toasts":{}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/","search":"","hash":""}},"readOnly":true} + Role Mappings Page: {"notifications":{"toasts":{}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/","search":"","hash":""}},"readOnly":true}
    `); @@ -136,7 +136,7 @@ describe('roleMappingsManagementApp', () => { expect(docTitle.reset).not.toHaveBeenCalled(); expect(container).toMatchInlineSnapshot(`
    - Role Mapping Edit Page: {"action":"edit","roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"notifications":{"toasts":{}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit","search":"","hash":""}},"readOnly":false} + Role Mapping Edit Page: {"action":"edit","roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"notifications":{"toasts":{}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit","search":"","hash":""}},"readOnly":false}
    `); @@ -166,7 +166,7 @@ describe('roleMappingsManagementApp', () => { expect(docTitle.reset).not.toHaveBeenCalled(); expect(container).toMatchInlineSnapshot(`
    - Role Mapping Edit Page: {"action":"edit","name":"role@mapping","roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"notifications":{"toasts":{}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit/role@mapping","search":"","hash":""}},"readOnly":false} + Role Mapping Edit Page: {"action":"edit","name":"role@mapping","roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"notifications":{"toasts":{}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit/role@mapping","search":"","hash":""}},"readOnly":false}
    `); @@ -197,7 +197,7 @@ describe('roleMappingsManagementApp', () => { expect(docTitle.reset).not.toHaveBeenCalled(); expect(container).toMatchInlineSnapshot(`
    - Role Mapping Edit Page: {"action":"edit","name":"role@mapping","roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"notifications":{"toasts":{}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit/role@mapping","search":"","hash":""}},"readOnly":true} + Role Mapping Edit Page: {"action":"edit","name":"role@mapping","roleMappingsAPI":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"notifications":{"toasts":{}},"docLinks":{},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit/role@mapping","search":"","hash":""}},"readOnly":true}
    `); diff --git a/x-pack/plugins/security/public/management/roles/roles_management_app.test.tsx b/x-pack/plugins/security/public/management/roles/roles_management_app.test.tsx index 5e9d5fcc56350..300f5e195b510 100644 --- a/x-pack/plugins/security/public/management/roles/roles_management_app.test.tsx +++ b/x-pack/plugins/security/public/management/roles/roles_management_app.test.tsx @@ -90,7 +90,7 @@ describe('rolesManagementApp', () => { expect(docTitle.reset).not.toHaveBeenCalled(); expect(container).toMatchInlineSnapshot(`
    - Roles Page: {"notifications":{"toasts":{}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/","search":"","hash":""}},"readOnly":false} + Roles Page: {"notifications":{"toasts":{}},"rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/","search":"","hash":""}},"readOnly":false}
    `); @@ -112,7 +112,7 @@ describe('rolesManagementApp', () => { expect(docTitle.reset).not.toHaveBeenCalled(); expect(container).toMatchInlineSnapshot(`
    - Role Edit Page: {"action":"edit","rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"userAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"indicesAPIClient":{"fieldCache":{},"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"privilegesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}},"notifications":{"toasts":{}},"fatalErrors":{},"license":{"features$":{}},"docLinks":{},"uiCapabilities":{"catalogue":{},"management":{},"navLinks":{},"roles":{"save":true}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit","search":"","hash":""}}} + Role Edit Page: {"action":"edit","rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"userAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"indicesAPIClient":{"fieldCache":{},"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"privilegesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}},"notifications":{"toasts":{}},"fatalErrors":{},"license":{"features$":{}},"docLinks":{},"uiCapabilities":{"catalogue":{},"management":{},"navLinks":{},"roles":{"save":true}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit","search":"","hash":""}}}
    `); @@ -139,7 +139,7 @@ describe('rolesManagementApp', () => { expect(docTitle.reset).not.toHaveBeenCalled(); expect(container).toMatchInlineSnapshot(`
    - Role Edit Page: {"action":"edit","roleName":"role@name","rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"userAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"indicesAPIClient":{"fieldCache":{},"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"privilegesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}},"notifications":{"toasts":{}},"fatalErrors":{},"license":{"features$":{}},"docLinks":{},"uiCapabilities":{"catalogue":{},"management":{},"navLinks":{},"roles":{"save":true}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit/role@name","search":"","hash":""}}} + Role Edit Page: {"action":"edit","roleName":"role@name","rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"userAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"indicesAPIClient":{"fieldCache":{},"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"privilegesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}},"notifications":{"toasts":{}},"fatalErrors":{},"license":{"features$":{}},"docLinks":{},"uiCapabilities":{"catalogue":{},"management":{},"navLinks":{},"roles":{"save":true}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/edit/role@name","search":"","hash":""}}}
    `); @@ -166,7 +166,7 @@ describe('rolesManagementApp', () => { expect(docTitle.reset).not.toHaveBeenCalled(); expect(container).toMatchInlineSnapshot(`
    - Role Edit Page: {"action":"clone","roleName":"someRoleName","rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"userAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"indicesAPIClient":{"fieldCache":{},"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"privilegesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}}},"http":{"basePath":{"basePath":"","serverBasePath":""},"anonymousPaths":{},"externalUrl":{}},"notifications":{"toasts":{}},"fatalErrors":{},"license":{"features$":{}},"docLinks":{},"uiCapabilities":{"catalogue":{},"management":{},"navLinks":{},"roles":{"save":true}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/clone/someRoleName","search":"","hash":""}}} + Role Edit Page: {"action":"clone","roleName":"someRoleName","rolesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"userAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"indicesAPIClient":{"fieldCache":{},"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"privilegesAPIClient":{"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}}},"http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}},"notifications":{"toasts":{}},"fatalErrors":{},"license":{"features$":{}},"docLinks":{},"uiCapabilities":{"catalogue":{},"management":{},"navLinks":{},"roles":{"save":true}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/clone/someRoleName","search":"","hash":""}}}
    `); diff --git a/x-pack/plugins/security/public/session/unauthorized_response_http_interceptor.test.ts b/x-pack/plugins/security/public/session/unauthorized_response_http_interceptor.test.ts index 7f3f0d57d449c..202d1b2d578c6 100644 --- a/x-pack/plugins/security/public/session/unauthorized_response_http_interceptor.test.ts +++ b/x-pack/plugins/security/public/session/unauthorized_response_http_interceptor.test.ts @@ -8,6 +8,7 @@ // @ts-ignore import fetchMock from 'fetch-mock/es5/client'; +import type { HttpSetup } from '@kbn/core/public'; import { applicationServiceMock } from '@kbn/core/public/mocks'; import { setup } from '@kbn/core-test-helpers-http-setup-browser'; @@ -30,7 +31,7 @@ const setupHttp = (basePath: string) => { const { http } = setup((injectedMetadata) => { injectedMetadata.getBasePath.mockReturnValue(basePath); }); - return http; + return http as HttpSetup; }; const tenant = ''; const application = applicationServiceMock.createStartContract(); 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/assistant/get_comments/index.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx index 9c547b3033112..3b778013a42d1 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 @@ -124,6 +124,7 @@ export const getComments = ({ amendMessage={amendMessageOfConversation} index={index} isLastComment={isLastComment} + isError={message.isError} reader={message.reader} regenerateMessage={regenerateMessageOfConversation} transformMessage={transformMessage} diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/index.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/index.tsx index db394f39bfa32..219a8565481cf 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/index.tsx +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/index.tsx @@ -17,6 +17,7 @@ import { MessageText } from './message_text'; interface Props { amendMessage: (message: string) => void; content?: string; + isError?: boolean; isFetching?: boolean; isLastComment: boolean; index: number; @@ -29,6 +30,7 @@ export const StreamComment = ({ amendMessage, content, index, + isError = false, isFetching = false, isLastComment, reader, @@ -39,6 +41,7 @@ export const StreamComment = ({ amendMessage, content, reader, + isError, }); const currentState = useRef({ isStreaming, pendingMessage, amendMessage }); 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 9a63621021cc3..764db1b3990ae 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 @@ -5,7 +5,8 @@ * 2.0. */ import { getStreamObservable } from './stream_observable'; -// import { getReaderValue, mockUint8Arrays } from './mock'; +import { API_ERROR } from '../translations'; + import type { PromptObservableState } from './types'; import { Subject } from 'rxjs'; describe('getStreamObservable', () => { @@ -27,41 +28,23 @@ describe('getStreamObservable', () => { const expectedStates: PromptObservableState[] = [ { chunks: [], loading: true }, { - chunks: [ - { - id: '1', - object: 'chunk', - created: 1635633600000, - model: 'model-1', - choices: [ - { - index: 0, - delta: { role: 'role-1', content: 'content-1' }, - finish_reason: null, - }, - ], - }, - ], - message: 'content-1', + chunks: ['one chunk ', 'another chunk', ''], + message: 'one chunk ', loading: true, }, { - chunks: [ - { - id: '1', - object: 'chunk', - created: 1635633600000, - model: 'model-1', - choices: [ - { - index: 0, - delta: { role: 'role-1', content: 'content-1' }, - finish_reason: null, - }, - ], - }, - ], - message: 'content-1', + chunks: ['one chunk ', 'another chunk', ''], + message: 'one chunk another chunk', + loading: true, + }, + { + chunks: ['one chunk ', 'another chunk', ''], + message: 'one chunk another chunk', + loading: true, + }, + { + chunks: ['one chunk ', 'another chunk', ''], + message: 'one chunk another chunk', loading: false, }, ]; @@ -69,23 +52,67 @@ describe('getStreamObservable', () => { mockReader.read .mockResolvedValueOnce({ done: false, - value: new Uint8Array( - new TextEncoder().encode(`data: ${JSON.stringify(expectedStates[1].chunks[0])}`) - ), + value: new Uint8Array(new TextEncoder().encode(`one chunk `)), + }) + .mockResolvedValueOnce({ + done: false, + value: new Uint8Array(new TextEncoder().encode(`another chunk`)), }) .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode(``)), + value: new Uint8Array(new TextEncoder().encode('')), }) + .mockResolvedValue({ + done: true, + }); + + const source = getStreamObservable(typedReader, setLoading, false); + const emittedStates: PromptObservableState[] = []; + + source.subscribe({ + next: (state) => 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 stream errors when reader contains errors', (done) => { + const completeSubject = new Subject(); + const expectedStates: PromptObservableState[] = [ + { chunks: [], loading: true }, + { + chunks: [`${API_ERROR}\n\nis an error`], + message: `${API_ERROR}\n\nis an error`, + loading: true, + }, + { + chunks: [`${API_ERROR}\n\nis an error`], + message: `${API_ERROR}\n\nis an error`, + loading: false, + }, + ]; + + mockReader.read .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode('data: [DONE]\n')), + value: new Uint8Array(new TextEncoder().encode(JSON.stringify({ message: 'is an error' }))), }) .mockResolvedValue({ done: true, }); - const source = getStreamObservable(typedReader, setLoading); + const source = getStreamObservable(typedReader, setLoading, true); const emittedStates: PromptObservableState[] = []; source.subscribe({ @@ -111,7 +138,7 @@ describe('getStreamObservable', () => { const error = new Error('Test Error'); // Simulate an error mockReader.read.mockRejectedValue(error); - const source = getStreamObservable(typedReader, setLoading); + const source = getStreamObservable(typedReader, setLoading, false); source.subscribe({ next: (state) => {}, 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 83f9b4cf8ead3..b30be69b82cae 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 @@ -5,26 +5,29 @@ * 2.0. */ -import { concatMap, delay, finalize, Observable, of, scan, shareReplay, timestamp } from 'rxjs'; +import { concatMap, delay, finalize, Observable, of, scan, timestamp } from 'rxjs'; import type { Dispatch, SetStateAction } from 'react'; -import type { PromptObservableState, Chunk } from './types'; - +import { API_ERROR } from '../translations'; +import type { PromptObservableState } from './types'; const MIN_DELAY = 35; + /** * Returns an Observable that reads data from a ReadableStream and emits values representing the state of the data processing. * * @param reader - The ReadableStreamDefaultReader used to read data from the stream. * @param setLoading - A function to update the loading state. + * @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> + setLoading: Dispatch>, + isError: boolean ): Observable => new Observable((observer) => { observer.next({ chunks: [], loading: true }); const decoder = new TextDecoder(); - const chunks: Chunk[] = []; + const chunks: string[] = []; function read() { reader .read() @@ -39,23 +42,17 @@ export const getStreamObservable = ( observer.complete(); return; } - - const nextChunks: Chunk[] = decoder - .decode(value) - .split('\n') - // every line starts with "data: ", we remove it and are left with stringified JSON or the string "[DONE]" - .map((str) => str.substring(6)) - // filter out empty lines and the "[DONE]" string - .filter((str) => !!str && str !== '[DONE]') - .map((line) => JSON.parse(line)); - - nextChunks.forEach((chunk) => { - chunks.push(chunk); - observer.next({ - chunks, - message: getMessageFromChunks(chunks), - loading: true, - }); + 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, }); } catch (err) { observer.error(err); @@ -72,9 +69,6 @@ export const getStreamObservable = ( reader.cancel(); }; }).pipe( - // make sure the request is only triggered once, - // even with multiple subscribers - shareReplay(1), // append a timestamp of when each value was emitted timestamp(), // use the previous timestamp to calculate a target @@ -105,8 +99,8 @@ export const getStreamObservable = ( finalize(() => setLoading(false)) ); -function getMessageFromChunks(chunks: Chunk[]) { - return chunks.map((chunk) => chunk.choices[0]?.delta.content ?? '').join(''); +function getMessageFromChunks(chunks: string[]) { + return chunks.join(''); } export const getPlaceholderObservable = () => new Observable(); diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/types.ts b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/types.ts index 3cf45852ddb11..80ef5e4ae6eda 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/types.ts +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/types.ts @@ -6,20 +6,8 @@ */ export interface PromptObservableState { - chunks: Chunk[]; + chunks: string[]; message?: string; error?: string; loading: boolean; } -export interface ChunkChoice { - index: 0; - delta: { role: string; content: string }; - finish_reason: null | string; -} -export interface Chunk { - id: string; - object: string; - created: number; - model: string; - choices: ChunkChoice[]; -} 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 4fbecfac870e1..efbc61999f2cc 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,32 +11,20 @@ import { useStream } from './use_stream'; const amendMessage = jest.fn(); const reader = jest.fn(); const cancel = jest.fn(); -const exampleChunk = { - id: '1', - object: 'chunk', - created: 1635633600000, - model: 'model-1', - choices: [ - { - index: 0, - delta: { role: 'role-1', content: 'content-1' }, - finish_reason: null, - }, - ], -}; + const readerComplete = { read: reader .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode(`data: ${JSON.stringify(exampleChunk)}`)), + value: new Uint8Array(new TextEncoder().encode('one chunk ')), }) .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode(``)), + value: new Uint8Array(new TextEncoder().encode(`another chunk`)), }) .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode('data: [DONE]\n')), + value: new Uint8Array(new TextEncoder().encode(``)), }) .mockResolvedValue({ done: true, @@ -46,7 +34,7 @@ const readerComplete = { closed: jest.fn().mockResolvedValue(true), } as unknown as ReadableStreamDefaultReader; -const defaultProps = { amendMessage, reader: readerComplete }; +const defaultProps = { amendMessage, reader: readerComplete, isError: false }; describe('useStream', () => { beforeEach(() => { jest.clearAllMocks(); @@ -69,7 +57,7 @@ describe('useStream', () => { error: undefined, isLoading: true, isStreaming: true, - pendingMessage: 'content-1', + pendingMessage: 'one chunk ', setComplete: expect.any(Function), }); }); @@ -79,7 +67,7 @@ describe('useStream', () => { error: undefined, isLoading: false, isStreaming: false, - pendingMessage: 'content-1', + pendingMessage: 'one chunk another chunk', setComplete: expect.any(Function), }); }); @@ -104,7 +92,7 @@ describe('useStream', () => { .fn() .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode(`data: ${JSON.stringify(exampleChunk)}`)), + value: new Uint8Array(new TextEncoder().encode(`one chunk`)), }) .mockRejectedValue(new Error(errorMessage)), cancel, @@ -113,7 +101,7 @@ describe('useStream', () => { } as unknown as ReadableStreamDefaultReader; const { result, waitForNextUpdate } = renderHook(() => useStream({ - amendMessage, + ...defaultProps, reader: errorReader, }) ); 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 148338f2afafa..7de06589f87c7 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 @@ -12,6 +12,7 @@ import { getPlaceholderObservable, getStreamObservable } from './stream_observab interface UseStreamProps { amendMessage: (message: string) => void; + isError: boolean; content?: string; reader?: ReadableStreamDefaultReader; } @@ -33,8 +34,14 @@ interface UseStream { * @param amendMessage - handles the amended message * @param content - the content of the message. If provided, the function will not use the reader to stream data. * @param reader - The readable stream reader used to stream data. If provided, the function will use this reader to stream data. + * @param isError - indicates whether the reader response is an error message or not */ -export const useStream = ({ amendMessage, content, reader }: UseStreamProps): UseStream => { +export const useStream = ({ + amendMessage, + content, + reader, + isError, +}: UseStreamProps): UseStream => { const [pendingMessage, setPendingMessage] = useState(); const [loading, setLoading] = useState(false); const [error, setError] = useState(); @@ -42,9 +49,9 @@ export const useStream = ({ amendMessage, content, reader }: UseStreamProps): Us const observer$ = useMemo( () => content == null && reader != null - ? getStreamObservable(reader, setLoading) + ? getStreamObservable(reader, setLoading, isError) : getPlaceholderObservable(), - [content, reader] + [content, isError, reader] ); const onCompleteStream = useCallback(() => { subscription?.unsubscribe(); diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/translations.ts b/x-pack/plugins/security_solution/public/assistant/get_comments/translations.ts index 2b83d580ef2cd..fbccef68f7398 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/translations.ts +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/translations.ts @@ -20,3 +20,7 @@ export const AT = (timestamp: string) => export const YOU = i18n.translate('xpack.securitySolution.assistant.getComments.you', { defaultMessage: 'You', }); + +export const API_ERROR = i18n.translate('xpack.securitySolution.assistant.apiErrorTitle', { + defaultMessage: 'An error occurred sending your 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/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/visualization_actions/actions.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/actions.tsx index 0825aacfee410..5527e0eca44d6 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/actions.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/actions.tsx @@ -10,6 +10,7 @@ import type { Action, ActionExecutionContext } from '@kbn/ui-actions-plugin/publ import React, { useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; +import type { LensEmbeddableInput } from '@kbn/lens-plugin/public'; import { InputsModelId } from '../../store/inputs/constants'; import { useKibana } from '../../lib/kibana/kibana_react'; import { ModalInspectQuery } from '../inspect/modal'; @@ -18,6 +19,7 @@ import { useInspect } from '../inspect/use_inspect'; import { useLensAttributes } from './use_lens_attributes'; import { useAddToExistingCase } from './use_add_to_existing_case'; import { useAddToNewCase } from './use_add_to_new_case'; +import { useSaveToLibrary } from './use_save_to_library'; import type { VisualizationActionsProps } from './types'; import { ADD_TO_EXISTING_CASE, @@ -25,9 +27,11 @@ import { INSPECT, MORE_ACTIONS, OPEN_IN_LENS, + ADDED_TO_LIBRARY, } from './translations'; import { VISUALIZATION_ACTIONS_BUTTON_CLASS } from './utils'; import { SourcererScopeName } from '../../store/sourcerer/model'; +import { useAppToasts } from '../../hooks/use_app_toasts'; const Wrapper = styled.div` &.viz-actions { @@ -62,9 +66,19 @@ const VisualizationActionsComponent: React.FC = ({ }) => { const { lens } = useKibana().services; - const { canUseEditor, navigateToPrefilledEditor } = lens; + const { canUseEditor, navigateToPrefilledEditor, SaveModalComponent } = lens; const [isPopoverOpen, setPopover] = useState(false); const [isInspectModalOpen, setIsInspectModalOpen] = useState(false); + const [isSaveModalVisible, setIsSaveModalVisible] = useState(false); + const { addSuccess } = useAppToasts(); + const onSave = useCallback(() => { + setIsSaveModalVisible(false); + addSuccess(ADDED_TO_LIBRARY); + }, [addSuccess]); + const onClose = useCallback(() => { + setIsSaveModalVisible(false); + }, []); + const hasPermission = canUseEditor(); const onButtonClick = useCallback(() => { setPopover(!isPopoverOpen); @@ -116,6 +130,10 @@ const VisualizationActionsComponent: React.FC = ({ ); }, [attributes, navigateToPrefilledEditor, timerange]); + const { openSaveVisualizationFlyout, disableVisualizations } = useSaveToLibrary({ + attributes, + }); + const onOpenInspectModal = useCallback(() => { closePopover(); setIsInspectModalOpen(true); @@ -146,11 +164,6 @@ const VisualizationActionsComponent: React.FC = ({ queryId, }); - const disabledOpenInLens = useMemo( - () => !canUseEditor() || attributes == null, - [attributes, canUseEditor] - ); - const items = useMemo(() => { const context = {} as ActionExecutionContext; const extraActionsItems = @@ -197,11 +210,24 @@ const VisualizationActionsComponent: React.FC = ({ > {ADD_TO_EXISTING_CASE} , + ...(hasPermission + ? [ + + {ADDED_TO_LIBRARY} + , + ] + : []), {OPEN_IN_LENS} @@ -210,8 +236,9 @@ const VisualizationActionsComponent: React.FC = ({ : []), ]; }, [ + hasPermission, disableInspectButton, - disabledOpenInLens, + disableVisualizations, extraActions, handleInspectButtonClick, isAddToExistingCaseDisabled, @@ -219,6 +246,7 @@ const VisualizationActionsComponent: React.FC = ({ onAddToExistingCaseClicked, onAddToNewCaseClicked, onOpenInLens, + openSaveVisualizationFlyout, withDefaultActions, ]); @@ -261,6 +289,13 @@ const VisualizationActionsComponent: React.FC = ({ title={inspectTitle} /> )} + {isSaveModalVisible && hasPermission && ( + + )} ); }; diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.ts index a444d479d2ba0..013a05c840fbf 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.ts @@ -6,8 +6,8 @@ */ import { - AUTHENCICATION_FAILURE_CHART_LABEL, - AUTHENCICATION_SUCCESS_CHART_LABEL, + AUTHENTICATION_FAILURE_CHART_LABEL, + AUTHENTICATION_SUCCESS_CHART_LABEL, } from '../../translations'; import type { LensAttributes } from '../../types'; @@ -115,7 +115,7 @@ export const authenticationLensAttributes: LensAttributes = { }, }, '5417777d-d9d9-4268-9cdc-eb29b873bd65': { - label: AUTHENCICATION_SUCCESS_CHART_LABEL, + label: AUTHENTICATION_SUCCESS_CHART_LABEL, dataType: 'number', operationType: 'count', isBucketed: false, @@ -148,7 +148,7 @@ export const authenticationLensAttributes: LensAttributes = { }, }, 'a3bf9dc1-c8d2-42d6-9e60-31892a4c509e': { - label: AUTHENCICATION_FAILURE_CHART_LABEL, + label: AUTHENTICATION_FAILURE_CHART_LABEL, dataType: 'number', operationType: 'count', isBucketed: false, 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..943bf4dab0d80 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 @@ -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'; @@ -218,11 +218,6 @@ const LensEmbeddableComponent: React.FC = ({ [attributes?.state?.adHocDataViews] ); - const shouldShowLegendAction = useCallback( - (actionId: string) => showLegendActionsByActionId({ actionId, scopeId }), - [scopeId] - ); - if (!searchSessionId) { return null; } @@ -286,7 +281,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/translations.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/translations.ts index 8f21d61bc869b..2e6e6d2b8f3ef 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/translations.ts @@ -67,7 +67,7 @@ export const SUCCESS_CHART_LABEL = i18n.translate( } ); -export const AUTHENCICATION_SUCCESS_CHART_LABEL = i18n.translate( +export const AUTHENTICATION_SUCCESS_CHART_LABEL = i18n.translate( 'xpack.securitySolution.visualizationActions.userAuthentications.authentication.successChartLabel', { defaultMessage: 'Success', @@ -81,7 +81,7 @@ export const FAIL_CHART_LABEL = i18n.translate( } ); -export const AUTHENCICATION_FAILURE_CHART_LABEL = i18n.translate( +export const AUTHENTICATION_FAILURE_CHART_LABEL = i18n.translate( 'xpack.securitySolution.visualizationActions.userAuthentications.authentication.failureChartLabel', { defaultMessage: 'Failure', @@ -111,3 +111,10 @@ export const COUNT_OF = (field: string) => values: { field }, defaultMessage: 'Count of {field}', }); + +export const ADDED_TO_LIBRARY = i18n.translate( + 'xpack.securitySolution.visualizationActions.addedToLibrary', + { + defaultMessage: 'Added to library', + } +); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.test.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.test.tsx index 0de49b52d66ff..273e4d89d1d7a 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.test.tsx @@ -6,9 +6,13 @@ */ import { renderHook } from '@testing-library/react-hooks'; +import React from 'react'; +import { NavigationProvider } from '@kbn/security-solution-navigation'; import { useKibana } from '../../lib/kibana/kibana_react'; import { mockAttributes } from './mocks'; import { useActions } from './use_actions'; +import { coreMock } from '@kbn/core/public/mocks'; +import { TestProviders } from '../../mock'; jest.mock('./use_add_to_existing_case', () => { return { @@ -32,6 +36,12 @@ jest.mock('../../lib/kibana/kibana_react', () => { }; }); +const coreStart = coreMock.createStart(); +const wrapper = ({ children }: { children: React.ReactNode }) => ( + + {children} + +); describe(`useActions`, () => { const mockNavigateToPrefilledEditor = jest.fn(); beforeAll(() => { @@ -39,6 +49,15 @@ describe(`useActions`, () => { services: { lens: { navigateToPrefilledEditor: mockNavigateToPrefilledEditor, + canUseEditor: jest.fn().mockReturnValue(true), + SaveModalComponent: jest + .fn() + .mockReturnValue(() =>
    ), + }, + notifications: { + toasts: { + addWarning: jest.fn(), + }, }, }, }); @@ -49,29 +68,34 @@ describe(`useActions`, () => { }); it('should render actions', () => { - const { result } = renderHook(() => - useActions({ - withActions: true, - attributes: mockAttributes, - timeRange: { - from: '2022-10-26T23:00:00.000Z', - to: '2022-11-03T15:16:50.053Z', - }, - inspectActionProps: { - onInspectActionClicked: jest.fn(), - isDisabled: false, - }, - }) + const { result } = renderHook( + () => + useActions({ + withActions: true, + attributes: mockAttributes, + timeRange: { + from: '2022-10-26T23:00:00.000Z', + to: '2022-11-03T15:16:50.053Z', + }, + inspectActionProps: { + onInspectActionClicked: jest.fn(), + isDisabled: false, + }, + }), + { + wrapper, + } ); - expect(result.current[0].id).toEqual('inspect'); expect(result.current[0].order).toEqual(4); expect(result.current[1].id).toEqual('addToNewCase'); expect(result.current[1].order).toEqual(3); expect(result.current[2].id).toEqual('addToExistingCase'); expect(result.current[2].order).toEqual(2); - expect(result.current[3].id).toEqual('openInLens'); + expect(result.current[3].id).toEqual('saveToLibrary'); expect(result.current[3].order).toEqual(1); + expect(result.current[4].id).toEqual('openInLens'); + expect(result.current[4].order).toEqual(0); }); it('should render extra actions if available', () => { @@ -92,31 +116,37 @@ describe(`useActions`, () => { order: 0, }, ]; - const { result } = renderHook(() => - useActions({ - withActions: true, - attributes: mockAttributes, - timeRange: { - from: '2022-10-26T23:00:00.000Z', - to: '2022-11-03T15:16:50.053Z', - }, - inspectActionProps: { - onInspectActionClicked: jest.fn(), - isDisabled: false, - }, - extraActions: mockExtraAction, - }) + const { result } = renderHook( + () => + useActions({ + withActions: true, + attributes: mockAttributes, + timeRange: { + from: '2022-10-26T23:00:00.000Z', + to: '2022-11-03T15:16:50.053Z', + }, + inspectActionProps: { + onInspectActionClicked: jest.fn(), + isDisabled: false, + }, + extraActions: mockExtraAction, + }), + { + wrapper, + } ); expect(result.current[0].id).toEqual('inspect'); - expect(result.current[0].order).toEqual(4); + expect(result.current[0].order).toEqual(5); expect(result.current[1].id).toEqual('addToNewCase'); - expect(result.current[1].order).toEqual(3); + expect(result.current[1].order).toEqual(4); expect(result.current[2].id).toEqual('addToExistingCase'); - expect(result.current[2].order).toEqual(2); - expect(result.current[3].id).toEqual('openInLens'); - expect(result.current[3].order).toEqual(1); - expect(result.current[4].id).toEqual('mockExtraAction'); - expect(result.current[4].order).toEqual(0); + expect(result.current[2].order).toEqual(3); + expect(result.current[3].id).toEqual('saveToLibrary'); + expect(result.current[3].order).toEqual(2); + expect(result.current[4].id).toEqual('openInLens'); + expect(result.current[4].order).toEqual(1); + expect(result.current[5].id).toEqual('mockExtraAction'); + expect(result.current[5].order).toEqual(0); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.ts index 08f8cd63f7673..760d9e396584e 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.ts @@ -10,8 +10,14 @@ import type { Action, ActionExecutionContext } from '@kbn/ui-actions-plugin/publ import { useKibana } from '../../lib/kibana/kibana_react'; import { useAddToExistingCase } from './use_add_to_existing_case'; import { useAddToNewCase } from './use_add_to_new_case'; +import { useSaveToLibrary } from './use_save_to_library'; -import { ADD_TO_EXISTING_CASE, ADD_TO_NEW_CASE, OPEN_IN_LENS } from './translations'; +import { + ADDED_TO_LIBRARY, + ADD_TO_EXISTING_CASE, + ADD_TO_NEW_CASE, + OPEN_IN_LENS, +} from './translations'; import type { LensAttributes } from './types'; import { INSPECT } from '../inspect/translations'; @@ -36,6 +42,7 @@ export const useActions = ({ 'inspect', 'addToNewCase', 'addToExistingCase', + 'saveToLibrary', 'openInLens', ]); @@ -72,6 +79,7 @@ export const useActions = ({ lensAttributes: attributes, }); + const { openSaveVisualizationFlyout, disableVisualizations } = useSaveToLibrary({ attributes }); const actions = useMemo( () => defaultActions?.reduce((acc, action) => { @@ -106,6 +114,16 @@ export const useActions = ({ return [...acc, getOpenInLensAction({ callback: onOpenInLens })]; } + if (action === 'saveToLibrary') { + return [ + ...acc, + getSaveToLibraryAction({ + callback: openSaveVisualizationFlyout, + disabled: disableVisualizations, + }), + ]; + } + return acc; }, []), [ @@ -116,10 +134,18 @@ export const useActions = ({ onAddToNewCaseClicked, isAddToNewCaseDisabled, onOpenInLens, + openSaveVisualizationFlyout, + disableVisualizations, ] ); - const withExtraActions = actions.concat(extraActions ?? []); + const withExtraActions = actions.concat(extraActions ?? []).map((a, i, totalActions) => { + const order = Math.max(totalActions.length - (1 + i), 0); + return { + ...a, + order, + }; + }); return withExtraActions; }; @@ -141,11 +167,38 @@ const getOpenInLensAction = ({ callback }: { callback: () => void }): Action => async execute(context: ActionExecutionContext): Promise { callback(); }, + order: 0, + }; +}; + +const getSaveToLibraryAction = ({ + callback, + disabled, +}: { + callback: () => void; + disabled?: boolean; +}): Action => { + return { + id: 'saveToLibrary', + getDisplayName(context: ActionExecutionContext): string { + return ADDED_TO_LIBRARY; + }, + getIconType(context: ActionExecutionContext): string | undefined { + return 'save'; + }, + type: 'actionButton', + async isCompatible(context: ActionExecutionContext): Promise { + return true; + }, + async execute(context: ActionExecutionContext): Promise { + callback(); + }, + disabled, order: 1, }; }; -const getAddToNewCaseAction = ({ +const getAddToExistingCaseAction = ({ callback, disabled, }: { @@ -153,9 +206,9 @@ const getAddToNewCaseAction = ({ disabled?: boolean; }): Action => { return { - id: 'addToNewCase', + id: 'addToExistingCase', getDisplayName(context: ActionExecutionContext): string { - return ADD_TO_NEW_CASE; + return ADD_TO_EXISTING_CASE; }, getIconType(context: ActionExecutionContext): string | undefined { return 'casesApp'; @@ -168,11 +221,11 @@ const getAddToNewCaseAction = ({ callback(); }, disabled, - order: 3, + order: 2, }; }; -const getInspectAction = ({ +const getAddToNewCaseAction = ({ callback, disabled, }: { @@ -180,12 +233,12 @@ const getInspectAction = ({ disabled?: boolean; }): Action => { return { - id: 'inspect', + id: 'addToNewCase', getDisplayName(context: ActionExecutionContext): string { - return INSPECT; + return ADD_TO_NEW_CASE; }, getIconType(context: ActionExecutionContext): string | undefined { - return 'inspect'; + return 'casesApp'; }, type: 'actionButton', async isCompatible(context: ActionExecutionContext): Promise { @@ -195,11 +248,11 @@ const getInspectAction = ({ callback(); }, disabled, - order: 4, + order: 3, }; }; -const getAddToExistingCaseAction = ({ +const getInspectAction = ({ callback, disabled, }: { @@ -207,12 +260,12 @@ const getAddToExistingCaseAction = ({ disabled?: boolean; }): Action => { return { - id: 'addToExistingCase', + id: 'inspect', getDisplayName(context: ActionExecutionContext): string { - return ADD_TO_EXISTING_CASE; + return INSPECT; }, getIconType(context: ActionExecutionContext): string | undefined { - return 'casesApp'; + return 'inspect'; }, type: 'actionButton', async isCompatible(context: ActionExecutionContext): Promise { @@ -222,6 +275,6 @@ const getAddToExistingCaseAction = ({ callback(); }, disabled, - order: 2, + order: 4, }; }; diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_redirect_to_dashboard_from_lens.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_redirect_to_dashboard_from_lens.ts new file mode 100644 index 0000000000000..1aebf72217c5b --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_redirect_to_dashboard_from_lens.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMemo, useCallback } from 'react'; +import { SecurityPageName } from '../../../../common'; +import { useNavigateTo } from '../../lib/kibana'; +import type { GetSecuritySolutionUrl } from '../link_to'; + +export const useRedirectToDashboardFromLens = ({ + getSecuritySolutionUrl, +}: { + getSecuritySolutionUrl: GetSecuritySolutionUrl; +}) => { + const { navigateTo } = useNavigateTo(); + + const dashboardListingUrl = useMemo( + () => + `${getSecuritySolutionUrl({ + deepLinkId: SecurityPageName.dashboards, + })}`, + [getSecuritySolutionUrl] + ); + + const getEditOrCreateDashboardPath = useCallback( + (id: string | null | undefined) => (id != null && id !== 'new' ? `${id}/edit` : `/create`), + [] + ); + const getEditOrCreateDashboardUrl = useCallback( + (id: string | null | undefined) => + `${getSecuritySolutionUrl({ + deepLinkId: SecurityPageName.dashboards, + path: getEditOrCreateDashboardPath(id), + })}`, + [getEditOrCreateDashboardPath, getSecuritySolutionUrl] + ); + + const redirectTo = useCallback( + (props) => { + if (props.destination === 'listing') { + navigateTo({ url: dashboardListingUrl }); + } + if (props.destination === 'dashboard') { + navigateTo({ url: getEditOrCreateDashboardUrl(props.id) }); + } + }, + [dashboardListingUrl, getEditOrCreateDashboardUrl, navigateTo] + ); + + return { + redirectTo, + getEditOrCreateDashboardPath, + getEditOrCreateDashboardUrl, + dashboardListingUrl, + }; +}; diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_save_to_library.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_save_to_library.tsx new file mode 100644 index 0000000000000..158b30979881a --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_save_to_library.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 React, { useCallback, useMemo } from 'react'; +import { toMountPoint } from '@kbn/react-kibana-mount'; +import type { LensEmbeddableInput } from '@kbn/lens-plugin/public'; +import { unmountComponentAtNode } from 'react-dom'; +import type { SaveProps } from '@kbn/lens-plugin/public/plugin'; +import { useKibana } from '../../lib/kibana'; +import type { LensAttributes } from './types'; +import { useRedirectToDashboardFromLens } from './use_redirect_to_dashboard_from_lens'; +import { APP_UI_ID, SecurityPageName } from '../../../../common'; +import { useGetSecuritySolutionUrl } from '../link_to'; + +export const useSaveToLibrary = ({ + attributes, +}: { + attributes: LensAttributes | undefined | null; +}) => { + const { lens, theme, i18n } = useKibana().services; + const { SaveModalComponent, canUseEditor } = lens; + const getSecuritySolutionUrl = useGetSecuritySolutionUrl(); + const { redirectTo, getEditOrCreateDashboardPath } = useRedirectToDashboardFromLens({ + getSecuritySolutionUrl, + }); + + const openSaveVisualizationFlyout = useCallback(() => { + const targetDomElement = document.createElement('div'); + const mount = toMountPoint( + { + unmountComponentAtNode(targetDomElement); + }} + onClose={() => { + unmountComponentAtNode(targetDomElement); + }} + originatingApp={APP_UI_ID} + getOriginatingPath={(dashboardId) => + `${SecurityPageName.dashboards}/${getEditOrCreateDashboardPath(dashboardId)}` + } + redirectTo={redirectTo} + />, + { theme, i18n } + ); + + mount(targetDomElement); + }, [SaveModalComponent, attributes, getEditOrCreateDashboardPath, i18n, redirectTo, theme]); + + const disableVisualizations = useMemo( + () => !canUseEditor() || attributes == null, + [attributes, canUseEditor] + ); + + return { openSaveVisualizationFlyout, disableVisualizations }; +}; 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/store/inputs/selectors.ts b/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts index aee7d1957841d..b6ef6b0867504 100644 --- a/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts +++ b/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts @@ -13,6 +13,15 @@ import type { State } from '../types'; import type { InputsModel, InputsRange, GlobalQuery } from './model'; +const defaultQuery = { + id: 'kql', + inspect: null, + isInspected: false, + loading: false, + refetch: null, + selectedInspectIndex: 0, +}; + const selectInputs = (state: State): InputsModel => state.inputs; const selectGlobal = (state: State): InputsRange => state.inputs.global; @@ -24,25 +33,12 @@ const selectSocTrends = (state: State): InputsState['socTrends'] | undefined => state.inputs.socTrends; const selectGlobalQuery = (state: State, id: string): GlobalQuery => - state.inputs.global.queries.find((q) => q.id === id) || { - id: 'kql', - inspect: null, - isInspected: false, - loading: false, - refetch: null, - selectedInspectIndex: 0, - }; + state.inputs.global.queries.find((q) => q.id === id) || defaultQuery; const selectTimelineQuery = (state: State, id: string): GlobalQuery => state.inputs.timeline.queries.find((q) => q.id === id) || - state.inputs.global.queries.find((q) => q.id === id) || { - id: 'kql', - inspect: null, - isInspected: false, - loading: false, - refetch: null, - selectedInspectIndex: 0, - }; + state.inputs.global.queries.find((q) => q.id === id) || + defaultQuery; export const inputsSelector = () => createSelector(selectInputs, (inputs) => inputs); 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/alert_context_menu.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx index cb20b7910a929..741039c09e0e2 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx @@ -9,8 +9,7 @@ import React, { useCallback, useMemo, useState } from 'react'; import { EuiButtonIcon, EuiContextMenu, EuiPopover, EuiToolTip } from '@elastic/eui'; import { indexOf } from 'lodash'; -import type { ConnectedProps } from 'react-redux'; -import { connect } from 'react-redux'; +import { useSelector } from 'react-redux'; import { ExceptionListTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; import { get } from 'lodash/fp'; import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; @@ -63,7 +62,7 @@ interface AlertContextMenuProps { refetch: (() => void) | undefined; } -const AlertContextMenuComponent: React.FC = ({ +const AlertContextMenuComponent: React.FC = ({ ariaLabel = i18n.MORE_ACTIONS, ariaRowindex, columnValues, @@ -71,8 +70,6 @@ const AlertContextMenuComponent: React.FC { const [isPopoverOpen, setPopover] = useState(false); @@ -82,6 +79,11 @@ const AlertContextMenuComponent: React.FC inputsSelectors.globalQuery(), []); + const getTimelineQuery = useMemo(() => inputsSelectors.timelineQueryByIdSelector(), []); + const globalQuery = useSelector((state: State) => getGlobalQueries(state)); + const timelineQuery = useSelector((state: State) => getTimelineQuery(state, scopeId)); + const getAlertId = () => (ecsRowData?.kibana?.alert ? ecsRowData?._id : null); const alertId = getAlertId(); const ruleId = get(0, ecsRowData?.kibana?.alert?.rule?.uuid); @@ -323,23 +325,7 @@ const AlertContextMenuComponent: React.FC { - const getGlobalQueries = inputsSelectors.globalQuery(); - const getTimelineQuery = inputsSelectors.timelineQueryByIdSelector(); - const mapStateToProps = (state: State, { scopeId }: AlertContextMenuProps) => { - return { - globalQuery: getGlobalQueries(state), - timelineQuery: getTimelineQuery(state, scopeId), - }; - }; - return mapStateToProps; -}; - -const connector = connect(makeMapStateToProps); - -type PropsFromRedux = ConnectedProps; - -export const AlertContextMenu = connector(React.memo(AlertContextMenuComponent)); +export const AlertContextMenu = React.memo(AlertContextMenuComponent); type AddExceptionFlyoutWrapperProps = Omit< AddExceptionFlyoutProps, 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/flyout/document_details/left/components/host_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx index bdfb03639382c..3f68ef15956ed 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx @@ -195,7 +195,7 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s const relatedUsersCount = useMemo( () => ( - + diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx index daa58fc4d0379..1758bbc5b05d8 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx @@ -196,7 +196,7 @@ export const UserDetails: React.FC = ({ userName, timestamp, s const relatedHostsCount = useMemo( () => ( - + diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/preview/components/rule_preview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/preview/components/rule_preview.tsx index 6e4d9221421ee..6f679df0c5e9e 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/preview/components/rule_preview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/preview/components/rule_preview.tsx @@ -34,6 +34,14 @@ const panelViewStyle = css` font-size: 90% !important; } text-overflow: ellipsis; + .euiFlexGroup { + flex-wrap: inherit; + } + + .euiFlexItem { + inline-size: inherit; + flex-basis: inherit; + } `; /** 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 105d57ba4e7f6..0003a5cd2c123 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 @@ -98,7 +98,12 @@ export const Description: FC = () => { {isAlert ? ( - +
    { data-test-subj={INSIGHTS_ENTITIES_TEST_ID} > {userName || hostName ? ( - + {userName && ( 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 d67253061d1d1..1573f5ef33bcf 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 @@ -73,7 +73,7 @@ export const HeaderTitle: FC = memo(() => { {isAlert && !isEmpty(ruleName) ? ruleTitle : eventTitle} - + 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 fdc3edf96e9b8..58d9bf9d8a418 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 @@ -156,7 +156,7 @@ export const HostEntityOverview: React.FC = ({ hostName return [ { title: ( - + {HOST_RISK_LEVEL} @@ -177,9 +177,14 @@ export const HostEntityOverview: React.FC = ({ hostName }, [hostRisk]); return ( - + - + @@ -207,7 +212,7 @@ export const HostEntityOverview: React.FC = ({ hostName /> ) : ( - + = ({ const colorDataTestSubj = `${dataTestSubj}Color`; return ( - + - - - + data-test-subj={iconDataTestSubj} + aria-label={i18n.translate( + 'xpack.securitySolution.flyout.right.insights.insightSummaryButtonIconAriaLabel', + { + defaultMessage: 'Insight summary row icon', + } + )} + color="text" + display="empty" + type={icon} + size="m" + /> {
    {isAlert ? ( - - + +
    { } return ( - +

    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 cd1a057b6fbc0..81b1b75df57e9 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 @@ -155,7 +155,7 @@ export const UserEntityOverview: React.FC = ({ userName return [ { title: ( - + {USER_RISK_LEVEL} @@ -176,9 +176,14 @@ export const UserEntityOverview: React.FC = ({ userName }, [userRisk]); return ( - + - + @@ -206,7 +211,7 @@ export const UserEntityOverview: React.FC = ({ userName data-test-subj={ENTITIES_USER_OVERVIEW_LOADING_TEST_ID} /> ) : ( - + = ({ {expandable && children && toggleIcon} diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/get_processes_action.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/get_processes_action.tsx index fee7a2b73e815..095710e50466a 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/get_processes_action.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/get_processes_action.tsx @@ -22,16 +22,20 @@ const StyledEuiBasicTable = styled(EuiBasicTable)` table { background-color: transparent; } + .euiTableHeaderCell { border-bottom: ${(props) => props.theme.eui.euiBorderThin}; + .euiTableCellContent__text { font-weight: ${(props) => props.theme.eui.euiFontWeightRegular}; } } + .euiTableRow { &:hover { background-color: ${({ theme: { eui } }) => eui.euiColorEmptyShade} !important; } + .euiTableRowCell { border-top: none !important; border-bottom: none !important; @@ -71,6 +75,7 @@ export const GetProcessesActionResult = memo( () => [ { field: 'user', + 'data-test-subj': 'process_list_user', name: i18n.translate( 'xpack.securitySolution.endpointResponseActions.getProcesses.table.header.user', { defaultMessage: 'USER' } @@ -79,6 +84,7 @@ export const GetProcessesActionResult = memo( }, { field: 'pid', + 'data-test-subj': 'process_list_pid', name: i18n.translate( 'xpack.securitySolution.endpointResponseActions.getProcesses.table.header.pid', { defaultMessage: 'PID' } @@ -87,6 +93,7 @@ export const GetProcessesActionResult = memo( }, { field: 'entity_id', + 'data-test-subj': 'process_list_entity_id', name: i18n.translate( 'xpack.securitySolution.endpointResponseActions.getProcesses.table.header.enityId', { defaultMessage: 'ENTITY ID' } @@ -96,6 +103,7 @@ export const GetProcessesActionResult = memo( { field: 'command', + 'data-test-subj': 'process_list_command', name: i18n.translate( 'xpack.securitySolution.endpointResponseActions.getProcesses.table.header.command', { defaultMessage: 'COMMAND' } @@ -120,7 +128,11 @@ export const GetProcessesActionResult = memo( // Show results return ( - + ); } diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts index a50bdf394a9a1..c7120ded692b9 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { getRunningProcesses } from '../../../tasks/response_actions'; import type { PolicyData } from '../../../../../../common/endpoint/types'; import type { CreateAndEnrollEndpointHostResponse } from '../../../../../../scripts/endpoint/common/endpoint_host_services'; import { @@ -23,16 +24,12 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/170563 -describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { +describe('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); describe('Processes operations:', () => { - let cronPID: string; - let newCronPID: string; - let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; @@ -70,58 +67,47 @@ describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { it('"processes" - should obtain a list of processes', () => { waitForEndpointListPageToBeLoaded(createdHost.hostname); openResponseConsoleFromEndpointList(); + + // get running processes performCommandInputChecks('processes'); submitCommand(); cy.contains('Action pending.').should('exist'); - cy.getByTestSubj('getProcessesSuccessCallout', { timeout: 120000 }).within(() => { + + // on success + cy.getByTestSubj('getProcessListTable', { timeout: 120000 }).within(() => { ['USER', 'PID', 'ENTITY ID', 'COMMAND'].forEach((header) => { cy.contains(header); }); cy.get('tbody > tr').should('have.length.greaterThan', 0); - cy.get('tbody > tr > td').should('contain', '/usr/sbin/cron'); - cy.get('tbody > tr > td') - .contains('/usr/sbin/cron') - .parents('td') - .siblings('td') - .eq(1) - .find('span') - .then((span) => { - cronPID = span.text(); - }); + cy.get('tbody > tr > td').should('contain', '/components/filebeat'); }); }); it('"kill-process --pid" - should kill a process', () => { waitForEndpointListPageToBeLoaded(createdHost.hostname); openResponseConsoleFromEndpointList(); - inputConsoleCommand(`kill-process --pid ${cronPID}`); - submitCommand(); - waitForCommandToBeExecuted('kill-process'); - - performCommandInputChecks('processes'); - submitCommand(); - cy.getByTestSubj('getProcessesSuccessCallout', { timeout: 120000 }).within(() => { - cy.get('tbody > tr > td') - .contains('/usr/sbin/cron') - .parents('td') - .siblings('td') - .eq(1) - .find('span') - .then((span) => { - newCronPID = span.text(); - }); + // get running processes + getRunningProcesses('/components/filebeat').then((pid) => { + // kill the process using PID + inputConsoleCommand(`kill-process --pid ${pid}`); + submitCommand(); + waitForCommandToBeExecuted('kill-process'); }); - expect(newCronPID).to.not.equal(cronPID); }); it('"suspend-process --pid" - should suspend a process', () => { waitForEndpointListPageToBeLoaded(createdHost.hostname); openResponseConsoleFromEndpointList(); - inputConsoleCommand(`suspend-process --pid ${newCronPID}`); - submitCommand(); - waitForCommandToBeExecuted('suspend-process'); + + // get running processes + getRunningProcesses('/components/filebeat').then((pid) => { + // suspend the process using PID + inputConsoleCommand(`suspend-process --pid ${pid}`); + submitCommand(); + waitForCommandToBeExecuted('suspend-process'); + }); }); }); }); 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 80f1aaba567a0..387f86c0dd160 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 @@ -5,6 +5,7 @@ * 2.0. */ +import { inputConsoleCommand, submitCommand } from './response_console'; import type { UserAuthzAccessLevel } from '../screens'; import { loadPage, request } from './common'; import { resolvePathVariables } from '../../../common/utils/resolve_path_variables'; @@ -66,6 +67,28 @@ export const visitRuleActions = (ruleId: string) => { cy.getByTestSubj('stepPanelProgress').should('not.exist'); }; +export const getRunningProcesses = (command: string): Cypress.Chainable => { + inputConsoleCommand('processes'); + submitCommand(); + cy.contains('Action pending.').should('exist'); + + // on success + // find pid of process + // traverse back from last column to the second column that has pid + return cy + .getByTestSubj('getProcessListTable', { timeout: 120000 }) + .findByTestSubj('process_list_command') + .contains(command) + .parents('td') + .siblings('td') + .eq(1) + .find('span') + .then((span) => { + // get pid + return Number(span.text()); + }); +}; + export const tryAddingDisabledResponseAction = (itemNumber = 0) => { cy.getByTestSubj('response-actions-wrapper').within(() => { cy.getByTestSubj('Endpoint Security-response-action-type-selection-option').should( diff --git a/x-pack/plugins/security_solution/public/resolver/view/process_event_dot.tsx b/x-pack/plugins/security_solution/public/resolver/view/process_event_dot.tsx index 4a91e71e3e0b5..13b6513650089 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/process_event_dot.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/process_event_dot.tsx @@ -291,7 +291,9 @@ const UnstyledProcessEventDot = React.memo( */ false ); - const labelHTMLID = htmlIdGenerator('resolver')(`${nodeID}:label`); + const labelHTMLID = useMemo(() => { + return htmlIdGenerator('resolver')(`${nodeID}:label`); + }, [nodeID]); const isAriaCurrent = nodeID === ariaActiveDescendant; const isAriaSelected = nodeID === selectedNode; @@ -351,6 +353,14 @@ const UnstyledProcessEventDot = React.memo( } }, [processEvent, nodeName]); + const flowToId = useMemo(() => { + return ariaFlowtoNodeID === null ? undefined : nodeHTMLID(ariaFlowtoNodeID); + }, [ariaFlowtoNodeID, nodeHTMLID]); + + const generatedNodeHTMLID = useMemo(() => { + return nodeHTMLID(nodeID); + }, [nodeHTMLID, nodeID]); + /* eslint-disable jsx-a11y/click-events-have-key-events */ return (
    { - 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 ; +}; diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/pane.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/pane.test.tsx new file mode 100644 index 0000000000000..08d1465b08fba --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/pane.test.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../../common/mock'; +import { TimelineId } from '../../../../../common/types/timeline'; +import { Pane } from '.'; + +jest.mock('../../timeline', () => ({ + StatefulTimeline: () =>
    , +})); + +const mockIsFullScreen = jest.fn(() => false); +jest.mock('../../../../common/store/selectors', () => ({ + inputsSelectors: { timelineFullScreenSelector: () => mockIsFullScreen() }, +})); + +describe('Pane', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should render the timeline', async () => { + const wrapper = render( + + + + ); + + expect(wrapper.getByTestId('StatefulTimelineMock')).toBeInTheDocument(); + }); + + it('should render without fullscreen className', async () => { + mockIsFullScreen.mockReturnValue(false); + const wrapper = render( + + + + ); + + expect(wrapper.getByTestId('timeline-wrapper')).not.toHaveClass( + 'timeline-wrapper--full-screen' + ); + }); + + it('should render with fullscreen className', async () => { + mockIsFullScreen.mockReturnValue(true); + const wrapper = render( + + + + ); + + expect(wrapper.getByTestId('timeline-wrapper')).toHaveClass('timeline-wrapper--full-screen'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/pane.tsx similarity index 51% rename from x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx rename to x-pack/plugins/security_solution/public/timelines/components/flyout/pane/pane.tsx index c8156c455d7e2..853c88044cd8b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/pane.tsx @@ -5,16 +5,18 @@ * 2.0. */ -import React, { useMemo, useRef } from 'react'; -import { css } from '@emotion/react'; -import { useEuiBackgroundColor, useEuiTheme } from '@elastic/eui'; - +import React, { useRef } from 'react'; +import classNames from 'classnames'; import { StatefulTimeline } from '../../timeline'; import type { TimelineId } from '../../../../../common/types/timeline'; import * as i18n from './translations'; import { defaultRowRenderers } from '../../timeline/body/renderers'; import { DefaultCellRenderer } from '../../timeline/cell_rendering/default_cell_renderer'; import { EuiPortal } from './custom_portal'; +import { useShallowEqualSelector } from '../../../../common/hooks/use_selector'; +import { inputsSelectors } from '../../../../common/store/selectors'; +import { usePaneStyles, OverflowHiddenGlobalStyles } from './pane.styles'; + interface FlyoutPaneComponentProps { timelineId: TimelineId; visible?: boolean; @@ -24,41 +26,33 @@ const FlyoutPaneComponent: React.FC = ({ timelineId, visible = true, }) => { - const { euiTheme } = useEuiTheme(); const ref = useRef(null); - const timeline = useMemo( - () => ( - - ), - [timelineId] - ); + const isFullScreen = useShallowEqualSelector(inputsSelectors.timelineFullScreenSelector) ?? false; + + const styles = usePaneStyles(); + const wrapperClassName = classNames('timeline-wrapper', styles, { + 'timeline-wrapper--full-screen': isFullScreen, + 'timeline-wrapper--hidden': !visible, + }); return (
    -
    - {timeline} +
    +
    + +
    + {visible && }
    ); }; 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/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/__snapshots__/index.test.tsx.snap index c5494c676118a..8ea295a03c9a9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/__snapshots__/index.test.tsx.snap @@ -33,6 +33,7 @@ exports[`Header rendering renders correctly against snapshot 1`] = ` "isOverridden": [MockFunction], "remove": [MockFunction], "set": [MockFunction], + "validateValue": [MockFunction], }, "updated$": Subject { "closed": false, 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/scripts/run_cypress/parallel_serverless.ts b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts index c00ec17116ca9..a64f4027f456e 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 @@ -24,8 +24,8 @@ import pRetry from 'p-retry'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION } from '@kbn/data-views-plugin/server/constants'; +import { exec } from 'child_process'; import { renderSummaryTable } from './print_run'; -import type { SecuritySolutionDescribeBlockFtrConfig } from './utils'; import { parseTestFileConfig, retrieveIntegrations } from './utils'; interface ProductType { @@ -53,6 +53,12 @@ interface Credentials { password: string; } +const DEFAULT_CONFIGURATION: Readonly = [ + { product_line: 'security', product_tier: 'complete' }, + { product_line: 'cloud', product_tier: 'complete' }, + { product_line: 'endpoint', product_tier: 'complete' }, +] as const; + const DEFAULT_REGION = 'aws-eu-west-1'; const PROJECT_NAME_PREFIX = 'kibana-cypress-security-solution-ephemeral'; const BASE_ENV_URL = 'https://global.qa.cld.elstc.co'; @@ -82,19 +88,14 @@ const getApiKeyFromElasticCloudJsonFile = (): string | undefined => { async function createSecurityProject( projectName: string, apiKey: string, - ftrConfig: SecuritySolutionDescribeBlockFtrConfig + productTypes: ProductType[] ): Promise { const body: CreateProjectRequestBody = { name: projectName, region_id: DEFAULT_REGION, + product_types: productTypes, }; - const productTypes: ProductType[] = []; - ftrConfig?.productTypes?.forEach((t) => { - productTypes.push(t as ProductType); - }); - if (productTypes.length > 0) body.product_types = productTypes; - try { const response = await axios.post(`${BASE_ENV_URL}/api/v1/serverless/projects/security`, body, { headers: { @@ -325,9 +326,32 @@ function waitForKibanaLogin(kbUrl: string, credentials: Credentials): Promise { + let productTypes: ProductType[] = [...DEFAULT_CONFIGURATION]; + + if (tier) { + productTypes = productTypes.map((product) => ({ + ...product, + product_tier: tier, + })); + } + if (!cloudAddon) { + productTypes = productTypes.filter((product) => product.product_line !== 'cloud'); + } + if (!endpointAddon) { + productTypes = productTypes.filter((product) => product.product_line !== 'endpoint'); + } + + return productTypes; +}; + export const cli = () => { run( - async () => { + async (context) => { log = new ToolingLog({ level: 'info', writeTo: process.stdout, @@ -371,7 +395,22 @@ export const cli = () => { } return acc; }, {} as Record) - ); + ) + .option('tier', { + alias: 't', + type: 'string', + default: 'complete', + }) + .option('endpointAddon', { + alias: 'ea', + type: 'boolean', + default: true, + }) + .option('cloudAddon', { + alias: 'ca', + type: 'boolean', + default: true, + }); log.info(` ---------------------------------------------- @@ -388,6 +427,10 @@ ${JSON.stringify(argv, null, 2)} const cypressConfigFilePath = require.resolve(`../../${argv.configFile}`) as string; const cypressConfigFile = await import(cypressConfigFilePath); + const tier: string = argv.tier; + const endpointAddon: boolean = argv.endpointAddon; + const cloudAddon: boolean = argv.cloudAddon; + log.info(` ---------------------------------------------- Cypress config for file: ${cypressConfigFilePath}: @@ -456,7 +499,10 @@ ${JSON.stringify(cypressConfigFile, null, 2)} await withProcRunner(log, async (procs) => { const id = crypto.randomBytes(8).toString('hex'); const PROJECT_NAME = `${PROJECT_NAME_PREFIX}-${id}`; - const specFileFTRConfig = parseTestFileConfig(filePath); + + const productTypes = isOpen + ? getProductTypes(tier, endpointAddon, cloudAddon) + : (parseTestFileConfig(filePath).productTypes as ProductType[]); if (!API_KEY) { log.info('API KEY to create project could not be retrieved.'); @@ -466,7 +512,7 @@ ${JSON.stringify(cypressConfigFile, null, 2)} log.info(`${id}: Creating project ${PROJECT_NAME}...`); // Creating project for the test to run - const project = await createSecurityProject(PROJECT_NAME, API_KEY, specFileFTRConfig); + const project = await createSecurityProject(PROJECT_NAME, API_KEY, productTypes); if (!project) { log.info('Failed to create project.'); @@ -474,6 +520,11 @@ ${JSON.stringify(cypressConfigFile, null, 2)} return process.exit(1); } + context.addCleanupTask(() => { + const command = `curl -X DELETE ${BASE_ENV_URL}/api/v1/serverless/projects/security/${project.id} -H "Authorization: ApiKey ${API_KEY}"`; + exec(command); + }); + // Reset credentials for elastic user const credentials = await resetCredentials(project.id, id, API_KEY); @@ -553,15 +604,13 @@ ${JSON.stringify(cypressConfigFile, null, 2)} env: cyCustomEnv, }, }); + // Delete serverless project + log.info(`${id} : Deleting project ${PROJECT_NAME}...`); + await deleteSecurityProject(project.id, PROJECT_NAME, API_KEY); } catch (error) { result = error; } } - - // Delete serverless project - log.info(`${id} : Deleting project ${PROJECT_NAME}...`); - await deleteSecurityProject(project.id, PROJECT_NAME, API_KEY); - return result; }); return result; diff --git a/x-pack/plugins/security_solution/server/config.mock.ts b/x-pack/plugins/security_solution/server/config.mock.ts index 36c46300f9f31..855cec11ab16e 100644 --- a/x-pack/plugins/security_solution/server/config.mock.ts +++ b/x-pack/plugins/security_solution/server/config.mock.ts @@ -30,6 +30,7 @@ export const createMockConfig = (): ConfigType => { settings: getDefaultConfigSettings(), experimentalFeatures: parseExperimentalConfigValue(enableExperimental).features, enabled: true, + enableUiSettingsValidations: false, }; }; diff --git a/x-pack/plugins/security_solution/server/config.ts b/x-pack/plugins/security_solution/server/config.ts index 766aca8b5c8be..adc8fbfb1174c 100644 --- a/x-pack/plugins/security_solution/server/config.ts +++ b/x-pack/plugins/security_solution/server/config.ts @@ -114,6 +114,7 @@ export const configSchema = schema.object({ */ prebuiltRulesPackageVersion: schema.maybe(schema.string()), enabled: schema.boolean({ defaultValue: true }), + enableUiSettingsValidations: schema.boolean({ defaultValue: false }), /** * The Max number of Bytes allowed for the `upload` endpoint response action @@ -140,6 +141,7 @@ export type ConfigSchema = TypeOf; export type ConfigType = Omit & { experimentalFeatures: ExperimentalFeatures; settings: ConfigSettings; + enableUiSettingsValidations: boolean; }; export const createConfig = (context: PluginInitializerContext): ConfigType => { diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 66f22e0c44bef..c3e20042d224f 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -170,7 +170,7 @@ export class Plugin implements ISecuritySolutionPlugin { const experimentalFeatures = config.experimentalFeatures; initSavedObjects(core.savedObjects); - initUiSettings(core.uiSettings, experimentalFeatures); + initUiSettings(core.uiSettings, experimentalFeatures, config.enableUiSettingsValidations); appFeaturesService.init(plugins.features); events.forEach((eventConfig) => core.analytics.registerEventType(eventConfig)); diff --git a/x-pack/plugins/security_solution/server/ui_settings.ts b/x-pack/plugins/security_solution/server/ui_settings.ts index 6a41844e9e032..18b5a01b2ad30 100644 --- a/x-pack/plugins/security_solution/server/ui_settings.ts +++ b/x-pack/plugins/security_solution/server/ui_settings.ts @@ -57,7 +57,8 @@ const orderSettings = (settings: SettingsConfig): SettingsConfig => { export const initUiSettings = ( uiSettings: CoreSetup['uiSettings'], - experimentalFeatures: ExperimentalFeatures + experimentalFeatures: ExperimentalFeatures, + validationsEnabled: boolean ) => { const securityUiSettings: Record> = { [DEFAULT_APP_REFRESH_INTERVAL]: { @@ -115,7 +116,9 @@ export const initUiSettings = ( }), category: [APP_ID], requiresPageReload: true, - schema: schema.arrayOf(schema.string()), + schema: validationsEnabled + ? schema.arrayOf(schema.string(), { maxSize: 50 }) + : schema.arrayOf(schema.string()), }, [DEFAULT_THREAT_INDEX_KEY]: { name: i18n.translate('xpack.securitySolution.uiSettings.defaultThreatIndexLabel', { @@ -132,7 +135,9 @@ export const initUiSettings = ( ), category: [APP_ID], requiresPageReload: true, - schema: schema.arrayOf(schema.string()), + schema: validationsEnabled + ? schema.arrayOf(schema.string(), { maxSize: 10 }) + : schema.arrayOf(schema.string()), }, [DEFAULT_ANOMALY_SCORE]: { name: i18n.translate('xpack.securitySolution.uiSettings.defaultAnomalyScoreLabel', { @@ -149,7 +154,7 @@ export const initUiSettings = ( ), category: [APP_ID], requiresPageReload: true, - schema: schema.number(), + schema: validationsEnabled ? schema.number({ max: 100, min: 0 }) : schema.number(), }, [ENABLE_NEWS_FEED_SETTING]: { name: i18n.translate('xpack.securitySolution.uiSettings.enableNewsFeedLabel', { diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc index 0ac92bc197468..a9000e7542475 100644 --- a/x-pack/plugins/serverless_search/kibana.jsonc +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -15,6 +15,7 @@ "requiredPlugins": [ "cloud", "console", + "dataViews", "dashboard", "devTools", "discover", diff --git a/x-pack/plugins/serverless_search/server/plugin.ts b/x-pack/plugins/serverless_search/server/plugin.ts index 2651d6a2f38da..98f60c803972b 100644 --- a/x-pack/plugins/serverless_search/server/plugin.ts +++ b/x-pack/plugins/serverless_search/server/plugin.ts @@ -11,9 +11,11 @@ import type { PluginInitializerContext, Plugin, CoreSetup, + CoreStart, } from '@kbn/core/server'; import type { SecurityPluginStart } from '@kbn/security-plugin/server'; import { SEARCH_PROJECT_SETTINGS } from '@kbn/serverless-search-settings'; +import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; import { registerApiKeyRoutes } from './routes/api_key_routes'; import { registerIndicesRoutes } from './routes/indices_routes'; @@ -51,6 +53,27 @@ export class ServerlessSearchPlugin this.config = initializerContext.config.get(); this.logger = initializerContext.logger.get(); } + private async createDefaultDataView(core: CoreStart, dataViews: DataViewsServerPluginStart) { + const dataViewsService = await dataViews.dataViewsServiceFactory( + core.savedObjects.createInternalRepository(), + core.elasticsearch.client.asInternalUser, + undefined, + true + ); + const dataViewExists = await dataViewsService.get('default_all_data_id').catch(() => false); + if (!dataViewExists) { + const defaultDataViewExists = await dataViewsService.defaultDataViewExists(); + if (!defaultDataViewExists) { + await dataViewsService.createAndSave({ + allowNoIndex: false, + name: 'default:all-data', + title: '*', + id: 'default_all_data_id', + }); + } + } + return; + } public setup( { getStartServices, http }: CoreSetup, @@ -75,7 +98,8 @@ export class ServerlessSearchPlugin return {}; } - public start() { + public start(core: CoreStart, { dataViews }: StartDependencies) { + this.createDefaultDataView(core, dataViews); return {}; } diff --git a/x-pack/plugins/serverless_search/server/types.ts b/x-pack/plugins/serverless_search/server/types.ts index c2eee3d0078a7..3cbd26ad2dd5f 100644 --- a/x-pack/plugins/serverless_search/server/types.ts +++ b/x-pack/plugins/serverless_search/server/types.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; import type { SecurityPluginStart } from '@kbn/security-plugin/server'; import type { ServerlessPluginSetup } from '@kbn/serverless/server'; @@ -14,6 +15,7 @@ export interface ServerlessSearchPluginSetup {} export interface ServerlessSearchPluginStart {} export interface StartDependencies { + dataViews: DataViewsServerPluginStart; security: SecurityPluginStart; } export interface SetupDependencies { diff --git a/x-pack/plugins/serverless_search/tsconfig.json b/x-pack/plugins/serverless_search/tsconfig.json index c07cff77aa19e..f58828f69569b 100644 --- a/x-pack/plugins/serverless_search/tsconfig.json +++ b/x-pack/plugins/serverless_search/tsconfig.json @@ -35,6 +35,7 @@ "@kbn/react-kibana-context-theme", "@kbn/search-connectors", "@kbn/shared-ux-router", + "@kbn/data-views-plugin", "@kbn/kibana-utils-plugin", "@kbn/index-management-plugin", ] diff --git a/x-pack/plugins/session_view/public/components/session_view/index.tsx b/x-pack/plugins/session_view/public/components/session_view/index.tsx index 18accecb36dd5..4eaa905f9852d 100644 --- a/x-pack/plugins/session_view/public/components/session_view/index.tsx +++ b/x-pack/plugins/session_view/public/components/session_view/index.tsx @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { v4 as uuidv4 } from 'uuid'; import React, { useState, useCallback, useEffect, useMemo, useRef } from 'react'; import { EuiEmptyPrompt, @@ -98,6 +99,7 @@ export const SessionView = ({ const [currentJumpToCursor, setCurrentJumpToCursor] = useState(jumpToCursor); const [currentJumpToEntityId, setCurrentJumpToEntityId] = useState(jumpToEntityId); const [currentJumpToOutputEntityId, setCurrentJumpToOutputEntityId] = useState(''); + const sessionViewId = useMemo(() => `session-view-uuid-${uuidv4()}`, []); const styles = useStyles({ height, isFullScreen }); @@ -399,7 +401,7 @@ export const SessionView = ({ {(EuiResizablePanel, EuiResizableButton, { togglePanel }) => { detailPanelCollapseFn.current = () => { - togglePanel?.('session-detail-panel', { direction: 'left' }); + togglePanel?.(sessionViewId, { direction: 'left' }); }; return ( @@ -458,7 +460,7 @@ export const SessionView = ({ ; @@ -21,3 +23,5 @@ export type RunActionParams = TypeOf; export type InvokeAIActionParams = TypeOf; export type InvokeAIActionResponse = TypeOf; export type RunActionResponse = TypeOf; +export type StreamActionParams = TypeOf; +export type StreamingResponse = TypeOf; diff --git a/x-pack/plugins/stack_connectors/common/openai/constants.ts b/x-pack/plugins/stack_connectors/common/openai/constants.ts index db01f52d762cf..5cf6ecb659f8a 100644 --- a/x-pack/plugins/stack_connectors/common/openai/constants.ts +++ b/x-pack/plugins/stack_connectors/common/openai/constants.ts @@ -17,6 +17,7 @@ export const OPENAI_CONNECTOR_ID = '.gen-ai'; export enum SUB_ACTION { RUN = 'run', INVOKE_AI = 'invokeAI', + INVOKE_STREAM = 'invokeStream', STREAM = 'stream', DASHBOARD = 'getDashboard', TEST = 'test', 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 dcd3d70f9b4ff..708e8cd4e0364 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 @@ -4,12 +4,16 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import aws from 'aws4'; +import { 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 } from '../../../common/bedrock/schema'; +import { RunActionResponseSchema, StreamingResponseSchema } from '../../../common/bedrock/schema'; import { BEDROCK_CONNECTOR_ID, DEFAULT_BEDROCK_MODEL, @@ -19,10 +23,8 @@ import { import { DEFAULT_BODY } from '../../../public/connector_types/bedrock/constants'; import { AxiosError } from 'axios'; -jest.mock('aws4', () => ({ - sign: () => ({ signed: true }), -})); - +// @ts-ignore +const mockSigner = jest.spyOn(aws, 'sign').mockReturnValue({ signed: true }); describe('BedrockConnector', () => { let mockRequest: jest.Mock; let mockError: jest.Mock; @@ -35,6 +37,7 @@ describe('BedrockConnector', () => { }, }; beforeEach(() => { + jest.clearAllMocks(); mockRequest = jest.fn().mockResolvedValue(mockResponse); mockError = jest.fn().mockImplementation(() => { throw new Error('API Error'); @@ -53,14 +56,29 @@ describe('BedrockConnector', () => { logger: loggingSystemMock.createLogger(), services: actionsMock.createServices(), }); - beforeEach(() => { // @ts-ignore connector.request = mockRequest; - jest.clearAllMocks(); }); describe('runApi', () => { + it('the aws signature has non-streaming headers', async () => { + await connector.runApi({ body: DEFAULT_BODY }); + + expect(mockSigner).toHaveBeenCalledWith( + { + body: '{"prompt":"\\n\\nHuman: Hello world! \\n\\nAssistant:","max_tokens_to_sample":8191,"stop_sequences":["\\n\\nHuman:"]}', + headers: { + Accept: '*/*', + 'Content-Type': 'application/json', + }, + host: 'bedrock.us-east-1.amazonaws.com', + path: '/model/anthropic.claude-v2/invoke', + service: 'bedrock', + }, + { accessKeyId: '123', secretAccessKey: 'secret' } + ); + }); it('the Bedrock API call is successful with correct parameters', async () => { const response = await connector.runApi({ body: DEFAULT_BODY }); expect(mockRequest).toBeCalledTimes(1); @@ -83,6 +101,124 @@ describe('BedrockConnector', () => { }); }); + describe('invokeStream', () => { + let stream; + beforeEach(() => { + stream = createStreamMock(); + stream.write(encodeBedrockResponse(mockResponseString)); + mockRequest = jest.fn().mockResolvedValue({ ...mockResponse, data: stream.transform }); + // @ts-ignore + connector.request = mockRequest; + }); + + const aiAssistantBody = { + messages: [ + { + role: 'user', + content: 'Hello world', + }, + ], + }; + + it('the aws signature has streaming headers', async () => { + await connector.invokeStream(aiAssistantBody); + + expect(mockSigner).toHaveBeenCalledWith( + { + body: JSON.stringify({ + prompt: '\n\nHuman:Hello world \n\nAssistant:', + max_tokens_to_sample: DEFAULT_TOKEN_LIMIT, + temperature: 0.5, + stop_sequences: ['\n\nHuman:'], + }), + headers: { + accept: 'application/vnd.amazon.eventstream', + 'Content-Type': 'application/json', + 'x-amzn-bedrock-accept': '*/*', + }, + host: 'bedrock.us-east-1.amazonaws.com', + path: '/model/anthropic.claude-v2/invoke-with-response-stream', + service: 'bedrock', + }, + { accessKeyId: '123', secretAccessKey: 'secret' } + ); + }); + + it('the API call is successful with correct request parameters', async () => { + await connector.invokeStream(aiAssistantBody); + expect(mockRequest).toBeCalledTimes(1); + expect(mockRequest).toHaveBeenCalledWith({ + signed: true, + url: `${DEFAULT_BEDROCK_URL}/model/${DEFAULT_BEDROCK_MODEL}/invoke-with-response-stream`, + method: 'post', + responseSchema: StreamingResponseSchema, + responseType: 'stream', + data: JSON.stringify({ + prompt: '\n\nHuman:Hello world \n\nAssistant:', + max_tokens_to_sample: DEFAULT_TOKEN_LIMIT, + temperature: 0.5, + stop_sequences: ['\n\nHuman:'], + }), + }); + }); + + it('formats messages from user, assistant, and system', async () => { + await connector.invokeStream({ + messages: [ + { + role: 'user', + content: 'Hello world', + }, + { + role: 'system', + content: 'Be a good chatbot', + }, + { + role: 'assistant', + content: 'Hi, I am a good chatbot', + }, + { + role: 'user', + content: 'What is 2+2?', + }, + ], + }); + expect(mockRequest).toHaveBeenCalledWith({ + signed: true, + responseType: 'stream', + url: `${DEFAULT_BEDROCK_URL}/model/${DEFAULT_BEDROCK_MODEL}/invoke-with-response-stream`, + method: 'post', + responseSchema: StreamingResponseSchema, + data: JSON.stringify({ + prompt: + '\n\nHuman:Hello world\n\nHuman:Be a good chatbot\n\nAssistant:Hi, I am a good chatbot\n\nHuman:What is 2+2? \n\nAssistant:', + max_tokens_to_sample: DEFAULT_TOKEN_LIMIT, + temperature: 0.5, + stop_sequences: ['\n\nHuman:'], + }), + }); + }); + + it('transforms the response into a string', async () => { + const response = await connector.invokeStream(aiAssistantBody); + + let responseBody: string = ''; + response.on('data', (data: string) => { + responseBody += data.toString(); + }); + await waitFor(() => { + expect(responseBody).toEqual(mockResponseString); + }); + }); + + it('errors during API calls are properly handled', async () => { + // @ts-ignore + connector.request = mockError; + + await expect(connector.invokeStream(aiAssistantBody)).rejects.toThrow('API Error'); + }); + }); + describe('invokeAI', () => { const aiAssistantBody = { messages: [ @@ -112,7 +248,7 @@ describe('BedrockConnector', () => { expect(response.message).toEqual(mockResponseString); }); - it('Properly formats messages from user, assistant, and system', async () => { + it('formats messages from user, assistant, and system', async () => { const response = await connector.invokeAI({ messages: [ { @@ -210,3 +346,34 @@ describe('BedrockConnector', () => { }); }); }); + +function createStreamMock() { + const transform: Transform = new Transform({}); + + return { + write: (data: Uint8Array) => { + transform.push(data); + }, + fail: () => { + transform.emit('error', new Error('Stream failed')); + transform.end(); + }, + transform, + complete: () => { + transform.end(); + }, + }; +} + +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 ea0c72420b41e..70f8e121e1519 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 @@ -8,10 +8,15 @@ 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 { RunActionParamsSchema, RunActionResponseSchema, InvokeAIActionParamsSchema, + StreamingResponseSchema, } from '../../../common/bedrock/schema'; import type { Config, @@ -20,8 +25,10 @@ import type { RunActionResponse, InvokeAIActionParams, InvokeAIActionResponse, + StreamActionParams, } from '../../../common/bedrock/types'; import { SUB_ACTION, DEFAULT_TOKEN_LIMIT } from '../../../common/bedrock/constants'; +import { StreamingResponse } from '../../../common/bedrock/types'; interface SignedRequest { host: string; @@ -55,12 +62,17 @@ export class BedrockConnector extends SubActionConnector { method: 'runApi', schema: RunActionParamsSchema, }); - this.registerSubAction({ name: SUB_ACTION.INVOKE_AI, method: 'invokeAI', schema: InvokeAIActionParamsSchema, }); + + this.registerSubAction({ + name: SUB_ACTION.INVOKE_STREAM, + method: 'invokeStream', + schema: InvokeAIActionParamsSchema, + }); } protected getResponseErrorMessage(error: AxiosError<{ message?: string }>): string { @@ -82,15 +94,21 @@ export class BedrockConnector extends SubActionConnector { * @param body The request body to be signed. * @param path The path of the request URL. */ - private signRequest(body: string, path: string) { + private signRequest(body: string, path: string, stream: boolean) { const { host } = new URL(this.url); return aws.sign( { host, - headers: { - 'Content-Type': 'application/json', - Accept: '*/*', - }, + headers: stream + ? { + accept: 'application/vnd.amazon.eventstream', + 'Content-Type': 'application/json', + 'x-amzn-bedrock-accept': '*/*', + } + : { + 'Content-Type': 'application/json', + Accept: '*/*', + }, body, path, // Despite AWS docs, this value does not always get inferred. We need to always send it @@ -110,11 +128,11 @@ export class BedrockConnector extends SubActionConnector { */ public async runApi({ body, model: reqModel }: RunActionParams): Promise { // set model on per request basis - const model = reqModel ? reqModel : this.model; - const signed = this.signRequest(body, `/model/${model}/invoke`); + const path = `/model/${reqModel ?? this.model}/invoke`; + const signed = this.signRequest(body, path, false); const response = await this.request({ ...signed, - url: `${this.url}/model/${model}/invoke`, + url: `${this.url}${path}`, method: 'post', responseSchema: RunActionResponseSchema, data: body, @@ -125,33 +143,104 @@ export class BedrockConnector extends SubActionConnector { } /** - * takes in an array of messages and a model as input, and returns a promise that resolves to a string. - * The method combines the messages into a single prompt formatted for bedrock,sends a request to the - * runApi method with the prompt and model, and returns the trimmed completion from the response. - * @param messages An array of message objects, where each object has a role (string) and content (string) property. + * NOT INTENDED TO BE CALLED DIRECTLY + * call invokeStream instead + * responsible for making a POST request to a specified URL with a given request body. + * The response is then processed based on whether it is a streaming response or a regular response. + * @param body The stringified request body to be sent in the POST request. * @param model Optional model to be used for the API request. If not provided, the default model from the connector will be used. */ + private async streamApi({ + body, + model: reqModel, + }: StreamActionParams): Promise { + // set model on per request basis + const path = `/model/${reqModel ?? this.model}/invoke-with-response-stream`; + const signed = this.signRequest(body, path, true); + + const response = await this.request({ + ...signed, + url: `${this.url}${path}`, + method: 'post', + responseSchema: StreamingResponseSchema, + data: body, + responseType: 'stream', + }); + + return response.data.pipe(new PassThrough()); + } + + /** + * takes in an array of messages and a model as inputs. It calls the streamApi method to make a + * request to the Bedrock API with the formatted messages and model. It then returns a Transform stream + * that pipes the response from the API through the transformToString function, + * which parses the proprietary response into a string of the response text alone + * @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 { + const res = (await this.streamApi({ + body: JSON.stringify(formatBedrockBody({ messages })), + model, + })) as unknown as IncomingMessage; + return res.pipe(transformToString()); + } + + /** + * Deprecated. Use invokeStream instead. + * TODO: remove before 8.12 FF in part 3 of streaming work for security solution + * tracked here: https://github.com/elastic/security-team/issues/7363 + * No token tracking implemented for this method + */ public async invokeAI({ messages, model, }: InvokeAIActionParams): Promise { - const combinedMessages = messages.reduce((acc: string, message) => { - const { role, content } = message; - // Bedrock only has Assistant and Human, so 'system' and 'user' will be converted to Human - const bedrockRole = role === 'assistant' ? '\n\nAssistant:' : '\n\nHuman:'; - return `${acc}${bedrockRole}${content}`; - }, ''); - - const req = { - // end prompt in "Assistant:" to avoid the model starting its message with "Assistant:" - prompt: `${combinedMessages} \n\nAssistant:`, - max_tokens_to_sample: DEFAULT_TOKEN_LIMIT, - temperature: 0.5, - // prevent model from talking to itself - stop_sequences: ['\n\nHuman:'], - }; - - const res = await this.runApi({ body: JSON.stringify(req), model }); + const res = await this.runApi({ body: JSON.stringify(formatBedrockBody({ messages })), model }); return { message: res.completion.trim() }; } } + +const formatBedrockBody = ({ + messages, +}: { + messages: Array<{ role: string; content: string }>; +}) => { + const combinedMessages = messages.reduce((acc: string, message) => { + const { role, content } = message; + // Bedrock only has Assistant and Human, so 'system' and 'user' will be converted to Human + const bedrockRole = role === 'assistant' ? '\n\nAssistant:' : '\n\nHuman:'; + return `${acc}${bedrockRole}${content}`; + }, ''); + + return { + // end prompt in "Assistant:" to avoid the model starting its message with "Assistant:" + prompt: `${combinedMessages} \n\nAssistant:`, + max_tokens_to_sample: DEFAULT_TOKEN_LIMIT, + temperature: 0.5, + // prevent model from talking to itself + 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 e214047a5c6d5..7769dd8592faf 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,6 +17,8 @@ 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'; jest.mock('./create_dashboard'); describe('OpenAIConnector', () => { @@ -33,6 +35,9 @@ describe('OpenAIConnector', () => { role: 'assistant', content: mockResponseString, }, + delta: { + content: mockResponseString, + }, finish_reason: 'stop', index: 0, }, @@ -268,6 +273,98 @@ describe('OpenAIConnector', () => { }); }); + describe('invokeStream', () => { + const mockStream = ( + dataToStream: string[] = [ + 'data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"My"}}]}\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" new"}}]}', + ] + ) => { + const streamMock = createStreamMock(); + dataToStream.forEach((chunk) => { + streamMock.write(chunk); + }); + streamMock.complete(); + mockRequest = jest.fn().mockResolvedValue({ ...mockResponse, data: streamMock.transform }); + return mockRequest; + }; + beforeEach(() => { + // @ts-ignore + connector.request = mockStream(); + }); + + it('the API call is successful with correct request parameters', async () => { + await connector.invokeStream(sampleOpenAiBody); + expect(mockRequest).toBeCalledTimes(1); + expect(mockRequest).toHaveBeenCalledWith({ + url: 'https://api.openai.com/v1/chat/completions', + method: 'post', + responseSchema: StreamingResponseSchema, + responseType: 'stream', + data: JSON.stringify({ ...sampleOpenAiBody, stream: true, model: DEFAULT_OPENAI_MODEL }), + headers: { + Authorization: 'Bearer 123', + 'content-type': 'application/json', + }, + }); + }); + + it('errors during API calls are properly handled', async () => { + // @ts-ignore + connector.request = mockError; + + await expect(connector.invokeStream(sampleOpenAiBody)).rejects.toThrow('API Error'); + }); + + it('transforms the response into a string', 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'); + }); + }); + }); + describe('invokeAI', () => { it('the API call is successful with correct parameters', async () => { const response = await connector.invokeAI(sampleOpenAiBody); @@ -598,3 +695,21 @@ describe('OpenAIConnector', () => { }); }); }); + +function createStreamMock() { + const transform: Transform = new Transform({}); + + return { + write: (data: string) => { + transform.push(data); + }, + fail: () => { + transform.emit('error', new Error('Stream failed')); + transform.end(); + }, + transform, + complete: () => { + transform.end(); + }, + }; +} 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 7680cae94db9a..78fca4bd84198 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,6 +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 { RunActionParamsSchema, RunActionResponseSchema, @@ -82,6 +84,12 @@ export class OpenAIConnector extends SubActionConnector { method: 'invokeAI', schema: InvokeAIActionParamsSchema, }); + + this.registerSubAction({ + name: SUB_ACTION.INVOKE_STREAM, + method: 'invokeStream', + schema: InvokeAIActionParamsSchema, + }); } protected getResponseErrorMessage(error: AxiosError<{ error?: { message?: string } }>): string { @@ -185,9 +193,24 @@ export class OpenAIConnector extends SubActionConnector { } /** - * takes an array of messages and a model as input and returns a promise that resolves to a string. - * Sends the stringified input to the runApi method. Returns the trimmed completion from the response. - * @param body An object containing array of message objects, and possible other OpenAI properties + * Responsible for invoking the streamApi method with the provided body and + * stream parameters set to true. It then returns a Transform stream that processes + * 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 { + const res = (await this.streamApi({ + body: JSON.stringify(body), + stream: true, + })) as unknown as IncomingMessage; + + return res.pipe(new PassThrough()).pipe(transformToString()); + } + + /** + * Deprecated. Use invokeStream instead. + * TODO: remove before 8.12 FF in part 3 of streaming work for security solution + * tracked here: https://github.com/elastic/security-team/issues/7363 */ public async invokeAI(body: InvokeAIActionParams): Promise { const res = await this.runApi({ body: JSON.stringify(body) }); @@ -206,3 +229,44 @@ 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/transform/common/api_schemas/audit_messages.ts b/x-pack/plugins/transform/common/api_schemas/audit_messages.ts index 438310f495e70..5027dba58f05c 100644 --- a/x-pack/plugins/transform/common/api_schemas/audit_messages.ts +++ b/x-pack/plugins/transform/common/api_schemas/audit_messages.ts @@ -5,9 +5,20 @@ * 2.0. */ +import { schema, TypeOf } from '@kbn/config-schema'; + import { TransformMessage } from '../types/messages'; export interface GetTransformsAuditMessagesResponseSchema { messages: TransformMessage[]; total: number; } + +export const getTransformAuditMessagesQuerySchema = schema.object({ + sortField: schema.string(), + sortDirection: schema.oneOf([schema.literal('asc'), schema.literal('desc')]), +}); + +export type GetTransformAuditMessagesQuerySchema = TypeOf< + typeof getTransformAuditMessagesQuerySchema +>; diff --git a/x-pack/plugins/transform/common/api_schemas/transforms.ts b/x-pack/plugins/transform/common/api_schemas/transforms.ts index 65e0433a81264..5b1d68bb2d3f7 100644 --- a/x-pack/plugins/transform/common/api_schemas/transforms.ts +++ b/x-pack/plugins/transform/common/api_schemas/transforms.ts @@ -148,16 +148,29 @@ export interface PutTransformsPivotRequestSchema export type PutTransformsLatestRequestSchema = Omit; +export const putTransformsQuerySchema = schema.object({ + createDataView: schema.boolean({ defaultValue: false }), + timeFieldName: schema.maybe(schema.string()), +}); + +export type PutTransformsQuerySchema = TypeOf; + interface TransformCreated { transform: TransformId; } -interface TransformCreatedError { - id: TransformId; +interface DataViewCreated { + id: string; +} +interface CreatedError { + id: string; error: any; } + export interface PutTransformsResponseSchema { transformsCreated: TransformCreated[]; - errors: TransformCreatedError[]; + dataViewsCreated: DataViewCreated[]; + dataViewsErrors: CreatedError[]; + errors: CreatedError[]; } // POST transforms/_preview diff --git a/x-pack/plugins/transform/common/constants.ts b/x-pack/plugins/transform/common/constants.ts index ec26333a834a7..8ee030b2a953d 100644 --- a/x-pack/plugins/transform/common/constants.ts +++ b/x-pack/plugins/transform/common/constants.ts @@ -216,3 +216,5 @@ export const DEFAULT_TRANSFORM_SETTINGS_MAX_PAGE_SEARCH_SIZE = 500; // Used in the transform list's expanded row for the messages and issues table. export const TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'; + +export const TRANSFORM_NOTIFICATIONS_INDEX = '.transform-notifications-read'; diff --git a/x-pack/plugins/transform/common/types/transform.ts b/x-pack/plugins/transform/common/types/transform.ts index 8c6690641873a..2e244e69b70fa 100644 --- a/x-pack/plugins/transform/common/types/transform.ts +++ b/x-pack/plugins/transform/common/types/transform.ts @@ -70,3 +70,12 @@ export interface LatestFunctionConfigUI { unique_key: Array> | undefined; sort: EuiComboBoxOptionOption | undefined; } + +export enum TRANSFORM_ACTIONS { + DELETE = 'delete', + REAUTHORIZE = 'reauthorize', + RESET = 'reset', + SCHEDULE_NOW = 'schedule_now', + STOP = 'stop', + START = 'start', +} diff --git a/x-pack/plugins/transform/public/app/hooks/use_create_transform.tsx b/x-pack/plugins/transform/public/app/hooks/use_create_transform.tsx index 272e815c42eb4..c678549683bec 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_create_transform.tsx +++ b/x-pack/plugins/transform/public/app/hooks/use_create_transform.tsx @@ -27,6 +27,8 @@ import { useRefreshTransformList } from './use_refresh_transform_list'; interface CreateTransformArgs { transformId: TransformId; transformConfig: PutTransformsRequestSchema; + createDataView: boolean; + timeFieldName?: string; } export const useCreateTransform = () => { @@ -48,10 +50,16 @@ export const useCreateTransform = () => { } const mutation = useMutation({ - mutationFn: ({ transformId, transformConfig }: CreateTransformArgs) => { + mutationFn: ({ + transformId, + transformConfig, + createDataView = false, + timeFieldName, + }: CreateTransformArgs) => { return http.put( addInternalBasePath(`transforms/${transformId}`), { + query: { createDataView, timeFieldName }, body: JSON.stringify(transformConfig), version: '1', } diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_create/step_create_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_create/step_create_form.tsx index 3c78757a6f257..07eb6e536ade3 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_create/step_create_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_create/step_create_form.tsx @@ -28,9 +28,6 @@ import { toMountPoint } from '@kbn/react-kibana-mount'; import { DISCOVER_APP_LOCATOR } from '@kbn/discover-plugin/common'; -import { DuplicateDataViewError } from '@kbn/data-plugin/public'; -import type { RuntimeField } from '@kbn/data-views-plugin/common'; -import { isPopulatedObject } from '@kbn/ml-is-populated-object'; import { PROGRESS_REFRESH_INTERVAL_MS } from '../../../../../../common/constants'; import { getErrorMessage } from '../../../../../../common/utils/errors'; @@ -44,7 +41,7 @@ import { PutTransformsLatestRequestSchema, PutTransformsPivotRequestSchema, } from '../../../../../../common/api_schemas/transforms'; -import { isContinuousTransform, isLatestTransform } from '../../../../../../common/types/transform'; +import { isContinuousTransform } from '../../../../../../common/types/transform'; import { TransformAlertFlyout } from '../../../../../alerting/transform_alerting_flyout'; export interface StepDetailsExposedState { @@ -87,8 +84,7 @@ export const StepCreateForm: FC = React.memo( const [discoverLink, setDiscoverLink] = useState(); const toastNotifications = useToastNotifications(); - const { application, data, i18n: i18nStart, share, theme } = useAppDependencies(); - const dataViews = data.dataViews; + const { application, i18n: i18nStart, share, theme } = useAppDependencies(); const isDiscoverAvailable = application.capabilities.discover?.show ?? false; useEffect(() => { @@ -128,13 +124,13 @@ export const StepCreateForm: FC = React.memo( setLoading(true); createTransform( - { transformId, transformConfig }, + { transformId, transformConfig, createDataView, timeFieldName }, { onError: () => setCreated(false), - onSuccess: () => { + onSuccess: (resp) => { setCreated(true); - if (createDataView) { - createKibanaDataView(); + if (resp.dataViewsCreated.length === 1) { + setDataViewId(resp.dataViewsCreated[0].id); } if (startAfterCreation) { startTransform(); @@ -155,57 +151,6 @@ export const StepCreateForm: FC = React.memo( }); } - const createKibanaDataView = async () => { - setLoading(true); - const dataViewName = transformConfig.dest.index; - const runtimeMappings = transformConfig.source.runtime_mappings as Record< - string, - RuntimeField - >; - - try { - const newDataView = await dataViews.createAndSave( - { - title: dataViewName, - timeFieldName, - ...(isPopulatedObject(runtimeMappings) && isLatestTransform(transformConfig) - ? { runtimeFieldMap: runtimeMappings } - : {}), - allowNoIndex: true, - }, - false, - true - ); - - setDataViewId(newDataView.id); - setLoading(false); - return true; - } catch (e) { - if (e instanceof DuplicateDataViewError) { - toastNotifications.addDanger( - i18n.translate('xpack.transform.stepCreateForm.duplicateDataViewErrorMessage', { - defaultMessage: - 'An error occurred creating the Kibana data view {dataViewName}: The data view already exists.', - values: { dataViewName }, - }) - ); - } else { - toastNotifications.addDanger({ - title: i18n.translate('xpack.transform.stepCreateForm.createDataViewErrorMessage', { - defaultMessage: 'An error occurred creating the Kibana data view {dataViewName}:', - values: { dataViewName }, - }), - text: toMountPoint(, { - theme, - i18n: i18nStart, - }), - }); - setLoading(false); - return false; - } - } - }; - const isBatchTransform = typeof transformConfig.sync === 'undefined'; useEffect(() => { diff --git a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts index 5c218a40abb45..8bf3fb16f6a0f 100644 --- a/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts +++ b/x-pack/plugins/transform/server/lib/alerting/transform_health_rule_type/transform_health_service.ts @@ -16,6 +16,7 @@ import { TransformHealthRuleParams } from './schema'; import { ALL_TRANSFORMS_SELECTION, TRANSFORM_HEALTH_CHECK_NAMES, + TRANSFORM_NOTIFICATIONS_INDEX, TRANSFORM_RULE_TYPE, TRANSFORM_STATE, } from '../../../../common/constants'; @@ -27,7 +28,6 @@ import type { } from './register_transform_health_rule_type'; import type { TransformHealthAlertRule } from '../../../../common/types/alerting'; import { isContinuousTransform } from '../../../../common/types/transform'; -import { ML_DF_NOTIFICATION_INDEX_PATTERN } from '../../../routes/api/transforms_audit_messages'; interface TestResult { isHealthy: boolean; @@ -169,7 +169,7 @@ export function transformHealthServiceProvider({ unknown, Record<'by_transform', estypes.AggregationsMultiBucketAggregateBase> >({ - index: ML_DF_NOTIFICATION_INDEX_PATTERN, + index: TRANSFORM_NOTIFICATIONS_INDEX, size: 0, query: { bool: { diff --git a/x-pack/plugins/transform/server/routes/api/audit_messages/register_route.ts b/x-pack/plugins/transform/server/routes/api/audit_messages/register_route.ts new file mode 100644 index 0000000000000..be665d9acc890 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/audit_messages/register_route.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 { addInternalBasePath } from '../../../../common/constants'; +import { + transformIdParamSchema, + TransformIdParamSchema, +} from '../../../../common/api_schemas/common'; +import { + getTransformAuditMessagesQuerySchema, + type GetTransformAuditMessagesQuerySchema, +} from '../../../../common/api_schemas/audit_messages'; + +import { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms Audit Messages + * + * @api {get} /internal/transform/transforms/:transformId/messages Transforms Messages + * @apiName GetTransformsMessages + * @apiDescription Get transforms audit messages + * + * @apiSchema (params) transformIdParamSchema + */ + router.versioned + .get({ + path: addInternalBasePath('transforms/{transformId}/messages'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + params: transformIdParamSchema, + query: getTransformAuditMessagesQuerySchema, + }, + }, + }, + license.guardApiRoute< + TransformIdParamSchema, + GetTransformAuditMessagesQuerySchema, + undefined + >(routeHandler) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/audit_messages/route_handler.ts b/x-pack/plugins/transform/server/routes/api/audit_messages/route_handler.ts new file mode 100644 index 0000000000000..81d1ee01645d5 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/audit_messages/route_handler.ts @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { RequestHandler } from '@kbn/core/server'; + +import { + DEFAULT_MAX_AUDIT_MESSAGE_SIZE, + TRANSFORM_NOTIFICATIONS_INDEX, +} from '../../../../common/constants'; +import type { TransformIdParamSchema } from '../../../../common/api_schemas/common'; +import { AuditMessage } from '../../../../common/types/messages'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +interface BoolQuery { + bool: { [key: string]: any }; +} + +interface TransformMessageQuery { + sortField: string; + sortDirection: 'asc' | 'desc'; +} + +export const routeHandler: RequestHandler< + TransformIdParamSchema, + TransformMessageQuery, + undefined +> = async (ctx, req, res) => { + const { transformId } = req.params; + const sortField = req.query?.sortField ?? 'timestamp'; + const sortDirection = req.query?.sortDirection ?? 'desc'; + + // search for audit messages, + // transformId is optional. without it, all transforms will be listed. + const query: BoolQuery = { + bool: { + filter: [ + { + bool: { + must_not: { + term: { + level: 'activity', + }, + }, + }, + }, + ], + }, + }; + + // if no transformId specified, load all of the messages + if (transformId !== undefined) { + query.bool.filter.push({ + bool: { + should: [ + { + term: { + transform_id: '', // catch system messages + }, + }, + { + term: { + transform_id: transformId, // messages for specified transformId + }, + }, + ], + }, + }); + } + + try { + const esClient = (await ctx.core).elasticsearch.client; + const resp = await esClient.asCurrentUser.search({ + index: TRANSFORM_NOTIFICATIONS_INDEX, + ignore_unavailable: true, + size: DEFAULT_MAX_AUDIT_MESSAGE_SIZE, + body: { + sort: [ + { [sortField]: { order: sortDirection } }, + { transform_id: { order: 'asc' as const } }, + ], + query, + }, + track_total_hits: true, + }); + const totalHits = + typeof resp.hits.total === 'number' ? resp.hits.total : resp.hits.total!.value; + + let messages: AuditMessage[] = []; + // TODO: remove typeof checks when appropriate overloading is added for the `search` API + if ( + (typeof resp.hits.total === 'number' && resp.hits.total > 0) || + (typeof resp.hits.total === 'object' && resp.hits.total.value > 0) + ) { + messages = resp.hits.hits.map((hit) => hit._source!); + } + return res.ok({ body: { messages, total: totalHits } }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/delete_transforms/delete_transforms.ts b/x-pack/plugins/transform/server/routes/api/delete_transforms/delete_transforms.ts new file mode 100644 index 0000000000000..00c0f4b40acfb --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/delete_transforms/delete_transforms.ts @@ -0,0 +1,133 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { KibanaResponseFactory, RequestHandlerContext } from '@kbn/core/server'; +import type { DataViewsService } from '@kbn/data-views-plugin/common'; + +import { TRANSFORM_ACTIONS } from '../../../../common/types/transform'; +import { TRANSFORM_STATE } from '../../../../common/constants'; +import type { ResponseStatus } from '../../../../common/api_schemas/common'; +import type { + DeleteTransformsRequestSchema, + DeleteTransformsResponseSchema, +} from '../../../../common/api_schemas/delete_transforms'; + +import { isRequestTimeout, fillResultsWithTimeouts } from '../../utils/error_utils'; + +async function getDataViewId(indexName: string, dataViewsService: DataViewsService) { + const dv = (await dataViewsService.find(indexName)).find(({ title }) => title === indexName); + return dv?.id; +} + +async function deleteDestDataViewById(dataViewId: string, dataViewsService: DataViewsService) { + return await dataViewsService.delete(dataViewId); +} + +export async function deleteTransforms( + reqBody: DeleteTransformsRequestSchema, + ctx: RequestHandlerContext, + response: KibanaResponseFactory, + dataViewsService: DataViewsService +) { + const { transformsInfo } = reqBody; + + // Cast possible undefineds as booleans + const deleteDestIndex = !!reqBody.deleteDestIndex; + const deleteDestDataView = !!reqBody.deleteDestDataView; + const shouldForceDelete = !!reqBody.forceDelete; + + const results: DeleteTransformsResponseSchema = {}; + + const coreContext = await ctx.core; + const esClient = coreContext.elasticsearch.client; + + for (const transformInfo of transformsInfo) { + let destinationIndex: string | undefined; + + const transformDeleted: ResponseStatus = { success: false }; + const destIndexDeleted: ResponseStatus = { success: false }; + const destDataViewDeleted: ResponseStatus = { + success: false, + }; + const transformId = transformInfo.id; + // force delete only if the transform has failed + let needToForceDelete = false; + + try { + if (transformInfo.state === TRANSFORM_STATE.FAILED) { + needToForceDelete = true; + } + if (!shouldForceDelete) { + // Grab destination index info to delete + try { + const body = await esClient.asCurrentUser.transform.getTransform({ + transform_id: transformId, + }); + const transformConfig = body.transforms[0]; + destinationIndex = transformConfig.dest.index; + } catch (getTransformConfigError) { + transformDeleted.error = getTransformConfigError.meta.body.error; + results[transformId] = { + transformDeleted, + destIndexDeleted, + destDataViewDeleted, + destinationIndex, + }; + // No need to perform further delete attempts + continue; + } + } + + // Delete the data view if there's a data view that matches the name of dest index + if (destinationIndex && deleteDestDataView) { + try { + const dataViewId = await getDataViewId(destinationIndex, dataViewsService); + if (dataViewId) { + await deleteDestDataViewById(dataViewId, dataViewsService); + destDataViewDeleted.success = true; + } + } catch (deleteDestDataViewError) { + destDataViewDeleted.error = deleteDestDataViewError.meta.body.error; + } + } + + try { + await esClient.asCurrentUser.transform.deleteTransform({ + transform_id: transformId, + force: shouldForceDelete && needToForceDelete, + // @ts-expect-error ES type needs to be updated + delete_dest_index: deleteDestIndex, + }); + transformDeleted.success = true; + destIndexDeleted.success = deleteDestIndex; + } catch (deleteTransformJobError) { + transformDeleted.error = deleteTransformJobError.meta.body.error; + if (deleteTransformJobError.statusCode === 403) { + return response.forbidden(); + } + } + + results[transformId] = { + transformDeleted, + destIndexDeleted, + destDataViewDeleted, + destinationIndex, + }; + } catch (e) { + if (isRequestTimeout(e)) { + return fillResultsWithTimeouts({ + results, + id: transformInfo.id, + items: transformsInfo, + action: TRANSFORM_ACTIONS.DELETE, + }); + } + results[transformId] = { transformDeleted: { success: false, error: e.meta.body.error } }; + } + } + return results; +} diff --git a/x-pack/plugins/transform/server/routes/api/delete_transforms/register_route.ts b/x-pack/plugins/transform/server/routes/api/delete_transforms/register_route.ts new file mode 100644 index 0000000000000..cdb58c02d9664 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/delete_transforms/register_route.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + deleteTransformsRequestSchema, + type DeleteTransformsRequestSchema, +} from '../../../../common/api_schemas/delete_transforms'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandlerFactory } from './route_handler_factory'; + +export function registerRoute(routeDependencies: RouteDependencies) { + const { router, license } = routeDependencies; + /** + * @apiGroup Transforms + * + * @api {post} /internal/transform/delete_transforms Post delete transforms + * @apiName DeleteTransforms + * @apiDescription Deletes transforms + * + * @apiSchema (body) deleteTransformsRequestSchema + */ + router.versioned + .post({ + path: addInternalBasePath('delete_transforms'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: deleteTransformsRequestSchema, + }, + }, + }, + license.guardApiRoute( + routeHandlerFactory(routeDependencies) + ) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/delete_transforms/route_handler_factory.ts b/x-pack/plugins/transform/server/routes/api/delete_transforms/route_handler_factory.ts new file mode 100644 index 0000000000000..81b51cabb6209 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/delete_transforms/route_handler_factory.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 type { RequestHandler } from '@kbn/core/server'; + +import { type DeleteTransformsRequestSchema } from '../../../../common/api_schemas/delete_transforms'; + +import type { TransformRequestHandlerContext } from '../../../services/license'; +import { RouteDependencies } from '../../../types'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +import { deleteTransforms } from './delete_transforms'; + +export const routeHandlerFactory: ( + routeDependencies: RouteDependencies +) => RequestHandler< + undefined, + undefined, + DeleteTransformsRequestSchema, + TransformRequestHandlerContext +> = + ({ coreStart, dataViews }) => + async (ctx, req, res) => { + try { + const { savedObjects, elasticsearch } = coreStart; + const savedObjectsClient = savedObjects.getScopedClient(req); + const esClient = elasticsearch.client.asScoped(req).asCurrentUser; + + const dataViewsService = await dataViews.dataViewsServiceFactory( + savedObjectsClient, + esClient, + req + ); + const body = await deleteTransforms(req.body, ctx, res, dataViewsService); + + if (body && body.status) { + if (body.status === 404) { + return res.notFound(); + } + if (body.status === 403) { + return res.forbidden(); + } + } + + return res.ok({ + body, + }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } + }; diff --git a/x-pack/plugins/transform/server/routes/api/field_histograms.ts b/x-pack/plugins/transform/server/routes/api/field_histograms.ts deleted file mode 100644 index 39020201bdd6f..0000000000000 --- a/x-pack/plugins/transform/server/routes/api/field_histograms.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. - */ - -import { fetchHistogramsForFields } from '@kbn/ml-agg-utils'; -import { addInternalBasePath } from '../../../common/constants'; - -import { dataViewTitleSchema, DataViewTitleSchema } from '../../../common/api_schemas/common'; -import { - fieldHistogramsRequestSchema, - FieldHistogramsRequestSchema, -} from '../../../common/api_schemas/field_histograms'; -import { RouteDependencies } from '../../types'; - -import { wrapError, wrapEsError } from './error_utils'; - -export function registerFieldHistogramsRoutes({ router, license }: RouteDependencies) { - router.versioned - .post({ - path: addInternalBasePath('field_histograms/{dataViewTitle}'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - params: dataViewTitleSchema, - body: fieldHistogramsRequestSchema, - }, - }, - }, - license.guardApiRoute( - async (ctx, req, res) => { - const { dataViewTitle } = req.params; - const { query, fields, runtimeMappings, samplerShardSize } = req.body; - - try { - const esClient = (await ctx.core).elasticsearch.client; - const resp = await fetchHistogramsForFields( - esClient.asCurrentUser, - dataViewTitle, - query, - fields, - samplerShardSize, - runtimeMappings - ); - - return res.ok({ body: resp }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - } - ) - ); -} diff --git a/x-pack/plugins/transform/server/routes/api/field_histograms/register_route.ts b/x-pack/plugins/transform/server/routes/api/field_histograms/register_route.ts new file mode 100644 index 0000000000000..5cba0b49675da --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/field_histograms/register_route.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { addInternalBasePath } from '../../../../common/constants'; + +import { dataViewTitleSchema, DataViewTitleSchema } from '../../../../common/api_schemas/common'; +import { + fieldHistogramsRequestSchema, + FieldHistogramsRequestSchema, +} from '../../../../common/api_schemas/field_histograms'; +import { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + router.versioned + .post({ + path: addInternalBasePath('field_histograms/{dataViewTitle}'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + params: dataViewTitleSchema, + body: fieldHistogramsRequestSchema, + }, + }, + }, + license.guardApiRoute( + routeHandler + ) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/field_histograms/route_handler.ts b/x-pack/plugins/transform/server/routes/api/field_histograms/route_handler.ts new file mode 100644 index 0000000000000..365813860462a --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/field_histograms/route_handler.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RequestHandler } from '@kbn/core/server'; +import { fetchHistogramsForFields } from '@kbn/ml-agg-utils'; + +import type { DataViewTitleSchema } from '../../../../common/api_schemas/common'; +import type { FieldHistogramsRequestSchema } from '../../../../common/api_schemas/field_histograms'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +export const routeHandler: RequestHandler< + DataViewTitleSchema, + undefined, + FieldHistogramsRequestSchema +> = async (ctx, req, res) => { + const { dataViewTitle } = req.params; + const { query, fields, runtimeMappings, samplerShardSize } = req.body; + + try { + const esClient = (await ctx.core).elasticsearch.client; + const resp = await fetchHistogramsForFields( + esClient.asCurrentUser, + dataViewTitle, + query, + fields, + samplerShardSize, + runtimeMappings + ); + + return res.ok({ body: resp }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/reauthorize_and_start_transforms.ts b/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/reauthorize_and_start_transforms.ts new file mode 100644 index 0000000000000..45d78999223a1 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/reauthorize_and_start_transforms.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ElasticsearchClient } from '@kbn/core/server'; +import type { TransportRequestOptions } from '@elastic/elasticsearch'; + +import { TRANSFORM_ACTIONS } from '../../../../common/types/transform'; +import type { + ReauthorizeTransformsRequestSchema, + ReauthorizeTransformsResponseSchema, +} from '../../../../common/api_schemas/reauthorize_transforms'; + +import { isRequestTimeout, fillResultsWithTimeouts } from '../../utils/error_utils'; + +export async function reauthorizeAndStartTransforms( + transformsInfo: ReauthorizeTransformsRequestSchema, + esClient: ElasticsearchClient, + options?: TransportRequestOptions +) { + const results: ReauthorizeTransformsResponseSchema = {}; + + for (const transformInfo of transformsInfo) { + const transformId = transformInfo.id; + try { + await esClient.transform.updateTransform( + { + body: {}, + transform_id: transformId, + }, + options ?? {} + ); + + await esClient.transform.startTransform( + { + transform_id: transformId, + }, + { ignore: [409] } + ); + + results[transformId] = { success: true }; + } catch (e) { + if (isRequestTimeout(e)) { + return fillResultsWithTimeouts({ + results, + id: transformId, + items: transformsInfo, + action: TRANSFORM_ACTIONS.REAUTHORIZE, + }); + } + results[transformId] = { success: false, error: e.meta.body.error }; + } + } + return results; +} diff --git a/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/register_route.ts b/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/register_route.ts new file mode 100644 index 0000000000000..017aa98e76304 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/register_route.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { StartTransformsRequestSchema } from '../../../../common/api_schemas/start_transforms'; +import { reauthorizeTransformsRequestSchema } from '../../../../common/api_schemas/reauthorize_transforms'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandlerFactory } from './route_handler_factory'; + +export function registerRoute(routeDependencies: RouteDependencies) { + const { router, license } = routeDependencies; + /** + * @apiGroup Reauthorize transforms with API key generated from currently logged in user + * @api {post} /internal/transform/reauthorize_transforms Post reauthorize transforms + * @apiName Reauthorize Transforms + * @apiDescription Reauthorize transforms by generating an API Key for current user + * and update transform's es-secondary-authorization headers with the generated key, + * then start the transform. + * @apiSchema (body) reauthorizeTransformsRequestSchema + */ + router.versioned + .post({ + path: addInternalBasePath('reauthorize_transforms'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: reauthorizeTransformsRequestSchema, + }, + }, + }, + license.guardApiRoute( + routeHandlerFactory(routeDependencies) + ) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/route_handler_factory.ts b/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/route_handler_factory.ts new file mode 100644 index 0000000000000..acefdec0257a9 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/route_handler_factory.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RequestHandler } from '@kbn/core/server'; + +import { generateTransformSecondaryAuthHeaders } from '../../../../common/utils/transform_api_key'; +import type { StartTransformsRequestSchema } from '../../../../common/api_schemas/start_transforms'; + +import type { TransformRequestHandlerContext } from '../../../services/license'; + +import type { RouteDependencies } from '../../../types'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +import { reauthorizeAndStartTransforms } from './reauthorize_and_start_transforms'; + +export const routeHandlerFactory: ( + routeDependencies: RouteDependencies +) => RequestHandler< + undefined, + undefined, + StartTransformsRequestSchema, + TransformRequestHandlerContext +> = (routeDependencies) => async (ctx, req, res) => { + const { coreStart, security: securityStart } = routeDependencies; + + try { + const transformsInfo = req.body; + const { elasticsearch } = coreStart; + const esClient = elasticsearch.client.asScoped(req).asCurrentUser; + + let apiKeyWithCurrentUserPermission; + + // If security is not enabled or available, user should not have the need to reauthorize + // in that case, start anyway + if (securityStart) { + apiKeyWithCurrentUserPermission = await securityStart.authc.apiKeys.grantAsInternalUser(req, { + name: `auto-generated-transform-api-key`, + role_descriptors: {}, + }); + } + const secondaryAuth = generateTransformSecondaryAuthHeaders(apiKeyWithCurrentUserPermission); + + const authorizedTransforms = await reauthorizeAndStartTransforms(transformsInfo, esClient, { + ...(secondaryAuth ? secondaryAuth : {}), + }); + return res.ok({ body: authorizedTransforms }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/reset_transforms/register_route.ts b/x-pack/plugins/transform/server/routes/api/reset_transforms/register_route.ts new file mode 100644 index 0000000000000..cae6245455810 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/reset_transforms/register_route.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 { + resetTransformsRequestSchema, + type ResetTransformsRequestSchema, +} from '../../../../common/api_schemas/reset_transforms'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {post} /internal/transform/reset_transforms Post reset transforms + * @apiName ResetTransforms + * @apiDescription resets transforms + * + * @apiSchema (body) resetTransformsRequestSchema + */ + router.versioned + .post({ + path: addInternalBasePath('reset_transforms'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: resetTransformsRequestSchema, + }, + }, + }, + license.guardApiRoute(routeHandler) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/reset_transforms/reset_transforms.ts b/x-pack/plugins/transform/server/routes/api/reset_transforms/reset_transforms.ts new file mode 100644 index 0000000000000..e9d2edd52f440 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/reset_transforms/reset_transforms.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 type { KibanaResponseFactory, RequestHandlerContext } from '@kbn/core/server'; + +import { TRANSFORM_ACTIONS } from '../../../../common/types/transform'; +import type { ResponseStatus } from '../../../../common/api_schemas/common'; +import type { + ResetTransformsRequestSchema, + ResetTransformsResponseSchema, +} from '../../../../common/api_schemas/reset_transforms'; + +import { isRequestTimeout, fillResultsWithTimeouts } from '../../utils/error_utils'; + +export async function resetTransforms( + reqBody: ResetTransformsRequestSchema, + ctx: RequestHandlerContext, + response: KibanaResponseFactory +) { + const { transformsInfo } = reqBody; + + const results: ResetTransformsResponseSchema = {}; + const esClient = (await ctx.core).elasticsearch.client; + + for (const transformInfo of transformsInfo) { + const transformReset: ResponseStatus = { success: false }; + const transformId = transformInfo.id; + + try { + try { + await esClient.asCurrentUser.transform.resetTransform({ + transform_id: transformId, + }); + transformReset.success = true; + } catch (resetTransformJobError) { + transformReset.error = resetTransformJobError.meta.body.error; + if (resetTransformJobError.statusCode === 403) { + return response.forbidden(); + } + } + + results[transformId] = { + transformReset, + }; + } catch (e) { + if (isRequestTimeout(e)) { + return fillResultsWithTimeouts({ + results, + id: transformInfo.id, + items: transformsInfo, + action: TRANSFORM_ACTIONS.RESET, + }); + } + results[transformId] = { transformReset: { success: false, error: e.meta.body.error } }; + } + } + return results; +} diff --git a/x-pack/plugins/transform/server/routes/api/reset_transforms/route_handler.ts b/x-pack/plugins/transform/server/routes/api/reset_transforms/route_handler.ts new file mode 100644 index 0000000000000..d10a093ae5ee2 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/reset_transforms/route_handler.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 type { RequestHandler } from '@kbn/core/server'; + +import type { ResetTransformsRequestSchema } from '../../../../common/api_schemas/reset_transforms'; + +import type { TransformRequestHandlerContext } from '../../../services/license'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +import { resetTransforms } from './reset_transforms'; + +export const routeHandler: RequestHandler< + undefined, + undefined, + ResetTransformsRequestSchema, + TransformRequestHandlerContext +> = async (ctx, req, res) => { + try { + const body = await resetTransforms(req.body, ctx, res); + + if (body && body.status) { + if (body.status === 404) { + return res.notFound(); + } + if (body.status === 403) { + return res.forbidden(); + } + } + + return res.ok({ + body, + }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/schedule_now_transforms/register_route.ts b/x-pack/plugins/transform/server/routes/api/schedule_now_transforms/register_route.ts new file mode 100644 index 0000000000000..cf19b56c316f1 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/schedule_now_transforms/register_route.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 { + scheduleNowTransformsRequestSchema, + type ScheduleNowTransformsRequestSchema, +} from '../../../../common/api_schemas/schedule_now_transforms'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {post} /internal/transform/schedule_now_transforms Schedules transforms now + * @apiName PostScheduleNowTransforms + * @apiDescription Schedules transforms now + * + * @apiSchema (body) scheduleNowTransformsRequestSchema + */ + router.versioned + .post({ + path: addInternalBasePath('schedule_now_transforms'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: scheduleNowTransformsRequestSchema, + }, + }, + }, + license.guardApiRoute(routeHandler) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/schedule_now_transforms/route_handler.ts b/x-pack/plugins/transform/server/routes/api/schedule_now_transforms/route_handler.ts new file mode 100644 index 0000000000000..53099f7270b7a --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/schedule_now_transforms/route_handler.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 { RequestHandler } from '@kbn/core/server'; + +import type { ScheduleNowTransformsRequestSchema } from '../../../../common/api_schemas/schedule_now_transforms'; + +import type { TransformRequestHandlerContext } from '../../../services/license'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +import { scheduleNowTransforms } from './schedule_now_transforms'; + +export const routeHandler: RequestHandler< + undefined, + undefined, + ScheduleNowTransformsRequestSchema, + TransformRequestHandlerContext +> = async (ctx, req, res) => { + const transformsInfo = req.body; + + try { + const esClient = (await ctx.core).elasticsearch.client; + return res.ok({ + body: await scheduleNowTransforms(transformsInfo, esClient.asCurrentUser), + }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/schedule_now_transforms/schedule_now_transforms.ts b/x-pack/plugins/transform/server/routes/api/schedule_now_transforms/schedule_now_transforms.ts new file mode 100644 index 0000000000000..fddcaf78185d4 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/schedule_now_transforms/schedule_now_transforms.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 { ElasticsearchClient } from '@kbn/core/server'; + +import { TRANSFORM_ACTIONS } from '../../../../common/types/transform'; +import type { + ScheduleNowTransformsRequestSchema, + ScheduleNowTransformsResponseSchema, +} from '../../../../common/api_schemas/schedule_now_transforms'; + +import { isRequestTimeout, fillResultsWithTimeouts } from '../../utils/error_utils'; + +export async function scheduleNowTransforms( + transformsInfo: ScheduleNowTransformsRequestSchema, + esClient: ElasticsearchClient +) { + const results: ScheduleNowTransformsResponseSchema = {}; + + for (const transformInfo of transformsInfo) { + const transformId = transformInfo.id; + try { + await esClient.transport.request({ + method: 'POST', + path: `_transform/${transformId}/_schedule_now`, + }); + + results[transformId] = { success: true }; + } catch (e) { + if (isRequestTimeout(e)) { + return fillResultsWithTimeouts({ + results, + id: transformId, + items: transformsInfo, + action: TRANSFORM_ACTIONS.SCHEDULE_NOW, + }); + } + results[transformId] = { success: false, error: e.meta.body.error }; + } + } + return results; +} diff --git a/x-pack/plugins/transform/server/routes/api/start_transforms/register_route.ts b/x-pack/plugins/transform/server/routes/api/start_transforms/register_route.ts new file mode 100644 index 0000000000000..5cba3a5a01d70 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/start_transforms/register_route.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 { + startTransformsRequestSchema, + type StartTransformsRequestSchema, +} from '../../../../common/api_schemas/start_transforms'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {post} /internal/transform/start_transforms Start transforms + * @apiName PostStartTransforms + * @apiDescription Starts transform + * + * @apiSchema (body) startTransformsRequestSchema + */ + router.versioned + .post({ + path: addInternalBasePath('start_transforms'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: startTransformsRequestSchema, + }, + }, + }, + license.guardApiRoute(routeHandler) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/start_transforms/route_handler.ts b/x-pack/plugins/transform/server/routes/api/start_transforms/route_handler.ts new file mode 100644 index 0000000000000..50bbf395a5ac7 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/start_transforms/route_handler.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RequestHandler } from '@kbn/core/server'; + +import type { StartTransformsRequestSchema } from '../../../../common/api_schemas/start_transforms'; + +import type { TransformRequestHandlerContext } from '../../../services/license'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +import { startTransforms } from './start_transforms'; + +export const routeHandler: RequestHandler< + undefined, + undefined, + StartTransformsRequestSchema, + TransformRequestHandlerContext +> = async (ctx, req, res) => { + const transformsInfo = req.body; + + try { + const esClient = (await ctx.core).elasticsearch.client; + const body = await startTransforms(transformsInfo, esClient.asCurrentUser); + return res.ok({ + body, + }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/start_transforms/start_transforms.ts b/x-pack/plugins/transform/server/routes/api/start_transforms/start_transforms.ts new file mode 100644 index 0000000000000..d8097001df9bb --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/start_transforms/start_transforms.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 type { ElasticsearchClient } from '@kbn/core/server'; + +import { TRANSFORM_ACTIONS } from '../../../../common/types/transform'; +import type { + StartTransformsRequestSchema, + StartTransformsResponseSchema, +} from '../../../../common/api_schemas/start_transforms'; + +import { isRequestTimeout, fillResultsWithTimeouts } from '../../utils/error_utils'; + +export async function startTransforms( + transformsInfo: StartTransformsRequestSchema, + esClient: ElasticsearchClient +) { + const results: StartTransformsResponseSchema = {}; + + for (const transformInfo of transformsInfo) { + const transformId = transformInfo.id; + try { + await esClient.transform.startTransform({ + transform_id: transformId, + }); + results[transformId] = { success: true }; + } catch (e) { + if (isRequestTimeout(e)) { + return fillResultsWithTimeouts({ + results, + id: transformId, + items: transformsInfo, + action: TRANSFORM_ACTIONS.START, + }); + } + results[transformId] = { success: false, error: e.meta.body.error }; + } + } + return results; +} diff --git a/x-pack/plugins/transform/server/routes/api/stop_transforms/register_route.ts b/x-pack/plugins/transform/server/routes/api/stop_transforms/register_route.ts new file mode 100644 index 0000000000000..df9498f9ae033 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/stop_transforms/register_route.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 { + stopTransformsRequestSchema, + type StopTransformsRequestSchema, +} from '../../../../common/api_schemas/stop_transforms'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {post} /internal/transform/stop_transforms Stop transforms + * @apiName PostStopTransforms + * @apiDescription Stops transform + * + * @apiSchema (body) stopTransformsRequestSchema + */ + router.versioned + .post({ + path: addInternalBasePath('stop_transforms'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: stopTransformsRequestSchema, + }, + }, + }, + license.guardApiRoute(routeHandler) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/stop_transforms/route_handler.ts b/x-pack/plugins/transform/server/routes/api/stop_transforms/route_handler.ts new file mode 100644 index 0000000000000..3ad753ec24c55 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/stop_transforms/route_handler.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 { RequestHandler } from '@kbn/core/server'; + +import type { StopTransformsRequestSchema } from '../../../../common/api_schemas/stop_transforms'; + +import type { TransformRequestHandlerContext } from '../../../services/license'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +import { stopTransforms } from './stop_transforms'; + +export const routeHandler: RequestHandler< + undefined, + undefined, + StopTransformsRequestSchema, + TransformRequestHandlerContext +> = async (ctx, req, res) => { + const transformsInfo = req.body; + + try { + const esClient = (await ctx.core).elasticsearch.client; + return res.ok({ + body: await stopTransforms(transformsInfo, esClient.asCurrentUser), + }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/stop_transforms/stop_transforms.ts b/x-pack/plugins/transform/server/routes/api/stop_transforms/stop_transforms.ts new file mode 100644 index 0000000000000..2096c9f9f0ca5 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/stop_transforms/stop_transforms.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 type { ElasticsearchClient } from '@kbn/core/server'; + +import { TRANSFORM_ACTIONS } from '../../../../common/types/transform'; +import { TRANSFORM_STATE } from '../../../../common/constants'; +import type { + StopTransformsRequestSchema, + StopTransformsResponseSchema, +} from '../../../../common/api_schemas/stop_transforms'; + +import { isRequestTimeout, fillResultsWithTimeouts } from '../../utils/error_utils'; + +export async function stopTransforms( + transformsInfo: StopTransformsRequestSchema, + esClient: ElasticsearchClient +) { + const results: StopTransformsResponseSchema = {}; + + for (const transformInfo of transformsInfo) { + const transformId = transformInfo.id; + try { + await esClient.transform.stopTransform({ + transform_id: transformId, + force: + transformInfo.state !== undefined + ? transformInfo.state === TRANSFORM_STATE.FAILED + : false, + wait_for_completion: true, + }); + results[transformId] = { success: true }; + } catch (e) { + if (isRequestTimeout(e)) { + return fillResultsWithTimeouts({ + results, + id: transformId, + items: transformsInfo, + action: TRANSFORM_ACTIONS.STOP, + }); + } + results[transformId] = { success: false, error: e.meta.body.error }; + } + } + return results; +} diff --git a/x-pack/plugins/transform/server/routes/api/transforms.ts b/x-pack/plugins/transform/server/routes/api/transforms.ts deleted file mode 100644 index 80d44c0e907bf..0000000000000 --- a/x-pack/plugins/transform/server/routes/api/transforms.ts +++ /dev/null @@ -1,1021 +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 * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; - -import { - ElasticsearchClient, - KibanaResponseFactory, - RequestHandler, - RequestHandlerContext, -} from '@kbn/core/server'; - -import { DataViewsService } from '@kbn/data-views-plugin/common'; -import type { TransportRequestOptions } from '@elastic/elasticsearch'; -import { generateTransformSecondaryAuthHeaders } from '../../../common/utils/transform_api_key'; -import { - reauthorizeTransformsRequestSchema, - ReauthorizeTransformsRequestSchema, - ReauthorizeTransformsResponseSchema, -} from '../../../common/api_schemas/reauthorize_transforms'; -import { addInternalBasePath, TRANSFORM_STATE } from '../../../common/constants'; -import { - transformIdParamSchema, - ResponseStatus, - TransformIdParamSchema, -} from '../../../common/api_schemas/common'; -import { - deleteTransformsRequestSchema, - DeleteTransformsRequestSchema, - DeleteTransformsResponseSchema, -} from '../../../common/api_schemas/delete_transforms'; -import { - resetTransformsRequestSchema, - ResetTransformsRequestSchema, - ResetTransformsResponseSchema, -} from '../../../common/api_schemas/reset_transforms'; -import { - startTransformsRequestSchema, - StartTransformsRequestSchema, - StartTransformsResponseSchema, -} from '../../../common/api_schemas/start_transforms'; -import { - stopTransformsRequestSchema, - StopTransformsRequestSchema, - StopTransformsResponseSchema, -} from '../../../common/api_schemas/stop_transforms'; -import { - scheduleNowTransformsRequestSchema, - ScheduleNowTransformsRequestSchema, - ScheduleNowTransformsResponseSchema, -} from '../../../common/api_schemas/schedule_now_transforms'; -import { - postTransformsUpdateRequestSchema, - PostTransformsUpdateRequestSchema, -} from '../../../common/api_schemas/update_transforms'; -import { - postTransformsPreviewRequestSchema, - PostTransformsPreviewRequestSchema, - putTransformsRequestSchema, - PutTransformsRequestSchema, - PutTransformsResponseSchema, -} from '../../../common/api_schemas/transforms'; - -import { RouteDependencies } from '../../types'; - -import { isRequestTimeout, fillResultsWithTimeouts, wrapError, wrapEsError } from './error_utils'; -import { registerTransformsAuditMessagesRoutes } from './transforms_audit_messages'; -import { registerTransformNodesRoutes } from './transforms_nodes'; -import { isLatestTransform } from '../../../common/types/transform'; -import { isKeywordDuplicate } from '../../../common/utils/field_utils'; -import { transformHealthServiceProvider } from '../../lib/alerting/transform_health_rule_type/transform_health_service'; - -enum TRANSFORM_ACTIONS { - DELETE = 'delete', - REAUTHORIZE = 'reauthorize', - RESET = 'reset', - SCHEDULE_NOW = 'schedule_now', - STOP = 'stop', - START = 'start', -} - -export function registerTransformsRoutes(routeDependencies: RouteDependencies) { - const { router, license, coreStart, dataViews, security: securityStart } = routeDependencies; - /** - * @apiGroup Transforms - * - * @api {get} /internal/transform/transforms Get transforms - * @apiName GetTransforms - * @apiDescription Returns transforms - * - * @apiSchema (params) jobAuditMessagesJobIdSchema - * @apiSchema (query) jobAuditMessagesQuerySchema - */ - router.versioned - .get({ - path: addInternalBasePath('transforms'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: false, - }, - license.guardApiRoute( - async (ctx, req, res) => { - try { - const esClient = (await ctx.core).elasticsearch.client; - const body = await esClient.asCurrentUser.transform.getTransform({ - size: 1000, - ...req.params, - }); - - const alerting = await ctx.alerting; - if (alerting) { - const transformHealthService = transformHealthServiceProvider({ - esClient: esClient.asCurrentUser, - rulesClient: alerting.getRulesClient(), - }); - - // @ts-ignore - await transformHealthService.populateTransformsWithAssignedRules(body.transforms); - } - - return res.ok({ body }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - } - ) - ); - - /** - * @apiGroup Transforms - * - * @api {get} /internal/transform/transforms/:transformId Get transform - * @apiName GetTransform - * @apiDescription Returns a single transform - * - * @apiSchema (params) transformIdParamSchema - */ - router.versioned - .get({ - path: addInternalBasePath('transforms/{transformId}'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - params: transformIdParamSchema, - }, - }, - }, - license.guardApiRoute(async (ctx, req, res) => { - const { transformId } = req.params; - try { - const esClient = (await ctx.core).elasticsearch.client; - const body = await esClient.asCurrentUser.transform.getTransform({ - transform_id: transformId, - }); - return res.ok({ body }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - }) - ); - - /** - * @apiGroup Transforms - * - * @api {get} /internal/transform/transforms/_stats Get transforms stats - * @apiName GetTransformsStats - * @apiDescription Returns transforms stats - */ - router.versioned - .get({ - path: addInternalBasePath('transforms/_stats'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: false, - }, - license.guardApiRoute( - async (ctx, req, res) => { - try { - const esClient = (await ctx.core).elasticsearch.client; - const body = await esClient.asCurrentUser.transform.getTransformStats( - { - size: 1000, - transform_id: '_all', - }, - { maxRetries: 0 } - ); - return res.ok({ body }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - } - ) - ); - - /** - * @apiGroup Transforms - * - * @api {get} /internal/transform/transforms/:transformId/_stats Get transform stats - * @apiName GetTransformStats - * @apiDescription Returns stats for a single transform - * - * @apiSchema (params) transformIdParamSchema - */ - router.versioned - .get({ - path: addInternalBasePath('transforms/{transformId}/_stats'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - params: transformIdParamSchema, - }, - }, - }, - license.guardApiRoute(async (ctx, req, res) => { - const { transformId } = req.params; - try { - const esClient = (await ctx.core).elasticsearch.client; - const body = await esClient.asCurrentUser.transform.getTransformStats( - { - transform_id: transformId, - }, - { maxRetries: 0 } - ); - return res.ok({ body }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - }) - ); - - /** - * @apiGroup Transforms - * - * @api {put} /internal/transform/transforms/:transformId Put transform - * @apiName PutTransform - * @apiDescription Creates a transform - * - * @apiSchema (params) transformIdParamSchema - * @apiSchema (body) putTransformsRequestSchema - */ - router.versioned - .put({ - path: addInternalBasePath('transforms/{transformId}'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - params: transformIdParamSchema, - body: putTransformsRequestSchema, - }, - }, - }, - license.guardApiRoute( - async (ctx, req, res) => { - const { transformId } = req.params; - - const response: PutTransformsResponseSchema = { - transformsCreated: [], - errors: [], - }; - - const esClient = (await ctx.core).elasticsearch.client; - await esClient.asCurrentUser.transform - .putTransform({ - // @ts-expect-error @elastic/elasticsearch group_by is expected to be optional in TransformPivot - body: req.body, - transform_id: transformId, - }) - .then(() => { - response.transformsCreated.push({ transform: transformId }); - }) - .catch((e) => - response.errors.push({ - id: transformId, - error: wrapEsError(e), - }) - ); - - return res.ok({ body: response }); - } - ) - ); - - /** - * @apiGroup Transforms - * - * @api {post} /internal/transform/transforms/:transformId/_update Post transform update - * @apiName PostTransformUpdate - * @apiDescription Updates a transform - * - * @apiSchema (params) transformIdParamSchema - * @apiSchema (body) postTransformsUpdateRequestSchema - */ - router.versioned - .post({ - path: addInternalBasePath('transforms/{transformId}/_update'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - params: transformIdParamSchema, - body: postTransformsUpdateRequestSchema, - }, - }, - }, - license.guardApiRoute( - async (ctx, req, res) => { - const { transformId } = req.params; - - try { - const esClient = (await ctx.core).elasticsearch.client; - const body = await esClient.asCurrentUser.transform.updateTransform({ - // @ts-expect-error query doesn't satisfy QueryDslQueryContainer from @elastic/elasticsearch - body: req.body, - transform_id: transformId, - }); - return res.ok({ - body, - }); - } catch (e) { - return res.customError(wrapError(e)); - } - } - ) - ); - - /** - * @apiGroup Reauthorize transforms with API key generated from currently logged in user - * @api {post} /internal/transform/reauthorize_transforms Post reauthorize transforms - * @apiName Reauthorize Transforms - * @apiDescription Reauthorize transforms by generating an API Key for current user - * and update transform's es-secondary-authorization headers with the generated key, - * then start the transform. - * @apiSchema (body) reauthorizeTransformsRequestSchema - */ - router.versioned - .post({ - path: addInternalBasePath('reauthorize_transforms'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - body: reauthorizeTransformsRequestSchema, - }, - }, - }, - license.guardApiRoute( - async (ctx, req, res) => { - try { - const transformsInfo = req.body; - const { elasticsearch } = coreStart; - const esClient = elasticsearch.client.asScoped(req).asCurrentUser; - - let apiKeyWithCurrentUserPermission; - - // If security is not enabled or available, user should not have the need to reauthorize - // in that case, start anyway - if (securityStart) { - apiKeyWithCurrentUserPermission = - await securityStart.authc.apiKeys.grantAsInternalUser(req, { - name: `auto-generated-transform-api-key`, - role_descriptors: {}, - }); - } - const secondaryAuth = generateTransformSecondaryAuthHeaders( - apiKeyWithCurrentUserPermission - ); - - const authorizedTransforms = await reauthorizeAndStartTransforms( - transformsInfo, - esClient, - { - ...(secondaryAuth ? secondaryAuth : {}), - } - ); - return res.ok({ body: authorizedTransforms }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - } - ) - ); - - /** - * @apiGroup Transforms - * - * @api {post} /internal/transform/delete_transforms Post delete transforms - * @apiName DeleteTransforms - * @apiDescription Deletes transforms - * - * @apiSchema (body) deleteTransformsRequestSchema - */ - router.versioned - .post({ - path: addInternalBasePath('delete_transforms'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - body: deleteTransformsRequestSchema, - }, - }, - }, - license.guardApiRoute( - async (ctx, req, res) => { - try { - const { savedObjects, elasticsearch } = coreStart; - const savedObjectsClient = savedObjects.getScopedClient(req); - const esClient = elasticsearch.client.asScoped(req).asCurrentUser; - - const dataViewsService = await dataViews.dataViewsServiceFactory( - savedObjectsClient, - esClient, - req - ); - const body = await deleteTransforms(req.body, ctx, res, dataViewsService); - - if (body && body.status) { - if (body.status === 404) { - return res.notFound(); - } - if (body.status === 403) { - return res.forbidden(); - } - } - - return res.ok({ - body, - }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - } - ) - ); - - /** - * @apiGroup Transforms - * - * @api {post} /internal/transform/reset_transforms Post reset transforms - * @apiName ResetTransforms - * @apiDescription resets transforms - * - * @apiSchema (body) resetTransformsRequestSchema - */ - router.versioned - .post({ - path: addInternalBasePath('reset_transforms'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - body: resetTransformsRequestSchema, - }, - }, - }, - license.guardApiRoute( - async (ctx, req, res) => { - try { - const body = await resetTransforms(req.body, ctx, res); - - if (body && body.status) { - if (body.status === 404) { - return res.notFound(); - } - if (body.status === 403) { - return res.forbidden(); - } - } - - return res.ok({ - body, - }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - } - ) - ); - - /** - * @apiGroup Transforms - * - * @api {post} /internal/transform/transforms/_preview Preview transform - * @apiName PreviewTransform - * @apiDescription Previews transform - * - * @apiSchema (body) postTransformsPreviewRequestSchema - */ - router.versioned - .post({ - path: addInternalBasePath('transforms/_preview'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - body: postTransformsPreviewRequestSchema, - }, - }, - }, - license.guardApiRoute( - previewTransformHandler - ) - ); - - /** - * @apiGroup Transforms - * - * @api {post} /internal/transform/start_transforms Start transforms - * @apiName PostStartTransforms - * @apiDescription Starts transform - * - * @apiSchema (body) startTransformsRequestSchema - */ - router.versioned - .post({ - path: addInternalBasePath('start_transforms'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - body: startTransformsRequestSchema, - }, - }, - }, - license.guardApiRoute( - startTransformsHandler - ) - ); - - /** - * @apiGroup Transforms - * - * @api {post} /internal/transform/stop_transforms Stop transforms - * @apiName PostStopTransforms - * @apiDescription Stops transform - * - * @apiSchema (body) stopTransformsRequestSchema - */ - router.versioned - .post({ - path: addInternalBasePath('stop_transforms'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - body: stopTransformsRequestSchema, - }, - }, - }, - license.guardApiRoute( - stopTransformsHandler - ) - ); - - /** - * @apiGroup Transforms - * - * @api {post} /internal/transform/schedule_now_transforms Schedules transforms now - * @apiName PostScheduleNowTransforms - * @apiDescription Schedules transforms now - * - * @apiSchema (body) scheduleNowTransformsRequestSchema - */ - router.versioned - .post({ - path: addInternalBasePath('schedule_now_transforms'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - body: scheduleNowTransformsRequestSchema, - }, - }, - }, - license.guardApiRoute( - scheduleNowTransformsHandler - ) - ); - - registerTransformsAuditMessagesRoutes(routeDependencies); - registerTransformNodesRoutes(routeDependencies); -} - -async function getDataViewId(indexName: string, dataViewsService: DataViewsService) { - const dv = (await dataViewsService.find(indexName)).find(({ title }) => title === indexName); - return dv?.id; -} - -async function deleteDestDataViewById(dataViewId: string, dataViewsService: DataViewsService) { - return await dataViewsService.delete(dataViewId); -} - -async function deleteTransforms( - reqBody: DeleteTransformsRequestSchema, - ctx: RequestHandlerContext, - response: KibanaResponseFactory, - dataViewsService: DataViewsService -) { - const { transformsInfo } = reqBody; - - // Cast possible undefineds as booleans - const deleteDestIndex = !!reqBody.deleteDestIndex; - const deleteDestDataView = !!reqBody.deleteDestDataView; - const shouldForceDelete = !!reqBody.forceDelete; - - const results: DeleteTransformsResponseSchema = {}; - - const coreContext = await ctx.core; - const esClient = coreContext.elasticsearch.client; - - for (const transformInfo of transformsInfo) { - let destinationIndex: string | undefined; - - const transformDeleted: ResponseStatus = { success: false }; - const destIndexDeleted: ResponseStatus = { success: false }; - const destDataViewDeleted: ResponseStatus = { - success: false, - }; - const transformId = transformInfo.id; - // force delete only if the transform has failed - let needToForceDelete = false; - - try { - if (transformInfo.state === TRANSFORM_STATE.FAILED) { - needToForceDelete = true; - } - if (!shouldForceDelete) { - // Grab destination index info to delete - try { - const body = await esClient.asCurrentUser.transform.getTransform({ - transform_id: transformId, - }); - const transformConfig = body.transforms[0]; - destinationIndex = transformConfig.dest.index; - } catch (getTransformConfigError) { - transformDeleted.error = getTransformConfigError.meta.body.error; - results[transformId] = { - transformDeleted, - destIndexDeleted, - destDataViewDeleted, - destinationIndex, - }; - // No need to perform further delete attempts - continue; - } - } - - // Delete the data view if there's a data view that matches the name of dest index - if (destinationIndex && deleteDestDataView) { - try { - const dataViewId = await getDataViewId(destinationIndex, dataViewsService); - if (dataViewId) { - await deleteDestDataViewById(dataViewId, dataViewsService); - destDataViewDeleted.success = true; - } - } catch (deleteDestDataViewError) { - destDataViewDeleted.error = deleteDestDataViewError.meta.body.error; - } - } - - try { - await esClient.asCurrentUser.transform.deleteTransform({ - transform_id: transformId, - force: shouldForceDelete && needToForceDelete, - // @ts-expect-error ES type needs to be updated - delete_dest_index: deleteDestIndex, - }); - transformDeleted.success = true; - destIndexDeleted.success = deleteDestIndex; - } catch (deleteTransformJobError) { - transformDeleted.error = deleteTransformJobError.meta.body.error; - if (deleteTransformJobError.statusCode === 403) { - return response.forbidden(); - } - } - - results[transformId] = { - transformDeleted, - destIndexDeleted, - destDataViewDeleted, - destinationIndex, - }; - } catch (e) { - if (isRequestTimeout(e)) { - return fillResultsWithTimeouts({ - results, - id: transformInfo.id, - items: transformsInfo, - action: TRANSFORM_ACTIONS.DELETE, - }); - } - results[transformId] = { transformDeleted: { success: false, error: e.meta.body.error } }; - } - } - return results; -} - -async function resetTransforms( - reqBody: ResetTransformsRequestSchema, - ctx: RequestHandlerContext, - response: KibanaResponseFactory -) { - const { transformsInfo } = reqBody; - - const results: ResetTransformsResponseSchema = {}; - const esClient = (await ctx.core).elasticsearch.client; - - for (const transformInfo of transformsInfo) { - const transformReset: ResponseStatus = { success: false }; - const transformId = transformInfo.id; - - try { - try { - await esClient.asCurrentUser.transform.resetTransform({ - transform_id: transformId, - }); - transformReset.success = true; - } catch (resetTransformJobError) { - transformReset.error = resetTransformJobError.meta.body.error; - if (resetTransformJobError.statusCode === 403) { - return response.forbidden(); - } - } - - results[transformId] = { - transformReset, - }; - } catch (e) { - if (isRequestTimeout(e)) { - return fillResultsWithTimeouts({ - results, - id: transformInfo.id, - items: transformsInfo, - action: TRANSFORM_ACTIONS.RESET, - }); - } - results[transformId] = { transformReset: { success: false, error: e.meta.body.error } }; - } - } - return results; -} - -const previewTransformHandler: RequestHandler< - undefined, - undefined, - PostTransformsPreviewRequestSchema -> = async (ctx, req, res) => { - try { - const reqBody = req.body; - const esClient = (await ctx.core).elasticsearch.client; - const body = await esClient.asCurrentUser.transform.previewTransform( - { - body: reqBody, - }, - { maxRetries: 0 } - ); - if (isLatestTransform(reqBody)) { - // for the latest transform mappings properties have to be retrieved from the source - const fieldCapsResponse = await esClient.asCurrentUser.fieldCaps( - { - index: reqBody.source.index, - fields: '*', - include_unmapped: false, - }, - { maxRetries: 0 } - ); - - const fieldNamesSet = new Set(Object.keys(fieldCapsResponse.fields)); - - const fields = Object.entries( - fieldCapsResponse.fields as Record> - ).reduce((acc, [fieldName, fieldCaps]) => { - const fieldDefinition = Object.values(fieldCaps)[0]; - const isMetaField = fieldDefinition.type.startsWith('_') || fieldName === '_doc_count'; - if (isMetaField || isKeywordDuplicate(fieldName, fieldNamesSet)) { - return acc; - } - acc[fieldName] = { ...fieldDefinition }; - return acc; - }, {} as Record); - - body.generated_dest_index.mappings!.properties = fields as Record< - string, - estypes.MappingProperty - >; - } - return res.ok({ body }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } -}; - -const startTransformsHandler: RequestHandler< - undefined, - undefined, - StartTransformsRequestSchema -> = async (ctx, req, res) => { - const transformsInfo = req.body; - - try { - const esClient = (await ctx.core).elasticsearch.client; - const body = await startTransforms(transformsInfo, esClient.asCurrentUser); - return res.ok({ - body, - }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } -}; - -async function startTransforms( - transformsInfo: StartTransformsRequestSchema, - esClient: ElasticsearchClient -) { - const results: StartTransformsResponseSchema = {}; - - for (const transformInfo of transformsInfo) { - const transformId = transformInfo.id; - try { - await esClient.transform.startTransform({ - transform_id: transformId, - }); - results[transformId] = { success: true }; - } catch (e) { - if (isRequestTimeout(e)) { - return fillResultsWithTimeouts({ - results, - id: transformId, - items: transformsInfo, - action: TRANSFORM_ACTIONS.START, - }); - } - results[transformId] = { success: false, error: e.meta.body.error }; - } - } - return results; -} - -const stopTransformsHandler: RequestHandler< - undefined, - undefined, - StopTransformsRequestSchema -> = async (ctx, req, res) => { - const transformsInfo = req.body; - - try { - const esClient = (await ctx.core).elasticsearch.client; - return res.ok({ - body: await stopTransforms(transformsInfo, esClient.asCurrentUser), - }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } -}; - -async function stopTransforms( - transformsInfo: StopTransformsRequestSchema, - esClient: ElasticsearchClient -) { - const results: StopTransformsResponseSchema = {}; - - for (const transformInfo of transformsInfo) { - const transformId = transformInfo.id; - try { - await esClient.transform.stopTransform({ - transform_id: transformId, - force: - transformInfo.state !== undefined - ? transformInfo.state === TRANSFORM_STATE.FAILED - : false, - wait_for_completion: true, - }); - results[transformId] = { success: true }; - } catch (e) { - if (isRequestTimeout(e)) { - return fillResultsWithTimeouts({ - results, - id: transformId, - items: transformsInfo, - action: TRANSFORM_ACTIONS.STOP, - }); - } - results[transformId] = { success: false, error: e.meta.body.error }; - } - } - return results; -} - -const scheduleNowTransformsHandler: RequestHandler< - undefined, - undefined, - ScheduleNowTransformsRequestSchema -> = async (ctx, req, res) => { - const transformsInfo = req.body; - - try { - const esClient = (await ctx.core).elasticsearch.client; - return res.ok({ - body: await scheduleNowTransforms(transformsInfo, esClient.asCurrentUser), - }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } -}; - -async function scheduleNowTransforms( - transformsInfo: ScheduleNowTransformsRequestSchema, - esClient: ElasticsearchClient -) { - const results: ScheduleNowTransformsResponseSchema = {}; - - for (const transformInfo of transformsInfo) { - const transformId = transformInfo.id; - try { - await esClient.transport.request({ - method: 'POST', - path: `_transform/${transformId}/_schedule_now`, - }); - - results[transformId] = { success: true }; - } catch (e) { - if (isRequestTimeout(e)) { - return fillResultsWithTimeouts({ - results, - id: transformId, - items: transformsInfo, - action: TRANSFORM_ACTIONS.SCHEDULE_NOW, - }); - } - results[transformId] = { success: false, error: e.meta.body.error }; - } - } - return results; -} - -async function reauthorizeAndStartTransforms( - transformsInfo: ReauthorizeTransformsRequestSchema, - esClient: ElasticsearchClient, - options?: TransportRequestOptions -) { - const results: ReauthorizeTransformsResponseSchema = {}; - - for (const transformInfo of transformsInfo) { - const transformId = transformInfo.id; - try { - await esClient.transform.updateTransform( - { - body: {}, - transform_id: transformId, - }, - options ?? {} - ); - - await esClient.transform.startTransform( - { - transform_id: transformId, - }, - { ignore: [409] } - ); - - results[transformId] = { success: true }; - } catch (e) { - if (isRequestTimeout(e)) { - return fillResultsWithTimeouts({ - results, - id: transformId, - items: transformsInfo, - action: TRANSFORM_ACTIONS.REAUTHORIZE, - }); - } - results[transformId] = { success: false, error: e.meta.body.error }; - } - } - return results; -} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_all/register_route.ts b/x-pack/plugins/transform/server/routes/api/transforms_all/register_route.ts new file mode 100644 index 0000000000000..e808e0e8fafc2 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_all/register_route.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 type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {get} /internal/transform/transforms Get transforms + * @apiName GetTransforms + * @apiDescription Returns transforms + * + * @apiSchema (params) jobAuditMessagesJobIdSchema + * @apiSchema (query) jobAuditMessagesQuerySchema + */ + router.versioned + .get({ + path: addInternalBasePath('transforms'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: false, + }, + license.guardApiRoute( + routeHandler + ) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_all/route_handler.ts b/x-pack/plugins/transform/server/routes/api/transforms_all/route_handler.ts new file mode 100644 index 0000000000000..10d52b86f8df8 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_all/route_handler.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { RequestHandler } from '@kbn/core/server'; + +import { TransformRequestHandlerContext } from '../../../services/license'; +import { transformHealthServiceProvider } from '../../../lib/alerting/transform_health_rule_type/transform_health_service'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +export const routeHandler: RequestHandler< + estypes.TransformGetTransformRequest, + undefined, + undefined, + TransformRequestHandlerContext +> = async (ctx, req, res) => { + try { + const esClient = (await ctx.core).elasticsearch.client; + const body = await esClient.asCurrentUser.transform.getTransform({ + size: 1000, + ...req.params, + }); + + const alerting = await ctx.alerting; + if (alerting) { + const transformHealthService = transformHealthServiceProvider({ + esClient: esClient.asCurrentUser, + rulesClient: alerting.getRulesClient(), + }); + + // @ts-ignore + await transformHealthService.populateTransformsWithAssignedRules(body.transforms); + } + + return res.ok({ body }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/transforms_audit_messages.ts b/x-pack/plugins/transform/server/routes/api/transforms_audit_messages.ts deleted file mode 100644 index 5aeecf399bbd3..0000000000000 --- a/x-pack/plugins/transform/server/routes/api/transforms_audit_messages.ts +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { schema } from '@kbn/config-schema'; -import { addInternalBasePath, DEFAULT_MAX_AUDIT_MESSAGE_SIZE } from '../../../common/constants'; -import { transformIdParamSchema, TransformIdParamSchema } from '../../../common/api_schemas/common'; -import { AuditMessage } from '../../../common/types/messages'; - -import { RouteDependencies } from '../../types'; - -import { wrapError, wrapEsError } from './error_utils'; - -export const ML_DF_NOTIFICATION_INDEX_PATTERN = '.transform-notifications-read'; - -interface BoolQuery { - bool: { [key: string]: any }; -} - -interface TransformMessageQuery { - sortField: string; - sortDirection: 'asc' | 'desc'; -} - -export function registerTransformsAuditMessagesRoutes({ router, license }: RouteDependencies) { - /** - * @apiGroup Transforms Audit Messages - * - * @api {get} /internal/transform/transforms/:transformId/messages Transforms Messages - * @apiName GetTransformsMessages - * @apiDescription Get transforms audit messages - * - * @apiSchema (params) transformIdParamSchema - */ - router.versioned - .get({ - path: addInternalBasePath('transforms/{transformId}/messages'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: { - request: { - params: transformIdParamSchema, - query: schema.object({ - sortField: schema.string(), - sortDirection: schema.oneOf([schema.literal('asc'), schema.literal('desc')]), - }), - }, - }, - }, - license.guardApiRoute( - async (ctx, req, res) => { - const { transformId } = req.params; - const sortField = req.query?.sortField ?? 'timestamp'; - const sortDirection = req.query?.sortDirection ?? 'desc'; - - // search for audit messages, - // transformId is optional. without it, all transforms will be listed. - const query: BoolQuery = { - bool: { - filter: [ - { - bool: { - must_not: { - term: { - level: 'activity', - }, - }, - }, - }, - ], - }, - }; - - // if no transformId specified, load all of the messages - if (transformId !== undefined) { - query.bool.filter.push({ - bool: { - should: [ - { - term: { - transform_id: '', // catch system messages - }, - }, - { - term: { - transform_id: transformId, // messages for specified transformId - }, - }, - ], - }, - }); - } - - try { - const esClient = (await ctx.core).elasticsearch.client; - const resp = await esClient.asCurrentUser.search({ - index: ML_DF_NOTIFICATION_INDEX_PATTERN, - ignore_unavailable: true, - size: DEFAULT_MAX_AUDIT_MESSAGE_SIZE, - body: { - sort: [ - { [sortField]: { order: sortDirection } }, - { transform_id: { order: 'asc' as const } }, - ], - query, - }, - track_total_hits: true, - }); - const totalHits = - typeof resp.hits.total === 'number' ? resp.hits.total : resp.hits.total!.value; - - let messages: AuditMessage[] = []; - // TODO: remove typeof checks when appropriate overloading is added for the `search` API - if ( - (typeof resp.hits.total === 'number' && resp.hits.total > 0) || - (typeof resp.hits.total === 'object' && resp.hits.total.value > 0) - ) { - messages = resp.hits.hits.map((hit) => hit._source!); - } - return res.ok({ body: { messages, total: totalHits } }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - } - ) - ); -} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_create/register_route.ts b/x-pack/plugins/transform/server/routes/api/transforms_create/register_route.ts new file mode 100644 index 0000000000000..49b8e7c138357 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_create/register_route.ts @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + transformIdParamSchema, + type TransformIdParamSchema, +} from '../../../../common/api_schemas/common'; +import { + putTransformsRequestSchema, + putTransformsQuerySchema, + type PutTransformsRequestSchema, + type PutTransformsQuerySchema, +} from '../../../../common/api_schemas/transforms'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandlerFactory } from './route_handler_factory'; + +export function registerRoute(routeDependencies: RouteDependencies) { + const { router, license } = routeDependencies; + + /** + * @apiGroup Transforms + * + * @api {put} /internal/transform/transforms/:transformId Put transform + * @apiName PutTransform + * @apiDescription Creates a transform + * + * @apiSchema (params) transformIdParamSchema + * @apiSchema (query) transformIdParamSchema + * @apiSchema (body) putTransformsRequestSchema + */ + router.versioned + .put({ + path: addInternalBasePath('transforms/{transformId}'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + params: transformIdParamSchema, + query: putTransformsQuerySchema, + body: putTransformsRequestSchema, + }, + }, + }, + license.guardApiRoute< + TransformIdParamSchema, + PutTransformsQuerySchema, + PutTransformsRequestSchema + >(routeHandlerFactory(routeDependencies)) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_create/route_handler_factory.ts b/x-pack/plugins/transform/server/routes/api/transforms_create/route_handler_factory.ts new file mode 100644 index 0000000000000..1679bbf3a6309 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_create/route_handler_factory.ts @@ -0,0 +1,108 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { RequestHandler } from '@kbn/core/server'; +import type { RuntimeField } from '@kbn/data-views-plugin/common'; +import { isPopulatedObject } from '@kbn/ml-is-populated-object'; + +import type { TransformIdParamSchema } from '../../../../common/api_schemas/common'; +import type { + PutTransformsRequestSchema, + PutTransformsQuerySchema, + PutTransformsResponseSchema, +} from '../../../../common/api_schemas/transforms'; +import { isLatestTransform } from '../../../../common/types/transform'; + +import type { RouteDependencies } from '../../../types'; +import type { TransformRequestHandlerContext } from '../../../services/license'; + +import { wrapEsError } from '../../utils/error_utils'; + +export const routeHandlerFactory: ( + routeDependencies: RouteDependencies +) => RequestHandler< + TransformIdParamSchema, + PutTransformsQuerySchema, + PutTransformsRequestSchema, + TransformRequestHandlerContext +> = (routeDependencies) => async (ctx, req, res) => { + const { coreStart, dataViews } = routeDependencies; + const { transformId } = req.params; + const { createDataView, timeFieldName } = req.query; + + const response: PutTransformsResponseSchema = { + dataViewsCreated: [], + dataViewsErrors: [], + transformsCreated: [], + errors: [], + }; + + const esClient = (await ctx.core).elasticsearch.client; + + try { + const resp = await esClient.asCurrentUser.transform.putTransform({ + // @ts-expect-error @elastic/elasticsearch group_by is expected to be optional in TransformPivot + body: req.body, + transform_id: transformId, + }); + + if (resp.acknowledged) { + response.transformsCreated.push({ transform: transformId }); + } else { + response.errors.push({ + id: transformId, + error: wrapEsError(resp), + }); + } + } catch (e) { + response.errors.push({ + id: transformId, + error: wrapEsError(e), + }); + } + + if (createDataView) { + const { savedObjects, elasticsearch } = coreStart; + const dataViewsService = await dataViews.dataViewsServiceFactory( + savedObjects.getScopedClient(req), + elasticsearch.client.asScoped(req).asCurrentUser, + req + ); + + const dataViewName = req.body.dest.index; + const runtimeMappings = req.body.source.runtime_mappings as Record; + + try { + const dataViewsResp = await dataViewsService.createAndSave( + { + title: dataViewName, + timeFieldName, + // Adding runtime mappings for transforms of type latest only here + // since only they will want to replicate the source index mapping. + // Pivot type transforms have index mappings that cannot be + // inferred from the source index. + ...(isPopulatedObject(runtimeMappings) && isLatestTransform(req.body) + ? { runtimeFieldMap: runtimeMappings } + : {}), + allowNoIndex: true, + }, + false, + true + ); + + if (dataViewsResp.id) { + response.dataViewsCreated = [{ id: dataViewsResp.id }]; + } + } catch (error) { + // For the error id we use the transform id + // because in case of an error we don't get a data view id. + response.dataViewsErrors = [{ id: transformId, error }]; + } + } + + return res.ok({ body: response }); +}; diff --git a/x-pack/plugins/transform/server/routes/api/transforms_nodes.ts b/x-pack/plugins/transform/server/routes/api/transforms_nodes.ts deleted file mode 100644 index 5f9b51d0fa433..0000000000000 --- a/x-pack/plugins/transform/server/routes/api/transforms_nodes.ts +++ /dev/null @@ -1,90 +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 Boom from '@hapi/boom'; - -import { isPopulatedObject } from '@kbn/ml-is-populated-object'; - -import { addInternalBasePath, NODES_INFO_PRIVILEGES } from '../../../common/constants'; - -import { RouteDependencies } from '../../types'; - -import { wrapError, wrapEsError } from './error_utils'; - -const NODE_ROLES = 'roles'; - -interface NodesAttributes { - roles: string[]; -} - -type Nodes = Record; - -export const isNodes = (arg: unknown): arg is Nodes => { - return ( - isPopulatedObject(arg) && - Object.values(arg).every( - (node) => isPopulatedObject(node, [NODE_ROLES]) && Array.isArray(node.roles) - ) - ); -}; - -export function registerTransformNodesRoutes({ router, license }: RouteDependencies) { - /** - * @apiGroup Transform Nodes - * - * @api {get} /internal/transforms/_nodes Transform Nodes - * @apiName GetTransformNodes - * @apiDescription Get transform nodes - */ - router.versioned - .get({ - path: addInternalBasePath('transforms/_nodes'), - access: 'internal', - }) - .addVersion( - { - version: '1', - validate: false, - }, - license.guardApiRoute(async (ctx, req, res) => { - try { - const esClient = (await ctx.core).elasticsearch.client; - // If security is enabled, check that the user has at least permission to - // view transforms before calling the _nodes endpoint with the internal user. - if (license.getStatus().isSecurityEnabled === true) { - const { has_all_requested: hasAllPrivileges } = - await esClient.asCurrentUser.security.hasPrivileges({ - body: { - cluster: NODES_INFO_PRIVILEGES, - }, - }); - - if (!hasAllPrivileges) { - return res.customError(wrapError(new Boom.Boom('Forbidden', { statusCode: 403 }))); - } - } - - const { nodes } = await esClient.asInternalUser.nodes.info({ - filter_path: `nodes.*.${NODE_ROLES}`, - }); - - let count = 0; - if (isNodes(nodes)) { - for (const { roles } of Object.values(nodes)) { - if (roles.includes('transform')) { - count++; - } - } - } - - return res.ok({ body: { count } }); - } catch (e) { - return res.customError(wrapError(wrapEsError(e))); - } - }) - ); -} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_nodes/register_route.ts b/x-pack/plugins/transform/server/routes/api/transforms_nodes/register_route.ts new file mode 100644 index 0000000000000..ba22d01dfa016 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_nodes/register_route.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 { addInternalBasePath } from '../../../../common/constants'; + +import { RouteDependencies } from '../../../types'; + +import { routeHandlerFactory } from './route_handler_factory'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transform Nodes + * + * @api {get} /internal/transforms/_nodes Transform Nodes + * @apiName GetTransformNodes + * @apiDescription Get transform nodes + */ + router.versioned + .get({ + path: addInternalBasePath('transforms/_nodes'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: false, + }, + license.guardApiRoute(routeHandlerFactory(license)) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_nodes.test.ts b/x-pack/plugins/transform/server/routes/api/transforms_nodes/route_handler_factory.test.ts similarity index 96% rename from x-pack/plugins/transform/server/routes/api/transforms_nodes.test.ts rename to x-pack/plugins/transform/server/routes/api/transforms_nodes/route_handler_factory.test.ts index 462a4688ad455..00664a0326f14 100644 --- a/x-pack/plugins/transform/server/routes/api/transforms_nodes.test.ts +++ b/x-pack/plugins/transform/server/routes/api/transforms_nodes/route_handler_factory.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { isNodes } from './transforms_nodes'; +import { isNodes } from './route_handler_factory'; describe('Transform: Nodes API endpoint', () => { test('isNodes()', () => { diff --git a/x-pack/plugins/transform/server/routes/api/transforms_nodes/route_handler_factory.ts b/x-pack/plugins/transform/server/routes/api/transforms_nodes/route_handler_factory.ts new file mode 100644 index 0000000000000..8eed2ad119d38 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_nodes/route_handler_factory.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import Boom from '@hapi/boom'; +import type { RequestHandler } from '@kbn/core/server'; +import { isPopulatedObject } from '@kbn/ml-is-populated-object'; + +import { NODES_INFO_PRIVILEGES } from '../../../../common/constants'; + +import { RouteDependencies } from '../../../types'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +const NODE_ROLES = 'roles'; + +interface NodesAttributes { + roles: string[]; +} + +type Nodes = Record; + +export const isNodes = (arg: unknown): arg is Nodes => { + return ( + isPopulatedObject(arg) && + Object.values(arg).every( + (node) => isPopulatedObject(node, [NODE_ROLES]) && Array.isArray(node.roles) + ) + ); +}; + +export const routeHandlerFactory: ( + license: RouteDependencies['license'] +) => RequestHandler = (license) => async (ctx, req, res) => { + try { + const esClient = (await ctx.core).elasticsearch.client; + // If security is enabled, check that the user has at least permission to + // view transforms before calling the _nodes endpoint with the internal user. + if (license.getStatus().isSecurityEnabled === true) { + const { has_all_requested: hasAllPrivileges } = + await esClient.asCurrentUser.security.hasPrivileges({ + body: { + cluster: NODES_INFO_PRIVILEGES, + }, + }); + + if (!hasAllPrivileges) { + return res.customError(wrapError(new Boom.Boom('Forbidden', { statusCode: 403 }))); + } + } + + const { nodes } = await esClient.asInternalUser.nodes.info({ + filter_path: `nodes.*.${NODE_ROLES}`, + }); + + let count = 0; + if (isNodes(nodes)) { + for (const { roles } of Object.values(nodes)) { + if (roles.includes('transform')) { + count++; + } + } + } + + return res.ok({ body: { count } }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/transforms_preview/register_route.ts b/x-pack/plugins/transform/server/routes/api/transforms_preview/register_route.ts new file mode 100644 index 0000000000000..1b22eae72ef14 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_preview/register_route.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 { + postTransformsPreviewRequestSchema, + PostTransformsPreviewRequestSchema, +} from '../../../../common/api_schemas/transforms'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {post} /internal/transform/transforms/_preview Preview transform + * @apiName PreviewTransform + * @apiDescription Previews transform + * + * @apiSchema (body) postTransformsPreviewRequestSchema + */ + router.versioned + .post({ + path: addInternalBasePath('transforms/_preview'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: postTransformsPreviewRequestSchema, + }, + }, + }, + license.guardApiRoute(routeHandler) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_preview/route_handler.ts b/x-pack/plugins/transform/server/routes/api/transforms_preview/route_handler.ts new file mode 100644 index 0000000000000..2ce611260836e --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_preview/route_handler.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 * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { RequestHandler } from '@kbn/core/server'; + +import type { PostTransformsPreviewRequestSchema } from '../../../../common/api_schemas/transforms'; +import { isLatestTransform } from '../../../../common/types/transform'; +import { isKeywordDuplicate } from '../../../../common/utils/field_utils'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +export const routeHandler: RequestHandler< + undefined, + undefined, + PostTransformsPreviewRequestSchema +> = async (ctx, req, res) => { + try { + const reqBody = req.body; + const esClient = (await ctx.core).elasticsearch.client; + const body = await esClient.asCurrentUser.transform.previewTransform( + { + body: reqBody, + }, + { maxRetries: 0 } + ); + if (isLatestTransform(reqBody)) { + // for the latest transform mappings properties have to be retrieved from the source + const fieldCapsResponse = await esClient.asCurrentUser.fieldCaps( + { + index: reqBody.source.index, + fields: '*', + include_unmapped: false, + }, + { maxRetries: 0 } + ); + + const fieldNamesSet = new Set(Object.keys(fieldCapsResponse.fields)); + + const fields = Object.entries( + fieldCapsResponse.fields as Record> + ).reduce((acc, [fieldName, fieldCaps]) => { + const fieldDefinition = Object.values(fieldCaps)[0]; + const isMetaField = fieldDefinition.type.startsWith('_') || fieldName === '_doc_count'; + if (isMetaField || isKeywordDuplicate(fieldName, fieldNamesSet)) { + return acc; + } + acc[fieldName] = { ...fieldDefinition }; + return acc; + }, {} as Record); + + body.generated_dest_index.mappings!.properties = fields as Record< + string, + estypes.MappingProperty + >; + } + return res.ok({ body }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/transforms_single/register_route.ts b/x-pack/plugins/transform/server/routes/api/transforms_single/register_route.ts new file mode 100644 index 0000000000000..e79446d3962c0 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_single/register_route.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 { addInternalBasePath } from '../../../../common/constants'; +import { + transformIdParamSchema, + type TransformIdParamSchema, +} from '../../../../common/api_schemas/common'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {get} /internal/transform/transforms/:transformId Get transform + * @apiName GetTransform + * @apiDescription Returns a single transform + * + * @apiSchema (params) transformIdParamSchema + */ + router.versioned + .get({ + path: addInternalBasePath('transforms/{transformId}'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + params: transformIdParamSchema, + }, + }, + }, + license.guardApiRoute(routeHandler) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_single/route_handler.ts b/x-pack/plugins/transform/server/routes/api/transforms_single/route_handler.ts new file mode 100644 index 0000000000000..623769707b0e2 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_single/route_handler.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RequestHandler } from '@kbn/core/server'; + +import type { TransformIdParamSchema } from '../../../../common/api_schemas/common'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +export const routeHandler: RequestHandler = async ( + ctx, + req, + res +) => { + const { transformId } = req.params; + try { + const esClient = (await ctx.core).elasticsearch.client; + const body = await esClient.asCurrentUser.transform.getTransform({ + transform_id: transformId, + }); + return res.ok({ body }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/transforms_stats_all/register_route.ts b/x-pack/plugins/transform/server/routes/api/transforms_stats_all/register_route.ts new file mode 100644 index 0000000000000..0f2fa18b4665f --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_stats_all/register_route.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {get} /internal/transform/transforms/_stats Get transforms stats + * @apiName GetTransformsStats + * @apiDescription Returns transforms stats + */ + router.versioned + .get({ + path: addInternalBasePath('transforms/_stats'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: false, + }, + license.guardApiRoute( + routeHandler + ) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_stats_all/route_handler.ts b/x-pack/plugins/transform/server/routes/api/transforms_stats_all/route_handler.ts new file mode 100644 index 0000000000000..901afdd4ea809 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_stats_all/route_handler.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import type { RequestHandler } from '@kbn/core/server'; + +import { TransformRequestHandlerContext } from '../../../services/license'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +export const routeHandler: RequestHandler< + estypes.TransformGetTransformStatsResponse, + undefined, + undefined, + TransformRequestHandlerContext +> = async (ctx, req, res) => { + try { + const esClient = (await ctx.core).elasticsearch.client; + const body = await esClient.asCurrentUser.transform.getTransformStats( + { + size: 1000, + transform_id: '_all', + }, + { maxRetries: 0 } + ); + return res.ok({ body }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/transforms_stats_single/register_route.ts b/x-pack/plugins/transform/server/routes/api/transforms_stats_single/register_route.ts new file mode 100644 index 0000000000000..8c06c95892116 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_stats_single/register_route.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 { + transformIdParamSchema, + type TransformIdParamSchema, +} from '../../../../common/api_schemas/common'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {get} /internal/transform/transforms/:transformId/_stats Get transform stats + * @apiName GetTransformStats + * @apiDescription Returns stats for a single transform + * + * @apiSchema (params) transformIdParamSchema + */ + router.versioned + .get({ + path: addInternalBasePath('transforms/{transformId}/_stats'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + params: transformIdParamSchema, + }, + }, + }, + license.guardApiRoute(routeHandler) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_stats_single/route_handler.ts b/x-pack/plugins/transform/server/routes/api/transforms_stats_single/route_handler.ts new file mode 100644 index 0000000000000..29c6f39e7126b --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_stats_single/route_handler.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RequestHandler } from '@kbn/core/server'; + +import type { TransformIdParamSchema } from '../../../../common/api_schemas/common'; + +import type { TransformRequestHandlerContext } from '../../../services/license'; + +import { wrapError, wrapEsError } from '../../utils/error_utils'; + +export const routeHandler: RequestHandler< + TransformIdParamSchema, + undefined, + undefined, + TransformRequestHandlerContext +> = async (ctx, req, res) => { + const { transformId } = req.params; + try { + const esClient = (await ctx.core).elasticsearch.client; + const body = await esClient.asCurrentUser.transform.getTransformStats( + { + transform_id: transformId, + }, + { maxRetries: 0 } + ); + return res.ok({ body }); + } catch (e) { + return res.customError(wrapError(wrapEsError(e))); + } +}; diff --git a/x-pack/plugins/transform/server/routes/api/transforms_update/register_route.ts b/x-pack/plugins/transform/server/routes/api/transforms_update/register_route.ts new file mode 100644 index 0000000000000..366b4ea32fc92 --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_update/register_route.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + transformIdParamSchema, + type TransformIdParamSchema, +} from '../../../../common/api_schemas/common'; +import { + postTransformsUpdateRequestSchema, + type PostTransformsUpdateRequestSchema, +} from '../../../../common/api_schemas/update_transforms'; +import { addInternalBasePath } from '../../../../common/constants'; + +import type { RouteDependencies } from '../../../types'; + +import { routeHandler } from './route_handler'; + +export function registerRoute({ router, license }: RouteDependencies) { + /** + * @apiGroup Transforms + * + * @api {post} /internal/transform/transforms/:transformId/_update Post transform update + * @apiName PostTransformUpdate + * @apiDescription Updates a transform + * + * @apiSchema (params) transformIdParamSchema + * @apiSchema (body) postTransformsUpdateRequestSchema + */ + router.versioned + .post({ + path: addInternalBasePath('transforms/{transformId}/_update'), + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + params: transformIdParamSchema, + body: postTransformsUpdateRequestSchema, + }, + }, + }, + license.guardApiRoute( + routeHandler + ) + ); +} diff --git a/x-pack/plugins/transform/server/routes/api/transforms_update/route_handler.ts b/x-pack/plugins/transform/server/routes/api/transforms_update/route_handler.ts new file mode 100644 index 0000000000000..9a88c4da3d48a --- /dev/null +++ b/x-pack/plugins/transform/server/routes/api/transforms_update/route_handler.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RequestHandler } from '@kbn/core/server'; + +import type { TransformIdParamSchema } from '../../../../common/api_schemas/common'; +import type { PostTransformsUpdateRequestSchema } from '../../../../common/api_schemas/update_transforms'; + +import type { TransformRequestHandlerContext } from '../../../services/license'; + +import { wrapError } from '../../utils/error_utils'; + +export const routeHandler: RequestHandler< + TransformIdParamSchema, + undefined, + PostTransformsUpdateRequestSchema, + TransformRequestHandlerContext +> = async (ctx, req, res) => { + const { transformId } = req.params; + + try { + const esClient = (await ctx.core).elasticsearch.client; + const body = await esClient.asCurrentUser.transform.updateTransform({ + // @ts-expect-error query doesn't satisfy QueryDslQueryContainer from @elastic/elasticsearch + body: req.body, + transform_id: transformId, + }); + return res.ok({ + body, + }); + } catch (e) { + return res.customError(wrapError(e)); + } +}; diff --git a/x-pack/plugins/transform/server/routes/index.ts b/x-pack/plugins/transform/server/routes/index.ts index aec4417f2a421..d3d8bd48b8c0a 100644 --- a/x-pack/plugins/transform/server/routes/index.ts +++ b/x-pack/plugins/transform/server/routes/index.ts @@ -7,10 +7,38 @@ import { RouteDependencies } from '../types'; -import { registerFieldHistogramsRoutes } from './api/field_histograms'; -import { registerTransformsRoutes } from './api/transforms'; +import { registerRoute as registerFieldHistogramsRoute } from './api/field_histograms/register_route'; +import { registerRoute as registerAuditMessagesRoute } from './api/audit_messages/register_route'; +import { registerRoute as registerTransformsNodesRoute } from './api/transforms_nodes/register_route'; +import { registerRoute as registerTransformsAllRoute } from './api/transforms_all/register_route'; +import { registerRoute as registerTransformsSingleRoute } from './api/transforms_single/register_route'; +import { registerRoute as registerTransformsStatsAllRoute } from './api/transforms_stats_all/register_route'; +import { registerRoute as registerTransformsStatsSingleRoute } from './api/transforms_stats_single/register_route'; +import { registerRoute as registerTransformsCreateRoute } from './api/transforms_create/register_route'; +import { registerRoute as registerTransformsUpdateRoute } from './api/transforms_update/register_route'; +import { registerRoute as registerReauthorizeTransformsRoute } from './api/reauthorize_transforms/register_route'; +import { registerRoute as registerResetTransformsRoute } from './api/reset_transforms/register_route'; +import { registerRoute as registerTransformsPreviewRoute } from './api/transforms_preview/register_route'; +import { registerRoute as registerStartTransformsRoute } from './api/start_transforms/register_route'; +import { registerRoute as registerStopTransformsRoute } from './api/stop_transforms/register_route'; +import { registerRoute as registerDeleteTransformsRoute } from './api/delete_transforms/register_route'; +import { registerRoute as registerScheduleNowTransformsRoute } from './api/schedule_now_transforms/register_route'; export function registerRoutes(dependencies: RouteDependencies) { - registerFieldHistogramsRoutes(dependencies); - registerTransformsRoutes(dependencies); + registerFieldHistogramsRoute(dependencies); + registerAuditMessagesRoute(dependencies); + registerTransformsNodesRoute(dependencies); + registerTransformsAllRoute(dependencies); + registerTransformsSingleRoute(dependencies); + registerTransformsStatsAllRoute(dependencies); + registerTransformsStatsSingleRoute(dependencies); + registerTransformsCreateRoute(dependencies); + registerTransformsUpdateRoute(dependencies); + registerReauthorizeTransformsRoute(dependencies); + registerResetTransformsRoute(dependencies); + registerTransformsPreviewRoute(dependencies); + registerStartTransformsRoute(dependencies); + registerStopTransformsRoute(dependencies); + registerDeleteTransformsRoute(dependencies); + registerScheduleNowTransformsRoute(dependencies); } diff --git a/x-pack/plugins/transform/server/routes/api/error_utils.ts b/x-pack/plugins/transform/server/routes/utils/error_utils.ts similarity index 100% rename from x-pack/plugins/transform/server/routes/api/error_utils.ts rename to x-pack/plugins/transform/server/routes/utils/error_utils.ts diff --git a/x-pack/plugins/transform/server/services/license.ts b/x-pack/plugins/transform/server/services/license.ts index 3a22b2e6bd27f..4a5591bbe74e8 100644 --- a/x-pack/plugins/transform/server/services/license.ts +++ b/x-pack/plugins/transform/server/services/license.ts @@ -36,7 +36,7 @@ interface SetupSettings { coreStart: CoreStart; } -type TransformRequestHandlerContext = CustomRequestHandlerContext<{ +export type TransformRequestHandlerContext = CustomRequestHandlerContext<{ alerting?: AlertingApiRequestHandlerContext; }>; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index bfb2b2bdfd683..f55b85b97b539 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -4937,7 +4937,6 @@ "management.settings.categoryNames.visualizationsLabel": "Visualisations", "management.settings.changeImageLinkText": "Modifier l'image", "management.settings.customSettingTooltip": "Paramètre personnalisé", - "management.settings.field.codeEditorSyntaxErrorMessage": "Syntaxe JSON non valide", "management.settings.field.customSettingAriaLabel": "Paramètre personnalisé", "management.settings.field.imageChangeErrorMessage": "Impossible d’enregistrer l'image", "management.settings.field.invalidIconLabel": "Non valide", @@ -8685,7 +8684,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", @@ -23511,8 +23509,6 @@ "xpack.maps.blendedVectorLayer.clusteredLayerName": "{displayName} en cluster", "xpack.maps.common.esSpatialRelation.clusterFilterLabel": "intersecte le cluster {gridId}", "xpack.maps.deleteLayerConfirmModal.multiLayerWarning": "Le retrait de ce calque retire également {numChildren} {numChildren, plural, one {calque imbriqué} many {les calques} other {les calques}}.", - "xpack.maps.distanceSource.requestDescription": "Obtenir des indicateurs de la vue de données : {dataViewName} ; champ géospatial : {geoFieldName}", - "xpack.maps.distanceSource.requestName": "{leftSourceName} à distance de la requête de liaison", "xpack.maps.embeddable.boundsFilterLabel": "{geoFieldsLabel} dans les limites de la carte", "xpack.maps.es_geo_utils.convert.unsupportedGeometryTypeErrorMessage": "Conversion de la géométrie {geometryType} en geojson impossible ; non pris en charge", "xpack.maps.es_geo_utils.distanceFilterAlias": "dans un rayon de {distanceKm} km de {pointLabel}", @@ -23526,10 +23522,6 @@ "xpack.maps.esSearch.topHitsEntitiesCountMsg": "{entityCount} entités trouvées.", "xpack.maps.esSearch.topHitsResultsTrimmedMsg": "Résultats limités aux {entityCount} premières entités sur environ {totalEntities}.", "xpack.maps.esSearch.topHitsSizeMsg": "Affichage des {topHitsSize} premiers documents par entité.", - "xpack.maps.esSearchSource.requestDescription": "Obtenir des documents de la vue de données : {dataViewName} ; champ géospatial : {geoFieldName}", - "xpack.maps.esSearchSource.requestName": "Requête de documents de {layerName}", - "xpack.maps.esSearchSource.topHits.requestDescription": "Obtenir les premiers résultats de la vue de données : {dataViewName} ; entités : {entitiesFieldName} ; champ géospatial : {geoFieldName}", - "xpack.maps.esSearchSource.topHits.requestName": "Requête des premiers résultats de {layerName}", "xpack.maps.fileUpload.trimmedResultsMsg": "Résultats limités à {numFeatures} fonctionnalités, {previewCoverage} % du fichier.", "xpack.maps.filterByMapExtentMenuItem.displayName": "Filtrer {containerLabel} selon les limites de la carte", "xpack.maps.filterByMapExtentMenuItem.displayNameTooltip": "Quand vous vous déplacez sur la carte ou que vous zoomez, le {containerLabel} se met à jour pour afficher uniquement les données visibles dans les limites de la carte.", @@ -23552,7 +23544,6 @@ "xpack.maps.mask.maskLabel": "Masquer {hideNoun}", "xpack.maps.mask.whenJoinMetric": "{whenLabel} l'indicateur de jonction", "xpack.maps.maskLegend.is": "{aggLabel} est", - "xpack.maps.pewPew.requestName": "Requête de chemins de {layerName}", "xpack.maps.scalingDocs.clustersDetails": "Affichez les clusters lorsque les résultats dépassent {maxResultWindow} documents. Affichez les documents lorsqu'il y a moins de {maxResultWindow} résultats.", "xpack.maps.scalingDocs.limitDetails": "Affichez les fonctionnalités des {maxResultWindow} premiers documents.", "xpack.maps.scalingDocs.maxResultWindow": "Contrainte {maxResultWindow} fournie par le paramètre d'index {link}.", @@ -23568,15 +23559,8 @@ "xpack.maps.source.emsTileSourceDescription": "Service de fond de carte de {host}", "xpack.maps.source.esAggSource.topTermLabel": "{fieldLabel} principal", "xpack.maps.source.esGeoGrid.groupBy.termsDescription": "Créez un suivi pour les {maxTermsTracks} termes principaux. Le suivi est tronqué lorsque le nombre d'éléments dépasse la limite.", - "xpack.maps.source.esGeoLine.entityRequestDescription": "Obtenir des entités au sein de la mémoire tampon de la carte depuis la vue de données  : {dataViewName} ; entités : {splitFieldName}", - "xpack.maps.source.esGeoLine.timeSeriesTrackRequestDescription": "Obtenir des suivis de la vue de données : {dataViewName} ; champ géospatial : {geoFieldName}", - "xpack.maps.source.esGeoLine.trackRequestDescription": "Obtenir des pistes pour des entités {numEntities} depuis la vue de données : {dataViewName} ; champ géospatial : {geoFieldName}", "xpack.maps.source.esGeoLineDisabledReason": "{title} requiert une licence Gold.", - "xpack.maps.source.esGrid.compositeInspector.requestName": "Requête composite de {layerName} {bucketsName} ({requestCount})", - "xpack.maps.source.esGrid.compositeInspectorDescription": "Obtenir {bucketsName} de la vue de données : {dataViewName} ; champ géospatial : {geoFieldName}", "xpack.maps.source.esGrid.compositePaginationErrorMessage": "{layerName} génère trop de requêtes. Réduisez \"Résolution de la grille\" et/ou réduisez le nombre d'indicateurs de premier terme.", - "xpack.maps.source.esGrid.inspector.requestDescription": "Obtenir {bucketsName} de la vue de données : {dataViewName} ; champ géospatial : {geoFieldName}", - "xpack.maps.source.esGrid.inspector.requestName": "Requête de {layerName} {bucketsName}", "xpack.maps.source.esGrid.resolutionParamErrorMessage": "Paramètre de résolution de grille non reconnu : {resolution}", "xpack.maps.source.esJoin.countLabel": "Nombre de {indexPatternLabel}", "xpack.maps.source.esSearch.clusterScalingLabel": "Afficher les clusters lorsque les résultats dépassent {maxResultWindow}", @@ -23587,15 +23571,12 @@ "xpack.maps.source.esSource.noGeoFieldErrorMessage": "La vue de données \"{indexPatternLabel}\" ne contient plus le champ géographique \"{geoField}\"", "xpack.maps.source.esSource.stylePropsMetaRequestName": "{layerName} - Métadonnées", "xpack.maps.source.MVTSingleLayerVectorSourceEditor.urlHelpMessage": "URL du service de cartographie vectoriel .mvt. Par exemple, {url}", - "xpack.maps.source.pewPew.inspectorDescription": "Obtenir des chemins depuis la vue de données : {dataViewName} ; source : {sourceFieldName} ; destination : {destFieldName}", "xpack.maps.spatialJoin.wizardForm.withinExpressionValue": "{distance} {units} de fonctionnalités de calque", "xpack.maps.spatialJoinExpression.noDataViewTitle": "Impossible de charger la vue de données {dataViewId}.", "xpack.maps.spatialJoinExpression.value": "fonctionnalités de {geoField}", "xpack.maps.style.fieldSelect.OriginLabel": "Champs de {fieldOrigin}", "xpack.maps.termJoinExpression.topTerms": "{size} principal", "xpack.maps.termJoinExpression.value": "termes {topTerms} de {term}", - "xpack.maps.termSource.requestDescription": "Obtenir des indicateurs depuis la vue de données : {dataViewName} ; champ de terme : {termFieldName}", - "xpack.maps.termSource.requestName": "Requête de liaison de terme de {leftSourceName}", "xpack.maps.tiles.resultsCompleteMsg": "{countPrefix}{count} documents trouvés.", "xpack.maps.tiles.resultsTrimmedMsg": "Les résultats sont limités à {countPrefix}{count} documents.", "xpack.maps.tooltip.pageNumerText": "{pageNumber} de {total}", @@ -24035,8 +24016,6 @@ "xpack.maps.source.esGeoLine.sortFieldPlaceholder": "Sélectionner le champ de tri", "xpack.maps.source.esGeoLine.splitFieldLabel": "Entité", "xpack.maps.source.esGeoLine.splitFieldPlaceholder": "Sélectionner un champ d'entité", - "xpack.maps.source.esGeoLine.timeSeriesTrackRequestName": "Requêtes de piste \"{layerName}\" (séries temporelles)", - "xpack.maps.source.esGeoLine.trackRequestName": "Requêtes de piste \"{layerName}\" (termes)", "xpack.maps.source.esGeoLine.trackSettingsLabel": "Pistes", "xpack.maps.source.esGeoLineDescription": "Créer des lignes à partir de points", "xpack.maps.source.esGeoLineTitle": "Pistes", @@ -24079,7 +24058,6 @@ "xpack.maps.source.esSearch.useMVTVectorTiles": "Utiliser les tuiles vectorielles", "xpack.maps.source.esSearchDescription": "Points, lignes et polygones d'Elasticsearch", "xpack.maps.source.esSearchTitle": "Documents", - "xpack.maps.source.esSource.stylePropsMetaRequestDescription": "Recherche Elasticsearch récupérant les métadonnées de champ utilisées pour le calcul des champs de symbolisation.", "xpack.maps.source.esTopHitsSearch.sortFieldLabel": "Champ de tri", "xpack.maps.source.esTopHitsSearch.sortOrderLabel": "Ordre de tri", "xpack.maps.source.geofieldLabel": "Champ géospatial", @@ -40449,9 +40427,7 @@ "xpack.transform.forceDeleteTransformMessage": "Supprimer {count} {count, plural, one {transformation} many {transformations} other {transformations}}", "xpack.transform.managedTransformsWarningCallout": "{count, plural, one {Cette transformation} many {Au moins l''une de ces transformations} other {Au moins l''une de ces transformations}} est préconfigurée par Elastic. Le fait de {action} {count, plural, one {la} many {les} other {les}} avec une heure de fin spécifique peut avoir un impact sur d'autres éléments du produit.", "xpack.transform.multiTransformActionsMenu.transformsCount": "Sélection effectuée de {count} {count, plural, one {transformation} many {transformations} other {transformations}}", - "xpack.transform.stepCreateForm.createDataViewErrorMessage": "Une erreur est survenue lors de la création de la vue de données Kibana {dataViewName} :", "xpack.transform.stepCreateForm.createTransformErrorMessage": "Une erreur s'est produite lors de la création de la transformation {transformId} :", - "xpack.transform.stepCreateForm.duplicateDataViewErrorMessage": "Une erreur est survenue lors de la création de la vue de données Kibana {dataViewName} : La vue de données existe déjà.", "xpack.transform.stepDefineForm.invalidKuerySyntaxErrorMessageQueryBar": "Requête non valide : {queryErrorMessage}", "xpack.transform.stepDefineForm.queryPlaceholderKql": "Par exemple, {example}", "xpack.transform.stepDefineForm.queryPlaceholderLucene": "Par exemple, {example}", @@ -43309,10 +43285,10 @@ "randomSampling.ui.sliderControl.performanceLabel": "Performances", "reporting.commonExportTypesHelpers.missingJobHeadersErrorMessage": "Les en-têtes de tâche sont manquants", "reporting.commonExportTypesHelpers.failedToDecryptReportJobDataErrorMessage": "Impossible de déchiffrer les données de la tâche de reporting. Veuillez vous assurer que {encryptionKey} est défini et générez à nouveau ce rapport. {err}", - "reactPackages.mountPointPortal.errorMessage": "Erreur lors du rendu du contenu du portail.", "reporting.common.browserCouldNotLaunchErrorMessage": "Impossible de générer des captures d'écran, car le navigateur ne s’est pas lancé. Consultez les logs de serveur pour en savoir plus.", "reporting.common.cloud.insufficientSystemMemoryError": "Impossible de générer ce rapport en raison d’un manque de mémoire.", "reporting.common.pdfWorkerOutOfMemoryErrorMessage": "Impossible de générer un PDF en raison d’un manque de mémoire. Essayez de réduire la taille du PDF et relancez ce rapport.", + "reactPackages.mountPointPortal.errorMessage": "Erreur lors du rendu du contenu du portail.", "savedObjectsFinder.advancedSettings.listingLimitText": "Nombre d'objets à récupérer pour les pages de listing", "savedObjectsFinder.advancedSettings.listingLimitTitle": "Limite de listing d’objets", "savedObjectsFinder.advancedSettings.perPageText": "Nombre d'objets à afficher par page dans la boîte de dialogue de chargement", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 3819e84db48e4..a04e7f46cf676 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4952,7 +4952,6 @@ "management.settings.categoryNames.visualizationsLabel": "ビジュアライゼーション", "management.settings.changeImageLinkText": "画像を変更", "management.settings.customSettingTooltip": "カスタム設定", - "management.settings.field.codeEditorSyntaxErrorMessage": "無効な JSON 構文", "management.settings.field.customSettingAriaLabel": "カスタム設定", "management.settings.field.imageChangeErrorMessage": "画像を保存できませんでした", "management.settings.field.invalidIconLabel": "無効", @@ -8700,7 +8699,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": "すべての演算", @@ -23525,8 +23523,6 @@ "xpack.maps.blendedVectorLayer.clusteredLayerName": "クラスター化された{displayName}", "xpack.maps.common.esSpatialRelation.clusterFilterLabel": "クラスター{gridId}と交差します", "xpack.maps.deleteLayerConfirmModal.multiLayerWarning": "このレイヤーを削除すと、{numChildren}個のネストされた{numChildren, plural, other {レイヤー}}も削除されます。", - "xpack.maps.distanceSource.requestDescription": "データビューからメトリックを取得します:{dataViewName}、地理空間フィールド:{geoFieldName}", - "xpack.maps.distanceSource.requestName": "距離結合リクエスト内の{leftSourceName}", "xpack.maps.embeddable.boundsFilterLabel": "マップ境界内の{geoFieldsLabel}", "xpack.maps.es_geo_utils.convert.unsupportedGeometryTypeErrorMessage": "{geometryType} ジオメトリから Geojson に変換できません。サポートされていません", "xpack.maps.es_geo_utils.distanceFilterAlias": "{pointLabel}の{distanceKm}km以内", @@ -23540,10 +23536,6 @@ "xpack.maps.esSearch.topHitsEntitiesCountMsg": "{entityCount}エンティティが見つかりました。", "xpack.maps.esSearch.topHitsResultsTrimmedMsg": "結果は~{totalEntities}の{entityCount}エンティティに制限されています。", "xpack.maps.esSearch.topHitsSizeMsg": "エンティティごとに上位の{topHitsSize}ドキュメントを表示しています。", - "xpack.maps.esSearchSource.requestDescription": "データビューからドキュメントを取得します:{dataViewName}、地理空間フィールド:{geoFieldName}", - "xpack.maps.esSearchSource.requestName": "{layerName}ドキュメントリクエスト", - "xpack.maps.esSearchSource.topHits.requestDescription": "データビューから上位の一致を取得します:{dataViewName}、表現:{entitiesFieldName}、地理空間フィールド:{geoFieldName}", - "xpack.maps.esSearchSource.topHits.requestName": "{layerName}の上位の一致リクエスト", "xpack.maps.fileUpload.trimmedResultsMsg": "結果は{numFeatures}機能、ファイルの{previewCoverage}%に制限されています。", "xpack.maps.filterByMapExtentMenuItem.displayName": "マップ境界で{containerLabel}をフィルター", "xpack.maps.filterByMapExtentMenuItem.displayNameTooltip": "マップをズームおよびパンすると、{containerLabel}が更新され、マップ境界に表示されるデータのみが表示されます。", @@ -23566,7 +23558,6 @@ "xpack.maps.mask.maskLabel": "{hideNoun}を非表示", "xpack.maps.mask.whenJoinMetric": "{whenLabel}結合メトリック", "xpack.maps.maskLegend.is": "{aggLabel}は", - "xpack.maps.pewPew.requestName": "{layerName}パスリクエスト", "xpack.maps.scalingDocs.clustersDetails": "結果が{maxResultWindow}ドキュメントを超えたときにクラスターを表示します。結果が{maxResultWindow}未満のときにドキュメントを表示します。", "xpack.maps.scalingDocs.limitDetails": "最初の{maxResultWindow}ドキュメントから特徴量を表示します。", "xpack.maps.scalingDocs.maxResultWindow": "{link}のインデックス設定によって提供される{maxResultWindow}制約。", @@ -23582,15 +23573,8 @@ "xpack.maps.source.emsTileSourceDescription": "{host}からのベースマップサービス", "xpack.maps.source.esAggSource.topTermLabel": "上位{fieldLabel}", "xpack.maps.source.esGeoGrid.groupBy.termsDescription": "上位{maxTermsTracks}語句のトラックを作成します。ポイント数が上限を超えると、トラックは切り捨てられます。", - "xpack.maps.source.esGeoLine.entityRequestDescription": "データビューからマップバッファー内の表現を取得します:{dataViewName}、表現:{splitFieldName}", - "xpack.maps.source.esGeoLine.timeSeriesTrackRequestDescription": "データビューからトラックを取得します:{dataViewName}、地理空間フィールド:{geoFieldName}", - "xpack.maps.source.esGeoLine.trackRequestDescription": "データビューから{numEntities}個の表現のトラックを取得します:{dataViewName}、地理空間フィールド:{geoFieldName}", "xpack.maps.source.esGeoLineDisabledReason": "{title}には Gold ライセンスが必要です。", - "xpack.maps.source.esGrid.compositeInspector.requestName": "{layerName} {bucketsName}複合リクエスト({requestCount})", - "xpack.maps.source.esGrid.compositeInspectorDescription": "データビューから{bucketsName}を取得します:{dataViewName}、地理空間フィールド:{geoFieldName}", "xpack.maps.source.esGrid.compositePaginationErrorMessage": "{layerName}はリクエスト過多の原因になります。「グリッド解像度」を下げるか、またはトップ用語「メトリック」の数を減らしてください。", - "xpack.maps.source.esGrid.inspector.requestDescription": "データビューから{bucketsName}を取得します:{dataViewName}、地理空間フィールド:{geoFieldName}", - "xpack.maps.source.esGrid.inspector.requestName": "{layerName} {bucketsName}リクエスト", "xpack.maps.source.esGrid.resolutionParamErrorMessage": "グリッド解像度パラメーターが認識されません: {resolution}", "xpack.maps.source.esJoin.countLabel": "{indexPatternLabel}のカウント", "xpack.maps.source.esSearch.clusterScalingLabel": "結果が{maxResultWindow}を超えたらクラスターを表示", @@ -23601,15 +23585,12 @@ "xpack.maps.source.esSource.noGeoFieldErrorMessage": "データビュー\"{indexPatternLabel}\"には現在ジオフィールド\"{geoField}\"が含まれていません", "xpack.maps.source.esSource.stylePropsMetaRequestName": "{layerName} - メタデータ", "xpack.maps.source.MVTSingleLayerVectorSourceEditor.urlHelpMessage": ".mvtベクトルタイルサービスのURL。例:{url}", - "xpack.maps.source.pewPew.inspectorDescription": "データビューからパスを取得します:{dataViewName}、ソース:{sourceFieldName}、デスティネーション:{destFieldName}", "xpack.maps.spatialJoin.wizardForm.withinExpressionValue": "レイヤー特徴量の{distance} {units}", "xpack.maps.spatialJoinExpression.noDataViewTitle": "データビュー{dataViewId}を読み込めません。", "xpack.maps.spatialJoinExpression.value": "{geoField}からの特徴量", "xpack.maps.style.fieldSelect.OriginLabel": "{fieldOrigin}からのフィールド", "xpack.maps.termJoinExpression.topTerms": "上位{size}", "xpack.maps.termJoinExpression.value": "{term}からの{topTerms}用語", - "xpack.maps.termSource.requestDescription": "データビューからメトリックを取得します:{dataViewName}、用語フィールド:{termFieldName}", - "xpack.maps.termSource.requestName": "{leftSourceName}用語結合リクエスト", "xpack.maps.tiles.resultsCompleteMsg": "{countPrefix}{count}件のドキュメントが見つかりました。", "xpack.maps.tiles.resultsTrimmedMsg": "結果は{countPrefix}{count}ドキュメントに制限されています。", "xpack.maps.tooltip.pageNumerText": "{pageNumber} / {total}", @@ -24049,8 +24030,6 @@ "xpack.maps.source.esGeoLine.sortFieldPlaceholder": "ソートフィールドを選択", "xpack.maps.source.esGeoLine.splitFieldLabel": "エンティティ", "xpack.maps.source.esGeoLine.splitFieldPlaceholder": "エンティティフィールドを選択", - "xpack.maps.source.esGeoLine.timeSeriesTrackRequestName": "'{layerName}'トラックリクエスト(時系列)", - "xpack.maps.source.esGeoLine.trackRequestName": "'{layerName}'トラックリクエスト(用語)", "xpack.maps.source.esGeoLine.trackSettingsLabel": "追跡", "xpack.maps.source.esGeoLineDescription": "ポイントから線を作成", "xpack.maps.source.esGeoLineTitle": "追跡", @@ -24093,7 +24072,6 @@ "xpack.maps.source.esSearch.useMVTVectorTiles": "ベクトルタイルを使用", "xpack.maps.source.esSearchDescription": "Elasticsearch の点、線、多角形", "xpack.maps.source.esSearchTitle": "ドキュメント", - "xpack.maps.source.esSource.stylePropsMetaRequestDescription": "シンボル化バンドを計算するために使用されるフィールドメタデータを取得するElasticsearchリクエスト。", "xpack.maps.source.esTopHitsSearch.sortFieldLabel": "並べ替えフィールド", "xpack.maps.source.esTopHitsSearch.sortOrderLabel": "並べ替え順", "xpack.maps.source.geofieldLabel": "地理空間フィールド", @@ -40447,9 +40425,7 @@ "xpack.transform.forceDeleteTransformMessage": "{count}{count, plural, other {変換}}の削除", "xpack.transform.managedTransformsWarningCallout": "{count, plural, other {これらの変換のうちの少なくとも1個の変換}}はElasticによってあらかじめ構成されています。{count, plural, other {それらを}}{action}すると、製品の他の部分に影響する可能性があります。", "xpack.transform.multiTransformActionsMenu.transformsCount": "{count}個の{count, plural, other {変換}}を選択済み", - "xpack.transform.stepCreateForm.createDataViewErrorMessage": "Kibanaデータビュー{dataViewName}の作成中にエラーが発生しました:", "xpack.transform.stepCreateForm.createTransformErrorMessage": "変換 {transformId} の取得中にエラーが発生しました。", - "xpack.transform.stepCreateForm.duplicateDataViewErrorMessage": "Kibanaデータビュー{dataViewName}の作成中にエラーが発生しました:データビューはすでに存在します。", "xpack.transform.stepDefineForm.invalidKuerySyntaxErrorMessageQueryBar": "無効なクエリ:{queryErrorMessage}", "xpack.transform.stepDefineForm.queryPlaceholderKql": "例: {example}.", "xpack.transform.stepDefineForm.queryPlaceholderLucene": "例: {example}.", @@ -43299,10 +43275,10 @@ "randomSampling.ui.sliderControl.performanceLabel": "パフォーマンス", "reporting.commonExportTypesHelpers.failedToDecryptReportJobDataErrorMessage": "レポートジョブデータの解読に失敗しました。{encryptionKey} が設定されていることを確認してこのレポートを再生成してください。{err}", "reporting.commonExportTypesHelpers.missingJobHeadersErrorMessage": "ジョブヘッダーがありません", - "reactPackages.mountPointPortal.errorMessage": "ポータルコンテンツのレンダリングエラー", "reporting.common.browserCouldNotLaunchErrorMessage": "ブラウザーが起動していないため、スクリーンショットを生成できません。詳細については、サーバーログを参照してください。", "reporting.common.cloud.insufficientSystemMemoryError": "メモリ不足のため、このレポートを生成できません。", "reporting.common.pdfWorkerOutOfMemoryErrorMessage": "メモリ不足のため、PDFを生成できません。PDFのサイズを小さくして、このレポートを再試行してください。", + "reactPackages.mountPointPortal.errorMessage": "ポータルコンテンツのレンダリングエラー", "savedObjectsFinder.advancedSettings.listingLimitText": "一覧ページ用に取得するオブジェクトの数です", "savedObjectsFinder.advancedSettings.listingLimitTitle": "オブジェクト取得制限", "savedObjectsFinder.advancedSettings.perPageText": "読み込みダイアログで表示されるページごとのオブジェクトの数です", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 5f86f2816eeed..5077a6c337332 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4951,7 +4951,6 @@ "management.settings.categoryNames.visualizationsLabel": "可视化", "management.settings.changeImageLinkText": "更改图片", "management.settings.customSettingTooltip": "定制设置", - "management.settings.field.codeEditorSyntaxErrorMessage": "JSON 语法无效", "management.settings.field.customSettingAriaLabel": "定制设置", "management.settings.field.imageChangeErrorMessage": "图片无法保存", "management.settings.field.invalidIconLabel": "无效", @@ -8699,7 +8698,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": "所有操作", @@ -23525,8 +23523,6 @@ "xpack.maps.blendedVectorLayer.clusteredLayerName": "集群 {displayName}", "xpack.maps.common.esSpatialRelation.clusterFilterLabel": "相交集群 {gridId}", "xpack.maps.deleteLayerConfirmModal.multiLayerWarning": "移除此图层还会移除 {numChildren} 个嵌套{numChildren, plural, other {图层}}。", - "xpack.maps.distanceSource.requestDescription": "获取指标的数据视图:{dataViewName}、地理空间字段:{geoFieldName}", - "xpack.maps.distanceSource.requestName": "距离联接请求内的 {leftSourceName}", "xpack.maps.embeddable.boundsFilterLabel": "地图边界内的 {geoFieldsLabel}", "xpack.maps.es_geo_utils.convert.unsupportedGeometryTypeErrorMessage": "无法将 {geometryType} 几何图形转换成 geojson,不支持", "xpack.maps.es_geo_utils.distanceFilterAlias": "{pointLabel} {distanceKm}km 内", @@ -23540,10 +23536,6 @@ "xpack.maps.esSearch.topHitsEntitiesCountMsg": "找到 {entityCount} 个实体。", "xpack.maps.esSearch.topHitsResultsTrimmedMsg": "结果限制为 ~{totalEntities} 个实体中的前 {entityCount} 个。", "xpack.maps.esSearch.topHitsSizeMsg": "显示每个实体排名前 {topHitsSize} 的文档。", - "xpack.maps.esSearchSource.requestDescription": "获取文档的数据视图:{dataViewName}、地理空间字段:{geoFieldName}", - "xpack.maps.esSearchSource.requestName": "{layerName} 文档请求", - "xpack.maps.esSearchSource.topHits.requestDescription": "获取最高命中结果的数据视图:{dataViewName}、实体:{entitiesFieldName}、地理空间字段:{geoFieldName}", - "xpack.maps.esSearchSource.topHits.requestName": "{layerName} 最高命中结果请求", "xpack.maps.fileUpload.trimmedResultsMsg": "结果仅限于 {numFeatures} 个特征、{previewCoverage}% 的文件。", "xpack.maps.filterByMapExtentMenuItem.displayName": "按地图边界筛选 {containerLabel}", "xpack.maps.filterByMapExtentMenuItem.displayNameTooltip": "当您缩放和平移地图时,{containerLabel} 会进行更新以仅显示在地图边界中可见的数据。", @@ -23566,7 +23558,6 @@ "xpack.maps.mask.maskLabel": "隐藏 {hideNoun}", "xpack.maps.mask.whenJoinMetric": "{whenLabel} 联接指标", "xpack.maps.maskLegend.is": "{aggLabel} 为", - "xpack.maps.pewPew.requestName": "{layerName} 路径请求", "xpack.maps.scalingDocs.clustersDetails": "结果超过 {maxResultWindow} 个文档时显示集群。结果数小于 {maxResultWindow} 时显示文档。", "xpack.maps.scalingDocs.limitDetails": "显示前 {maxResultWindow} 个文档中的特征。", "xpack.maps.scalingDocs.maxResultWindow": "{link} 索引设置提供的 {maxResultWindow} 限制。", @@ -23582,15 +23573,8 @@ "xpack.maps.source.emsTileSourceDescription": "来自 {host} 的基础地图服务", "xpack.maps.source.esAggSource.topTermLabel": "排名靠前 {fieldLabel}", "xpack.maps.source.esGeoGrid.groupBy.termsDescription": "为排名前 {maxTermsTracks} 的词创建轨迹。点数超出限制时,会截短轨迹。", - "xpack.maps.source.esGeoLine.entityRequestDescription": "获取地图缓冲内实体的数据视图:{dataViewName}、实体:{splitFieldName}", - "xpack.maps.source.esGeoLine.timeSeriesTrackRequestDescription": "获取轨迹的数据视图:{dataViewName}、地理空间字段:{geoFieldName}", - "xpack.maps.source.esGeoLine.trackRequestDescription": "获取 {numEntities} 个实体的轨迹的数据视图:{dataViewName}、地理空间字段:{geoFieldName}", "xpack.maps.source.esGeoLineDisabledReason": "{title} 需要黄金级许可证。", - "xpack.maps.source.esGrid.compositeInspector.requestName": "{layerName} {bucketsName} 组合请求 ({requestCount})", - "xpack.maps.source.esGrid.compositeInspectorDescription": "获取 {bucketsName} 的数据视图:{dataViewName}、地理空间字段:{geoFieldName}", "xpack.maps.source.esGrid.compositePaginationErrorMessage": "{layerName} 正导致过多的请求。降低“网格分辨率”和/或减少热门词“指标”的数量。", - "xpack.maps.source.esGrid.inspector.requestDescription": "获取 {bucketsName} 的数据视图:{dataViewName}、地理空间字段:{geoFieldName}", - "xpack.maps.source.esGrid.inspector.requestName": "{layerName} {bucketsName} 请求", "xpack.maps.source.esGrid.resolutionParamErrorMessage": "无法识别网格分辨率参数:{resolution}", "xpack.maps.source.esJoin.countLabel": "{indexPatternLabel} 的计数", "xpack.maps.source.esSearch.clusterScalingLabel": "结果超过 {maxResultWindow} 个时显示集群", @@ -23601,15 +23585,12 @@ "xpack.maps.source.esSource.noGeoFieldErrorMessage": "数据视图“{indexPatternLabel}”不再包含地理字段“{geoField}”", "xpack.maps.source.esSource.stylePropsMetaRequestName": "{layerName} - 元数据", "xpack.maps.source.MVTSingleLayerVectorSourceEditor.urlHelpMessage": ".mvt 矢量磁帖服务的 URL。例如 {url}", - "xpack.maps.source.pewPew.inspectorDescription": "获取路径的数据视图:{dataViewName}、源:{sourceFieldName}、目标:{destFieldName}", "xpack.maps.spatialJoin.wizardForm.withinExpressionValue": "图层特征的 {distance} {units}", "xpack.maps.spatialJoinExpression.noDataViewTitle": "无法加载数据视图 {dataViewId}。", "xpack.maps.spatialJoinExpression.value": "{geoField} 中的特征", "xpack.maps.style.fieldSelect.OriginLabel": "来自 {fieldOrigin} 的字段", "xpack.maps.termJoinExpression.topTerms": "排名靠前 {size}", "xpack.maps.termJoinExpression.value": "来自 {term} 的 {topTerms} 词", - "xpack.maps.termSource.requestDescription": "获取指标的数据视图:{dataViewName}、词字段:{termFieldName}", - "xpack.maps.termSource.requestName": "{leftSourceName} 词联接请求", "xpack.maps.tiles.resultsCompleteMsg": "找到 {countPrefix}{count} 个文档。", "xpack.maps.tiles.resultsTrimmedMsg": "结果仅限为 {countPrefix}{count} 个文档。", "xpack.maps.tooltip.pageNumerText": "{total} 的 {pageNumber}", @@ -24049,8 +24030,6 @@ "xpack.maps.source.esGeoLine.sortFieldPlaceholder": "选择排序字段", "xpack.maps.source.esGeoLine.splitFieldLabel": "实体", "xpack.maps.source.esGeoLine.splitFieldPlaceholder": "选择实体字段", - "xpack.maps.source.esGeoLine.timeSeriesTrackRequestName": "“{layerName}”轨迹请求(时间序列)", - "xpack.maps.source.esGeoLine.trackRequestName": "“{layerName}”轨迹请求(词)", "xpack.maps.source.esGeoLine.trackSettingsLabel": "轨迹", "xpack.maps.source.esGeoLineDescription": "从点创建线", "xpack.maps.source.esGeoLineTitle": "轨迹", @@ -24093,7 +24072,6 @@ "xpack.maps.source.esSearch.useMVTVectorTiles": "使用矢量磁贴", "xpack.maps.source.esSearchDescription": "Elasticsearch 的点、线和多边形", "xpack.maps.source.esSearchTitle": "文档", - "xpack.maps.source.esSource.stylePropsMetaRequestDescription": "检索用于计算符号化带的字段元数据的 Elasticsearch 请求。", "xpack.maps.source.esTopHitsSearch.sortFieldLabel": "排序字段", "xpack.maps.source.esTopHitsSearch.sortOrderLabel": "排序顺序", "xpack.maps.source.geofieldLabel": "地理空间字段", @@ -40441,9 +40419,7 @@ "xpack.transform.forceDeleteTransformMessage": "删除 {count} {count, plural, other {转换}}", "xpack.transform.managedTransformsWarningCallout": "{count, plural, other {至少一个此类转换}}由 Elastic 预配置;{action} {count, plural, other {这些转换}}可能会影响该产品的其他部分。", "xpack.transform.multiTransformActionsMenu.transformsCount": "已选定 {count} 个{count, plural, other {转换}}", - "xpack.transform.stepCreateForm.createDataViewErrorMessage": "创建 Kibana 数据视图 {dataViewName} 时发生错误:", "xpack.transform.stepCreateForm.createTransformErrorMessage": "创建转换 {transformId} 时出错:", - "xpack.transform.stepCreateForm.duplicateDataViewErrorMessage": "创建 Kibana 数据视图 {dataViewName} 时发生错误:数据视图已存在。", "xpack.transform.stepDefineForm.invalidKuerySyntaxErrorMessageQueryBar": "无效查询:{queryErrorMessage}", "xpack.transform.stepDefineForm.queryPlaceholderKql": "例如,{example}", "xpack.transform.stepDefineForm.queryPlaceholderLucene": "例如,{example}", @@ -43293,10 +43269,10 @@ "randomSampling.ui.sliderControl.performanceLabel": "性能", "reporting.commonExportTypesHelpers.missingJobHeadersErrorMessage": "作业标头缺失", "reporting.commonExportTypesHelpers.failedToDecryptReportJobDataErrorMessage": "无法解密报告作业数据。请确保已设置 {encryptionKey},然后重新生成此报告。{err}", - "reactPackages.mountPointPortal.errorMessage": "呈现门户内容时出错", "reporting.common.browserCouldNotLaunchErrorMessage": "无法生成屏幕截图,因为浏览器未启动。有关更多信息,请查看服务器日志。", "reporting.common.cloud.insufficientSystemMemoryError": "由于内存不足,无法生成此报告。", "reporting.common.pdfWorkerOutOfMemoryErrorMessage": "由于内存不足,无法生成 PDF。尝试生成更小的 PDF,然后重试此报告。", + "reactPackages.mountPointPortal.errorMessage": "呈现门户内容时出错", "savedObjectsFinder.advancedSettings.listingLimitText": "要为列表页面提取的对象数目", "savedObjectsFinder.advancedSettings.listingLimitTitle": "对象列表限制", "savedObjectsFinder.advancedSettings.perPageText": "加载对话框中每页要显示的对象数目", 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/alerting_api_integration/common/plugins/actions_simulators/server/bedrock_simulation.ts b/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/bedrock_simulation.ts index bfa8c5cb0736f..29e77feb5edaf 100644 --- a/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/bedrock_simulation.ts +++ b/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/bedrock_simulation.ts @@ -7,6 +7,8 @@ import http from 'http'; +import { EventStreamCodec } from '@smithy/eventstream-codec'; +import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; import { ProxyArgs, Simulator } from './simulator'; export class BedrockSimulator extends Simulator { @@ -27,6 +29,10 @@ export class BedrockSimulator extends Simulator { return BedrockSimulator.sendErrorResponse(response); } + if (request.url === '/model/anthropic.claude-v2/invoke-with-response-stream') { + return BedrockSimulator.sendStreamResponse(response); + } + return BedrockSimulator.sendResponse(response); } @@ -36,6 +42,14 @@ export class BedrockSimulator extends Simulator { response.end(JSON.stringify(bedrockSuccessResponse, null, 4)); } + private static sendStreamResponse(response: http.ServerResponse) { + response.statusCode = 200; + response.setHeader('Content-Type', 'application/octet-stream'); + response.setHeader('Transfer-Encoding', 'chunked'); + response.write(encodeBedrockResponse('Hello world, what a unique string!')); + response.end(); + } + private static sendErrorResponse(response: http.ServerResponse) { response.statusCode = 422; response.setHeader('Content-Type', 'application/json;charset=UTF-8'); @@ -52,3 +66,20 @@ export const bedrockFailedResponse = { message: 'Malformed input request: extraneous key [ooooo] is not permitted, please reformat your input and try again.', }; + +function encodeBedrockResponse(completion: string) { + return new EventStreamCodec(toUtf8, fromUtf8).encode({ + headers: { + ':event-type': { type: 'string', value: 'chunk' }, + ':content-type': { type: 'string', value: 'application/json' }, + ':message-type': { type: 'string', value: 'event' }, + }, + body: Uint8Array.from( + Buffer.from( + JSON.stringify({ + bytes: Buffer.from(JSON.stringify({ completion })).toString('base64'), + }) + ) + ), + }); +} 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 67053bef7801b..70cdc0f96dfdd 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 @@ -12,6 +12,7 @@ import { bedrockSuccessResponse, } 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 { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { getUrlPrefix, ObjectRemover } from '../../../../../common/lib'; @@ -407,6 +408,43 @@ export default function bedrockTest({ getService }: FtrProviderContext) { data: { message: bedrockSuccessResponse.completion }, }); }); + + 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 + .post(`/internal/elastic_assistant/actions/connector/${bedrockActionId}/_execute`) + .set('kbn-xsrf', 'foo') + .on('error', reject) + .send({ + params: { + subAction: 'invokeStream', + subActionParams: { + messages: [ + { + role: 'user', + content: 'Hello world', + }, + ], + }, + }, + assistantLangChain: false, + }) + .pipe(passThrough); + + passThrough.on('data', (chunk) => { + responseBody += chunk.toString(); + }); + + passThrough.on('end', () => { + expect(responseBody).to.eql('Hello world, what a unique string!'); + resolve(); + }); + }); + }); }); }); 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/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/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/transform/transforms_create.ts b/x-pack/test/api_integration/apis/transform/transforms_create.ts index e82f1d4fdfddc..84617f6990e3e 100644 --- a/x-pack/test/api_integration/apis/transform/transforms_create.ts +++ b/x-pack/test/api_integration/apis/transform/transforms_create.ts @@ -10,7 +10,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; import { getCommonRequestHeader } from '../../../functional/services/ml/common_api'; import { USER } from '../../../functional/services/transform/security_common'; -import { generateTransformConfig } from './common'; +import { generateTransformConfig, generateDestIndex } from './common'; export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); @@ -27,8 +27,102 @@ export default ({ getService }: FtrProviderContext) => { await transform.api.cleanTransformIndices(); }); + it('should create a transform', async () => { + const transformId = 'test_transform_id_create'; + + const { body, status } = await supertest + .put(`/internal/transform/transforms/${transformId}`) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(getCommonRequestHeader('1')) + .send({ + ...generateTransformConfig(transformId), + }); + + transform.api.assertResponseStatusCode(200, status, body); + + expect(body).to.eql({ + dataViewsCreated: [], + dataViewsErrors: [], + errors: [], + transformsCreated: [ + { + transform: transformId, + }, + ], + }); + }); + + it('should create a transform with data view', async () => { + const transformId = 'test_transform_id_create_with_data_view'; + const destinationIndex = generateDestIndex(transformId); + + const { body, status } = await supertest + .put(`/internal/transform/transforms/${transformId}?createDataView=true`) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(getCommonRequestHeader('1')) + .send({ + ...generateTransformConfig(transformId), + }); + + transform.api.assertResponseStatusCode(200, status, body); + + // The data view id will be returned as a non-deterministic uuid + // so we cannot assert the actual id returned. We'll just assert + // that a data view has been created a no errors were returned. + expect(body.dataViewsCreated.length).to.be(1); + expect(body.dataViewsErrors.length).to.be(0); + expect(body.errors.length).to.be(0); + expect(body.transformsCreated).to.eql([ + { + transform: transformId, + }, + ]); + + await transform.testResources.deleteIndexPatternByTitle(destinationIndex); + }); + + it('should create a transform with data view and time field', async () => { + const transformId = 'test_transform_id_create_with_data_view_and_time_field'; + const destinationIndex = generateDestIndex(transformId); + + const { body, status } = await supertest + .put( + `/internal/transform/transforms/${transformId}?createDataView=true&timeFieldName=@timestamp` + ) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(getCommonRequestHeader('1')) + .send({ + ...generateTransformConfig(transformId), + }); + + transform.api.assertResponseStatusCode(200, status, body); + + // The data view id will be returned as a non-deterministic uuid + // so we cannot assert the actual id returned. We'll just assert + // that a data view has been created a no errors were returned. + expect(body.dataViewsCreated.length).to.be(1); + expect(body.dataViewsErrors.length).to.be(0); + expect(body.errors.length).to.be(0); + expect(body.transformsCreated).to.eql([ + { + transform: transformId, + }, + ]); + + await transform.testResources.deleteIndexPatternByTitle(destinationIndex); + }); + it('should not allow pivot and latest configs in same transform', async () => { - const transformId = 'test_transform_id'; + const transformId = 'test_transform_id_fail'; const { body, status } = await supertest .put(`/internal/transform/transforms/${transformId}`) @@ -50,7 +144,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should ensure if pivot or latest is provided', async () => { - const transformId = 'test_transform_id'; + const transformId = 'test_transform_id_fail'; const { pivot, ...config } = generateTransformConfig(transformId); diff --git a/x-pack/test/api_integration/apis/transform/transforms_stats.ts b/x-pack/test/api_integration/apis/transform/transforms_stats.ts index aea5c049343e9..2eec1f4e17b9a 100644 --- a/x-pack/test/api_integration/apis/transform/transforms_stats.ts +++ b/x-pack/test/api_integration/apis/transform/transforms_stats.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import type { GetTransformsStatsResponseSchema } from '@kbn/transform-plugin/common/api_schemas/transforms_stats'; -import { TRANSFORM_STATE } from '@kbn/transform-plugin/common/constants'; +import { TRANSFORM_STATE, type TransformState } from '@kbn/transform-plugin/common/constants'; import { getCommonRequestHeader } from '../../../functional/services/ml/common_api'; import { USER } from '../../../functional/services/transform/security_common'; @@ -17,45 +17,63 @@ import { FtrProviderContext } from '../../ftr_provider_context'; import { generateTransformConfig } from './common'; +interface ExpectedTransformsStats { + id: string; + state: TransformState; +} + export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); const transform = getService('transform'); - const expected = { - apiTransformTransforms: { - count: 2, - transform1: { id: 'transform-test-stats-1', state: TRANSFORM_STATE.STOPPED }, - transform2: { id: 'transform-test-stats-2', state: TRANSFORM_STATE.STOPPED }, - typeOfStats: 'object', - typeOfCheckpointing: 'object', - }, - }; + async function superTestRequest(endpoint: string, user: USER) { + return await supertest + .get(endpoint) + .auth(user, transform.securityCommon.getPasswordForUser(user)) + .set(getCommonRequestHeader('1')) + .send(); + } async function createTransform(transformId: string) { const config = generateTransformConfig(transformId); await transform.api.createTransform(transformId, config); } - function assertTransformsStatsResponseBody(body: GetTransformsStatsResponseSchema) { - expect(body.count).to.eql(expected.apiTransformTransforms.count); - expect(body.transforms).to.have.length(expected.apiTransformTransforms.count); + function assertTransformsStatsResponseBody( + body: GetTransformsStatsResponseSchema, + expectedTransformsStats: ExpectedTransformsStats[] + ) { + const expectedTransformsCount = expectedTransformsStats.length; - const transform1 = body.transforms[0]; - expect(transform1.id).to.eql(expected.apiTransformTransforms.transform1.id); - expect(transform1.state).to.eql(expected.apiTransformTransforms.transform1.state); - expect(typeof transform1.stats).to.eql(expected.apiTransformTransforms.typeOfStats); - expect(typeof transform1.checkpointing).to.eql( - expected.apiTransformTransforms.typeOfCheckpointing + expect(body.count).to.eql( + expectedTransformsCount, + `Expected response body count attribute to be ${expectedTransformsCount} (got ${body.count})` ); - - const transform2 = body.transforms[1]; - expect(transform2.id).to.eql(expected.apiTransformTransforms.transform2.id); - expect(transform2.state).to.eql(expected.apiTransformTransforms.transform2.state); - expect(typeof transform2.stats).to.eql(expected.apiTransformTransforms.typeOfStats); - expect(typeof transform2.checkpointing).to.eql( - expected.apiTransformTransforms.typeOfCheckpointing + expect(body.transforms).to.have.length( + expectedTransformsCount, + `Expected response body transforms count to be ${expectedTransformsCount} (got ${body.transforms.length})` ); + + expectedTransformsStats.forEach((expected, index) => { + const transformStats = body.transforms[index]; + expect(transformStats.id).to.eql( + expected.id, + `Expected transforms id to be ${expected.id} (got ${transformStats.id})` + ); + expect(transformStats.state).to.eql( + expected.state, + `Expected transforms state to be ${expected.state} (got ${transformStats.state})` + ); + expect(typeof transformStats.stats).to.eql( + 'object', + `Expected transforms stats type to be 'object' (got ${typeof transformStats.stats})` + ); + expect(typeof transformStats.checkpointing).to.eql( + 'object', + `Expected transforms checkpointing type to be 'object' (got ${typeof transformStats.checkpointing})` + ); + }); } describe('/internal/transform/transforms/_stats', function () { @@ -71,31 +89,57 @@ export default ({ getService }: FtrProviderContext) => { }); it('should return a list of transforms statistics for super-user', async () => { - const { body, status } = await supertest - .get('/internal/transform/transforms/_stats') - .auth( - USER.TRANSFORM_POWERUSER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) - ) - .set(getCommonRequestHeader('1')) - .send(); + const { body, status } = await superTestRequest( + '/internal/transform/transforms/_stats', + USER.TRANSFORM_POWERUSER + ); + transform.api.assertResponseStatusCode(200, status, body); - assertTransformsStatsResponseBody(body); + assertTransformsStatsResponseBody(body, [ + { id: 'transform-test-stats-1', state: TRANSFORM_STATE.STOPPED }, + { id: 'transform-test-stats-2', state: TRANSFORM_STATE.STOPPED }, + ]); + }); + + it('should return statistics for a single transform for super-user', async () => { + const { body, status } = await superTestRequest( + '/internal/transform/transforms/transform-test-stats-1/_stats', + USER.TRANSFORM_POWERUSER + ); + + transform.api.assertResponseStatusCode(200, status, body); + + assertTransformsStatsResponseBody(body, [ + { id: 'transform-test-stats-1', state: TRANSFORM_STATE.STOPPED }, + ]); }); it('should return a list of transforms statistics view-only user', async () => { - const { body, status } = await supertest - .get(`/internal/transform/transforms/_stats`) - .auth( - USER.TRANSFORM_VIEWER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_VIEWER) - ) - .set(getCommonRequestHeader('1')) - .send(); + const { body, status } = await superTestRequest( + '/internal/transform/transforms/_stats', + USER.TRANSFORM_VIEWER + ); + + transform.api.assertResponseStatusCode(200, status, body); + + assertTransformsStatsResponseBody(body, [ + { id: 'transform-test-stats-1', state: TRANSFORM_STATE.STOPPED }, + { id: 'transform-test-stats-2', state: TRANSFORM_STATE.STOPPED }, + ]); + }); + + it('should return statistics for a single transform for view-only user', async () => { + const { body, status } = await superTestRequest( + '/internal/transform/transforms/transform-test-stats-2/_stats', + USER.TRANSFORM_VIEWER + ); + transform.api.assertResponseStatusCode(200, status, body); - assertTransformsStatsResponseBody(body); + assertTransformsStatsResponseBody(body, [ + { id: 'transform-test-stats-2', state: TRANSFORM_STATE.STOPPED }, + ]); }); }); }; 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/detection_engine_api_integration/security_and_spaces/group5/index.ts b/x-pack/test/dataset_quality_api_integration/basic/config.ts similarity index 51% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group5/index.ts rename to x-pack/test/dataset_quality_api_integration/basic/config.ts index ac107392d4b5c..614f052c9c774 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/index.ts +++ b/x-pack/test/dataset_quality_api_integration/basic/config.ts @@ -5,11 +5,7 @@ * 2.0. */ -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { configs } from '../configs'; // eslint-disable-next-line import/no-default-export -export default ({ loadTestFile }: FtrProviderContext): void => { - describe('detection engine api security and spaces enabled - Group 5', function () { - loadTestFile(require.resolve('./keyword_family')); - }); -}; +export default configs.basic; diff --git a/x-pack/test/dataset_quality_api_integration/common/config.ts b/x-pack/test/dataset_quality_api_integration/common/config.ts new file mode 100644 index 0000000000000..7a0c7c08fb2f0 --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/common/config.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 { + DatasetQualityUsername, + DATASET_QUALITY_TEST_PASSWORD, +} from '@kbn/dataset-quality-plugin/server/test_helpers/create_dataset_quality_users/authentication'; +import { createDatasetQualityUsers } from '@kbn/dataset-quality-plugin/server/test_helpers/create_dataset_quality_users'; +import { FtrConfigProviderContext } from '@kbn/test'; +import supertest from 'supertest'; +import { format, UrlObject } from 'url'; +import { + FtrProviderContext, + InheritedFtrProviderContext, + InheritedServices, +} from './ftr_provider_context'; +import { createDatasetQualityApiClient } from './dataset_quality_api_supertest'; +import { RegistryProvider } from './registry'; +import { DatasetQualityFtrConfigName } from '../configs'; + +export interface DatasetQualityFtrConfig { + name: DatasetQualityFtrConfigName; + license: 'basic'; + kibanaConfig?: Record; +} + +async function getDatasetQualityApiClient({ + kibanaServer, + username, +}: { + kibanaServer: UrlObject; + username: DatasetQualityUsername | 'elastic'; +}) { + const url = format({ + ...kibanaServer, + auth: `${username}:${DATASET_QUALITY_TEST_PASSWORD}`, + }); + + return createDatasetQualityApiClient(supertest(url)); +} + +export type CreateTestConfig = ReturnType; + +export type DatasetQualityApiClientKey = + | 'noAccessUser' + | 'readUser' + | 'adminUser' + | 'writeUser' + | 'datasetQualityLogsUser'; + +export type DatasetQualityApiClient = Record< + DatasetQualityApiClientKey, + Awaited> +>; + +export interface CreateTest { + testFiles: string[]; + servers: any; + servicesRequiredForTestAnalysis: string[]; + services: InheritedServices & { + datasetQualityFtrConfig: () => DatasetQualityFtrConfig; + registry: ({ getService }: FtrProviderContext) => ReturnType; + datasetQualityApiClient: (context: InheritedFtrProviderContext) => DatasetQualityApiClient; + }; + junit: { reportName: string }; + esTestCluster: any; + kbnTestServer: any; +} + +export function createTestConfig( + config: DatasetQualityFtrConfig +): ({ readConfigFile }: FtrConfigProviderContext) => Promise { + const { license, name, kibanaConfig } = config; + + return async ({ readConfigFile }: FtrConfigProviderContext) => { + const xPackAPITestsConfig = await readConfigFile( + require.resolve('../../api_integration/config.ts') + ); + + const services = xPackAPITestsConfig.get('services'); + const servers = xPackAPITestsConfig.get('servers'); + const kibanaServer = servers.kibana as UrlObject; + const kibanaServerUrl = format(kibanaServer); + const esServer = servers.elasticsearch as UrlObject; + + return { + testFiles: [require.resolve('../tests')], + servers, + servicesRequiredForTestAnalysis: ['datasetQualityFtrConfig', 'registry'], + services: { + ...services, + datasetQualityFtrConfig: () => config, + registry: RegistryProvider, + datasetQualityApiClient: async (_: InheritedFtrProviderContext) => { + const { username, password } = servers.kibana; + const esUrl = format(esServer); + + // Creates DatasetQuality users + await createDatasetQualityUsers({ + elasticsearch: { node: esUrl, username, password }, + kibana: { hostname: kibanaServerUrl }, + }); + + return { + noAccessUser: await getDatasetQualityApiClient({ + kibanaServer, + username: DatasetQualityUsername.noAccessUser, + }), + readUser: await getDatasetQualityApiClient({ + kibanaServer, + username: DatasetQualityUsername.viewerUser, + }), + adminUser: await getDatasetQualityApiClient({ + kibanaServer, + username: 'elastic', + }), + writeUser: await getDatasetQualityApiClient({ + kibanaServer, + username: DatasetQualityUsername.editorUser, + }), + datasetQualityLogsUser: await getDatasetQualityApiClient({ + kibanaServer, + username: DatasetQualityUsername.datasetQualityLogsUser, + }), + }; + }, + }, + junit: { + reportName: `Dataset quality API Integration tests (${name})`, + }, + esTestCluster: { + ...xPackAPITestsConfig.get('esTestCluster'), + license, + }, + kbnTestServer: { + ...xPackAPITestsConfig.get('kbnTestServer'), + serverArgs: [ + ...xPackAPITestsConfig.get('kbnTestServer.serverArgs'), + ...(kibanaConfig + ? Object.entries(kibanaConfig).map(([key, value]) => + Array.isArray(value) ? `--${key}=${JSON.stringify(value)}` : `--${key}=${value}` + ) + : []), + ], + }, + }; + }; +} + +export type DatasetQualityServices = Awaited>['services']; 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 new file mode 100644 index 0000000000000..d28ddb5f04962 --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { format } from 'url'; +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'; + +export function createDatasetQualityApiClient(st: supertest.SuperTest) { + return async ( + options: { + type?: 'form-data'; + endpoint: TEndpoint; + } & APIClientRequestParamsOf & { params?: { query?: { _inspect?: boolean } } } + ): Promise> => { + const { endpoint, type } = options; + + const params = 'params' in options ? (options.params as Record) : {}; + + const { method, pathname, version } = formatRequest(endpoint, params.path); + const url = format({ pathname, query: params?.query }); + + const headers: Record = { 'kbn-xsrf': 'foo' }; + + if (version) { + headers['Elastic-Api-Version'] = version; + } + + let res: request.Response; + if (type === 'form-data') { + const fields: Array<[string, any]> = Object.entries(params.body); + const formDataRequest = st[method](url) + .set(headers) + .set('Content-type', 'multipart/form-data'); + + for (const field of fields) { + formDataRequest.field(field[0], field[1]); + } + + res = await formDataRequest; + } else if (params.body) { + res = await st[method](url).send(params.body).set(headers); + } else { + res = await st[method](url).set(headers); + } + + // supertest doesn't throw on http errors + if (res?.status !== 200) { + throw new DatasetQualityApiError(res, endpoint); + } + + return res; + }; +} + +type ApiErrorResponse = Omit & { + body: { + statusCode: number; + error: string; + message: string; + attributes: object; + }; +}; + +export type DatasetQualityApiSupertest = ReturnType; + +export class DatasetQualityApiError extends Error { + res: ApiErrorResponse; + + constructor(res: request.Response, endpoint: string) { + super( + `Unhandled DatasetQualityApiError. + Status: "${res.status}" + Endpoint: "${endpoint}" + Body: ${JSON.stringify(res.body)} + ` + ); + + this.res = res; + } +} + +export interface SupertestReturnType { + status: number; + body: APIReturnType; +} diff --git a/x-pack/test/dataset_quality_api_integration/common/ftr_provider_context.ts b/x-pack/test/dataset_quality_api_integration/common/ftr_provider_context.ts new file mode 100644 index 0000000000000..69de63c48402c --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/common/ftr_provider_context.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 { GenericFtrProviderContext } from '@kbn/test'; +import { FtrProviderContext as InheritedFtrProviderContext } from '../../api_integration/ftr_provider_context'; +import { DatasetQualityServices } from './config'; + +export type InheritedServices = InheritedFtrProviderContext extends GenericFtrProviderContext< + infer TServices, + {} +> + ? TServices + : {}; + +export type { InheritedFtrProviderContext }; +export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/dataset_quality_api_integration/common/registry.ts b/x-pack/test/dataset_quality_api_integration/common/registry.ts new file mode 100644 index 0000000000000..355824916f873 --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/common/registry.ts @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { castArray, groupBy } from 'lodash'; +import callsites from 'callsites'; +import { FtrProviderContext } from './ftr_provider_context'; +import { DatasetQualityFtrConfigName } from '../configs'; +import { joinByKey, maybe } from '../utils'; + +interface RunCondition { + config: DatasetQualityFtrConfigName; +} + +export function RegistryProvider({ getService }: FtrProviderContext) { + const datasetQualityFtrConfig = getService('datasetQualityFtrConfig'); + + const callbacks: Array< + RunCondition & { + runs: Array<{ + cb: () => void; + }>; + } + > = []; + + let running: boolean = false; + + function when( + title: string, + conditions: RunCondition | RunCondition[], + callback: (condition: RunCondition) => void, + skip?: boolean + ) { + const allConditions = castArray(conditions); + + if (!allConditions.length) { + throw new Error('At least one condition should be defined'); + } + + if (running) { + throw new Error("Can't add tests when running"); + } + + const frame = maybe(callsites()[1]); + + const file = frame?.getFileName(); + + if (!file) { + throw new Error('Could not infer file for suite'); + } + + allConditions.forEach((matchedCondition) => { + callbacks.push({ + ...matchedCondition, + runs: [ + { + cb: () => { + const suite: ReturnType = (skip ? describe.skip : describe)( + title, + () => { + callback(matchedCondition); + } + ) as any; + + suite.file = file; + suite.eachTest((test) => { + test.file = file; + }); + }, + }, + ], + }); + }); + } + + when.skip = ( + title: string, + conditions: RunCondition | RunCondition[], + callback: (condition: RunCondition) => void + ) => { + when(title, conditions, callback, true); + }; + + const registry = { + when, + run: () => { + running = true; + + const groups = joinByKey(callbacks, ['config'], (a, b) => ({ + ...a, + ...b, + runs: a.runs.concat(b.runs), + })); + + callbacks.length = 0; + + const byConfig = groupBy(groups, 'config'); + + Object.keys(byConfig).forEach((config) => { + const groupsForConfig = byConfig[config]; + + // register suites for other configs, but skip them so tests are marked as such + // and their snapshots are not marked as obsolete + (config === datasetQualityFtrConfig.name ? describe : describe.skip)(config, () => { + groupsForConfig.forEach((group) => { + const { runs } = group; + + runs.forEach((run) => { + run.cb(); + }); + }); + }); + }); + + running = false; + }, + }; + + return registry; +} diff --git a/x-pack/test/dataset_quality_api_integration/configs/index.ts b/x-pack/test/dataset_quality_api_integration/configs/index.ts new file mode 100644 index 0000000000000..db4447b0bcfea --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/configs/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 { mapValues } from 'lodash'; +import { createTestConfig, CreateTestConfig } from '../common/config'; + +export const datasetQualityDebugLogger = { + name: 'plugins.datasetQuality', + level: 'debug', + appenders: ['console'], +}; + +const datasetQualityFtrConfigs = { + basic: { + license: 'basic' as const, + kibanaConfig: { + 'logging.loggers': [datasetQualityDebugLogger], + }, + }, +}; + +export type DatasetQualityFtrConfigName = keyof typeof datasetQualityFtrConfigs; + +export const configs: Record = mapValues( + datasetQualityFtrConfigs, + (value, key) => { + return createTestConfig({ + name: key as DatasetQualityFtrConfigName, + ...value, + }); + } +); 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 new file mode 100644 index 0000000000000..cd236c109c667 --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams.spec.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 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'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const registry = getService('registry'); + const datasetQualityApiClient = getService('datasetQualityApiClient'); + + async function callApiAs(user: DatasetQualityApiClientKey) { + return await datasetQualityApiClient[user]({ + endpoint: 'GET /internal/dataset_quality/data_streams/stats', + params: { + query: { + type: 'logs', + sortOrder: 'asc', + }, + }, + }); + } + + registry.when('Api Key privileges check', { config: 'basic' }, () => { + describe('when missing required privileges', () => { + it('fails with a 500 error', async () => { + const err = await expectToReject( + async () => await callApiAs('readUser') + ); + + expect(err.res.status).to.be(500); + expect(err.res.body.message).to.contain('unauthorized'); + }); + }); + + describe('when required privileges are set', () => { + it('returns true when user has logMonitoring privileges', async () => { + const privileges = await callApiAs('datasetQualityLogsUser'); + + expect(privileges.body.items.length).to.be(0); + }); + }); + }); +} diff --git a/x-pack/test/dataset_quality_api_integration/tests/index.ts b/x-pack/test/dataset_quality_api_integration/tests/index.ts new file mode 100644 index 0000000000000..9aacc08923348 --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/tests/index.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 globby from 'globby'; +import path from 'path'; +import { FtrProviderContext } from '../common/ftr_provider_context'; + +const cwd = path.join(__dirname); +const envGrepFiles = process.env.DATASET_QUALITY_TEST_GREP_FILES as string; + +function getGlobPattern() { + try { + const envGrepFilesParsed = JSON.parse(envGrepFiles as string) as string[]; + return envGrepFilesParsed.map((pattern) => `**/${pattern}**`); + } catch (e) { + // ignore + } + return '**/*.spec.ts'; +} + +export default function datasetQualityApiIntegrationTests({ + getService, + loadTestFile, +}: FtrProviderContext) { + const registry = getService('registry'); + + describe('Dataset quality API tests', function () { + const filePattern = getGlobPattern(); + const tests = globby.sync(filePattern, { cwd }); + + if (envGrepFiles) { + // eslint-disable-next-line no-console + console.log( + `\nCommand "--grep-files=${filePattern}" matched ${tests.length} file(s):\n${tests + .map((name) => ` - ${name}`) + .join('\n')}\n` + ); + } + + tests.forEach((testName) => { + describe(testName, () => { + loadTestFile(require.resolve(`./${testName}`)); + registry.run(); + }); + }); + }); +} diff --git a/x-pack/test/dataset_quality_api_integration/utils/expect_to_reject.ts b/x-pack/test/dataset_quality_api_integration/utils/expect_to_reject.ts new file mode 100644 index 0000000000000..ae352c31d71a2 --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/utils/expect_to_reject.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. + */ + +export async function expectToReject(fn: () => Promise): Promise { + let res: any; + try { + res = await fn(); + } catch (e) { + return e; + } + + throw new Error(`expectToReject resolved: "${JSON.stringify(res)}"`); +} diff --git a/x-pack/test/dataset_quality_api_integration/utils/index.ts b/x-pack/test/dataset_quality_api_integration/utils/index.ts new file mode 100644 index 0000000000000..ae42a0d359d0b --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/utils/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 { joinByKey } from './join_by_key'; +export { maybe } from './maybe'; +export { expectToReject } from './expect_to_reject'; diff --git a/x-pack/test/dataset_quality_api_integration/utils/join_by_key.ts b/x-pack/test/dataset_quality_api_integration/utils/join_by_key.ts new file mode 100644 index 0000000000000..0a74a2b94f393 --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/utils/join_by_key.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 { UnionToIntersection, ValuesType } from 'utility-types'; +import { isEqual, pull, merge, castArray } from 'lodash'; + +/** + * Joins a list of records by a given key. Key can be any type of value, from + * strings to plain objects, as long as it is present in all records. `isEqual` + * is used for comparing keys. + * + * UnionToIntersection is needed to get all keys of union types, see below for + * example. + * + */ + +export type JoinedReturnType< + T extends Record, + U extends UnionToIntersection +> = Array< + Partial & { + [k in keyof T]: T[k]; + } +>; + +type ArrayOrSingle = T | T[]; + +export function joinByKey< + T extends Record, + U extends UnionToIntersection, + V extends ArrayOrSingle +>(items: T[], key: V): JoinedReturnType; + +export function joinByKey< + T extends Record, + U extends UnionToIntersection, + V extends ArrayOrSingle, + W extends JoinedReturnType, + X extends (a: T, b: T) => ValuesType +>(items: T[], key: V, mergeFn: X): W; + +export function joinByKey( + items: Array>, + key: string | string[], + mergeFn: Function = (a: Record, b: Record) => merge({}, a, b) +) { + const keys = castArray(key); + return items.reduce>>((prev, current) => { + let item = prev.find((prevItem) => keys.every((k) => isEqual(prevItem[k], current[k]))); + + if (!item) { + item = { ...current }; + prev.push(item); + } else { + pull(prev, item).push(mergeFn(item, current)); + } + + return prev; + }, []); +} diff --git a/x-pack/packages/kbn-slo-schema/src/models/pagination.ts b/x-pack/test/dataset_quality_api_integration/utils/maybe.ts similarity index 60% rename from x-pack/packages/kbn-slo-schema/src/models/pagination.ts rename to x-pack/test/dataset_quality_api_integration/utils/maybe.ts index 815c30f71d4c4..f73dbe09d6ad4 100644 --- a/x-pack/packages/kbn-slo-schema/src/models/pagination.ts +++ b/x-pack/test/dataset_quality_api_integration/utils/maybe.ts @@ -4,14 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -export interface Paginated { - total: number; - page: number; - perPage: number; - results: T[]; -} -export interface Pagination { - page: number; - perPage: number; +export function maybe(value: T): T | null | undefined { + return value; } diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/index.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/index.ts index 44d912f3271c6..d3e83305ad11e 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/index.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/index.ts @@ -14,7 +14,6 @@ export default ({ loadTestFile }: FtrProviderContext): void => { // action migration code. We are monitoring legacy action telemetry to clean up once we see their // existence being near 0. - loadTestFile(require.resolve('./check_privileges')); loadTestFile(require.resolve('./create_rules_bulk')); loadTestFile(require.resolve('./delete_rules')); loadTestFile(require.resolve('./delete_rules_bulk')); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/index.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/index.ts index ae0bfaa8940e8..70b50d7f5aef3 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/index.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/index.ts @@ -25,10 +25,5 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./perform_bulk_action')); loadTestFile(require.resolve('./perform_bulk_action_dry_run')); loadTestFile(require.resolve('./patch_rules')); - loadTestFile(require.resolve('./read_privileges')); - loadTestFile(require.resolve('./timestamps')); - loadTestFile(require.resolve('./runtime')); - loadTestFile(require.resolve('./throttle')); - loadTestFile(require.resolve('./ignore_fields')); }); }; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/mocks/new_terms.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/mocks/new_terms.ts deleted file mode 100644 index 15c63546a4be7..0000000000000 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/mocks/new_terms.ts +++ /dev/null @@ -1,1409 +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 const largeArraysBuckets = [ - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-0', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-1', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-2', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-3', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-4', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-5', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-6', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-7', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-8', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-0', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-1', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-2', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-3', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-4', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-5', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-6', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-7', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-8', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-9', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-10', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-11', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-12', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-13', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-14', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-15', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-16', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-17', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-18', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, - { - key: { - large_array_20: 'value-of-20-19', - large_array_10: 'value-of-10-9', - }, - doc_count: 1, - }, -]; diff --git a/x-pack/test/detection_engine_api_integration/utils/create_new_action.ts b/x-pack/test/detection_engine_api_integration/utils/create_new_action.ts deleted file mode 100644 index d5093d8d5d39b..0000000000000 --- a/x-pack/test/detection_engine_api_integration/utils/create_new_action.ts +++ /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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { ToolingLog } from '@kbn/tooling-log'; -import type SuperTest from 'supertest'; - -import { getWebHookAction } from './get_web_hook_action'; - -/** - * Helper to cut down on the noise in some of the tests. This - * creates a new action and expects a 200 and does not do any retries. - * @param supertest The supertest deps - */ -export const createNewAction = async ( - supertest: SuperTest.SuperTest, - log: ToolingLog -) => { - const response = await supertest - .post('/api/actions/action') - .set('kbn-xsrf', 'true') - .send(getWebHookAction()); - if (response.status !== 200) { - log.error( - `Did not get an expected 200 "ok" when creating a new action. CI issues could happen. Suspect this line if you are seeing CI issues. body: ${JSON.stringify( - response.body - )}, status: ${JSON.stringify(response.status)}` - ); - } - return response.body; -}; diff --git a/x-pack/test/detection_engine_api_integration/utils/index.ts b/x-pack/test/detection_engine_api_integration/utils/index.ts index 1c62f3dc2c123..a1373f03a1817 100644 --- a/x-pack/test/detection_engine_api_integration/utils/index.ts +++ b/x-pack/test/detection_engine_api_integration/utils/index.ts @@ -13,9 +13,7 @@ export * from './create_container_with_entries'; export * from './create_exception_list'; export * from './create_exception_list_item'; export * from './create_legacy_rule_action'; -export * from './create_new_action'; export * from './create_rule'; -export * from './create_rule_with_auth'; export * from './create_rule_with_exception_entries'; export * from './create_rule_saved_object'; export * from './create_signals_index'; @@ -26,12 +24,10 @@ export * from './delete_all_alerts'; export * from './delete_all_timelines'; export * from './delete_exception_list'; export * from './delete_rule'; -export * from './downgrade_immutable_rule'; export * from './finalize_signals_migration'; export * from './find_immutable_rule_by_id'; export * from './get_complex_rule'; export * from './get_complex_rule_output'; -export * from './get_detection_metrics_from_body'; export * from './get_eql_rule_for_signal_testing'; export * from './get_event_log_execute_complete_by_id'; export * from './get_legacy_action_notification_so'; @@ -48,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_security_telemetry_stats'; export * from './get_signal_status'; export * from './get_signals_by_id'; export * from './get_signals_by_ids'; @@ -63,9 +58,6 @@ export * from './get_simple_rule_output_without_rule_id'; export * from './get_simple_rule_update'; export * from './get_simple_rule_without_rule_id'; export * from './get_simple_saved_query_rule'; -export * from './get_simple_threat_match'; -export * from './get_stats'; -export * from './get_stats_url'; export * from './get_threat_match_rule_for_signal_testing'; export * from './get_threshold_rule_for_signal_testing'; export * from './get_slack_action'; @@ -77,7 +69,6 @@ export * from './preview_rule_with_exception_entries'; export * from './preview_rule'; export * from './refresh_index'; export * from './route_with_namespace'; -export * from './remove_time_fields_from_telemetry_stats'; export * from './remove_server_generated_properties'; export * from './remove_server_generated_properties_including_rule_id'; export * from './resolve_simple_rule_output'; diff --git a/x-pack/test/fleet_api_integration/apis/agents/upgrade.ts b/x-pack/test/fleet_api_integration/apis/agents/upgrade.ts index d9cf624fccdc1..3d48d66957191 100644 --- a/x-pack/test/fleet_api_integration/apis/agents/upgrade.ts +++ b/x-pack/test/fleet_api_integration/apis/agents/upgrade.ts @@ -443,6 +443,167 @@ export default function (providerContext: FtrProviderContext) { }) .expect(200); }); + + it('should respond 400 if trying to upgrade an already upgrading agent with no upgrade details', async () => { + await es.update({ + id: 'agent1', + refresh: 'wait_for', + index: AGENTS_INDEX, + body: { + doc: { + upgrade_started_at: new Date(Date.now() - 9 * 6e4).toISOString(), + local_metadata: { + elastic: { + agent: { + upgradeable: true, + version: '0.0.0', + }, + }, + }, + }, + }, + }); + const response = await supertest + .post(`/api/fleet/agents/agent1/upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + version: fleetServerVersion, + }) + .expect(400); + + expect(response.body.message).to.contain('is already upgrading'); + }); + + it('should respond 200 if trying to upgrade an already upgrading agent with no upgrade details with force flag', async () => { + await es.update({ + id: 'agent1', + refresh: 'wait_for', + index: AGENTS_INDEX, + body: { + doc: { + upgrade_started_at: new Date(Date.now() - 9 * 6e4).toISOString(), + local_metadata: { + elastic: { + agent: { + upgradeable: true, + version: '0.0.0', + }, + }, + }, + }, + }, + }); + await supertest + .post(`/api/fleet/agents/agent1/upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + version: fleetServerVersion, + force: true, + }) + .expect(200); + }); + + it('should respond 400 if trying to upgrade an already upgrading agent with upgrade details', async () => { + await es.update({ + id: 'agent1', + refresh: 'wait_for', + index: AGENTS_INDEX, + body: { + doc: { + local_metadata: { + elastic: { + agent: { + upgradeable: true, + version: '0.0.0', + }, + }, + }, + upgrade_details: { + target_version: fleetServerVersion, + action_id: 'XXX', + state: 'UPG_REQUESTED', + }, + }, + }, + }); + const response = await supertest + .post(`/api/fleet/agents/agent1/upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + version: fleetServerVersion, + }) + .expect(400); + + expect(response.body.message).to.contain('is already upgrading'); + }); + + it('should respond 200 if trying to upgrade an already upgrading agent with upgrade details with force flag', async () => { + await es.update({ + id: 'agent1', + refresh: 'wait_for', + index: AGENTS_INDEX, + body: { + doc: { + local_metadata: { + elastic: { + agent: { + upgradeable: true, + version: '0.0.0', + }, + }, + }, + upgrade_details: { + target_version: fleetServerVersion, + action_id: 'XXX', + state: 'UPG_REQUESTED', + }, + }, + }, + }); + await supertest + .post(`/api/fleet/agents/agent1/upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + version: fleetServerVersion, + force: true, + }) + .expect(200); + }); + + it('should respond 200 if trying to upgrade an agent with a failed upgrade status', async () => { + await es.update({ + id: 'agent1', + refresh: 'wait_for', + index: AGENTS_INDEX, + body: { + doc: { + local_metadata: { + elastic: { + agent: { + upgradeable: true, + version: '0.0.0', + }, + }, + }, + upgrade_details: { + target_version: fleetServerVersion, + action_id: 'XXX', + state: 'UPG_FAILED', + metadata: { + error_msg: 'Upgrade timed out', + }, + }, + }, + }, + }); + await supertest + .post(`/api/fleet/agents/agent1/upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + version: fleetServerVersion, + }) + .expect(200); + }); }); describe('multiple agents', () => { diff --git a/x-pack/test/functional/apps/index_management/create_enrich_policy/create_enrich_policy.ts b/x-pack/test/functional/apps/index_management/create_enrich_policy/create_enrich_policy.ts index 6017c202d161e..3d0a1e562e45b 100644 --- a/x-pack/test/functional/apps/index_management/create_enrich_policy/create_enrich_policy.ts +++ b/x-pack/test/functional/apps/index_management/create_enrich_policy/create_enrich_policy.ts @@ -6,7 +6,6 @@ */ import expect from '@kbn/expect'; -import { SLO_SUMMARY_ENRICH_POLICY_NAME } from '@kbn/observability-plugin/server/assets/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default ({ getPageObjects, getService }: FtrProviderContext) => { @@ -24,8 +23,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { before(async () => { await log.debug('Creating test index'); try { - await es.ingest.deletePipeline({ id: '.slo-*' }, { ignore: [404] }); - await es.enrich.deletePolicy({ name: SLO_SUMMARY_ENRICH_POLICY_NAME }, { ignore: [404] }); await es.indices.create({ index: INDEX_NAME, body: { diff --git a/x-pack/test/functional/apps/index_management/home_page.ts b/x-pack/test/functional/apps/index_management/home_page.ts index 485a09ef76381..265707ec6da8c 100644 --- a/x-pack/test/functional/apps/index_management/home_page.ts +++ b/x-pack/test/functional/apps/index_management/home_page.ts @@ -6,7 +6,6 @@ */ import expect from '@kbn/expect'; -import { SLO_SUMMARY_ENRICH_POLICY_NAME } from '@kbn/observability-plugin/server/assets/constants'; import { FtrProviderContext } from '../../ftr_provider_context'; export default ({ getPageObjects, getService }: FtrProviderContext) => { @@ -16,7 +15,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const browser = getService('browser'); const retry = getService('retry'); const security = getService('security'); - const es = getService('es'); describe('Home page', function () { before(async () => { @@ -96,10 +94,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); describe('Enrich policies', () => { - before(async () => { - await es.ingest.deletePipeline({ id: '.slo-*' }, { ignore: [404] }); - await es.enrich.deletePolicy({ name: SLO_SUMMARY_ENRICH_POLICY_NAME }, { ignore: [404] }); - }); it('renders the enrich policies tab', async () => { // Navigate to the component templates tab await pageObjects.indexManagement.changeTabs('enrich_policiesTab'); 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..4e0e12a386dc9 --- /dev/null +++ b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/tests.ts @@ -0,0 +1,323 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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; + + describe('ML job ID formats', function () { + this.tags('includeFirefox'); + + 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/group1/blended_vector_layer.js b/x-pack/test/functional/apps/maps/group1/blended_vector_layer.js index 28a68edf0e75c..d142513dfd4a9 100644 --- a/x-pack/test/functional/apps/maps/group1/blended_vector_layer.js +++ b/x-pack/test/functional/apps/maps/group1/blended_vector_layer.js @@ -13,6 +13,9 @@ export default function ({ getPageObjects, getService }) { const security = getService('security'); describe('blended vector layer', () => { + const LOAD_DOCUMENTS_REQUEST_NAME = 'load layer features (logstash-*)'; + const LOAD_CLUSTERS_REQUEST_NAME = 'load layer features (Clustered logstash-*)'; + before(async () => { await security.testUser.setRoles(['test_logstash_reader', 'global_maps_all']); await PageObjects.maps.loadSavedMap('blended document example'); @@ -27,20 +30,26 @@ export default function ({ getPageObjects, getService }) { }); it('should request documents when zoomed to smaller regions showing less data', async () => { - const { rawResponse: response } = await PageObjects.maps.getResponse(); + const { rawResponse: response } = await PageObjects.maps.getResponse( + LOAD_DOCUMENTS_REQUEST_NAME + ); // Allow a range of hits to account for variances in browser window size. expect(response.hits.hits.length).to.be.within(5, 12); }); it('should request clusters when zoomed to larger regions showing lots of data', async () => { await PageObjects.maps.setView(20, -90, 2); - const { rawResponse: response } = await PageObjects.maps.getResponse(); + const { rawResponse: response } = await PageObjects.maps.getResponse( + LOAD_CLUSTERS_REQUEST_NAME + ); expect(response.aggregations.gridSplit.buckets.length).to.equal(15); }); it('should request documents when query narrows data', async () => { await PageObjects.maps.setAndSubmitQuery('bytes > 19000'); - const { rawResponse: response } = await PageObjects.maps.getResponse(); + const { rawResponse: response } = await PageObjects.maps.getResponse( + LOAD_DOCUMENTS_REQUEST_NAME + ); expect(response.hits.hits.length).to.equal(75); }); }); diff --git a/x-pack/test/functional/apps/maps/group2/embeddable/dashboard.js b/x-pack/test/functional/apps/maps/group2/embeddable/dashboard.js index 2750bf3a7f68d..bdc681e06eece 100644 --- a/x-pack/test/functional/apps/maps/group2/embeddable/dashboard.js +++ b/x-pack/test/functional/apps/maps/group2/embeddable/dashboard.js @@ -77,7 +77,7 @@ export default function ({ getPageObjects, getService }) { await retry.try(async () => { const joinExampleRequestNames = await inspector.getRequestNames(); expect(joinExampleRequestNames).to.equal( - 'geo_shapes* documents request,geo_shapes* term join request' + 'load layer features (geo_shapes*),load join metrics (geo_shapes*)' ); }); await inspector.close(); @@ -88,7 +88,7 @@ export default function ({ getPageObjects, getService }) { await inspector.close(); expect(singleExampleRequest).to.be(true); - expect(selectedExampleRequest).to.equal('logstash-* grid request'); + expect(selectedExampleRequest).to.equal('load layer features (logstash-*)'); }); it('should apply container state (time, query, filters) to embeddable when loaded', async () => { @@ -120,7 +120,7 @@ export default function ({ getPageObjects, getService }) { const { rawResponse: joinResponse } = await PageObjects.maps.getResponseFromDashboardPanel( 'join example', - 'geo_shapes* term join request' + 'load join metrics (geo_shapes*)' ); expect(joinResponse.aggregations.join.buckets.length).to.equal(1); }); diff --git a/x-pack/test/functional/apps/maps/group4/joins.js b/x-pack/test/functional/apps/maps/group4/joins.js index bf1304e3f3470..74e68cb12c11a 100644 --- a/x-pack/test/functional/apps/maps/group4/joins.js +++ b/x-pack/test/functional/apps/maps/group4/joins.js @@ -39,7 +39,7 @@ export default function ({ getPageObjects, getService }) { it('should re-fetch join with refresh timer', async () => { async function getRequestTimestamp() { - await PageObjects.maps.openInspectorRequest('geo_shapes* term join request'); + await PageObjects.maps.openInspectorRequest('load join metrics (geo_shapes*)'); const requestStats = await inspector.getTableData(); const requestTimestamp = PageObjects.maps.getInspectorStatRowHit( requestStats, @@ -122,7 +122,7 @@ export default function ({ getPageObjects, getService }) { it('should not apply query to source and apply query to join', async () => { const { rawResponse: joinResponse } = await PageObjects.maps.getResponse( - 'geo_shapes* term join request' + 'load join metrics (geo_shapes*)' ); expect(joinResponse.aggregations.join.buckets.length).to.equal(2); }); @@ -139,7 +139,7 @@ export default function ({ getPageObjects, getService }) { it('should apply query to join request', async () => { const { rawResponse: joinResponse } = await PageObjects.maps.getResponse( - 'geo_shapes* term join request' + 'load join metrics (geo_shapes*)' ); expect(joinResponse.aggregations.join.buckets.length).to.equal(1); }); diff --git a/x-pack/test/functional/apps/observability_log_explorer/app.ts b/x-pack/test/functional/apps/observability_log_explorer/app.ts index 26fb9b4e8d19e..c60bf38205e3a 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/app.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/app.ts @@ -5,11 +5,14 @@ * 2.0. */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { log, timerange } from '@kbn/apm-synthtrace-client'; +import { FtrProviderContext } from './config'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'navigationalSearch', 'observabilityLogExplorer']); const testSubjects = getService('testSubjects'); + const synthtrace = getService('logSynthtraceEsClient'); + const dataGrid = getService('dataGrid'); describe('Application', () => { it('is shown in the global search', async () => { @@ -24,5 +27,32 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.observabilityLogExplorer.navigateTo(); await testSubjects.existOrFail('observability-nav-observability-log-explorer-explorer'); }); + + it('should load logs', async () => { + const from = '2023-08-03T10:24:14.035Z'; + const to = '2023-08-03T10:24:14.091Z'; + const COUNT = 5; + await synthtrace.index(generateLogsData({ from, to, count: COUNT })); + await PageObjects.observabilityLogExplorer.navigateTo(); + const docCount = await dataGrid.getDocCount(); + + expect(docCount).to.be(COUNT); + await synthtrace.clean(); + }); }); } + +function generateLogsData({ from, to, count = 1 }: { from: string; to: string; count: number }) { + const range = timerange(from, to); + + return range + .interval('1m') + .rate(1) + .generator((timestamp) => + Array(count) + .fill(0) + .map(() => { + return log.create().message('A sample log').timestamp(timestamp); + }) + ); +} diff --git a/x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts b/x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts index 7738d3b97b2bc..b23fd6813c0f6 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; import rison from '@kbn/rison'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from './config'; const defaultLogColumns = ['@timestamp', 'service.name', 'host.name', 'message']; diff --git a/x-pack/test/functional/apps/observability_log_explorer/config.ts b/x-pack/test/functional/apps/observability_log_explorer/config.ts index d0d07ff200281..c94616d50e14b 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/config.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/config.ts @@ -5,13 +5,38 @@ * 2.0. */ -import { FtrConfigProviderContext } from '@kbn/test'; +import { FtrConfigProviderContext, GenericFtrProviderContext } from '@kbn/test'; +import { createLogger, LogLevel, LogsSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import { FtrProviderContext as InheritedFtrProviderContext } from '../../ftr_provider_context'; -export default async function ({ readConfigFile }: FtrConfigProviderContext) { +export default async function createTestConfig({ readConfigFile }: FtrConfigProviderContext) { const functionalConfig = await readConfigFile(require.resolve('../../config.base.js')); + const services = functionalConfig.get('services'); + const pageObjects = functionalConfig.get('pageObjects'); return { ...functionalConfig.getAll(), testFiles: [require.resolve('.')], + services: { + ...services, + logSynthtraceEsClient: (context: InheritedFtrProviderContext) => { + return new LogsSynthtraceEsClient({ + client: context.getService('es'), + logger: createLogger(LogLevel.info), + refreshAfterIndex: true, + }); + }, + }, + pageObjects, }; } + +export type CreateTestConfig = Awaited>; + +export type ObsLogExplorerServices = CreateTestConfig['services']; +export type ObsLogExplorerPageObject = CreateTestConfig['pageObjects']; + +export type FtrProviderContext = GenericFtrProviderContext< + ObsLogExplorerServices, + ObsLogExplorerPageObject +>; diff --git a/x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts b/x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts index e232b9df5f1c4..9fc2cca312551 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; import rison from '@kbn/rison'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from './config'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); diff --git a/x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts b/x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts index 73426c990ec48..d656301a13891 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts @@ -5,7 +5,8 @@ * 2.0. */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from './config'; +import { WebElementWrapper } from '../../../../../test/functional/services/lib/web_element_wrapper'; const initialPackageMap = { apache: 'Apache HTTP Server', @@ -101,7 +102,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should display an empty prompt for no integrations', async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(menuEntries.length).to.be(0); await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( @@ -161,7 +164,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const uncategorizedEntries = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(uncategorizedEntries.length).to.be(0); @@ -313,7 +318,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const [panelTitleNode, integrationDatasetEntries] = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => + .then((menu: WebElementWrapper) => Promise.all([ PageObjects.observabilityLogExplorer.getPanelTitle(menu), PageObjects.observabilityLogExplorer.getPanelEntries(menu), @@ -335,7 +340,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const panelTitleNode = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); @@ -345,7 +352,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); @@ -356,7 +365,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be('error'); expect(await menuEntries[1].getVisibleText()).to.be('access'); @@ -367,7 +378,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); @@ -383,7 +396,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const panelTitleNode = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); @@ -391,7 +406,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); @@ -402,7 +419,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('error'); @@ -418,7 +437,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const panelTitleNode = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); @@ -426,7 +447,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be('access'); menuEntries[0].click(); @@ -452,14 +475,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.observabilityLogExplorer.openDatasetSelector(); await PageObjects.observabilityLogExplorer .getUncategorizedTab() - .then((tab) => tab.click()); + .then((tab: WebElementWrapper) => tab.click()); }); it('should display a list of available datasets', async () => { await retry.try(async () => { const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => + .then((menu: WebElementWrapper) => Promise.all([ PageObjects.observabilityLogExplorer.getPanelTitle(menu), PageObjects.observabilityLogExplorer.getPanelEntries(menu), @@ -477,7 +500,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const panelTitleNode = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); @@ -487,7 +512,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -499,7 +526,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[2]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -511,7 +540,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -523,7 +554,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const panelTitleNode = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); @@ -531,7 +564,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -543,7 +578,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('retail'); @@ -554,7 +591,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const panelTitleNode = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); @@ -562,7 +601,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); menuEntries[0].click(); @@ -585,14 +626,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { beforeEach(async () => { await browser.refresh(); await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer.getDataViewsTab().then((tab) => tab.click()); + await PageObjects.observabilityLogExplorer + .getDataViewsTab() + .then((tab: WebElementWrapper) => tab.click()); }); it('should display a list of available data views', async () => { await retry.try(async () => { const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer .getDataViewsContextMenu() - .then((menu) => + .then((menu: WebElementWrapper) => Promise.all([ PageObjects.observabilityLogExplorer.getPanelTitle(menu), PageObjects.observabilityLogExplorer.getPanelEntries(menu), @@ -614,7 +657,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const panelTitleNode = await PageObjects.observabilityLogExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); expect( await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( @@ -628,7 +673,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[2]); expect(await menuEntries[1].getVisibleText()).to.be(sortedExpectedDataViews[1]); @@ -640,7 +687,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[0]); expect(await menuEntries[1].getVisibleText()).to.be(sortedExpectedDataViews[1]); @@ -652,7 +701,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const panelTitleNode = await PageObjects.observabilityLogExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); expect( await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( @@ -664,7 +715,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[0].getVisibleText()).to.be(expectedDataViews[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedDataViews[1]); @@ -676,7 +729,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(menuEntries.length).to.be(2); expect(await menuEntries[0].getVisibleText()).to.be('logs-*'); @@ -688,7 +743,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const panelTitleNode = await PageObjects.observabilityLogExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); expect( await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( @@ -700,7 +757,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(await menuEntries[2].getVisibleText()).to.be(expectedDataViews[2]); menuEntries[2].click(); @@ -733,7 +792,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => + .then((menu: WebElementWrapper) => Promise.all([ PageObjects.observabilityLogExplorer.getPanelTitle(menu), PageObjects.observabilityLogExplorer.getPanelEntries(menu), @@ -751,7 +810,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => + .then((menu: WebElementWrapper) => Promise.all([ PageObjects.observabilityLogExplorer.getPanelTitle(menu), PageObjects.observabilityLogExplorer.getPanelEntries(menu), @@ -803,7 +862,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => + .then((menu: WebElementWrapper) => Promise.all([ PageObjects.observabilityLogExplorer.getPanelTitle(menu), PageObjects.observabilityLogExplorer.getPanelEntries(menu), @@ -820,7 +879,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('error'); @@ -829,7 +890,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Navigate back to integrations const panelTitleNode = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelTitle(menu) + ); panelTitleNode.click(); await retry.try(async () => { @@ -846,7 +909,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const menuEntries = await PageObjects.observabilityLogExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu: WebElementWrapper) => + PageObjects.observabilityLogExplorer.getPanelEntries(menu) + ); const searchValue = await PageObjects.observabilityLogExplorer.getSearchFieldValue(); expect(searchValue).to.eql('err'); diff --git a/x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts b/x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts index db04f6251d9bc..36087a23e8c4c 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from './config'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); diff --git a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts index eb3c94b62403b..f87edc5fc23a5 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts @@ -5,7 +5,7 @@ * 2.0. */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from './config'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); diff --git a/x-pack/test/functional/apps/observability_log_explorer/index.ts b/x-pack/test/functional/apps/observability_log_explorer/index.ts index 7a767baa887de..c1114211b41a9 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/index.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from './config'; export default function ({ loadTestFile }: FtrProviderContext) { describe('Observability Log Explorer', function () { diff --git a/x-pack/test/functional/es_archives/rule_keyword_family/const_keyword/mappings.json b/x-pack/test/functional/es_archives/rule_keyword_family/const_keyword/mappings.json index 7e3d74f840142..8622a0f62cd5a 100644 --- a/x-pack/test/functional/es_archives/rule_keyword_family/const_keyword/mappings.json +++ b/x-pack/test/functional/es_archives/rule_keyword_family/const_keyword/mappings.json @@ -39,7 +39,6 @@ }, "settings": { "index": { - "refresh_interval": "1s", "number_of_replicas": "1", "number_of_shards": "1" } diff --git a/x-pack/test/functional/es_archives/rule_keyword_family/keyword/mappings.json b/x-pack/test/functional/es_archives/rule_keyword_family/keyword/mappings.json index 9d5274a002279..233b1148f04b4 100644 --- a/x-pack/test/functional/es_archives/rule_keyword_family/keyword/mappings.json +++ b/x-pack/test/functional/es_archives/rule_keyword_family/keyword/mappings.json @@ -25,7 +25,6 @@ }, "settings": { "index": { - "refresh_interval": "1s", "number_of_replicas": "1", "number_of_shards": "1" } diff --git a/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0/data.json b/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0/data.json new file mode 100644 index 0000000000000..dc677dd5bf812 --- /dev/null +++ b/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0/data.json @@ -0,0 +1,422 @@ +{ + "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 + } + } + } +} diff --git a/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0/mappings.json b/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0/mappings.json new file mode 100644 index 0000000000000..f5a6e53cc4d60 --- /dev/null +++ b/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0/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/es_archives/security_solution/ignore_fields/mappings.json b/x-pack/test/functional/es_archives/security_solution/ignore_fields/mappings.json index e2c8ca3c2bc89..3c2cbeac06cca 100644 --- a/x-pack/test/functional/es_archives/security_solution/ignore_fields/mappings.json +++ b/x-pack/test/functional/es_archives/security_solution/ignore_fields/mappings.json @@ -32,7 +32,6 @@ }, "settings": { "index": { - "refresh_interval": "1s", "number_of_replicas": "1", "number_of_shards": "1" } diff --git a/x-pack/test/functional/es_archives/security_solution/runtime/mappings.json b/x-pack/test/functional/es_archives/security_solution/runtime/mappings.json index fd3f30f2a2129..e0adb6cb55742 100644 --- a/x-pack/test/functional/es_archives/security_solution/runtime/mappings.json +++ b/x-pack/test/functional/es_archives/security_solution/runtime/mappings.json @@ -7027,7 +7027,6 @@ }, "settings": { "index": { - "refresh_interval": "1s", "number_of_replicas": "1", "number_of_shards": "1", "mapping": { diff --git a/x-pack/test/functional/es_archives/security_solution/runtime_conflicting_fields/mappings.json b/x-pack/test/functional/es_archives/security_solution/runtime_conflicting_fields/mappings.json index 2e34eae159a7f..ed15855be8e31 100644 --- a/x-pack/test/functional/es_archives/security_solution/runtime_conflicting_fields/mappings.json +++ b/x-pack/test/functional/es_archives/security_solution/runtime_conflicting_fields/mappings.json @@ -108,7 +108,6 @@ }, "settings": { "index": { - "refresh_interval": "1s", "number_of_replicas": "1", "number_of_shards": "1" } diff --git a/x-pack/test/functional/es_archives/security_solution/timestamp_in_seconds/mappings.json b/x-pack/test/functional/es_archives/security_solution/timestamp_in_seconds/mappings.json index fd8880fe0bc49..056d6467f510f 100644 --- a/x-pack/test/functional/es_archives/security_solution/timestamp_in_seconds/mappings.json +++ b/x-pack/test/functional/es_archives/security_solution/timestamp_in_seconds/mappings.json @@ -13,7 +13,6 @@ }, "settings": { "index": { - "refresh_interval": "1s", "number_of_replicas": "1", "number_of_shards": "1" } diff --git a/x-pack/test/functional/es_archives/security_solution/timestamp_override_5/mappings.json b/x-pack/test/functional/es_archives/security_solution/timestamp_override_5/mappings.json index a9735aaeca8ef..fd6f02966837c 100644 --- a/x-pack/test/functional/es_archives/security_solution/timestamp_override_5/mappings.json +++ b/x-pack/test/functional/es_archives/security_solution/timestamp_override_5/mappings.json @@ -30,7 +30,6 @@ }, "settings": { "index": { - "refresh_interval": "1s", "number_of_replicas": "1", "number_of_shards": "1" } diff --git a/x-pack/test/functional/es_archives/security_solution/timestamp_override_6/mappings.json b/x-pack/test/functional/es_archives/security_solution/timestamp_override_6/mappings.json index e3d8afd7a5b33..b1b35d6e1a23b 100644 --- a/x-pack/test/functional/es_archives/security_solution/timestamp_override_6/mappings.json +++ b/x-pack/test/functional/es_archives/security_solution/timestamp_override_6/mappings.json @@ -20,7 +20,6 @@ }, "settings": { "index": { - "refresh_interval": "1s", "number_of_replicas": "1", "number_of_shards": "1" } diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 45b451721b2cd..927e8710017ee 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -1377,13 +1377,16 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont * * @param title - title for the new lens. If left undefined, the panel will be created by value * @param redirectToOrigin - whether to redirect back to the dashboard after saving the panel + * @param ignoreTimeFilter - whether time range has to be changed */ async createAndAddLensFromDashboard({ title, redirectToOrigin, + ignoreTimeFilter, }: { title?: string; redirectToOrigin?: boolean; + ignoreTimeFilter?: boolean; }) { log.debug(`createAndAddLens${title}`); const inViewMode = await PageObjects.dashboard.getIsInViewMode(); @@ -1391,7 +1394,11 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont await PageObjects.dashboard.switchToEditMode(); } await dashboardAddPanel.clickCreateNewLink(); - await this.goToTimeRange(); + + if (!ignoreTimeFilter) { + await this.goToTimeRange(); + } + await this.configureDimension({ dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', operation: 'average', diff --git a/x-pack/test/functional/services/cases/list.ts b/x-pack/test/functional/services/cases/list.ts index a83b11da78b78..ef3e61acf5213 100644 --- a/x-pack/test/functional/services/cases/list.ts +++ b/x-pack/test/functional/services/cases/list.ts @@ -19,6 +19,7 @@ export function CasesTableServiceProvider( const testSubjects = getService('testSubjects'); const find = getService('find'); const header = getPageObject('header'); + const browser = getService('browser'); const retry = getService('retry'); const config = getService('config'); @@ -392,5 +393,31 @@ export function CasesTableServiceProvider( return await titleElement.getVisibleText(); }, + + async hasColumn(columnName: string) { + const column = await find.allByCssSelector( + `th.euiTableHeaderCell span[title="${columnName}"]` + ); + return column.length !== 0; + }, + + async openColumnsPopover() { + await testSubjects.click('column-selection-popover-button'); + await testSubjects.existOrFail('column-selection-popover-drag-drop-context'); + }, + + async closeColumnsPopover() { + await testSubjects.click('column-selection-popover-button'); + }, + + async toggleColumnInPopover(columnId: string) { + await this.openColumnsPopover(); + + await testSubjects.existOrFail(`column-selection-switch-${columnId}`); + await testSubjects.click(`column-selection-switch-${columnId}`); + + // closes the popover + await browser.pressKeys(browser.keys.ESCAPE); + }, }; } 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_with_es_ssl/apps/cases/group2/list_view.ts b/x-pack/test/functional_with_es_ssl/apps/cases/group2/list_view.ts index 51a37c1eaccd9..c1d2b2a9d7c0c 100644 --- a/x-pack/test/functional_with_es_ssl/apps/cases/group2/list_view.ts +++ b/x-pack/test/functional_with_es_ssl/apps/cases/group2/list_view.ts @@ -656,5 +656,81 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { }); }); }); + + describe('Column Selection', () => { + afterEach(async () => { + await toasts.dismissAllToastsWithChecks(); + }); + + before(async () => { + await cases.api.createNthRandomCases(1); + await header.waitUntilLoadingHasFinished(); + await cases.casesTable.waitForCasesToBeListed(); + }); + + after(async () => { + await cases.api.deleteAllCases(); + await cases.casesTable.waitForCasesToBeDeleted(); + await browser.clearLocalStorage(); + }); + + it('column selection popover button exists', async () => { + await testSubjects.existOrFail('column-selection-popover-button'); + }); + + it('selecting a column works correctly', async () => { + expect(await cases.casesTable.hasColumn('Closed on')).to.be(false); + + await cases.casesTable.toggleColumnInPopover('closedAt'); + + expect(await cases.casesTable.hasColumn('Closed on')).to.be(true); + }); + + it('deselecting columns works correctly', async () => { + expect(await cases.casesTable.hasColumn('Name')).to.be(true); + + await cases.casesTable.toggleColumnInPopover('title'); + + expect(await cases.casesTable.hasColumn('Name')).to.be(false); + }); + + it('"Hide All" columns works correctly', async () => { + await cases.casesTable.openColumnsPopover(); + + await testSubjects.click('column-selection-popover-hide-all-button'); + + await cases.casesTable.closeColumnsPopover(); + + expect(await cases.casesTable.hasColumn('Name')).to.be(false); + expect(await cases.casesTable.hasColumn('Assignees')).to.be(false); + expect(await cases.casesTable.hasColumn('Tags')).to.be(false); + expect(await cases.casesTable.hasColumn('Category')).to.be(false); + }); + + it('"Show All" columns works correctly', async () => { + await cases.casesTable.openColumnsPopover(); + + await testSubjects.click('column-selection-popover-show-all-button'); + + await cases.casesTable.closeColumnsPopover(); + + expect(await cases.casesTable.hasColumn('Name')).to.be(true); + expect(await cases.casesTable.hasColumn('Assignees')).to.be(true); + expect(await cases.casesTable.hasColumn('Tags')).to.be(true); + expect(await cases.casesTable.hasColumn('Category')).to.be(true); + expect(await cases.casesTable.hasColumn('Closed on')).to.be(true); + }); + + it('search and toggle column works correctly', async () => { + await cases.casesTable.openColumnsPopover(); + + const input = await testSubjects.find('column-selection-popover-search'); + await input.type('name'); + + await testSubjects.existOrFail('column-selection-switch-title'); + await testSubjects.missingOrFail('column-selection-switch-closedAt'); + await testSubjects.missingOrFail('column-selection-switch-category'); + }); + }); }); }; 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/security_solution_api_integration/config/serverless/config.base.ts b/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts index 6238282722cfc..374538e593efa 100644 --- a/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts +++ b/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts @@ -11,15 +11,18 @@ export interface CreateTestConfigOptions { 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: [ diff --git a/x-pack/test/security_solution_api_integration/es_archive/serverless/filebeat/threat_intel/data.json b/x-pack/test/security_solution_api_integration/es_archive/serverless/filebeat/threat_intel/data.json new file mode 100644 index 0000000000000..80ccf200301c7 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/es_archive/serverless/filebeat/threat_intel/data.json @@ -0,0 +1,418 @@ +{ + "type": "doc", + "value": { + "id": "978783", + "index": "filebeat-8.0.0-2021.01.26-000001", + "source": { + "@timestamp": "2021-01-26T11:09:05.529Z", + "agent": { + "ephemeral_id": "b7b56c3e-1f27-4c69-96f4-aa9ca47888d0", + "id": "69acb5f0-1e79-4cfe-a4dc-e0dbf229ff51", + "name": "MacBook-Pro-de-Gloria.local", + "type": "filebeat", + "version": "8.0.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "category": "threat", + "created": "2021-01-26T11:09:05.529Z", + "dataset": "ti_abusech.malware", + "ingested": "2021-01-26T11:09:06.595350Z", + "kind": "enrichment", + "module": "threatintel", + "reference": "https://urlhaus.abuse.ch/url/978783/", + "type": "indicator" + }, + "fileset": { + "name": "abuseurl" + }, + "input": { + "type": "httpjson" + }, + "service": { + "type": "threatintel" + }, + "tags": [ + "threatintel-abuseurls", + "forwarded" + ], + "threat": { + "indicator": { + "description": "domain should match the auditbeat hosts' data's source.ip", + "domain": "159.89.119.67", + "first_seen": "2021-01-26T11:09:04.000Z", + "provider": "geenensp", + "type": "url", + "url": { + "full": "http://159.89.119.67:59600/bin.sh", + "scheme": "http" + } + } + }, + "threatintel": { + "abuseurl": { + "blacklists": { + "spamhaus_dbl": "not listed", + "surbl": "not listed" + }, + "larted": false, + "tags": null, + "threat": "malware_download", + "url_status": "online" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "978784", + "index": "filebeat-8.0.0-2021.01.26-000001", + "source": { + "@timestamp": "2021-01-26T11:09:05.529Z", + "agent": { + "ephemeral_id": "b7b56c3e-1f27-4c69-96f4-aa9ca47888d0", + "id": "69acb5f0-1e79-4cfe-a4dc-e0dbf229ff51", + "name": "MacBook-Pro-de-Gloria.local", + "type": "filebeat", + "version": "8.0.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "category": "threat", + "created": "2021-01-26T11:09:05.529Z", + "dataset": "ti_abusech.malware", + "ingested": "2021-01-26T11:09:06.616763Z", + "kind": "enrichment", + "module": "threatintel", + "reference": "https://urlhaus.abuse.ch/url/978782/", + "type": "indicator" + }, + "fileset": { + "name": "abuseurl" + }, + "input": { + "type": "httpjson" + }, + "service": { + "type": "threatintel" + }, + "tags": [ + "threatintel-abuseurls", + "forwarded" + ], + "threat": { + "indicator": { + "description": "this should not match the auditbeat hosts data", + "ip": "125.46.136.106", + "first_seen": "2021-01-26T11:06:03.000Z", + "provider": "geenensp", + "type": "ip" + } + }, + "threatintel": { + "abuseurl": { + "blacklists": { + "spamhaus_dbl": "not listed", + "surbl": "not listed" + }, + "larted": true, + "tags": [ + "32-bit", + "elf", + "mips" + ], + "threat": "malware_download", + "url_status": "online" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "978785", + "index": "filebeat-8.0.0-2021.01.26-000001", + "source": { + "@timestamp": "2021-01-26T11:09:05.529Z", + "agent": { + "ephemeral_id": "b7b56c3e-1f27-4c69-96f4-aa9ca47888d0", + "id": "69acb5f0-1e79-4cfe-a4dc-e0dbf229ff51", + "name": "MacBook-Pro-de-Gloria.local", + "type": "filebeat", + "version": "8.0.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "category": "threat", + "created": "2021-01-26T11:09:05.529Z", + "dataset": "ti_abusech.malware", + "ingested": "2021-01-26T11:09:06.616763Z", + "kind": "enrichment", + "module": "threatintel", + "reference": "https://urlhaus.abuse.ch/url/978782/", + "type": "indicator" + }, + "fileset": { + "name": "abuseurl" + }, + "input": { + "type": "httpjson" + }, + "service": { + "type": "threatintel" + }, + "tags": [ + "threatintel-abuseurls", + "forwarded" + ], + "threat": { + "indicator": { + "description": "this should match auditbeat/hosts on both port and ip", + "ip": "45.115.45.3", + "port": 57324, + "first_seen": "2021-01-26T11:06:03.000Z", + "provider": "geenensp", + "type": "url" + } + }, + "threatintel": { + "abuseurl": { + "blacklists": { + "spamhaus_dbl": "not listed", + "surbl": "not listed" + }, + "larted": true, + "tags": [ + "32-bit", + "elf", + "mips" + ], + "threat": "malware_download", + "url_status": "online" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "978787", + "index": "filebeat-8.0.0-2021.01.26-000001", + "source": { + "@timestamp": "2021-01-26T11:09:05.529Z", + "agent": { + "ephemeral_id": "b7b56c3e-1f27-4c69-96f4-aa9ca47888d0", + "id": "69acb5f0-1e79-4cfe-a4dc-e0dbf229ff51", + "name": "MacBook-Pro-de-Gloria.local", + "type": "filebeat", + "version": "8.0.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "category": "threat", + "created": "2021-01-26T11:09:05.529Z", + "dataset": "ti_abusech.malware", + "ingested": "2021-01-26T11:09:06.616763Z", + "kind": "enrichment", + "module": "threatintel", + "reference": "https://urlhaus.abuse.ch/url/978782/", + "type": "indicator" + }, + "fileset": { + "name": "abuseurl" + }, + "input": { + "type": "httpjson" + }, + "service": { + "type": "threatintel" + }, + "tags": [ + "threatintel-abuseurls", + "forwarded" + ], + "threat": { + "indicator": { + "description": "this should match auditbeat/hosts on ip", + "ip": "45.115.45.3", + "first_seen": "2021-01-26T11:06:03.000Z", + "provider": "other_provider", + "type": "ip" + } + }, + "threatintel": { + "abuseurl": { + "blacklists": { + "spamhaus_dbl": "not listed", + "surbl": "not listed" + }, + "larted": true, + "tags": [ + "32-bit", + "elf", + "mips" + ], + "threat": "malware_download", + "url_status": "online" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "978766", + "index": "filebeat-8.0.0-2021.01.26-000001", + "source": { + "@timestamp": "2021-01-26T11:09:05.529Z", + "agent": { + "ephemeral_id": "b7b56c3e-1f27-4c69-96f4-aa9ca47888d0", + "id": "69acb5f0-1e79-4cfe-a4dc-e0dbf229ff51", + "name": "MacBook-Pro-de-Gloria.local", + "type": "filebeat", + "version": "8.0.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "category": "threat", + "created": "2021-01-26T11:09:05.529Z", + "dataset": "ti_abusech.malware", + "ingested": "2021-01-26T11:09:06.595350Z", + "kind": "enrichment", + "module": "threatintel", + "reference": "https://urlhaus.abuse.ch/url/978783/", + "type": "indicator" + }, + "fileset": { + "name": "abuseurl" + }, + "input": { + "type": "httpjson" + }, + "service": { + "type": "threatintel" + }, + "tags": [ + "threatintel-abuseurls", + "forwarded" + ], + "threat": { + "indicator": { + "description": "domain should match the auditbeat hosts' data's source.ip", + "domain": "172.16.0.0", + "ip": "8.8.8.8", + "port": 777, + "first_seen": "2021-01-26T11:09:04.000Z", + "provider": "geenensp", + "type": "url", + "url": { + "full": "http://159.89.119.67:59600/bin.sh", + "scheme": "http" + } + } + }, + "threatintel": { + "abuseurl": { + "blacklists": { + "spamhaus_dbl": "not listed", + "surbl": "not listed" + }, + "larted": false, + "tags": null, + "threat": "malware_download", + "url_status": "online" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "978767", + "index": "filebeat-8.0.0-2021.01.26-000001", + "source": { + "@timestamp": "2021-01-26T11:09:05.529Z", + "agent": { + "ephemeral_id": "b7b56c3e-1f27-4c69-96f4-aa9ca47888d0", + "id": "69acb5f0-1e79-4cfe-a4dc-e0dbf229ff51", + "name": "MacBook-Pro-de-Gloria.local", + "type": "filebeat", + "version": "8.0.0" + }, + "ecs": { + "version": "1.6.0" + }, + "event": { + "category": "threat", + "created": "2021-01-26T11:09:05.529Z", + "dataset": "ti_abusech.malware", + "ingested": "2021-01-26T11:09:06.595350Z", + "kind": "enrichment", + "module": "threatintel", + "reference": "https://urlhaus.abuse.ch/url/978783/", + "type": "indicator" + }, + "fileset": { + "name": "abuseurl" + }, + "input": { + "type": "httpjson" + }, + "service": { + "type": "threatintel" + }, + "tags": [ + "threatintel-abuseurls", + "forwarded" + ], + "threat": { + "indicator": { + "description": "domain should match the auditbeat hosts' data's source.ip", + "domain": "172.16.0.0", + "ip": "9.9.9.9", + "port": 123, + "first_seen": "2021-01-26T11:09:04.000Z", + "provider": "geenensp", + "type": "url", + "url": { + "full": "http://159.89.119.67:59600/bin.sh", + "scheme": "http" + } + } + }, + "threatintel": { + "abuseurl": { + "blacklists": { + "spamhaus_dbl": "not listed", + "surbl": "not listed" + }, + "larted": false, + "tags": null, + "threat": "malware_download", + "url_status": "online" + } + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/security_solution_api_integration/es_archive/serverless/filebeat/threat_intel/mappings.json b/x-pack/test/security_solution_api_integration/es_archive/serverless/filebeat/threat_intel/mappings.json new file mode 100644 index 0000000000000..eda2430daef92 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/es_archive/serverless/filebeat/threat_intel/mappings.json @@ -0,0 +1,240 @@ +{ + "type": "index", + "value": { + "aliases": {}, + "index": "filebeat-8.0.0-2021.01.26-000001", + "mappings": { + "_meta": { + "beat": "filebeat", + "version": "7.0.0" + }, + "properties": { + "@timestamp": { + "type": "date" + }, + "@version": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat": { + "properties": { + "framework": { + "ignore_above": 1024, + "type": "keyword" + }, + "indicator": { + "properties": { + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "confidence": { + "ignore_above": 1024, + "type": "keyword" + }, + "dataset": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "type": "wildcard" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "first_seen": { + "type": "date" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "last_seen": { + "type": "date" + }, + "marking": { + "properties": { + "tlp": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "matched": { + "properties": { + "atomic": { + "ignore_above": 1024, + "type": "keyword" + }, + "field": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "scanner_stats": { + "type": "long" + }, + "sightings": { + "type": "long" + }, + "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": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "subtechnique": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "mapping": { + "total_fields": { + "limit": "10000" + } + }, + "number_of_replicas": "0", + "number_of_shards": "1", + "refresh_interval": "5s" + } + } + } +} diff --git a/x-pack/test/security_solution_api_integration/package.json b/x-pack/test/security_solution_api_integration/package.json index 5f9dc14546a9e..50dc47f95b1b3 100644 --- a/x-pack/test/security_solution_api_integration/package.json +++ b/x-pack/test/security_solution_api_integration/package.json @@ -83,6 +83,21 @@ "prebuilt_rules_update_prebuilt_rules_package:runner:serverless": "npm run run-tests:dr:default prebuilt_rules/update_prebuilt_rules_package serverless serverlessEnv", "prebuilt_rules_update_prebuilt_rules_package:qa:serverless": "npm run run-tests:dr:default prebuilt_rules/update_prebuilt_rules_package serverless qaEnv", "prebuilt_rules_update_prebuilt_rules_package:server:ess": "npm run initialize-server:dr:default prebuilt_rules/update_prebuilt_rules_package ess", - "prebuilt_rules_update_prebuilt_rules_package:runner:ess": "npm run run-tests:dr:default prebuilt_rules/update_prebuilt_rules_package ess essEnvs" + "prebuilt_rules_update_prebuilt_rules_package:runner:ess": "npm run run-tests:dr:default prebuilt_rules/update_prebuilt_rules_package ess essEnvs", + "rule_execution_logic:server:serverless": "npm run initialize-server:dr:default rule_execution_logic serverless", + "rule_execution_logic:runner:serverless": "npm run run-tests:dr:default rule_execution_logic serverless serverlessEnv", + "rule_execution_logic:qa:serverless": "npm run run-tests:dr:default rule_execution_logic serverless qaEnv", + "rule_execution_logic:server:ess": "npm run initialize-server:dr:default rule_execution_logic ess", + "rule_execution_logic:runner:ess": "npm run run-tests:dr:default rule_execution_logic ess essEnv", + "user_roles:server:serverless": "npm run initialize-server:dr:default user_roles serverless", + "user_roles:runner:serverless": "npm run run-tests:dr:default user_roles serverless serverlessEnv", + "user_roles:qa:serverless": "npm run run-tests:dr:default user_roles serverless qaEnv", + "user_roles:server:ess": "npm run initialize-server:dr:default user_roles ess", + "user_roles:runner:ess": "npm run run-tests:dr:default user_roles ess essEnv", + "telemetry:server:serverless": "npm run initialize-server:dr:default telemetry serverless", + "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" } } diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/add_actions.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/add_actions.ts index 8046eb89e0a28..1e4b1692cf9fc 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/add_actions.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/add_actions.ts @@ -6,7 +6,7 @@ */ 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 { deleteAllRules, @@ -55,7 +55,7 @@ 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( getCustomQueryRuleParams({ actions: [ruleAction], @@ -74,7 +74,7 @@ export default ({ getService }: FtrProviderContext) => { } = 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( getCustomQueryRuleParams({ index: ['logs-test'], @@ -108,7 +108,7 @@ export default ({ getService }: FtrProviderContext) => { } = 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( getCustomQueryRuleParams({ index: ['logs-test'], diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/check_privileges.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/check_privileges.ts similarity index 89% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group1/check_privileges.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/check_privileges.ts index 3a016fe68618d..cbcd75074b57c 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/check_privileges.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/check_privileges.ts @@ -9,19 +9,22 @@ import expect from '@kbn/expect'; import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; import { ROLES } from '@kbn/security-solution-plugin/common/test'; import { ThresholdRuleCreateProps } from '@kbn/security-solution-plugin/common/api/detection_engine'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; + import { - createSignalsIndex, + createAlertsIndex, deleteAllRules, waitForRulePartialFailure, - getRuleForSignalTesting, + getRuleForAlertTesting, createRuleWithAuth, - getThresholdRuleForSignalTesting, + getThresholdRuleForAlertTesting, deleteAllAlerts, } from '../../utils'; -import { createUserAndRole, deleteUserAndRole } from '../../../common/services/security_solution'; +import { + createUserAndRole, + deleteUserAndRole, +} from '../../../../../common/services/security_solution'; -// eslint-disable-next-line import/no-default-export +import { FtrProviderContext } from '../../../../ftr_provider_context'; export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); @@ -29,11 +32,11 @@ export default ({ getService }: FtrProviderContext) => { const log = getService('log'); const es = getService('es'); - describe('check_privileges', () => { + describe('@ess @serverless @brokenInServerless check_privileges', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); await esArchiver.load('x-pack/test/functional/es_archives/security_solution/alias'); - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); after(async () => { @@ -60,7 +63,7 @@ export default ({ getService }: FtrProviderContext) => { indexTestCases.forEach((index) => { it(`for KQL rule with index param: ${index}`, async () => { const rule = { - ...getRuleForSignalTesting(index), + ...getRuleForAlertTesting(index), query: 'process.executable: "/usr/bin/sudo"', }; await createUserAndRole(getService, ROLES.detections_admin); @@ -96,7 +99,7 @@ export default ({ getService }: FtrProviderContext) => { thresholdIndexTestCases.forEach((index) => { it(`for threshold rule with index param: ${index}`, async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(index), + ...getThresholdRuleForAlertTesting(index), threshold: { field: [], value: 700, diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/index.ts index 5c26d445eb158..4eb7f7eac6978 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/index.ts @@ -11,5 +11,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./add_actions')); loadTestFile(require.resolve('./update_actions')); loadTestFile(require.resolve('./migrations')); + loadTestFile(require.resolve('./throttle')); + loadTestFile(require.resolve('./check_privileges')); }); } diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/throttle.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/throttle.ts similarity index 78% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group10/throttle.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/throttle.ts index 34984d4ea0dc8..ee5d81b9f29fb 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/throttle.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions/throttle.ts @@ -13,20 +13,24 @@ import { NOTIFICATION_THROTTLE_NO_ACTIONS, NOTIFICATION_THROTTLE_RULE, } from '@kbn/security-solution-plugin/common/constants'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; import { - createSignalsIndex, + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; +import { + createAlertsIndex, deleteAllRules, deleteAllAlerts, getWebHookAction, getRuleWithWebHookAction, createRule, getSimpleRule, - getRule, + fetchRule, updateRule, } from '../../utils'; -// eslint-disable-next-line import/no-default-export +import { FtrProviderContext } from '../../../../ftr_provider_context'; + export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const log = getService('log'); @@ -45,10 +49,10 @@ export default ({ getService }: FtrProviderContext) => { * https://www.elastic.co/guide/en/kibana/current/mute-all-alerts-api.html * https://www.elastic.co/guide/en/security/current/rules-api-create.html */ - describe('throttle', () => { + describe('@ess @serverless throttle', () => { describe('adding actions', () => { beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -62,13 +66,17 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); const rule = await createRule(supertest, log, getRuleWithWebHookAction(hookAction.id)); const { body: { mute_all: muteAll, notify_when: notifyWhen, actions }, - } = await supertest.get(`/api/alerting/rule/${rule.id}`); + } = await supertest + .get(`/api/alerting/rule/${rule.id}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(muteAll).to.eql(false); expect(actions.length).to.eql(1); expect(actions[0].frequency).to.eql({ @@ -87,7 +95,9 @@ export default ({ getService }: FtrProviderContext) => { const rule = await createRule(supertest, log, ruleWithThrottle); const { body: { mute_all: muteAll, notify_when: notifyWhen }, - } = await supertest.get(`/api/alerting/rule/${rule.id}`); + } = await supertest + .get(`/api/alerting/rule/${rule.id}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(muteAll).to.eql(false); expect(notifyWhen).to.eql(null); }); @@ -97,6 +107,7 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); @@ -107,7 +118,9 @@ export default ({ getService }: FtrProviderContext) => { const rule = await createRule(supertest, log, ruleWithThrottle); const { body: { mute_all: muteAll, notify_when: notifyWhen }, - } = await supertest.get(`/api/alerting/rule/${rule.id}`); + } = await supertest + .get(`/api/alerting/rule/${rule.id}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(muteAll).to.eql(false); expect(notifyWhen).to.eql(null); }); @@ -120,7 +133,9 @@ export default ({ getService }: FtrProviderContext) => { const rule = await createRule(supertest, log, ruleWithThrottle); const { body: { mute_all: muteAll, notify_when: notifyWhen }, - } = await supertest.get(`/api/alerting/rule/${rule.id}`); + } = await supertest + .get(`/api/alerting/rule/${rule.id}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(muteAll).to.eql(false); expect(notifyWhen).to.eql(null); }); @@ -140,6 +155,8 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); @@ -150,7 +167,9 @@ export default ({ getService }: FtrProviderContext) => { const rule = await createRule(supertest, log, ruleWithThrottle); const { body: { mute_all: muteAll, notify_when: notifyWhen, actions }, - } = await supertest.get(`/api/alerting/rule/${rule.id}`); + } = await supertest + .get(`/api/alerting/rule/${rule.id}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(muteAll).to.eql(false); expect(actions.length).to.eql(1); expect(actions[0].frequency).to.eql({ @@ -169,7 +188,9 @@ export default ({ getService }: FtrProviderContext) => { const rule = await createRule(supertest, log, ruleWithThrottle); const { body: { mute_all: muteAll, notify_when: notifyWhen }, - } = await supertest.get(`/api/alerting/rule/${rule.id}`); + } = await supertest + .get(`/api/alerting/rule/${rule.id}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(muteAll).to.eql(false); expect(notifyWhen).to.eql(null); }); @@ -179,6 +200,8 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); @@ -189,7 +212,9 @@ export default ({ getService }: FtrProviderContext) => { const rule = await createRule(supertest, log, ruleWithThrottle); const { body: { mute_all: muteAll, notify_when: notifyWhen, actions }, - } = await supertest.get(`/api/alerting/rule/${rule.id}`); + } = await supertest + .get(`/api/alerting/rule/${rule.id}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(muteAll).to.eql(false); expect(actions.length).to.eql(1); expect(actions[0].frequency).to.eql({ @@ -207,11 +232,13 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); const rule = await createRule(supertest, log, getRuleWithWebHookAction(hookAction.id)); - const readRule = await getRule(supertest, log, rule.rule_id); + const readRule = await fetchRule(supertest, { ruleId: rule.rule_id }); expect(readRule.throttle).to.eql(undefined); }); @@ -221,7 +248,7 @@ export default ({ getService }: FtrProviderContext) => { throttle: NOTIFICATION_THROTTLE_NO_ACTIONS, }; const rule = await createRule(supertest, log, ruleWithThrottle); - const readRule = await getRule(supertest, log, rule.rule_id); + const readRule = await fetchRule(supertest, { ruleId: rule.rule_id }); expect(readRule.throttle).to.eql(undefined); }); @@ -232,7 +259,7 @@ export default ({ getService }: FtrProviderContext) => { throttle: NOTIFICATION_THROTTLE_RULE, }; const rule = await createRule(supertest, log, ruleWithThrottle); - const readRule = await getRule(supertest, log, rule.rule_id); + const readRule = await fetchRule(supertest, { ruleId: rule.rule_id }); expect(readRule.throttle).to.eql(undefined); }); @@ -241,6 +268,8 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); @@ -248,9 +277,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(`/api/alerting/rule/${rule.id}/_mute_all`) .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send() .expect(204); - const readRule = await getRule(supertest, log, rule.rule_id); + const readRule = await fetchRule(supertest, { ruleId: rule.rule_id }); expect(readRule.throttle).to.eql(undefined); }); }); @@ -261,13 +292,15 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); const ruleWithWebHookAction = getRuleWithWebHookAction(hookAction.id); await createRule(supertest, log, ruleWithWebHookAction); ruleWithWebHookAction.name = 'some other name'; - const updated = await updateRule(supertest, log, ruleWithWebHookAction); + const updated = await updateRule(supertest, ruleWithWebHookAction); expect(updated.throttle).to.eql(undefined); }); @@ -276,16 +309,20 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); const ruleWithWebHookAction = getRuleWithWebHookAction(hookAction.id); await createRule(supertest, log, ruleWithWebHookAction); ruleWithWebHookAction.name = 'some other name'; - const updated = await updateRule(supertest, log, ruleWithWebHookAction); + const updated = await updateRule(supertest, ruleWithWebHookAction); const { body: { mute_all: muteAll, notify_when: notifyWhen }, - } = await supertest.get(`/api/alerting/rule/${updated.id}`); + } = await supertest + .get(`/api/alerting/rule/${updated.id}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(muteAll).to.eql(false); expect(notifyWhen).to.eql(null); }); @@ -296,13 +333,15 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); const ruleWithWebHookAction = getRuleWithWebHookAction(hookAction.id); await createRule(supertest, log, ruleWithWebHookAction); ruleWithWebHookAction.actions = []; - const updated = await updateRule(supertest, log, ruleWithWebHookAction); + const updated = await updateRule(supertest, ruleWithWebHookAction); expect(updated.throttle).to.eql(undefined); }); }); @@ -313,6 +352,8 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); @@ -322,10 +363,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ rule_id: rule.rule_id, name: 'some other name' }) .expect(200); - const readRule = await getRule(supertest, log, rule.rule_id); + const readRule = await fetchRule(supertest, { ruleId: rule.rule_id }); expect(readRule.throttle).to.eql(undefined); }); @@ -334,6 +376,8 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); @@ -343,12 +387,15 @@ export default ({ getService }: FtrProviderContext) => { await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ rule_id: rule.rule_id, name: 'some other name' }) .expect(200); const { body: { mute_all: muteAll, notify_when: notifyWhen }, - } = await supertest.get(`/api/alerting/rule/${rule.id}`); + } = await supertest + .get(`/api/alerting/rule/${rule.id}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(muteAll).to.eql(false); expect(notifyWhen).to.eql(null); }); @@ -359,6 +406,8 @@ export default ({ getService }: FtrProviderContext) => { const { body: hookAction } = await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(getWebHookAction()) .expect(200); @@ -368,10 +417,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ rule_id: rule.rule_id, actions: [] }) .expect(200); - const readRule = await getRule(supertest, log, rule.rule_id); + const readRule = await fetchRule(supertest, { ruleId: rule.rule_id }); expect(readRule.throttle).to.eql(undefined); }); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/alerts/alerts_compatibility.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/alerts/alerts_compatibility.ts index 9e4a9d05771d1..7df54659da8ce 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/alerts/alerts_compatibility.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/alerts/alerts_compatibility.ts @@ -36,7 +36,7 @@ import { waitFor, waitForRuleSuccess, waitForAlertsToBePresent, - removeRandomValuedProperties, + removeRandomValuedPropertiesFromAlert, } from '../../utils'; import { FtrProviderContext } from '../../../../ftr_provider_context'; @@ -231,11 +231,11 @@ export default ({ getService }: FtrProviderContext) => { expect(signalsOpen.hits.hits.length).greaterThan(0); const hit = signalsOpen.hits.hits[0]; expect(hit._source?.kibana).to.eql(undefined); - const source = removeRandomValuedProperties(hit._source); + const source = removeRandomValuedPropertiesFromAlert(hit._source); expect(source).to.eql({ 'kibana.alert.rule.category': 'Custom Query Rule', 'kibana.alert.rule.consumer': 'siem', - 'kibana.alert.rule.name': 'Signal Testing Query', + 'kibana.alert.rule.name': 'Alert Testing Query', 'kibana.alert.rule.producer': 'siem', 'kibana.alert.rule.rule_type_id': 'siem.queryRule', 'kibana.space_ids': ['default'], @@ -322,7 +322,7 @@ export default ({ getService }: FtrProviderContext) => { 'kibana.alert.workflow_tags': [], 'kibana.alert.depth': 2, 'kibana.alert.reason': - 'event on security-linux-1 created high alert Signal Testing Query.', + 'event on security-linux-1 created high alert Alert Testing Query.', 'kibana.alert.severity': 'high', 'kibana.alert.risk_score': 1, 'kibana.alert.rule.parameters': { @@ -393,11 +393,11 @@ export default ({ getService }: FtrProviderContext) => { expect(signalsOpen.hits.hits.length).greaterThan(0); const hit = signalsOpen.hits.hits[0]; expect(hit._source?.kibana).to.eql(undefined); - const source = removeRandomValuedProperties(hit._source); + const source = removeRandomValuedPropertiesFromAlert(hit._source); expect(source).to.eql({ 'kibana.alert.rule.category': 'Custom Query Rule', 'kibana.alert.rule.consumer': 'siem', - 'kibana.alert.rule.name': 'Signal Testing Query', + 'kibana.alert.rule.name': 'Alert Testing Query', 'kibana.alert.rule.producer': 'siem', 'kibana.alert.rule.rule_type_id': 'siem.queryRule', 'kibana.space_ids': ['default'], @@ -484,7 +484,7 @@ export default ({ getService }: FtrProviderContext) => { 'kibana.alert.workflow_tags': [], 'kibana.alert.depth': 2, 'kibana.alert.reason': - 'event on security-linux-1 created high alert Signal Testing Query.', + 'event on security-linux-1 created high alert Alert Testing Query.', 'kibana.alert.severity': 'high', 'kibana.alert.risk_score': 1, 'kibana.alert.rule.parameters': { 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 bd306b0d65654..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); @@ -66,7 +67,7 @@ export default ({ getService }: FtrProviderContext): void => { expect(bundledInstallResponse._meta.install_source).toBe('bundled'); // Refresh ES indices to avoid race conditions between write and reading of indeces - // See implementation utility function at x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/install_prebuilt_rules_fleet_package.ts + // See implementation utility function at x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/install_prebuilt_rules_fleet_package.ts await es.indices.refresh({ index: ALL_SAVED_OBJECT_INDICES }); // Verify that status is updated after package installation diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/ess.config.ts similarity index 62% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/config.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/ess.config.ts index 2430b8f2148d9..bbf6c6c0e3f7b 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/ess.config.ts @@ -7,12 +7,16 @@ import { FtrConfigProviderContext } from '@kbn/test'; -// eslint-disable-next-line import/no-default-export export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const functionalConfig = await readConfigFile(require.resolve('../config.base.ts')); + const functionalConfig = await readConfigFile( + require.resolve('../../../../../config/ess/config.base.trial') + ); return { ...functionalConfig.getAll(), - testFiles: [require.resolve('.')], + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine API Integration Tests - ESS - Rule Execution Logic', + }, }; } diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/serverless.config.ts new file mode 100644 index 0000000000000..7bcb663699d68 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/configs/serverless.config.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 { createTestConfig } from '../../../../../config/serverless/config.base'; + +export default createTestConfig({ + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine API Integration Tests - Serverless - Rule Execution Logic', + }, + kbnTestServerArgs: [ + `--xpack.securitySolution.alertIgnoreFields=${JSON.stringify([ + 'testing_ignored.constant', + '/testing_regex*/', + ])}`, // See tests within the file "ignore_fields.ts" which use these values in "alertIgnoreFields" + ], +}); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/README.md b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/README.md similarity index 100% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/README.md rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/README.md diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/eql.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/eql.ts similarity index 79% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/eql.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/eql.ts index b0469c90d8e4d..9cb85e3366cee 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/eql.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/eql.ts @@ -27,35 +27,40 @@ import { ALERT_ORIGINAL_EVENT_CATEGORY, ALERT_GROUP_ID, } from '@kbn/security-solution-plugin/common/field_maps/field_names'; -import { getMaxSignalsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; +import { getMaxSignalsWarning as getMaxAlertsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; import { createRule, deleteAllRules, deleteAllAlerts, - getEqlRuleForSignalTesting, - getOpenSignals, + getEqlRuleForAlertTesting, + getOpenAlerts, getPreviewAlerts, previewRule, -} from '../../utils'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +} 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 es = getService('es'); const log = getService('log'); + // TODO: add a new service + const config = getService('config'); + const isServerless = config.get('serverless'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const auditPath = dataPathBuilder.getPath('auditbeat/hosts'); - describe('EQL type rules', () => { + describe('@ess @serverless EQL type rules', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.load(auditPath); await esArchiver.load( 'x-pack/test/functional/es_archives/security_solution/timestamp_override_6' ); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.unload(auditPath); await esArchiver.unload( 'x-pack/test/functional/es_archives/security_solution/timestamp_override_6' ); @@ -64,21 +69,21 @@ export default ({ getService }: FtrProviderContext) => { }); // First test creates a real rule - remaining tests use preview API - it('generates a correctly formatted signal from EQL non-sequence queries', async () => { + it('generates a correctly formatted alert from EQL non-sequence queries', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*']), + ...getEqlRuleForAlertTesting(['auditbeat-*']), query: 'configuration where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', }; const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals(supertest, log, es, createdRule); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); expect(alerts.hits.hits.length).eql(1); - const fullSignal = alerts.hits.hits[0]._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = alerts.hits.hits[0]._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - expect(fullSignal).eql({ - ...fullSignal, + expect(fullAlert).eql({ + ...fullAlert, agent: { ephemeral_id: '0010d67a-14f7-41da-be30-489fea735967', hostname: 'suricata-zeek-sensor-toronto', @@ -145,9 +150,9 @@ export default ({ getService }: FtrProviderContext) => { }, }, [ALERT_REASON]: - 'configuration event on suricata-zeek-sensor-toronto created high alert Signal Testing Query.', - [ALERT_RULE_UUID]: fullSignal[ALERT_RULE_UUID], - [ALERT_ORIGINAL_TIME]: fullSignal[ALERT_ORIGINAL_TIME], + 'configuration event on suricata-zeek-sensor-toronto created high alert Alert Testing Query.', + [ALERT_RULE_UUID]: fullAlert[ALERT_RULE_UUID], + [ALERT_ORIGINAL_TIME]: fullAlert[ALERT_ORIGINAL_TIME], [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_WORKFLOW_TAGS]: [], [ALERT_DEPTH]: 1, @@ -167,41 +172,41 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('generates up to max_signals for non-sequence EQL queries', async () => { - const maxSignals = 200; + it('generates up to max_alerts for non-sequence EQL queries', async () => { + const maxAlerts = 200; const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*']), - max_signals: maxSignals, + ...getEqlRuleForAlertTesting(['auditbeat-*']), + max_signals: maxAlerts, }; const { previewId } = await previewRule({ supertest, rule }); - const previewAlerts = await getPreviewAlerts({ es, previewId, size: maxSignals * 2 }); - expect(previewAlerts.length).eql(maxSignals); + const previewAlerts = await getPreviewAlerts({ es, previewId, size: maxAlerts * 2 }); + expect(previewAlerts.length).eql(maxAlerts); }); - it('generates max signals warning when circuit breaker is hit', async () => { + it('generates max alerts warning when circuit breaker is hit', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*']), + ...getEqlRuleForAlertTesting(['auditbeat-*']), }; const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).contain(getMaxSignalsWarning()); + expect(logs[0].warnings).contain(getMaxAlertsWarning()); }); it('uses the provided event_category_override', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*']), + ...getEqlRuleForAlertTesting(['auditbeat-*']), query: 'config_change where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', event_category_override: 'auditd.message_type', }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); expect(previewAlerts.length).eql(1); - const fullSignal = previewAlerts[0]._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = previewAlerts[0]._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - expect(fullSignal).eql({ - ...fullSignal, + expect(fullAlert).eql({ + ...fullAlert, auditd: { data: { audit_enabled: '1', @@ -236,9 +241,9 @@ export default ({ getService }: FtrProviderContext) => { }, }, [ALERT_REASON]: - 'configuration event on suricata-zeek-sensor-toronto created high alert Signal Testing Query.', - [ALERT_RULE_UUID]: fullSignal[ALERT_RULE_UUID], - [ALERT_ORIGINAL_TIME]: fullSignal[ALERT_ORIGINAL_TIME], + 'configuration event on suricata-zeek-sensor-toronto created high alert Alert Testing Query.', + [ALERT_RULE_UUID]: fullAlert[ALERT_RULE_UUID], + [ALERT_ORIGINAL_TIME]: fullAlert[ALERT_ORIGINAL_TIME], [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_DEPTH]: 1, [ALERT_ANCESTORS]: [ @@ -259,7 +264,7 @@ export default ({ getService }: FtrProviderContext) => { it('uses the provided timestamp_field', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['fake.index.1']), + ...getEqlRuleForAlertTesting(['fake.index.1']), query: 'any where true', timestamp_field: 'created_at', }; @@ -273,7 +278,7 @@ export default ({ getService }: FtrProviderContext) => { it('uses the provided tiebreaker_field', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['fake.index.1']), + ...getEqlRuleForAlertTesting(['fake.index.1']), query: 'any where true', tiebreaker_field: 'locale', }; @@ -285,9 +290,9 @@ export default ({ getService }: FtrProviderContext) => { expect(createdAtHits).to.eql(['es', 'pt', 'ua']); }); - it('generates building block signals from EQL sequences in the expected form', async () => { + it('generates building block alerts from EQL sequences in the expected form', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*']), + ...getEqlRuleForAlertTesting(['auditbeat-*']), query: 'sequence by host.name [anomoly where true] [any where true]', // TODO: spelling }; const { previewId } = await previewRule({ supertest, rule }); @@ -298,13 +303,13 @@ export default ({ getService }: FtrProviderContext) => { get(alert._source, ALERT_ORIGINAL_EVENT_CATEGORY) === 'anomoly' ); expect(buildingBlock).not.eql(undefined); - const fullSignal = buildingBlock?._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = buildingBlock?._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - expect(fullSignal).eql({ - ...fullSignal, + expect(fullAlert).eql({ + ...fullAlert, agent: { ephemeral_id: '1b4978a0-48be-49b1-ac96-323425b389ab', hostname: 'zeek-sensor-amsterdam', @@ -409,10 +414,10 @@ export default ({ getService }: FtrProviderContext) => { }, }, [ALERT_REASON]: - 'anomoly event with process bro, by root on zeek-sensor-amsterdam created high alert Signal Testing Query.', - [ALERT_RULE_UUID]: fullSignal[ALERT_RULE_UUID], - [ALERT_GROUP_ID]: fullSignal[ALERT_GROUP_ID], - [ALERT_ORIGINAL_TIME]: fullSignal[ALERT_ORIGINAL_TIME], + 'anomoly event with process bro, by root on zeek-sensor-amsterdam created high alert Alert Testing Query.', + [ALERT_RULE_UUID]: fullAlert[ALERT_RULE_UUID], + [ALERT_GROUP_ID]: fullAlert[ALERT_GROUP_ID], + [ALERT_ORIGINAL_TIME]: fullAlert[ALERT_ORIGINAL_TIME], [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_DEPTH]: 1, [ALERT_ANCESTORS]: [ @@ -431,9 +436,9 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('generates shell signals from EQL sequences in the expected form', async () => { + it('generates shell alerts from EQL sequences in the expected form', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*']), + ...getEqlRuleForAlertTesting(['auditbeat-*']), query: 'sequence by host.name [anomoly where true] [any where true]', }; const { previewId } = await previewRule({ supertest, rule }); @@ -480,7 +485,7 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_DEPTH]: 2, [ALERT_GROUP_ID]: source[ALERT_GROUP_ID], [ALERT_REASON]: - 'event by root on zeek-sensor-amsterdam created high alert Signal Testing Query.', + 'event by root on zeek-sensor-amsterdam created high alert Alert Testing Query.', [ALERT_RULE_UUID]: source[ALERT_RULE_UUID], [ALERT_ANCESTORS]: [ { @@ -513,28 +518,28 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('generates up to max_signals with an EQL rule', async () => { - const maxSignals = 200; + it('generates up to max_alerts with an EQL rule', async () => { + const maxAlerts = 200; const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*']), + ...getEqlRuleForAlertTesting(['auditbeat-*']), query: 'sequence by host.name [any where true] [any where true]', - max_signals: maxSignals, + max_signals: maxAlerts, }; const { previewId } = await previewRule({ supertest, rule }); - const previewAlerts = await getPreviewAlerts({ es, previewId, size: maxSignals * 5 }); - // For EQL rules, max_signals is the maximum number of detected sequences: each sequence has a building block - // alert for each event in the sequence, so max_signals=200 results in 400 building blocks in addition to + const previewAlerts = await getPreviewAlerts({ es, previewId, size: maxAlerts * 5 }); + // For EQL rules, max_alerts is the maximum number of detected sequences: each sequence has a building block + // alert for each event in the sequence, so max_alerts=200 results in 400 building blocks in addition to // 200 regular alerts - expect(previewAlerts.length).eql(maxSignals * 3); - const shellSignals = previewAlerts.filter((alert) => alert._source?.[ALERT_DEPTH] === 2); + expect(previewAlerts.length).eql(maxAlerts * 3); + const shellAlerts = previewAlerts.filter((alert) => alert._source?.[ALERT_DEPTH] === 2); const buildingBlocks = previewAlerts.filter((alert) => alert._source?.[ALERT_DEPTH] === 1); - expect(shellSignals.length).eql(maxSignals); - expect(buildingBlocks.length).eql(maxSignals * 2); + expect(shellAlerts.length).eql(maxAlerts); + expect(buildingBlocks.length).eql(maxAlerts * 2); }); - it('generates signals when an index name contains special characters to encode', async () => { + it('generates alerts when an index name contains special characters to encode', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*', '']), + ...getEqlRuleForAlertTesting(['auditbeat-*', '']), query: 'configuration where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', }; const { previewId } = await previewRule({ supertest, rule }); @@ -544,7 +549,7 @@ export default ({ getService }: FtrProviderContext) => { it('uses the provided filters', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*']), + ...getEqlRuleForAlertTesting(['auditbeat-*']), query: 'any where true', filters: [ { @@ -599,18 +604,18 @@ export default ({ getService }: FtrProviderContext) => { it('should be enriched with host risk score', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['auditbeat-*']), + ...getEqlRuleForAlertTesting(['auditbeat-*']), query: 'configuration where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); expect(previewAlerts.length).eql(1); - const fullSignal = previewAlerts[0]._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = previewAlerts[0]._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - expect(fullSignal?.host?.risk?.calculated_level).to.eql('Critical'); - expect(fullSignal?.host?.risk?.calculated_score_norm).to.eql(96); + expect(fullAlert?.host?.risk?.calculated_level).to.eql('Critical'); + expect(fullAlert?.host?.risk?.calculated_score_norm).to.eql(96); }); }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/esql.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/esql.ts similarity index 96% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/esql.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/esql.ts index 51db00fc1ed6b..e869854f0f44a 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/esql.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/esql.ts @@ -13,23 +13,22 @@ import { EsqlRuleCreateProps } from '@kbn/security-solution-plugin/common/api/de import { getCreateEsqlRulesSchemaMock } from '@kbn/security-solution-plugin/common/api/detection_engine/model/rule_schema/mocks'; import { RuleExecutionStatusEnum } from '@kbn/security-solution-plugin/common/api/detection_engine/rule_monitoring'; -import { getMaxSignalsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; +import { getMaxSignalsWarning as getMaxAlertsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; import { deleteAllRules, deleteAllAlerts, getPreviewAlerts, previewRule, createRule, - getOpenSignals as getOpenAlerts, -} from '../../utils'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { previewRuleWithExceptionEntries } from '../../utils/preview_rule_with_exception_entries'; -import { deleteAllExceptions } from '../../../lists_api_integration/utils'; -import { dataGeneratorFactory } from '../../utils/data_generator'; -import { removeRandomValuedProperties } from './utils'; -import { patchRule } from '../../utils/patch_rule'; - -// eslint-disable-next-line import/no-default-export + getOpenAlerts, + dataGeneratorFactory, + previewRuleWithExceptionEntries, + removeRandomValuedPropertiesFromAlert, + patchRule, +} from '../../../utils'; +import { deleteAllExceptions } from '../../../../../../lists_api_integration/utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; + export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); @@ -47,7 +46,7 @@ export default ({ getService }: FtrProviderContext) => { */ const internalIdPipe = (id: string) => `| where id=="${id}"`; - describe('ES|QL rule type', () => { + describe('@ess ES|QL rule type', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/security_solution/ecs_compliant'); }); @@ -84,7 +83,7 @@ export default ({ getService }: FtrProviderContext) => { const alerts = await getOpenAlerts(supertest, log, es, createdRule); expect(alerts.hits.hits.length).toBe(1); - expect(removeRandomValuedProperties(alerts.hits.hits[0]._source)).toEqual({ + expect(removeRandomValuedPropertiesFromAlert(alerts.hits.hits[0]._source)).toEqual({ 'kibana.alert.rule.parameters': { description: 'Detecting root and admin users', risk_score: 55, @@ -602,8 +601,8 @@ export default ({ getService }: FtrProviderContext) => { }); }); - describe('max signals', () => { - it('generates max signals warning when circuit breaker is exceeded', async () => { + describe('max alerts', () => { + it('generates max alerts warning when circuit breaker is exceeded', async () => { const id = uuidv4(); const rule: EsqlRuleCreateProps = { ...getCreateEsqlRulesSchemaMock('rule-1', true), @@ -629,7 +628,7 @@ export default ({ getService }: FtrProviderContext) => { timeframeEnd: new Date('2020-10-28T06:30:00.000Z'), }); - expect(logs[0].warnings).toEqual(expect.arrayContaining([getMaxSignalsWarning()])); + expect(logs[0].warnings).toEqual(expect.arrayContaining([getMaxAlertsWarning()])); const previewAlerts = await getPreviewAlerts({ es, @@ -640,7 +639,7 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts.length).toBe(100); }); - it("doesn't generate max signals warning when circuit breaker is met but not exceeded", async () => { + it("doesn't generate max alerts warning when circuit breaker is met but not exceeded", async () => { const id = uuidv4(); const rule: EsqlRuleCreateProps = { ...getCreateEsqlRulesSchemaMock('rule-1', true), @@ -665,7 +664,7 @@ export default ({ getService }: FtrProviderContext) => { rule, timeframeEnd: new Date('2020-10-28T06:30:00.000Z'), }); - expect(logs[0].warnings).not.toEqual(expect.arrayContaining([getMaxSignalsWarning()])); + expect(logs[0].warnings).not.toEqual(expect.arrayContaining([getMaxAlertsWarning()])); const previewAlerts = await getPreviewAlerts({ es, @@ -676,7 +675,7 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts.length).toBe(100); }); - it('should work for max signals > 100', async () => { + it('should work for max alerts > 100', async () => { const id = uuidv4(); const rule: EsqlRuleCreateProps = { ...getCreateEsqlRulesSchemaMock('rule-1', true), diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/index.ts similarity index 77% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/index.ts index e6cb1328c29b3..36a249304c7e6 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/index.ts @@ -5,11 +5,10 @@ * 2.0. */ -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default ({ loadTestFile }: FtrProviderContext): void => { - describe('detection engine api security and spaces enabled - rule execution logic', function () { + describe('Execution logic', function () { loadTestFile(require.resolve('./eql')); loadTestFile(require.resolve('./esql')); loadTestFile(require.resolve('./machine_learning')); @@ -18,7 +17,6 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./threat_match')); loadTestFile(require.resolve('./threshold')); loadTestFile(require.resolve('./non_ecs_fields')); - loadTestFile(require.resolve('./query')); }); }; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_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 similarity index 80% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/machine_learning.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/machine_learning.ts index 792fcb30b6645..81523755f4eea 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_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 @@ -24,33 +24,38 @@ import { ALERT_DEPTH, ALERT_ORIGINAL_TIME, } from '@kbn/security-solution-plugin/common/field_maps/field_names'; -import { getMaxSignalsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; +import { getMaxSignalsWarning as getMaxAlertsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; import { expect } from 'expect'; import { createListsIndex, deleteAllExceptions, deleteListsIndex, importFile, -} from '../../../lists_api_integration/utils'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +} from '../../../../../../lists_api_integration/utils'; import { createRule, deleteAllRules, deleteAllAlerts, executeSetupModuleRequest, forceStartDatafeeds, - getOpenSignals, + getOpenAlerts, getPreviewAlerts, previewRule, previewRuleWithExceptionEntries, -} 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 es = getService('es'); const log = getService('log'); + // TODO: add a new service + const config = getService('config'); + const isServerless = config.get('serverless'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const auditPath = dataPathBuilder.getPath('auditbeat/hosts'); const siemModule = 'security_linux_v3'; const mlJobId = 'v3_linux_anomalous_network_activity'; @@ -66,17 +71,18 @@ export default ({ getService }: FtrProviderContext) => { rule_id: 'ml-rule-id', }; - describe('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 - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.load(auditPath); await executeSetupModuleRequest({ module: siemModule, rspCode: 200, supertest }); await forceStartDatafeeds({ jobId: mlJobId, rspCode: 200, supertest }); await esArchiver.load('x-pack/test/functional/es_archives/security_solution/anomalies'); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.unload(auditPath); await esArchiver.unload('x-pack/test/functional/es_archives/security_solution/anomalies'); await deleteAllAlerts(supertest, log, es); await deleteAllRules(supertest, log); @@ -85,11 +91,11 @@ export default ({ getService }: FtrProviderContext) => { // First test creates a real rule - remaining tests use preview API it('should create 1 alert from ML rule when record meets anomaly_threshold', async () => { const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals(supertest, log, es, createdRule); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); expect(alerts.hits.hits.length).toBe(1); - const signal = alerts.hits.hits[0]; + const alert = alerts.hits.hits[0]; - expect(signal._source).toEqual( + expect(alert._source).toEqual( expect.objectContaining({ '@timestamp': expect.any(String), [ALERT_RULE_EXECUTION_UUID]: expect.any(String), @@ -160,23 +166,23 @@ export default ({ getService }: FtrProviderContext) => { ); }); - it('generates max signals warning when circuit breaker is exceeded', async () => { + it('@skipInQA generates max alerts warning when circuit breaker is exceeded', async () => { const { logs } = await previewRule({ supertest, rule: { ...rule, anomaly_threshold: 1, max_signals: 5 }, // This threshold generates 10 alerts with the current esArchive }); - expect(logs[0].warnings).toContain(getMaxSignalsWarning()); + expect(logs[0].warnings).toContain(getMaxAlertsWarning()); }); - it("doesn't generate max signals warning when circuit breaker is met, but not exceeded", async () => { + it("doesn't generate max alerts warning when circuit breaker is met, but not exceeded", async () => { const { logs } = await previewRule({ supertest, rule: { ...rule, anomaly_threshold: 1, max_signals: 10 }, }); - expect(logs[0].warnings).not.toContain(getMaxSignalsWarning()); + expect(logs[0].warnings).not.toContain(getMaxAlertsWarning()); }); - it('should create 7 alerts from ML rule when records meet anomaly_threshold', async () => { + it('@skipInQA should create 7 alerts from ML rule when records meet anomaly_threshold', async () => { const { previewId } = await previewRule({ supertest, rule: { ...rule, anomaly_threshold: 20 }, @@ -189,7 +195,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteAllExceptions(supertest, log); }); - it('generates no signals when an exception is added for an ML rule', async () => { + it('generates no alerts when an exception is added for an ML rule', async () => { const { previewId } = await previewRuleWithExceptionEntries({ supertest, log, @@ -220,7 +226,7 @@ export default ({ getService }: FtrProviderContext) => { await deleteAllExceptions(supertest, log); }); - it('generates no signals when a value list exception is added for an ML rule', async () => { + it('generates no alerts when a value list exception is added for an ML rule', async () => { const valueListId = 'value-list-id'; await importFile(supertest, log, 'keyword', ['mothra'], valueListId); const { previewId } = await previewRuleWithExceptionEntries({ @@ -255,14 +261,14 @@ export default ({ getService }: FtrProviderContext) => { await esArchiver.unload('x-pack/test/functional/es_archives/entity/risks'); }); - it('should be enriched with host risk score', async () => { + it('@skipInQA should be enriched with host risk score', async () => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); expect(previewAlerts.length).toBe(1); - const fullSignal = previewAlerts[0]._source; + const fullAlert = previewAlerts[0]._source; - expect(fullSignal?.host?.risk?.calculated_level).toBe('Low'); - expect(fullSignal?.host?.risk?.calculated_score_norm).toBe(1); + expect(fullAlert?.host?.risk?.calculated_level).toBe('Low'); + expect(fullAlert?.host?.risk?.calculated_score_norm).toBe(1); }); }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/new_terms.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/new_terms.ts similarity index 95% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/new_terms.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/new_terms.ts index 144d5e9bf51bd..0aedb19748cf4 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/new_terms.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/new_terms.ts @@ -12,26 +12,25 @@ import { NewTermsRuleCreateProps } from '@kbn/security-solution-plugin/common/ap import { orderBy } from 'lodash'; import { getCreateNewTermsRulesSchemaMock } from '@kbn/security-solution-plugin/common/api/detection_engine/model/rule_schema/mocks'; -import { getMaxSignalsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; +import { getMaxSignalsWarning as getMaxAlertsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; import { createRule, deleteAllRules, deleteAllAlerts, - getOpenSignals, + getOpenAlerts, getPreviewAlerts, previewRule, -} from '../../utils'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { previewRuleWithExceptionEntries } from '../../utils/preview_rule_with_exception_entries'; -import { deleteAllExceptions } from '../../../lists_api_integration/utils'; -import { dataGeneratorFactory } from '../../utils/data_generator'; - -import { removeRandomValuedProperties } from './utils'; + dataGeneratorFactory, + previewRuleWithExceptionEntries, + removeRandomValuedPropertiesFromAlert, +} from '../../../utils'; +import { deleteAllExceptions } from '../../../../../../lists_api_integration/utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { EsArchivePathBuilder } from '../../../../../es_archive_path_builder'; const historicalWindowStart = '2022-10-13T05:00:04.000Z'; const ruleExecutionStart = '2022-10-19T05:00:04.000Z'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); @@ -42,7 +41,12 @@ export default ({ getService }: FtrProviderContext) => { index: 'new_terms', log, }); - + // 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 path = dataPathBuilder.getPath('auditbeat/hosts'); /** * indexes 2 sets of documents: * - documents in historical window @@ -72,14 +76,14 @@ export default ({ getService }: FtrProviderContext) => { return testId; }; - describe('New terms type rules', () => { + describe('@ess @serverless New terms type rules', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.load(path); await esArchiver.load('x-pack/test/functional/es_archives/security_solution/new_terms'); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.unload(path); await esArchiver.unload('x-pack/test/functional/es_archives/security_solution/new_terms'); await deleteAllAlerts(supertest, log, es); await deleteAllRules(supertest, log); @@ -99,10 +103,10 @@ export default ({ getService }: FtrProviderContext) => { }; const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals(supertest, log, es, createdRule); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); expect(alerts.hits.hits.length).eql(1); - expect(removeRandomValuedProperties(alerts.hits.hits[0]._source)).eql({ + expect(removeRandomValuedPropertiesFromAlert(alerts.hits.hits[0]._source)).eql({ 'kibana.alert.new_terms': ['zeek-newyork-sha-aa8df15'], 'kibana.alert.rule.category': 'New Terms Rule', 'kibana.alert.rule.consumer': 'siem', @@ -196,7 +200,7 @@ export default ({ getService }: FtrProviderContext) => { }, 'kibana.alert.rule.actions': [], 'kibana.alert.rule.author': [], - 'kibana.alert.rule.created_by': 'elastic', + 'kibana.alert.rule.created_by': ELASTICSEARCH_USERNAME, 'kibana.alert.rule.description': 'Detecting root and admin users', 'kibana.alert.rule.enabled': true, 'kibana.alert.rule.exceptions_list': [], @@ -214,7 +218,7 @@ export default ({ getService }: FtrProviderContext) => { 'kibana.alert.rule.threat': [], 'kibana.alert.rule.to': 'now', 'kibana.alert.rule.type': 'new_terms', - 'kibana.alert.rule.updated_by': 'elastic', + 'kibana.alert.rule.updated_by': ELASTICSEARCH_USERNAME, 'kibana.alert.rule.version': 1, 'kibana.alert.rule.risk_score': 55, 'kibana.alert.rule.severity': 'high', @@ -229,7 +233,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('generates max signals warning when circuit breaker is exceeded', async () => { + it('generates max alerts warning when circuit breaker is exceeded', async () => { const rule: NewTermsRuleCreateProps = { ...getCreateNewTermsRulesSchemaMock('rule-1', true), new_terms_fields: ['process.pid'], @@ -239,10 +243,10 @@ export default ({ getService }: FtrProviderContext) => { }; const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).contain(getMaxSignalsWarning()); + expect(logs[0].warnings).contain(getMaxAlertsWarning()); }); - it("doesn't generate max signals warning when circuit breaker is met but not exceeded", async () => { + it("doesn't generate max alerts warning when circuit breaker is met but not exceeded", async () => { const rule: NewTermsRuleCreateProps = { ...getCreateNewTermsRulesSchemaMock('rule-1', true), new_terms_fields: ['host.ip'], @@ -252,7 +256,7 @@ export default ({ getService }: FtrProviderContext) => { }; const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).not.contain(getMaxSignalsWarning()); + expect(logs[0].warnings).not.contain(getMaxAlertsWarning()); }); it('should generate 3 alerts when 1 document has 3 new values', async () => { @@ -990,21 +994,21 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should work for max signals > 100', async () => { - const maxSignals = 200; + it('should work for max alerts > 100', async () => { + const maxAlerts = 200; const rule: NewTermsRuleCreateProps = { ...getCreateNewTermsRulesSchemaMock('rule-1', true), new_terms_fields: ['process.pid'], from: '2018-02-19T20:42:00.000Z', // Set the history_window_start close to 'from' so we should alert on all terms in the time range history_window_start: '2018-02-19T20:41:59.000Z', - max_signals: maxSignals, + max_signals: maxAlerts, }; const { previewId } = await previewRule({ supertest, rule }); - const previewAlerts = await getPreviewAlerts({ es, previewId, size: maxSignals * 2 }); + const previewAlerts = await getPreviewAlerts({ es, previewId, size: maxAlerts * 2 }); - expect(previewAlerts.length).eql(maxSignals); + expect(previewAlerts.length).eql(maxAlerts); const processPids = previewAlerts .map((signal) => signal._source?.['kibana.alert.new_terms']) .sort(); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/non_ecs_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/non_ecs_fields.ts similarity index 96% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/non_ecs_fields.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/non_ecs_fields.ts index 20d2f8e1dc571..e452ffcfaf34e 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/non_ecs_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/non_ecs_fields.ts @@ -10,18 +10,18 @@ import { deleteAllRules, deleteAllAlerts, getPreviewAlerts, - getRuleForSignalTesting, + getRuleForAlertTesting, previewRule, -} from '../../utils'; -import { dataGeneratorFactory, enhanceDocument } from '../../utils/data_generator'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; + dataGeneratorFactory, + enhanceDocument, +} from '../../../utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; const getQueryRule = (docIdToQuery: string) => ({ - ...getRuleForSignalTesting(['ecs_non_compliant']), + ...getRuleForAlertTesting(['ecs_non_compliant']), query: `id: "${docIdToQuery}"`, }); -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); @@ -56,7 +56,7 @@ export default ({ getService }: FtrProviderContext) => { }; }; - describe('Non ECS fields in alert document source', () => { + describe('@ess @serverless Non ECS fields in alert document source', () => { before(async () => { await esArchiver.load( 'x-pack/test/functional/es_archives/security_solution/ecs_non_compliant' diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/query.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/query.ts similarity index 92% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/query.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/query.ts index 4c38edaf0cd28..a1241c60f5ccf 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/query.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/query.ts @@ -42,29 +42,32 @@ import { import { DETECTION_ENGINE_RULES_BULK_ACTION, DETECTION_ENGINE_RULES_URL, - DETECTION_ENGINE_SIGNALS_STATUS_URL, + DETECTION_ENGINE_SIGNALS_STATUS_URL as DETECTION_ENGINE_ALERTS_STATUS_URL, } from '@kbn/security-solution-plugin/common/constants'; -import { getMaxSignalsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; -import { deleteAllExceptions } from '../../../lists_api_integration/utils'; +import { getMaxSignalsWarning as getMaxAlertsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; +import moment from 'moment'; +import { deleteAllExceptions } from '../../../../../../lists_api_integration/utils'; import { createExceptionList, createExceptionListItem, createRule, deleteAllRules, deleteAllAlerts, - getOpenSignals, + getOpenAlerts, getPreviewAlerts, - getRuleForSignalTesting, + getRuleForAlertTesting, getSimpleRule, previewRule, - setSignalStatus, + setAlertStatus, getRuleSOById, + patchRule, createRuleThroughAlertingEndpoint, getRuleSavedObjectWithLegacyInvestigationFields, -} from '../../utils'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { dataGeneratorFactory } from '../../utils/data_generator'; -import { patchRule } from '../../utils/patch_rule'; + dataGeneratorFactory, +} from '../../../utils'; + +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { EsArchivePathBuilder } from '../../../../../es_archive_path_builder'; /** * Specific _id to use for some of the tests. If the archiver changes and you see errors @@ -75,22 +78,29 @@ const ID = 'BhbXBmkBR346wHgn4PeZ'; /** * Test coverage: * [x] - Happy path generating 1 alert - * [x] - Rule type respects max signals + * [x] - Rule type respects max alerts * [x] - Alerts on alerts */ -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const es = getService('es'); const log = getService('log'); const esDeleteAllIndices = getService('esDeleteAllIndices'); + // TODO: add a new service + const config = getService('config'); + const isServerless = config.get('serverless'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const auditbeatPath = dataPathBuilder.getPath('auditbeat/hosts'); - describe('Query type rules', () => { + describe('@ess @serverless Query type rules', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); - await esArchiver.load('x-pack/test/functional/es_archives/security_solution/alerts/8.1.0'); + await esArchiver.load(auditbeatPath); + await esArchiver.load('x-pack/test/functional/es_archives/security_solution/alerts/8.8.0', { + useCreate: true, + docsOnly: true, + }); await esArchiver.load('x-pack/test/functional/es_archives/signals/severity_risk_overrides'); }); @@ -99,8 +109,7 @@ export default ({ getService }: FtrProviderContext) => { }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); - await esArchiver.unload('x-pack/test/functional/es_archives/security_solution/alerts/8.1.0'); + await esArchiver.unload(auditbeatPath); await esArchiver.unload('x-pack/test/functional/es_archives/signals/severity_risk_overrides'); await deleteAllAlerts(supertest, log, es, ['.preview.alerts-security.alerts-*']); await deleteAllRules(supertest, log); @@ -109,48 +118,48 @@ export default ({ getService }: FtrProviderContext) => { // First test creates a real rule - most remaining tests use preview API it('should have the specific audit record for _id or none of these tests below will pass', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: `_id:${ID}`, }; const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals(supertest, log, es, createdRule); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); expect(alerts.hits.hits.length).greaterThan(0); expect(alerts.hits.hits[0]._source?.['kibana.alert.ancestors'][0].id).eql(ID); }); - it('generates max signals warning when circuit breaker is hit', async () => { + it('generates max alerts warning when circuit breaker is hit', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), }; const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).contain(getMaxSignalsWarning()); + expect(logs[0].warnings).contain(getMaxAlertsWarning()); }); - it("doesn't generate max signals warning when circuit breaker is met but not exceeded", async () => { + it("doesn't generate max alerts warning when circuit breaker is met but not exceeded", async () => { const rule = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: 'process.executable: "/usr/bin/sudo"', max_signals: 10, }; const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).not.contain(getMaxSignalsWarning()); + expect(logs[0].warnings).not.contain(getMaxAlertsWarning()); }); it('should abide by max_signals > 100', async () => { - const maxSignals = 200; + const maxAlerts = 200; const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), - max_signals: maxSignals, + ...getRuleForAlertTesting(['auditbeat-*']), + max_signals: maxAlerts, }; const { previewId } = await previewRule({ supertest, rule }); // Search for 2x max_signals to make sure we aren't making more than max_signals - const previewAlerts = await getPreviewAlerts({ es, previewId, size: maxSignals * 2 }); - expect(previewAlerts.length).equal(maxSignals); + const previewAlerts = await getPreviewAlerts({ es, previewId, size: maxAlerts * 2 }); + expect(previewAlerts.length).equal(maxAlerts); }); - it('should have recorded the rule_id within the signal', async () => { + it('should have recorded the rule_id within the alert', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: `_id:${ID}`, }; const { previewId } = await previewRule({ supertest, rule }); @@ -158,17 +167,17 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts[0]._source?.[ALERT_RULE_RULE_ID]).eql(getSimpleRule().rule_id); }); - it('should query and get back expected signal structure using a basic KQL query', async () => { + it('should query and get back expected alert structure using a basic KQL query', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: `_id:${ID}`, }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - const signal = previewAlerts[0]._source; + const alert = previewAlerts[0]._source; - expect(signal).eql({ - ...signal, + expect(alert).eql({ + ...alert, [ALERT_ANCESTORS]: [ { id: 'BhbXBmkBR346wHgn4PeZ', @@ -189,11 +198,11 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should query and get back expected signal structure when it is a signal on a signal', async () => { - const alertId = '30a75fe46d3dbdfab55982036f77a8d60e2d1112e96f277c3b8c22f9bb57817a'; + it('should query and get back expected alert structure when it is a alert on a alert', async () => { + const alertId = 'eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1'; const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting([`.alerts-security.alerts-default*`]), - rule_id: 'signal-on-signal', + ...getRuleForAlertTesting([`.alerts-security.alerts-default*`]), + rule_id: 'alert-on-alert', query: `_id:${alertId}`, }; @@ -202,43 +211,44 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts.length).to.eql(1); - const signal = previewAlerts[0]._source; + const alert = previewAlerts[0]._source; - if (!signal) { - return expect(signal).to.be.ok(); + if (!alert) { + return expect(alert).to.be.ok(); } - - expect(signal).eql({ - ...signal, - [ALERT_ANCESTORS]: [ - { - id: 'ahEToH8BK09aFtXZFVMq', - type: 'event', - index: 'events-index-000001', - depth: 0, - }, - { - rule: '031d5c00-a72f-11ec-a8a3-7b1c8077fc3e', - id: '30a75fe46d3dbdfab55982036f77a8d60e2d1112e96f277c3b8c22f9bb57817a', - type: 'signal', - index: '.internal.alerts-security.alerts-default-000001', - depth: 1, - }, - ], - [ALERT_WORKFLOW_STATUS]: 'open', - [ALERT_DEPTH]: 2, - [ALERT_ORIGINAL_TIME]: '2022-03-19T02:48:12.634Z', - ...flattenWithPrefix(ALERT_ORIGINAL_EVENT, { - agent_id_status: 'verified', - ingested: '2022-03-19T02:47:57.376Z', - dataset: 'elastic_agent.filebeat', - }), - }); + const date = moment(); + const formattedDate = date.format('YYYY.MM.DD'); + const alertAncestorIndex = isServerless + ? `.ds-.alerts-security.alerts-default-${formattedDate}-000001` + : '.internal.alerts-security.alerts-default-000001'; + expect(alert[ALERT_ANCESTORS]).eql([ + { + id: 'vT9cwocBh3b8EMpD8lsi', + type: 'event', + index: '.ds-logs-endpoint.alerts-default-2023.04.27-000001', + depth: 0, + }, + { + rule: '7015a3e2-e4ea-11ed-8c11-49608884878f', + id: alertId, + type: 'signal', + index: alertAncestorIndex, + depth: 1, + }, + ]); + expect(alert[ALERT_WORKFLOW_STATUS]).eql('open'); + expect(alert[ALERT_DEPTH]).eql(2); + + expect(alert[ALERT_ORIGINAL_TIME]).eql('2023-04-27T11:03:57.906Z'); + expect(alert[`${ALERT_ORIGINAL_EVENT}.agent_id_status`]).eql('auth_metadata_missing'); + expect(alert[`${ALERT_ORIGINAL_EVENT}.ingested`]).eql('2023-04-27T10:58:03Z'); + expect(alert[`${ALERT_ORIGINAL_EVENT}.dataset`]).eql('endpoint'); + expect(alert[`${ALERT_ORIGINAL_EVENT}.ingested`]).eql('2023-04-27T10:58:03Z'); }); it('should not have risk score fields without risk indices', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: `_id:${ID}`, }; const { previewId } = await previewRule({ supertest, rule }); @@ -258,7 +268,7 @@ export default ({ getService }: FtrProviderContext) => { it('should have host and user risk score fields', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: `_id:${ID}`, }; const { previewId } = await previewRule({ supertest, rule }); @@ -273,11 +283,11 @@ export default ({ getService }: FtrProviderContext) => { /** * Here we test the functionality of Severity and Risk Score overrides (also called "mappings" * in the code). If the rule specifies a mapping, then the final Severity or Risk Score - * value of the signal will be taken from the mapped field of the source event. + * value of the alert will be taken from the mapped field of the source event. */ it('should get default severity and risk score if there is no mapping', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['signal_overrides']), + ...getRuleForAlertTesting(['signal_overrides']), severity: 'medium', risk_score: 75, }; @@ -297,7 +307,7 @@ export default ({ getService }: FtrProviderContext) => { it('should get overridden severity if the rule has a mapping for it', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['signal_overrides']), + ...getRuleForAlertTesting(['signal_overrides']), severity: 'medium', severity_mapping: [ { field: 'my_severity', operator: 'equals', value: 'sev_900', severity: 'high' }, @@ -334,7 +344,7 @@ export default ({ getService }: FtrProviderContext) => { it('should get overridden risk score if the rule has a mapping for it', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['signal_overrides']), + ...getRuleForAlertTesting(['signal_overrides']), severity: 'medium', risk_score: 75, risk_score_mapping: [ @@ -369,7 +379,7 @@ export default ({ getService }: FtrProviderContext) => { it('should get overridden severity and risk score if the rule has both mappings', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['signal_overrides']), + ...getRuleForAlertTesting(['signal_overrides']), severity: 'medium', severity_mapping: [ { field: 'my_severity', operator: 'equals', value: 'sev_900', severity: 'high' }, @@ -409,26 +419,26 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should generate signals with name_override field', async () => { + it('should generate alerts with name_override field', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: `event.action:boot`, rule_name_override: 'event.action', }; const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); - const fullSignal = previewAlerts[0]; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = previewAlerts[0]; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } expect(previewAlerts[0]._source?.['kibana.alert.rule.name']).to.eql('boot'); }); - it('should not generate duplicate signals', async () => { + it('should not generate duplicate alerts', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: `_id:${ID}`, }; @@ -448,7 +458,7 @@ export default ({ getService }: FtrProviderContext) => { it('should generate only 1 alert per host name when grouping by host name', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `host.name: "host-0"`, alert_suppression: { group_by: ['host.name'], @@ -481,7 +491,7 @@ export default ({ getService }: FtrProviderContext) => { it('should generate multiple alerts when multiple host names are found', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `host.name: *`, alert_suppression: { group_by: ['host.name'], @@ -521,7 +531,7 @@ export default ({ getService }: FtrProviderContext) => { it('should generate alerts when using multiple group by fields', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `host.name: *`, alert_suppression: { group_by: ['host.name', 'source.ip'], @@ -564,7 +574,7 @@ export default ({ getService }: FtrProviderContext) => { it('should not count documents that were covered by previous alerts', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `host.name: *`, alert_suppression: { group_by: ['host.name', 'source.ip'], @@ -632,7 +642,7 @@ export default ({ getService }: FtrProviderContext) => { // so we expect 2 groups to be created from the single document it('should generate multiple alerts for a single doc in multiple groups', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `*:*`, alert_suppression: { group_by: ['destination.ip'], @@ -689,7 +699,7 @@ export default ({ getService }: FtrProviderContext) => { // The last alert, with null for destination.ip, should be found by the first rule run but not duplicated // by the second run. const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `*:*`, alert_suppression: { group_by: ['destination.ip'], @@ -760,7 +770,7 @@ export default ({ getService }: FtrProviderContext) => { await indexListOfDocuments([firstDocument, firstDocument]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), rule_id: 'rule-2', query: `id:${id}`, alert_suppression: { @@ -772,7 +782,7 @@ export default ({ getService }: FtrProviderContext) => { }, }; const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals(supertest, log, es, createdRule); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); expect(alerts.hits.hits.length).eql(1); expect(alerts.hits.hits[0]._source).to.eql({ ...alerts.hits.hits[0]._source, @@ -802,7 +812,7 @@ export default ({ getService }: FtrProviderContext) => { await patchRule(supertest, log, { id: createdRule.id, enabled: false }); await patchRule(supertest, log, { id: createdRule.id, enabled: true }); const afterTimestamp = new Date(); - const secondAlerts = await getOpenSignals( + const secondAlerts = await getOpenAlerts( supertest, log, es, @@ -841,7 +851,7 @@ export default ({ getService }: FtrProviderContext) => { await indexListOfDocuments([firstDocument, firstDocument]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), rule_id: 'rule-2', query: `id:${id}`, alert_suppression: { @@ -853,15 +863,15 @@ export default ({ getService }: FtrProviderContext) => { }, }; const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals(supertest, log, es, createdRule); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); // Close the alert. Subsequent rule executions should ignore this closed alert // for suppression purposes. const alertIds = alerts.hits.hits.map((alert) => alert._id); await supertest - .post(DETECTION_ENGINE_SIGNALS_STATUS_URL) + .post(DETECTION_ENGINE_ALERTS_STATUS_URL) .set('kbn-xsrf', 'true') - .send(setSignalStatus({ signalIds: alertIds, status: 'closed' })) + .send(setAlertStatus({ alertIds, status: 'closed' })) .expect(200); const secondTimestamp = new Date().toISOString(); @@ -878,7 +888,7 @@ export default ({ getService }: FtrProviderContext) => { await patchRule(supertest, log, { id: createdRule.id, enabled: false }); await patchRule(supertest, log, { id: createdRule.id, enabled: true }); const afterTimestamp = new Date(); - const secondAlerts = await getOpenSignals( + const secondAlerts = await getOpenAlerts( supertest, log, es, @@ -922,7 +932,7 @@ export default ({ getService }: FtrProviderContext) => { it('should generate an alert per rule run when duration is less than rule interval', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `host.name: "host-0"`, alert_suppression: { group_by: ['host.name'], @@ -981,7 +991,7 @@ export default ({ getService }: FtrProviderContext) => { it('should update an existing alert in the time window', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `host.name: "host-0"`, alert_suppression: { group_by: ['host.name'], @@ -1025,7 +1035,7 @@ export default ({ getService }: FtrProviderContext) => { it('should update the correct alerts based on group_by field-value pair', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `host.name: *`, alert_suppression: { group_by: ['host.name'], @@ -1099,7 +1109,7 @@ export default ({ getService }: FtrProviderContext) => { it('should update the correct alerts based on group_by field-value pair even when value is null', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `host.name: *`, alert_suppression: { group_by: ['destination.ip'], // Only 1 document populates destination.ip @@ -1162,7 +1172,7 @@ export default ({ getService }: FtrProviderContext) => { await indexListOfDocuments([docWithoutOverride, docWithOverride]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name'], @@ -1226,7 +1236,7 @@ export default ({ getService }: FtrProviderContext) => { ); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name'], @@ -1313,7 +1323,7 @@ export default ({ getService }: FtrProviderContext) => { await indexListOfDocuments([firstDoc, secondDoc, thirdDoc]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name'], @@ -1383,7 +1393,7 @@ export default ({ getService }: FtrProviderContext) => { it('should be enriched with host risk score', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['suppression-data']), + ...getRuleForAlertTesting(['suppression-data']), query: `host.name: "host-0"`, alert_suppression: { group_by: ['host.name'], @@ -1474,7 +1484,7 @@ export default ({ getService }: FtrProviderContext) => { ]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name'], @@ -1545,7 +1555,7 @@ export default ({ getService }: FtrProviderContext) => { ]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name'], @@ -1600,7 +1610,7 @@ export default ({ getService }: FtrProviderContext) => { await indexListOfDocuments([firstDoc, firstDoc]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name'], @@ -1654,7 +1664,7 @@ export default ({ getService }: FtrProviderContext) => { await indexListOfDocuments([firstDoc, firstDoc]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name'], @@ -1752,7 +1762,7 @@ export default ({ getService }: FtrProviderContext) => { ]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name', 'agent.version'], @@ -1831,7 +1841,7 @@ export default ({ getService }: FtrProviderContext) => { ]); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name', 'agent.version'], @@ -1898,7 +1908,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should create suppressed alerts for single host.name when rule configure with suppress', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name'], @@ -1965,7 +1975,7 @@ export default ({ getService }: FtrProviderContext) => { it('should create unsuppressed alerts for single host.name', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id}`, alert_suppression: { group_by: ['agent.name'], @@ -2076,7 +2086,7 @@ export default ({ getService }: FtrProviderContext) => { }); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: `_id:${ID} or _id:GBbXBmkBR346wHgn5_eR or _id:x10zJ2oE9v5HJNSHhyxi`, exceptions_list: [{ id, list_id: listId, type, namespace_type: namespaceType }], }; @@ -2119,7 +2129,7 @@ export default ({ getService }: FtrProviderContext) => { }); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: `_id:${ID} or _id:GBbXBmkBR346wHgn5_eR or _id:x10zJ2oE9v5HJNSHhyxi`, exceptions_list: [{ id, list_id: listId, type, namespace_type: namespaceType }], }; @@ -2157,7 +2167,7 @@ export default ({ getService }: FtrProviderContext) => { await indexEnhancedDocuments({ documents: [firstDoc, firstDoc, secondDoc], id }); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id} AND agent.n*: test-1`, from: 'now-1h', interval: '1h', @@ -2188,7 +2198,7 @@ export default ({ getService }: FtrProviderContext) => { await indexEnhancedDocuments({ documents: [firstDoc, firstDoc, secondDoc], id }); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id} AND NOT agent.na*: "test-1"`, from: 'now-1h', interval: '1h', @@ -2215,7 +2225,7 @@ export default ({ getService }: FtrProviderContext) => { await indexEnhancedDocuments({ documents: [firstDoc, secondDoc, thirdDoc], id }); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id} AND agent*: "test-1"`, from: 'now-1h', interval: '1h', @@ -2249,7 +2259,7 @@ export default ({ getService }: FtrProviderContext) => { await indexEnhancedDocuments({ documents: [firstDoc, secondDoc, thirdDoc], id }); const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['ecs_compliant']), + ...getRuleForAlertTesting(['ecs_compliant']), query: `id:${id} AND agent.\\*: test-1`, from: 'now-1h', interval: '1h', @@ -2276,7 +2286,8 @@ export default ({ getService }: FtrProviderContext) => { }); }); - describe('legacy investigation_fields', () => { + // TODO: Ask YARA + describe('@brokenInServerless legacy investigation_fields', () => { let ruleWithLegacyInvestigationField: Rule; beforeEach(async () => { @@ -2317,7 +2328,7 @@ export default ({ getService }: FtrProviderContext) => { .set('elastic-api-version', '2023-10-31') .expect(200); - const alertsAfterEnable = await getOpenSignals(supertest, log, es, ruleBody, 'succeeded'); + const alertsAfterEnable = await getOpenAlerts(supertest, log, es, ruleBody, 'succeeded'); expect(alertsAfterEnable.hits.hits.length > 0).eql(true); }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/saved_query.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/saved_query.ts similarity index 70% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/saved_query.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/saved_query.ts index ed7173133f9f3..e387a2f840c41 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/saved_query.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/saved_query.ts @@ -20,10 +20,11 @@ import { createRule, deleteAllRules, deleteAllAlerts, - getOpenSignals, - getRuleForSignalTesting, -} from '../../utils'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; + getOpenAlerts, + getRuleForAlertTesting, +} from '../../../utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { EsArchivePathBuilder } from '../../../../../es_archive_path_builder'; /** * Specific _id to use for some of the tests. If the archiver changes and you see errors @@ -31,37 +32,41 @@ import { FtrProviderContext } from '../../common/ftr_provider_context'; */ const ID = 'BhbXBmkBR346wHgn4PeZ'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const es = getService('es'); const log = getService('log'); + // TODO: add a new service + const config = getService('config'); + const isServerless = config.get('serverless'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const path = dataPathBuilder.getPath('auditbeat/hosts'); - describe('Saved query type rules', () => { + describe('@ess @serverless Saved query type rules', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.load(path); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.unload(path); await deleteAllAlerts(supertest, log, es); await deleteAllRules(supertest, log); }); // First test creates a real rule - remaining tests use preview API - it('should query and get back expected signal structure using a saved query rule', async () => { + it('should query and get back expected alert structure using a saved query rule', async () => { const rule: SavedQueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), type: 'saved_query', query: `_id:${ID}`, saved_id: 'doesnt-exist', }; const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals(supertest, log, es, createdRule); - const signal = alerts.hits.hits[0]._source; - expect(signal).eql({ - ...signal, + const alerts = await getOpenAlerts(supertest, log, es, createdRule); + const alert = alerts.hits.hits[0]._source; + expect(alert).eql({ + ...alert, [ALERT_ANCESTORS]: [ { id: 'BhbXBmkBR346wHgn4PeZ', diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threat_match.ts similarity index 91% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threat_match.ts index efed9c26375e2..8d7cf8fd9f89b 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threat_match.ts @@ -35,16 +35,18 @@ import { ALERT_ORIGINAL_TIME, } from '@kbn/security-solution-plugin/common/field_maps/field_names'; import { RuleExecutionStatusEnum } from '@kbn/security-solution-plugin/common/api/detection_engine/rule_monitoring'; -import { getMaxSignalsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; +import { getMaxSignalsWarning as getMaxAlertsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; import { previewRule, - getOpenSignals, + getOpenAlerts, getPreviewAlerts, deleteAllAlerts, deleteAllRules, createRule, -} from '../../utils'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +} from '../../../utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { EsArchivePathBuilder } from '../../../../../es_archive_path_builder'; + const format = (value: unknown): string => JSON.stringify(value, null, 2); // Asserts that each expected value is included in the subject, independent of @@ -108,8 +110,8 @@ const createThreatMatchRule = ({ threat_index, threat_mapping, threat_filters: [], - threat_indicator_path, ...override, + threat_indicator_path, }); function alertsAreTheSame(alertsA: any[], alertsB: any[]): void { @@ -130,6 +132,7 @@ function alertsAreTheSame(alertsA: any[], alertsB: any[]): void { 'kibana.alert.start', 'kibana.alert.reason', 'kibana.alert.uuid', + 'kibana.alert.url', ]); }; @@ -138,37 +141,40 @@ function alertsAreTheSame(alertsA: any[], alertsB: any[]): void { expect(sort(alertsA.map(mapAlert))).to.eql(sort(alertsB.map(mapAlert))); } - -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); const es = getService('es'); const log = getService('log'); + // TODO: add a new service + const config = getService('config'); + const isServerless = config.get('serverless'); + const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const audibeatHostsPath = dataPathBuilder.getPath('auditbeat/hosts'); + const threatIntelPath = dataPathBuilder.getPath('filebeat/threat_intel'); /** * Specific api integration tests for threat matching rule type */ // FLAKY: https://github.com/elastic/kibana/issues/155304 - describe('Threat match type rules', () => { + describe('@ess @serverless Threat match type rules', () => { before(async () => { - // await deleteSignalsIndex(supertest, log); - // await deleteAllAlerts(supertest, log); - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.load(audibeatHostsPath); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.unload(audibeatHostsPath); await deleteAllAlerts(supertest, log, es); await deleteAllRules(supertest, log); }); // First 2 test creates a real rule - remaining tests use preview API - it('should be able to execute and get all signals when doing a specific query (terms query)', async () => { + it('should be able to execute and get all alerts when doing a specific query (terms query)', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule(); const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals( + const alerts = await getOpenAlerts( supertest, log, es, @@ -178,16 +184,15 @@ export default ({ getService }: FtrProviderContext) => { ); expect(alerts.hits.hits.length).equal(88); const fullSource = alerts.hits.hits.find( - (signal) => - (signal._source?.[ALERT_ANCESTORS] as Ancestor[])[0].id === '7yJ-B2kBR346wHgnhlMn' + (alert) => (alert._source?.[ALERT_ANCESTORS] as Ancestor[])[0].id === '7yJ-B2kBR346wHgnhlMn' ); - const fullSignal = fullSource?._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = fullSource?._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - expect(fullSignal).eql({ - ...fullSignal, - '@timestamp': fullSignal['@timestamp'], + expect(fullAlert).eql({ + ...fullAlert, + '@timestamp': fullAlert['@timestamp'], agent: { ephemeral_id: '1b4978a0-48be-49b1-ac96-323425b389ab', hostname: 'zeek-sensor-amsterdam', @@ -281,25 +286,25 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_ORIGINAL_EVENT_ACTION]: 'error', [ALERT_ORIGINAL_EVENT_CATEGORY]: 'user-login', [ALERT_ORIGINAL_EVENT_MODULE]: 'auditd', - [ALERT_ORIGINAL_TIME]: fullSignal[ALERT_ORIGINAL_TIME], + [ALERT_ORIGINAL_TIME]: fullAlert[ALERT_ORIGINAL_TIME], [ALERT_REASON]: 'user-login event with source 46.101.47.213 by root on zeek-sensor-amsterdam created high alert Query with a rule id.', - [ALERT_RULE_UUID]: fullSignal[ALERT_RULE_UUID], + [ALERT_RULE_UUID]: fullAlert[ALERT_RULE_UUID], [ALERT_STATUS]: 'active', - [ALERT_UUID]: fullSignal[ALERT_UUID], + [ALERT_UUID]: fullAlert[ALERT_UUID], [ALERT_WORKFLOW_STATUS]: 'open', [ALERT_WORKFLOW_TAGS]: [], [SPACE_IDS]: ['default'], - [VERSION]: fullSignal[VERSION], + [VERSION]: fullAlert[VERSION], threat: { - enrichments: get(fullSignal, 'threat.enrichments'), + enrichments: get(fullAlert, 'threat.enrichments'), }, ...flattenWithPrefix(ALERT_RULE_NAMESPACE, { actions: [], author: [], category: 'Indicator Match Rule', consumer: 'siem', - created_by: 'elastic', + created_by: ELASTICSEARCH_USERNAME, description: 'Detecting root and admin users', enabled: true, exceptions_list: [], @@ -320,14 +325,14 @@ export default ({ getService }: FtrProviderContext) => { threat: [], to: 'now', type: 'threat_match', - updated_at: fullSignal[ALERT_RULE_UPDATED_AT], - updated_by: 'elastic', - uuid: fullSignal[ALERT_RULE_UUID], + updated_at: fullAlert[ALERT_RULE_UPDATED_AT], + updated_by: ELASTICSEARCH_USERNAME, + uuid: fullAlert[ALERT_RULE_UUID], version: 1, }), }); }); - it('should be able to execute and get all signals when doing a specific query (match query)', async () => { + it('should be able to execute and get all alerts when doing a specific query (match query)', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ threat_mapping: [ // We match host.name against host.name @@ -349,7 +354,7 @@ export default ({ getService }: FtrProviderContext) => { }); const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals( + const alerts = await getOpenAlerts( supertest, log, es, @@ -359,16 +364,15 @@ export default ({ getService }: FtrProviderContext) => { ); expect(alerts.hits.hits.length).equal(88); const fullSource = alerts.hits.hits.find( - (signal) => - (signal._source?.[ALERT_ANCESTORS] as Ancestor[])[0].id === '7yJ-B2kBR346wHgnhlMn' + (alert) => (alert._source?.[ALERT_ANCESTORS] as Ancestor[])[0].id === '7yJ-B2kBR346wHgnhlMn' ); - const fullSignal = fullSource?._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = fullSource?._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - expect(fullSignal).eql({ - ...fullSignal, - '@timestamp': fullSignal['@timestamp'], + expect(fullAlert).eql({ + ...fullAlert, + '@timestamp': fullAlert['@timestamp'], agent: { ephemeral_id: '1b4978a0-48be-49b1-ac96-323425b389ab', hostname: 'zeek-sensor-amsterdam', @@ -462,24 +466,24 @@ export default ({ getService }: FtrProviderContext) => { [ALERT_ORIGINAL_EVENT_ACTION]: 'error', [ALERT_ORIGINAL_EVENT_CATEGORY]: 'user-login', [ALERT_ORIGINAL_EVENT_MODULE]: 'auditd', - [ALERT_ORIGINAL_TIME]: fullSignal[ALERT_ORIGINAL_TIME], + [ALERT_ORIGINAL_TIME]: fullAlert[ALERT_ORIGINAL_TIME], [ALERT_REASON]: 'user-login event with source 46.101.47.213 by root on zeek-sensor-amsterdam created high alert Query with a rule id.', - [ALERT_RULE_UUID]: fullSignal[ALERT_RULE_UUID], + [ALERT_RULE_UUID]: fullAlert[ALERT_RULE_UUID], [ALERT_STATUS]: 'active', - [ALERT_UUID]: fullSignal[ALERT_UUID], + [ALERT_UUID]: fullAlert[ALERT_UUID], [ALERT_WORKFLOW_STATUS]: 'open', [SPACE_IDS]: ['default'], - [VERSION]: fullSignal[VERSION], + [VERSION]: fullAlert[VERSION], threat: { - enrichments: get(fullSignal, 'threat.enrichments'), + enrichments: get(fullAlert, 'threat.enrichments'), }, ...flattenWithPrefix(ALERT_RULE_NAMESPACE, { actions: [], author: [], category: 'Indicator Match Rule', consumer: 'siem', - created_by: 'elastic', + created_by: ELASTICSEARCH_USERNAME, description: 'Detecting root and admin users', enabled: true, exceptions_list: [], @@ -500,18 +504,18 @@ export default ({ getService }: FtrProviderContext) => { threat: [], to: 'now', type: 'threat_match', - updated_at: fullSignal[ALERT_RULE_UPDATED_AT], - updated_by: 'elastic', - uuid: fullSignal[ALERT_RULE_UUID], + updated_at: fullAlert[ALERT_RULE_UPDATED_AT], + updated_by: ELASTICSEARCH_USERNAME, + uuid: fullAlert[ALERT_RULE_UUID], version: 1, }), }); }); - it('generates max signals warning when circuit breaker is hit', async () => { + it('generates max alerts warning when circuit breaker is hit', async () => { const rule: ThreatMatchRuleCreateProps = { ...createThreatMatchRule(), max_signals: 87 }; // Query generates 88 alerts with current esArchive const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).contain(getMaxSignalsWarning()); + expect(logs[0].warnings).contain(getMaxAlertsWarning()); }); it('terms and match should have the same alerts with pagination', async () => { @@ -552,7 +556,7 @@ export default ({ getService }: FtrProviderContext) => { const createdRuleTerm = await createRule(supertest, log, termRule); const createdRuleMatch = await createRule(supertest, log, matchRule); - const alertsTerm = await getOpenSignals( + const alertsTerm = await getOpenAlerts( supertest, log, es, @@ -560,7 +564,7 @@ export default ({ getService }: FtrProviderContext) => { RuleExecutionStatusEnum.succeeded, 100 ); - const alertsMatch = await getOpenSignals( + const alertsMatch = await getOpenAlerts( supertest, log, es, @@ -593,7 +597,7 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts.length).equal(0); }); - it('should return 0 signals when using an AND and one of the clauses does not have data', async () => { + it('should return 0 alerts when using an AND and one of the clauses does not have data', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ threat_mapping: [ { @@ -618,7 +622,7 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts.length).equal(0); }); - it('should return 0 signals when using an AND and one of the clauses has a made up value that does not exist', async () => { + it('should return 0 alerts when using an AND and one of the clauses has a made up value that does not exist', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ threat_mapping: [ { @@ -661,14 +665,14 @@ export default ({ getService }: FtrProviderContext) => { describe('indicator enrichment: threat-first search', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/filebeat/threat_intel'); + await esArchiver.load(threatIntelPath); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/filebeat/threat_intel'); + await esArchiver.unload(threatIntelPath); }); - it('enriches signals with the single indicator that matched', async () => { + it('enriches alerts with the single indicator that matched', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ threat_mapping: [ { @@ -744,9 +748,9 @@ export default ({ getService }: FtrProviderContext) => { ]); }); - it('enriches signals with multiple indicators if several matched', async () => { + it('enriches alerts with multiple indicators if several matched', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ - query: 'NOT source.port:35326', // specify query to have signals more than treat indicators, but only 1 will match + query: 'NOT source.port:35326', // specify query to have alerts more than treat indicators, but only 1 will match threat_query: 'threat.indicator.ip: *', threat_index: ['filebeat-*'], // Mimics indicators from the filebeat MISP module threat_mapping: [ @@ -811,7 +815,7 @@ export default ({ getService }: FtrProviderContext) => { it('adds a single indicator that matched multiple fields', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ - query: 'NOT source.port:35326', // specify query to have signals more than treat indicators, but only 1 will match + query: 'NOT source.port:35326', // specify query to have alerts more than treat indicators, but only 1 will match threat_query: 'threat.indicator.port: 57324 or threat.indicator.ip:45.115.45.3', // narrow our query to a single indicator threat_index: ['filebeat-*'], // Mimics indicators from the filebeat MISP module threat_mapping: [ @@ -907,7 +911,7 @@ export default ({ getService }: FtrProviderContext) => { ]); }); - it('generates multiple signals with multiple matches', async () => { + it('generates multiple alerts with multiple matches', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ threat_query: '*:*', threat_index: ['filebeat-*'], // Mimics indicators from the filebeat MISP module @@ -1032,7 +1036,7 @@ export default ({ getService }: FtrProviderContext) => { }); // https://github.com/elastic/kibana/issues/149920 - // generates same number of alerts similarly to "enriches signals with the single indicator that matches" test + // generates same number of alerts similarly to "enriches alerts with the single indicator that matches" test it('generates alerts with single match if queries contain field path wildcards', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ // still matches all documents as default *:* @@ -1060,14 +1064,14 @@ export default ({ getService }: FtrProviderContext) => { describe('indicator enrichment: event-first search', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/filebeat/threat_intel'); + await esArchiver.load(threatIntelPath); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/filebeat/threat_intel'); + await esArchiver.unload(threatIntelPath); }); - it('enriches signals with the single indicator that matched', async () => { + it('enriches alerts with the single indicator that matched', async () => { const termRule: ThreatMatchRuleCreateProps = createThreatMatchRule({ query: 'destination.ip:159.89.119.67', threat_query: 'threat.indicator.domain: *', // narrow things down to indicators with a domain @@ -1168,7 +1172,7 @@ export default ({ getService }: FtrProviderContext) => { alertsAreTheSame(termPreviewAlerts, matchPrevieAlerts); }); - it('enriches signals with multiple indicators if several matched', async () => { + it('enriches alerts with multiple indicators if several matched', async () => { const termRule: ThreatMatchRuleCreateProps = createThreatMatchRule({ query: 'source.port: 57324', // narrow our query to a single record that matches two indicatorsthreat_query: 'threat.indicator.ip: *', threat_query: 'threat.indicator.ip: *', @@ -1408,7 +1412,7 @@ export default ({ getService }: FtrProviderContext) => { ); }); - it('generates multiple signals with multiple matches', async () => { + it('generates multiple alerts with multiple matches', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ query: '(source.port:57324 and source.ip:45.115.45.3) or destination.ip:159.89.119.67', // narrow our query to a single record that matches two indicators threat_query: '*:*', @@ -1534,7 +1538,7 @@ export default ({ getService }: FtrProviderContext) => { }); // https://github.com/elastic/kibana/issues/149920 - // creates same number of alerts similarly to "generates multiple signals with multiple matches" test + // creates same number of alerts similarly to "generates multiple alerts with multiple matches" test it('generates alerts with multiple matches if queries contain field path wildcards', async () => { const rule: ThreatMatchRuleCreateProps = createThreatMatchRule({ // source.po* matches port source.port field @@ -1605,16 +1609,16 @@ export default ({ getService }: FtrProviderContext) => { const previewAlerts = await getPreviewAlerts({ es, previewId, size: 100 }); expect(previewAlerts.length).equal(88); const fullSource = previewAlerts.find( - (signal) => - (signal._source?.[ALERT_ANCESTORS] as Ancestor[])[0].id === '7yJ-B2kBR346wHgnhlMn' + (alert) => + (alert._source?.[ALERT_ANCESTORS] as Ancestor[])[0].id === '7yJ-B2kBR346wHgnhlMn' ); - const fullSignal = fullSource?._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = fullSource?._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - expect(fullSignal?.host?.risk?.calculated_level).to.eql('Critical'); - expect(fullSignal?.host?.risk?.calculated_score_norm).to.eql(70); + expect(fullAlert?.host?.risk?.calculated_level).to.eql('Critical'); + expect(fullAlert?.host?.risk?.calculated_score_norm).to.eql(70); }); }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threshold.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold.ts similarity index 73% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threshold.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold.ts index 36f41da15e1ee..81203c3d48a28 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threshold.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/threshold.ts @@ -21,51 +21,56 @@ import { ALERT_ORIGINAL_TIME, ALERT_THRESHOLD_RESULT, } from '@kbn/security-solution-plugin/common/field_maps/field_names'; -import { getMaxSignalsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; +import { getMaxSignalsWarning as getMaxAlertsWarning } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/utils'; import { createRule, - getOpenSignals, + getOpenAlerts, getPreviewAlerts, - getThresholdRuleForSignalTesting, + getThresholdRuleForAlertTesting, previewRule, -} from '../../utils'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +} 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 es = getService('es'); const log = getService('log'); + // TODO: add a new service + const config = getService('config'); + const isServerless = config.get('serverless'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const path = dataPathBuilder.getPath('auditbeat/hosts'); - describe('Threshold type rules', () => { + describe('@ess @serverless Threshold type rules', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.load(path); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.unload(path); }); // First test creates a real rule - remaining tests use preview API - it('generates 1 signal from Threshold rules when threshold is met', async () => { + it('generates 1 alert from Threshold rules when threshold is met', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: ['host.id'], value: 700, }, }; const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals(supertest, log, es, createdRule); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); expect(alerts.hits.hits.length).eql(1); - const fullSignal = alerts.hits.hits[0]._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = alerts.hits.hits[0]._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - const eventIds = (fullSignal?.[ALERT_ANCESTORS] as Ancestor[]).map((event) => event.id); - expect(fullSignal).eql({ - ...fullSignal, + const eventIds = (fullAlert?.[ALERT_ANCESTORS] as Ancestor[]).map((event) => event.id); + expect(fullAlert).eql({ + ...fullAlert, 'host.id': '8cc95778cce5407c809480e8e32ad76b', [EVENT_KIND]: 'signal', [ALERT_ANCESTORS]: [ @@ -77,9 +82,9 @@ export default ({ getService }: FtrProviderContext) => { }, ], [ALERT_WORKFLOW_STATUS]: 'open', - [ALERT_REASON]: 'event created high alert Signal Testing Query.', - [ALERT_RULE_UUID]: fullSignal[ALERT_RULE_UUID], - [ALERT_ORIGINAL_TIME]: fullSignal[ALERT_ORIGINAL_TIME], + [ALERT_REASON]: 'event created high alert Alert Testing Query.', + [ALERT_RULE_UUID]: fullAlert[ALERT_RULE_UUID], + [ALERT_ORIGINAL_TIME]: fullAlert[ALERT_ORIGINAL_TIME], [ALERT_DEPTH]: 1, [ALERT_THRESHOLD_RESULT]: { terms: [ @@ -94,9 +99,9 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('generates max signals warning when circuit breaker is exceeded', async () => { + it('generates max alerts warning when circuit breaker is exceeded', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: 'host.id', value: 1, // This value generates 7 alerts with the current esArchive @@ -104,12 +109,12 @@ export default ({ getService }: FtrProviderContext) => { max_signals: 5, }; const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).contain(getMaxSignalsWarning()); + expect(logs[0].warnings).contain(getMaxAlertsWarning()); }); - it("doesn't generate max signals warning when circuit breaker is met but not exceeded", async () => { + it("doesn't generate max alerts warning when circuit breaker is met but not exceeded", async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: 'host.id', value: 1, // This value generates 7 alerts with the current esArchive @@ -117,12 +122,12 @@ export default ({ getService }: FtrProviderContext) => { max_signals: 7, }; const { logs } = await previewRule({ supertest, rule }); - expect(logs[0].warnings).not.contain(getMaxSignalsWarning()); + expect(logs[0].warnings).not.contain(getMaxAlertsWarning()); }); - it('generates 2 signals from Threshold rules when threshold is met', async () => { + it('generates 2 alerts from Threshold rules when threshold is met', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: 'host.id', value: 100, @@ -135,7 +140,7 @@ export default ({ getService }: FtrProviderContext) => { it('applies the provided query before bucketing ', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), query: 'host.id:"2ab45fc1c41e4c84bbd02202a7e5761f"', threshold: { field: 'process.name', @@ -147,9 +152,9 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts.length).eql(1); }); - it('generates no signals from Threshold rules when threshold is met and cardinality is not met', async () => { + it('generates no alerts from Threshold rules when threshold is met and cardinality is not met', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: 'host.id', value: 100, @@ -166,9 +171,9 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts.length).eql(0); }); - it('generates no signals from Threshold rules when cardinality is met and threshold is not met', async () => { + it('generates no alerts from Threshold rules when cardinality is met and threshold is not met', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: 'host.id', value: 1000, @@ -185,9 +190,9 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts.length).eql(0); }); - it('generates signals from Threshold rules when threshold and cardinality are both met', async () => { + it('generates alerts from Threshold rules when threshold and cardinality are both met', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: 'host.id', value: 100, @@ -202,13 +207,13 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); expect(previewAlerts.length).eql(1); - const fullSignal = previewAlerts[0]._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = previewAlerts[0]._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - const eventIds = (fullSignal?.[ALERT_ANCESTORS] as Ancestor[]).map((event) => event.id); - expect(fullSignal).eql({ - ...fullSignal, + const eventIds = (fullAlert?.[ALERT_ANCESTORS] as Ancestor[]).map((event) => event.id); + expect(fullAlert).eql({ + ...fullAlert, 'host.id': '8cc95778cce5407c809480e8e32ad76b', [EVENT_KIND]: 'signal', [ALERT_ANCESTORS]: [ @@ -220,9 +225,9 @@ export default ({ getService }: FtrProviderContext) => { }, ], [ALERT_WORKFLOW_STATUS]: 'open', - [ALERT_REASON]: `event created high alert Signal Testing Query.`, - [ALERT_RULE_UUID]: fullSignal[ALERT_RULE_UUID], - [ALERT_ORIGINAL_TIME]: fullSignal[ALERT_ORIGINAL_TIME], + [ALERT_REASON]: `event created high alert Alert Testing Query.`, + [ALERT_RULE_UUID]: fullAlert[ALERT_RULE_UUID], + [ALERT_ORIGINAL_TIME]: fullAlert[ALERT_ORIGINAL_TIME], [ALERT_DEPTH]: 1, [ALERT_THRESHOLD_RESULT]: { terms: [ @@ -243,9 +248,9 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should not generate signals if only one field meets the threshold requirement', async () => { + it('should not generate alerts if only one field meets the threshold requirement', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: ['host.id', 'process.name'], value: 22, @@ -256,9 +261,9 @@ export default ({ getService }: FtrProviderContext) => { expect(previewAlerts.length).eql(0); }); - it('generates signals from Threshold rules when bucketing by multiple fields', async () => { + it('generates alerts from Threshold rules when bucketing by multiple fields', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: ['host.id', 'process.name', 'event.module'], value: 21, @@ -267,13 +272,13 @@ export default ({ getService }: FtrProviderContext) => { const { previewId } = await previewRule({ supertest, rule }); const previewAlerts = await getPreviewAlerts({ es, previewId }); expect(previewAlerts.length).eql(1); - const fullSignal = previewAlerts[0]._source; - if (!fullSignal) { - return expect(fullSignal).to.be.ok(); + const fullAlert = previewAlerts[0]._source; + if (!fullAlert) { + return expect(fullAlert).to.be.ok(); } - const eventIds = (fullSignal[ALERT_ANCESTORS] as Ancestor[]).map((event) => event.id); - expect(fullSignal).eql({ - ...fullSignal, + const eventIds = (fullAlert[ALERT_ANCESTORS] as Ancestor[]).map((event) => event.id); + expect(fullAlert).eql({ + ...fullAlert, 'event.module': 'system', 'host.id': '2ab45fc1c41e4c84bbd02202a7e5761f', 'process.name': 'sshd', @@ -287,9 +292,9 @@ export default ({ getService }: FtrProviderContext) => { }, ], [ALERT_WORKFLOW_STATUS]: 'open', - [ALERT_REASON]: `event with process sshd, created high alert Signal Testing Query.`, - [ALERT_RULE_UUID]: fullSignal[ALERT_RULE_UUID], - [ALERT_ORIGINAL_TIME]: fullSignal[ALERT_ORIGINAL_TIME], + [ALERT_REASON]: `event with process sshd, created high alert Alert Testing Query.`, + [ALERT_RULE_UUID]: fullAlert[ALERT_RULE_UUID], + [ALERT_ORIGINAL_TIME]: fullAlert[ALERT_ORIGINAL_TIME], [ALERT_DEPTH]: 1, [ALERT_THRESHOLD_RESULT]: { terms: [ @@ -315,15 +320,15 @@ export default ({ getService }: FtrProviderContext) => { // https://github.com/elastic/kibana/issues/149920 it('generates 1 alert when threshold is met and rule query has wildcard in field name', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), - query: 'agent.ty*:auditbeat', // this query should match all documents from index and we will receive 1 alert, similarly to "generates 1 signal from Threshold rules when threshold is met" test case + ...getThresholdRuleForAlertTesting(['auditbeat-*']), + query: 'agent.ty*:auditbeat', // this query should match all documents from index and we will receive 1 alert, similarly to "generates 1 alert from Threshold rules when threshold is met" test case threshold: { field: ['host.id'], value: 700, }, }; const createdRule = await createRule(supertest, log, rule); - const alerts = await getOpenSignals(supertest, log, es, createdRule); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); expect(alerts.hits.hits.length).eql(1); }); @@ -342,7 +347,7 @@ export default ({ getService }: FtrProviderContext) => { it('applies timestamp override when using single field', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['timestamp-fallback-test']), + ...getThresholdRuleForAlertTesting(['timestamp-fallback-test']), threshold: { field: 'host.name', value: 1, @@ -370,7 +375,7 @@ export default ({ getService }: FtrProviderContext) => { it('applies timestamp override when using multiple fields', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['timestamp-fallback-test']), + ...getThresholdRuleForAlertTesting(['timestamp-fallback-test']), threshold: { field: ['host.name', 'source.ip'], value: 1, @@ -408,7 +413,7 @@ export default ({ getService }: FtrProviderContext) => { it('should be enriched with host risk score', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['auditbeat-*']), + ...getThresholdRuleForAlertTesting(['auditbeat-*']), threshold: { field: 'host.name', value: 100, diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/ignore_fields.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/ignore_fields.ts similarity index 70% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group10/ignore_fields.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/ignore_fields.ts index 829224b9c6089..6ddee1846067d 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/ignore_fields.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/ignore_fields.ts @@ -7,16 +7,15 @@ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; import { createRule, - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, - getEqlRuleForSignalTesting, - getSignalsById, + getEqlRuleForAlertTesting, + getAlertsById, waitForRuleSuccess, - waitForSignalsToBePresent, + waitForAlertsToBePresent, } from '../../utils'; interface Ignore { @@ -26,10 +25,10 @@ interface Ignore { testing_regex?: string; } -// eslint-disable-next-line import/no-default-export +import { FtrProviderContext } from '../../../../ftr_provider_context'; export default ({ getService }: FtrProviderContext): void => { /** - * See the config file (detection_engine_api_integration/common/config.ts) for which field values were added to be ignored + * See the config file (config.ts) for which field values were added to be ignored * for testing. The values should be in the config around the area of: * --xpack.securitySolution.alertIgnoreFields=[testing.ignore_1,/[testingRegex] * meaning that the ignore fields values should be the array: ["testing.ignore_1", "/[testingRegex]/"] @@ -47,7 +46,7 @@ export default ({ getService }: FtrProviderContext): void => { * server/lib/detection_engine/signals/source_fields_merging/utils/is_ignored.ts * server/lib/detection_engine/signals/source_fields_merging/utils/is_eql_bug_77152.ts */ - describe('ignore_fields', () => { + describe('@ess @serverless ignore_fields', () => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const log = getService('log'); @@ -62,7 +61,7 @@ export default ({ getService }: FtrProviderContext): void => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -70,14 +69,14 @@ export default ({ getService }: FtrProviderContext): void => { await deleteAllRules(supertest, log); }); - it('should ignore the field of "testing_ignored"', async () => { - const rule = getEqlRuleForSignalTesting(['ignore_fields']); + it('@skipInQA should ignore the field of "testing_ignored"', async () => { + const rule = getEqlRuleForAlertTesting(['ignore_fields']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits .map((hit) => (hit._source as Ignore).testing_ignored) .sort(); @@ -85,27 +84,27 @@ export default ({ getService }: FtrProviderContext): void => { expect(hits).to.eql([undefined, undefined, undefined, undefined]); }); - it('should ignore the field of "testing_regex"', async () => { - const rule = getEqlRuleForSignalTesting(['ignore_fields']); + it('@skipInQA should ignore the field of "testing_regex"', async () => { + const rule = getEqlRuleForAlertTesting(['ignore_fields']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits.map((hit) => (hit._source as Ignore).testing_regex).sort(); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits.map((hit) => (hit._source as Ignore).testing_regex).sort(); // Value should be "undefined for all records" expect(hits).to.eql([undefined, undefined, undefined, undefined]); }); it('should have the field of "normal_constant"', async () => { - const rule = getEqlRuleForSignalTesting(['ignore_fields']); + const rule = getEqlRuleForAlertTesting(['ignore_fields']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits .map((hit) => (hit._source as Ignore).normal_constant) .sort(); @@ -115,13 +114,13 @@ export default ({ getService }: FtrProviderContext): void => { // TODO: Remove this test once https://github.com/elastic/elasticsearch/issues/77152 is fixed it('should ignore the field of "_ignored" when using EQL and index the data', async () => { - const rule = getEqlRuleForSignalTesting(['ignore_fields']); + const rule = getEqlRuleForAlertTesting(['ignore_fields']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits.map((hit) => (hit._source as Ignore).small_field).sort(); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits.map((hit) => (hit._source as Ignore).small_field).sort(); // We just test a constant value to ensure this did not blow up on us and did index data. expect(hits).to.eql([ diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/index.ts new file mode 100644 index 0000000000000..b497472e0b574 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Rule execution logic API', function () { + loadTestFile(require.resolve('./keyword_family')); + loadTestFile(require.resolve('./ignore_fields')); + loadTestFile(require.resolve('./runtime')); + loadTestFile(require.resolve('./execution_logic')); + loadTestFile(require.resolve('./timestamps')); + }); +} diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/README.md b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/README.md similarity index 100% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/README.md rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/README.md diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/const_keyword.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/const_keyword.ts similarity index 66% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/const_keyword.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/const_keyword.ts index 44c25e51ba11f..0e3d01dc1ca22 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/const_keyword.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/const_keyword.ts @@ -12,28 +12,27 @@ import { } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { ALERT_THRESHOLD_RESULT } from '@kbn/security-solution-plugin/common/field_maps/field_names'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; import { createRule, - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, - getEqlRuleForSignalTesting, - getRuleForSignalTesting, - getSignalsById, - getThresholdRuleForSignalTesting, + getEqlRuleForAlertTesting, + getRuleForAlertTesting, + getAlertsById, + getThresholdRuleForAlertTesting, waitForRuleSuccess, - waitForSignalsToBePresent, + waitForAlertsToBePresent, } 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('Rule detects against a keyword of event.dataset', () => { + describe('@ess @serverless Rule detects against a keyword of event.dataset', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/rule_keyword_family/const_keyword'); }); @@ -45,7 +44,7 @@ export default ({ getService }: FtrProviderContext) => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -54,28 +53,28 @@ export default ({ getService }: FtrProviderContext) => { }); describe('"kql" rule type', () => { - it('should detect the "dataset_name_1" from "event.dataset" and have 4 signals', async () => { + it('should detect the "dataset_name_1" from "event.dataset" and have 4 alerts', async () => { const rule = { - ...getRuleForSignalTesting(['const_keyword']), + ...getRuleForAlertTesting(['const_keyword']), query: 'event.dataset: "dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - expect(signalsOpen.hits.hits.length).to.eql(4); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + expect(alertsOpen.hits.hits.length).to.eql(4); }); - it('should copy the dataset_name_1 from the index into the signal', async () => { + it('should copy the dataset_name_1 from the index into the alert', async () => { const rule = { - ...getRuleForSignalTesting(['const_keyword']), + ...getRuleForAlertTesting(['const_keyword']), query: 'event.dataset: "dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); expect(hits).to.eql([ 'dataset_name_1', 'dataset_name_1', @@ -86,30 +85,30 @@ export default ({ getService }: FtrProviderContext) => { }); describe('"eql" rule type', () => { - it('should detect the "dataset_name_1" from "event.dataset" and have 4 signals', async () => { + it('should detect the "dataset_name_1" from "event.dataset" and have 4 alerts', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['const_keyword']), + ...getEqlRuleForAlertTesting(['const_keyword']), query: 'any where event.dataset=="dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - expect(signalsOpen.hits.hits.length).to.eql(4); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + expect(alertsOpen.hits.hits.length).to.eql(4); }); it('should copy the "dataset_name_1" from "event.dataset"', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['const_keyword']), + ...getEqlRuleForAlertTesting(['const_keyword']), query: 'any where event.dataset=="dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); expect(hits).to.eql([ 'dataset_name_1', 'dataset_name_1', @@ -122,7 +121,7 @@ export default ({ getService }: FtrProviderContext) => { describe('"threshold" rule type', async () => { it('should detect the "dataset_name_1" from "event.dataset"', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['const_keyword']), + ...getThresholdRuleForAlertTesting(['const_keyword']), threshold: { field: 'event.dataset', value: 1, @@ -130,9 +129,9 @@ export default ({ getService }: FtrProviderContext) => { }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 1, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits + await waitForAlertsToBePresent(supertest, log, 1, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits .map((hit) => hit._source?.[ALERT_THRESHOLD_RESULT] ?? null) .sort(); expect(hits).to.eql([ diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/index.ts similarity index 81% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/index.ts index 1ecb06fbed4e5..7244085b6eff2 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/index.ts @@ -5,9 +5,8 @@ * 2.0. */ -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default ({ loadTestFile }: FtrProviderContext): void => { describe('Detection keyword family data types', function () { loadTestFile(require.resolve('./keyword')); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/keyword.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/keyword.ts similarity index 72% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/keyword.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/keyword.ts index 39d62da77a1a8..5a4dbf0929425 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/keyword.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/keyword.ts @@ -13,21 +13,20 @@ import { ThresholdRuleCreateProps, } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { ALERT_THRESHOLD_RESULT } from '@kbn/security-solution-plugin/common/field_maps/field_names'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; import { createRule, - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, - getEqlRuleForSignalTesting, - getRuleForSignalTesting, - getSignalsById, - getThresholdRuleForSignalTesting, + getEqlRuleForAlertTesting, + getRuleForAlertTesting, + getAlertsById, + getThresholdRuleForAlertTesting, waitForRuleSuccess, - waitForSignalsToBePresent, + waitForAlertsToBePresent, } 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'); @@ -44,7 +43,7 @@ export default ({ getService }: FtrProviderContext) => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -52,17 +51,17 @@ export default ({ getService }: FtrProviderContext) => { await deleteAllRules(supertest, log); }); - describe('"kql" rule type', () => { + describe('@ess @serverless "kql" rule type', () => { it('should detect the "dataset_name_1" from "event.dataset"', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['keyword']), + ...getRuleForAlertTesting(['keyword']), query: 'event.dataset: "dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); expect(hits).to.eql([ 'dataset_name_1', 'dataset_name_1', @@ -75,15 +74,15 @@ export default ({ getService }: FtrProviderContext) => { describe('"eql" rule type', () => { it('should detect the "dataset_name_1" from "event.dataset"', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['keyword']), + ...getEqlRuleForAlertTesting(['keyword']), query: 'any where event.dataset=="dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); expect(hits).to.eql([ 'dataset_name_1', 'dataset_name_1', @@ -96,7 +95,7 @@ export default ({ getService }: FtrProviderContext) => { describe('"threshold" rule type', async () => { it('should detect the "dataset_name_1" from "event.dataset"', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['keyword']), + ...getThresholdRuleForAlertTesting(['keyword']), threshold: { field: 'event.dataset', value: 1, @@ -104,9 +103,9 @@ export default ({ getService }: FtrProviderContext) => { }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 1, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits + await waitForAlertsToBePresent(supertest, log, 1, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits .map((hit) => hit._source?.[ALERT_THRESHOLD_RESULT] ?? null) .sort(); expect(hits).to.eql([ diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/keyword_mixed_with_const.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/keyword_mixed_with_const.ts similarity index 69% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/keyword_mixed_with_const.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/keyword_mixed_with_const.ts index 50bbd7efde9f2..1353c0b6ca5ed 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/keyword_family/keyword_mixed_with_const.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/keyword_family/keyword_mixed_with_const.ts @@ -12,27 +12,26 @@ import { } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { ALERT_THRESHOLD_RESULT } from '@kbn/security-solution-plugin/common/field_maps/field_names'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; import { createRule, - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, - getEqlRuleForSignalTesting, - getRuleForSignalTesting, - getSignalsById, + getEqlRuleForAlertTesting, + getRuleForAlertTesting, + getAlertsById, waitForRuleSuccess, - waitForSignalsToBePresent, + waitForAlertsToBePresent, } 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('Rule detects against a keyword and constant_keyword of event.dataset', () => { + describe('@ess @serverless Rule detects against a keyword and constant_keyword of event.dataset', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/rule_keyword_family/const_keyword'); await esArchiver.load('x-pack/test/functional/es_archives/rule_keyword_family/keyword'); @@ -46,7 +45,7 @@ export default ({ getService }: FtrProviderContext) => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -55,28 +54,28 @@ export default ({ getService }: FtrProviderContext) => { }); describe('"kql" rule type', () => { - it('should detect the "dataset_name_1" from "event.dataset" and have 8 signals, 4 from each index', async () => { + it('should detect the "dataset_name_1" from "event.dataset" and have 8 alerts, 4 from each index', async () => { const rule = { - ...getRuleForSignalTesting(['keyword', 'const_keyword']), + ...getRuleForAlertTesting(['keyword', 'const_keyword']), query: 'event.dataset: "dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 8, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - expect(signalsOpen.hits.hits.length).to.eql(8); + await waitForAlertsToBePresent(supertest, log, 8, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + expect(alertsOpen.hits.hits.length).to.eql(8); }); - it('should copy the dataset_name_1 from the index into the signal', async () => { + it('should copy the dataset_name_1 from the index into the alert', async () => { const rule = { - ...getRuleForSignalTesting(['keyword', 'const_keyword']), + ...getRuleForAlertTesting(['keyword', 'const_keyword']), query: 'event.dataset: "dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 8, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); + await waitForAlertsToBePresent(supertest, log, 8, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); expect(hits).to.eql([ 'dataset_name_1', 'dataset_name_1', @@ -91,30 +90,30 @@ export default ({ getService }: FtrProviderContext) => { }); describe('"eql" rule type', () => { - it('should detect the "dataset_name_1" from "event.dataset" and have 8 signals, 4 from each index', async () => { + it('should detect the "dataset_name_1" from "event.dataset" and have 8 alerts, 4 from each index', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['keyword', 'const_keyword']), + ...getEqlRuleForAlertTesting(['keyword', 'const_keyword']), query: 'any where event.dataset=="dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 8, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - expect(signalsOpen.hits.hits.length).to.eql(8); + await waitForAlertsToBePresent(supertest, log, 8, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + expect(alertsOpen.hits.hits.length).to.eql(8); }); it('should copy the "dataset_name_1" from "event.dataset"', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['keyword', 'const_keyword']), + ...getEqlRuleForAlertTesting(['keyword', 'const_keyword']), query: 'any where event.dataset=="dataset_name_1"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 8, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); + await waitForAlertsToBePresent(supertest, log, 8, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.['event.dataset']).sort(); expect(hits).to.eql([ 'dataset_name_1', 'dataset_name_1', @@ -131,7 +130,7 @@ export default ({ getService }: FtrProviderContext) => { describe('"threshold" rule type', async () => { it('should detect the "dataset_name_1" from "event.dataset"', async () => { const rule: ThresholdRuleCreateProps = { - ...getRuleForSignalTesting(['keyword', 'const_keyword']), + ...getRuleForAlertTesting(['keyword', 'const_keyword']), rule_id: 'threshold-rule', type: 'threshold', language: 'kuery', @@ -143,9 +142,9 @@ export default ({ getService }: FtrProviderContext) => { }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 1, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits + await waitForAlertsToBePresent(supertest, log, 1, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits .map((hit) => hit._source?.[ALERT_THRESHOLD_RESULT] ?? null) .sort(); expect(hits).to.eql([ diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/runtime.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/runtime.ts similarity index 70% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group10/runtime.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/runtime.ts index 83c988c5ff9fd..030f2eafd6a1e 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/runtime.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/runtime.ts @@ -8,19 +8,18 @@ import expect from '@kbn/expect'; import { performance } from 'perf_hooks'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; import { createRule, - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, - getRuleForSignalTesting, - getSignalsById, + getRuleForAlertTesting, + getAlertsById, waitForRuleSuccess, - waitForSignalsToBePresent, + waitForAlertsToBePresent, } 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'); @@ -33,7 +32,7 @@ export default ({ getService }: FtrProviderContext) => { } // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/138923 - describe('Tests involving runtime fields of source indexes and the signals index', () => { + describe('@ess @serverless Tests involving runtime fields of source indexes and the alerts index', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/security_solution/runtime'); }); @@ -44,7 +43,7 @@ export default ({ getService }: FtrProviderContext) => { describe('Regular runtime field mappings', () => { beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -53,7 +52,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should execute a rule to completion and not timeout when there are a lot of runtime fields', async () => { - const rule = getRuleForSignalTesting(['runtime']); + const rule = getRuleForAlertTesting(['runtime']); const { id } = await createRule(supertest, log, rule); const start = performance.now(); await waitForRuleSuccess({ supertest, log, id }); @@ -61,26 +60,26 @@ export default ({ getService }: FtrProviderContext) => { expect(end - start).to.be.lessThan(10000); }); - it('should copy normal non-runtime data set from the source index into the signals index in the same position when the target is ECS compatible', async () => { - const rule = getRuleForSignalTesting(['runtime']); + it('should copy normal non-runtime data set from the source index into the alerts index in the same position when the target is ECS compatible', async () => { + const rule = getRuleForAlertTesting(['runtime']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits - .map((signal) => (signal._source?.host as Runtime).name) + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits + .map((alert) => (alert._source?.host as Runtime).name) .sort(); expect(hits).to.eql(['host name 1', 'host name 2', 'host name 3', 'host name 4']); }); - it('should copy "runtime mapping" data from a source index into the signals index in the same position when the target is ECS compatible', async () => { - const rule = getRuleForSignalTesting(['runtime']); + it('should copy "runtime mapping" data from a source index into the alerts index in the same position when the target is ECS compatible', async () => { + const rule = getRuleForAlertTesting(['runtime']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits - .map((signal) => (signal._source?.host as Runtime).hostname) + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits + .map((alert) => (alert._source?.host as Runtime).hostname) .sort(); expect(hits).to.eql(['host name 1', 'host name 2', 'host name 3', 'host name 4']); }); @@ -88,7 +87,7 @@ export default ({ getService }: FtrProviderContext) => { describe('Runtime field mappings that have conflicts within them', () => { beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); await esArchiver.load( 'x-pack/test/functional/es_archives/security_solution/runtime_conflicting_fields' ); @@ -107,14 +106,14 @@ export default ({ getService }: FtrProviderContext) => { * risk with overwriting fields in the strategy we are currently using in detection engine. If you swap, change the strategies * because we decide to overwrite "_source" values with "fields", then expect to change this test. */ - it('should NOT copy normal non-runtime data set from the source index into the signals index in the same position when the target is ECS compatible', async () => { - const rule = getRuleForSignalTesting(['runtime_conflicting_fields']); + it('should NOT copy normal non-runtime data set from the source index into the alerts index in the same position when the target is ECS compatible', async () => { + const rule = getRuleForAlertTesting(['runtime_conflicting_fields']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits - .map((signal) => signal._source?.host as Array<{ name: string }>) + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits + .map((alert) => alert._source?.host as Array<{ name: string }>) .map((host) => { // sort the inner array elements first return host.sort((a, b) => a.name.localeCompare(b.name)); @@ -164,15 +163,13 @@ export default ({ getService }: FtrProviderContext) => { * fields as arrays of objects since the objects are flattened in "fields" and we detect something already there so we skip * this shadowed runtime data as it is ambiguous of where we would put it in the array. */ - it('should NOT copy "runtime mapping" data from a source index into the signals index in the same position when the target is ECS compatible', async () => { - const rule = getRuleForSignalTesting(['runtime_conflicting_fields']); + it('should NOT copy "runtime mapping" data from a source index into the alerts index in the same position when the target is ECS compatible', async () => { + const rule = getRuleForAlertTesting(['runtime_conflicting_fields']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); - const signalsOpen = await getSignalsById(supertest, log, id); - const hits = signalsOpen.hits.hits.map( - (signal) => (signal._source?.host as Runtime).hostname - ); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + const alertsOpen = await getAlertsById(supertest, log, id); + const hits = alertsOpen.hits.hits.map((alert) => (alert._source?.host as Runtime).hostname); expect(hits).to.eql([undefined, undefined, undefined, undefined]); }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/timestamps.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/timestamps.ts similarity index 58% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group10/timestamps.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/timestamps.ts index ef27b7c7ff4bd..d7c645c115082 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/timestamps.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/timestamps.ts @@ -14,37 +14,41 @@ import { } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { ALERT_ORIGINAL_TIME } from '@kbn/security-solution-plugin/common/field_maps/field_names'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; import { - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, createRule, waitForRuleSuccess, - waitForSignalsToBePresent, - getOpenSignals, - getRuleForSignalTesting, - getSignalsByIds, - getEqlRuleForSignalTesting, + waitForAlertsToBePresent, + getOpenAlerts, + getRuleForAlertTesting, + getAlertsByIds, + getEqlRuleForAlertTesting, waitForRulePartialFailure, } 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 es = getService('es'); const log = getService('log'); - + // TODO: add a new service + const config = getService('config'); + const isServerless = config.get('serverless'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const path = dataPathBuilder.getPath('auditbeat/hosts'); /** - * Tests around timestamps within signals such as the copying of timestamps correctly into + * Tests around timestamps within alerts such as the copying of timestamps correctly into * the "signal.original_time" field, ensuring that timestamp overrides operate, and ensuring that * partial errors happen correctly */ - describe('timestamp tests', () => { - describe('Signals generated from events with a timestamp in seconds is converted correctly into the forced ISO8601 format when copying', () => { + describe('@ess @serverless timestamp tests', () => { + describe('alerts generated from events with a timestamp in seconds is converted correctly into the forced ISO8601 format when copying', () => { beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); await esArchiver.load( 'x-pack/test/functional/es_archives/security_solution/timestamp_in_seconds' ); @@ -66,58 +70,50 @@ export default ({ getService }: FtrProviderContext) => { describe('KQL query', () => { it('should convert the @timestamp which is epoch_seconds into the correct ISO format', async () => { - const rule = getRuleForSignalTesting(['timestamp_in_seconds']); + const rule = getRuleForAlertTesting(['timestamp_in_seconds']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 1, [id]); - const signalsOpen = await getSignalsByIds(supertest, log, [id]); - const hits = signalsOpen.hits.hits - .map((hit) => hit._source?.[ALERT_ORIGINAL_TIME]) - .sort(); + await waitForAlertsToBePresent(supertest, log, 1, [id]); + const alertsOpen = await getAlertsByIds(supertest, log, [id]); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.[ALERT_ORIGINAL_TIME]).sort(); expect(hits).to.eql(['2021-06-02T23:33:15.000Z']); }); it('should still use the @timestamp field even with an override field. It should never use the override field', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['myfakeindex-5']), + ...getRuleForAlertTesting(['myfakeindex-5']), timestamp_override: 'event.ingested', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 1, [id]); - const signalsOpen = await getSignalsByIds(supertest, log, [id]); - const hits = signalsOpen.hits.hits - .map((hit) => hit._source?.[ALERT_ORIGINAL_TIME]) - .sort(); + await waitForAlertsToBePresent(supertest, log, 1, [id]); + const alertsOpen = await getAlertsByIds(supertest, log, [id]); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.[ALERT_ORIGINAL_TIME]).sort(); expect(hits).to.eql(['2020-12-16T15:16:18.000Z']); }); }); describe('EQL query', () => { it('should convert the @timestamp which is epoch_seconds into the correct ISO format for EQL', async () => { - const rule = getEqlRuleForSignalTesting(['timestamp_in_seconds']); + const rule = getEqlRuleForAlertTesting(['timestamp_in_seconds']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 1, [id]); - const signalsOpen = await getSignalsByIds(supertest, log, [id]); - const hits = signalsOpen.hits.hits - .map((hit) => hit._source?.[ALERT_ORIGINAL_TIME]) - .sort(); + await waitForAlertsToBePresent(supertest, log, 1, [id]); + const alertsOpen = await getAlertsByIds(supertest, log, [id]); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.[ALERT_ORIGINAL_TIME]).sort(); expect(hits).to.eql(['2021-06-02T23:33:15.000Z']); }); it('should still use the @timestamp field even with an override field. It should never use the override field', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['myfakeindex-5']), + ...getEqlRuleForAlertTesting(['myfakeindex-5']), timestamp_override: 'event.ingested', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 1, [id]); - const signalsOpen = await getSignalsByIds(supertest, log, [id]); - const hits = signalsOpen.hits.hits - .map((hit) => hit._source?.[ALERT_ORIGINAL_TIME]) - .sort(); + await waitForAlertsToBePresent(supertest, log, 1, [id]); + const alertsOpen = await getAlertsByIds(supertest, log, [id]); + const hits = alertsOpen.hits.hits.map((hit) => hit._source?.[ALERT_ORIGINAL_TIME]).sort(); expect(hits).to.eql(['2020-12-16T15:16:18.000Z']); }); }); @@ -129,10 +125,10 @@ export default ({ getService }: FtrProviderContext) => { * If no timestamp override field exists in the indices but one was provided to the rule, * the rule's query will additionally search for events using the `@timestamp` field */ - describe('Signals generated from events with timestamp override field', async () => { + describe('alerts generated from events with timestamp override field', async () => { beforeEach(async () => { await deleteAllAlerts(supertest, log, es); - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); await esArchiver.load( 'x-pack/test/functional/es_archives/security_solution/timestamp_override_1' ); @@ -165,9 +161,9 @@ export default ({ getService }: FtrProviderContext) => { }); describe('KQL', () => { - it('should generate signals with event.ingested, @timestamp and (event.ingested + timestamp)', async () => { + it('should generate alerts with event.ingested, @timestamp and (event.ingested + timestamp)', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['myfa*']), + ...getRuleForAlertTesting(['myfa*']), timestamp_override: 'event.ingested', }; @@ -178,17 +174,17 @@ export default ({ getService }: FtrProviderContext) => { log, id, }); - await waitForSignalsToBePresent(supertest, log, 3, [id]); - const signalsResponse = await getSignalsByIds(supertest, log, [id], 3); - const signals = signalsResponse.hits.hits.map((hit) => hit._source); - const signalsOrderedByEventId = orderBy(signals, 'signal.parent.id', 'asc'); + await waitForAlertsToBePresent(supertest, log, 3, [id]); + const alertsResponse = await getAlertsByIds(supertest, log, [id], 3); + const alerts = alertsResponse.hits.hits.map((hit) => hit._source); + const alertsOrderedByEventId = orderBy(alerts, 'alert.parent.id', 'asc'); - expect(signalsOrderedByEventId.length).equal(3); + expect(alertsOrderedByEventId.length).equal(3); }); - it('should generate 2 signals with event.ingested when timestamp fallback is disabled', async () => { + it('should generate 2 alerts with event.ingested when timestamp fallback is disabled', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['myfa*']), + ...getRuleForAlertTesting(['myfa*']), rule_id: 'rule-without-timestamp-fallback', timestamp_override: 'event.ingested', timestamp_override_fallback_disabled: true, @@ -201,16 +197,16 @@ export default ({ getService }: FtrProviderContext) => { log, id, }); - await waitForSignalsToBePresent(supertest, log, 2, [id]); - const signalsResponse = await getSignalsByIds(supertest, log, [id], 2); - const signals = signalsResponse.hits.hits.map((hit) => hit._source); - const signalsOrderedByEventId = orderBy(signals, 'signal.parent.id', 'asc'); + await waitForAlertsToBePresent(supertest, log, 2, [id]); + const alertsResponse = await getAlertsByIds(supertest, log, [id], 2); + const alerts = alertsResponse.hits.hits.map((hit) => hit._source); + const alertsOrderedByEventId = orderBy(alerts, 'alert.parent.id', 'asc'); - expect(signalsOrderedByEventId.length).equal(2); + expect(alertsOrderedByEventId.length).equal(2); }); - it('should generate 2 signals with @timestamp', async () => { - const rule: QueryRuleCreateProps = getRuleForSignalTesting(['myfa*']); + it('should generate 2 alerts with @timestamp', async () => { + const rule: QueryRuleCreateProps = getRuleForAlertTesting(['myfa*']); const { id } = await createRule(supertest, log, rule); @@ -219,17 +215,17 @@ export default ({ getService }: FtrProviderContext) => { log, id, }); - await waitForSignalsToBePresent(supertest, log, 2, [id]); - const signalsResponse = await getSignalsByIds(supertest, log, [id]); - const signals = signalsResponse.hits.hits.map((hit) => hit._source); - const signalsOrderedByEventId = orderBy(signals, 'signal.parent.id', 'asc'); + await waitForAlertsToBePresent(supertest, log, 2, [id]); + const alertsResponse = await getAlertsByIds(supertest, log, [id]); + const alerts = alertsResponse.hits.hits.map((hit) => hit._source); + const alertsOrderedByEventId = orderBy(alerts, 'alert.parent.id', 'asc'); - expect(signalsOrderedByEventId.length).equal(2); + expect(alertsOrderedByEventId.length).equal(2); }); - it('should generate 2 signals when timestamp override does not exist', async () => { + it('should generate 2 alerts when timestamp override does not exist', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['myfa*']), + ...getRuleForAlertTesting(['myfa*']), timestamp_override: 'event.fakeingestfield', }; const { id } = await createRule(supertest, log, rule); @@ -239,50 +235,50 @@ export default ({ getService }: FtrProviderContext) => { log, id, }); - await waitForSignalsToBePresent(supertest, log, 2, [id]); - const signalsResponse = await getSignalsByIds(supertest, log, [id, id]); - const signals = signalsResponse.hits.hits.map((hit) => hit._source); - const signalsOrderedByEventId = orderBy(signals, 'signal.parent.id', 'asc'); + await waitForAlertsToBePresent(supertest, log, 2, [id]); + const alertsResponse = await getAlertsByIds(supertest, log, [id, id]); + const alerts = alertsResponse.hits.hits.map((hit) => hit._source); + const alertsOrderedByEventId = orderBy(alerts, 'alert.parent.id', 'asc'); - expect(signalsOrderedByEventId.length).equal(2); + expect(alertsOrderedByEventId.length).equal(2); }); - it('should not generate any signals when timestamp override does not exist and timestamp fallback is disabled', async () => { + it('should not generate any alerts when timestamp override does not exist and timestamp fallback is disabled', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['myfa*']), + ...getRuleForAlertTesting(['myfa*']), rule_id: 'rule-without-timestamp-fallback', timestamp_override: 'event.fakeingestfield', timestamp_override_fallback_disabled: true, }; const createdRule = await createRule(supertest, log, rule); - const signalsOpen = await getOpenSignals( + const alertsOpen = await getOpenAlerts( supertest, log, es, createdRule, RuleExecutionStatusEnum['partial failure'] ); - expect(signalsOpen.hits.hits.length).eql(0); + expect(alertsOpen.hits.hits.length).eql(0); }); /** * We should not use the timestamp override as the "original_time" as that can cause * confusion if you have both a timestamp and an override in the source event. Instead the "original_time" - * field should only be overridden by the "timestamp" since when we generate a signal - * and we add a new timestamp to the signal. + * field should only be overridden by the "timestamp" since when we generate a alert + * and we add a new timestamp to the alert. */ it('should NOT use the timestamp override as the "original_time"', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['myfakeindex-2']), + ...getRuleForAlertTesting(['myfakeindex-2']), timestamp_override: 'event.ingested', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 1, [id]); - const signalsResponse = await getSignalsByIds(supertest, log, [id, id]); - const hits = signalsResponse.hits.hits + await waitForAlertsToBePresent(supertest, log, 1, [id]); + const alertsResponse = await getAlertsByIds(supertest, log, [id, id]); + const hits = alertsResponse.hits.hits .map((hit) => hit._source?.[ALERT_ORIGINAL_TIME]) .sort(); expect(hits).to.eql([undefined]); @@ -290,8 +286,8 @@ export default ({ getService }: FtrProviderContext) => { }); describe('EQL', () => { - it('should generate 2 signals with @timestamp', async () => { - const rule: EqlRuleCreateProps = getEqlRuleForSignalTesting(['myfa*']); + it('should generate 2 alerts with @timestamp', async () => { + const rule: EqlRuleCreateProps = getEqlRuleForAlertTesting(['myfa*']); const { id } = await createRule(supertest, log, rule); @@ -300,17 +296,17 @@ export default ({ getService }: FtrProviderContext) => { log, id, }); - await waitForSignalsToBePresent(supertest, log, 2, [id]); - const signalsResponse = await getSignalsByIds(supertest, log, [id]); - const signals = signalsResponse.hits.hits.map((hit) => hit._source); - const signalsOrderedByEventId = orderBy(signals, 'signal.parent.id', 'asc'); + await waitForAlertsToBePresent(supertest, log, 2, [id]); + const alertsResponse = await getAlertsByIds(supertest, log, [id]); + const alerts = alertsResponse.hits.hits.map((hit) => hit._source); + const alertsOrderedByEventId = orderBy(alerts, 'alert.parent.id', 'asc'); - expect(signalsOrderedByEventId.length).equal(2); + expect(alertsOrderedByEventId.length).equal(2); }); - it('should generate 2 signals when timestamp override does not exist', async () => { + it('should generate 2 alerts when timestamp override does not exist', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['myfa*']), + ...getEqlRuleForAlertTesting(['myfa*']), timestamp_override: 'event.fakeingestfield', }; const { id } = await createRule(supertest, log, rule); @@ -320,44 +316,44 @@ export default ({ getService }: FtrProviderContext) => { log, id, }); - await waitForSignalsToBePresent(supertest, log, 2, [id]); - const signalsResponse = await getSignalsByIds(supertest, log, [id, id]); - const signals = signalsResponse.hits.hits.map((hit) => hit._source); - const signalsOrderedByEventId = orderBy(signals, 'signal.parent.id', 'asc'); + await waitForAlertsToBePresent(supertest, log, 2, [id]); + const alertsResponse = await getAlertsByIds(supertest, log, [id, id]); + const alerts = alertsResponse.hits.hits.map((hit) => hit._source); + const alertsOrderedByEventId = orderBy(alerts, 'alert.parent.id', 'asc'); - expect(signalsOrderedByEventId.length).equal(2); + expect(alertsOrderedByEventId.length).equal(2); }); - it('should not generate any signals when timestamp override does not exist and timestamp fallback is disabled', async () => { + it('should not generate any alerts when timestamp override does not exist and timestamp fallback is disabled', async () => { const rule: EqlRuleCreateProps = { - ...getEqlRuleForSignalTesting(['myfa*']), + ...getEqlRuleForAlertTesting(['myfa*']), timestamp_override: 'event.fakeingestfield', timestamp_override_fallback_disabled: true, }; const createdRule = await createRule(supertest, log, rule); - const signalsOpen = await getOpenSignals( + const alertsOpen = await getOpenAlerts( supertest, log, es, createdRule, RuleExecutionStatusEnum['partial failure'] ); - expect(signalsOpen.hits.hits.length).eql(0); + expect(alertsOpen.hits.hits.length).eql(0); }); }); }); - describe('Signals generated from events with timestamp override field and ensures search_after continues to work when documents are missing timestamp override field', () => { + describe('alerts generated from events with timestamp override field and ensures search_after continues to work when documents are missing timestamp override field', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.load(path); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.unload(path); }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -377,9 +373,9 @@ export default ({ getService }: FtrProviderContext) => { * * ref: https://github.com/elastic/elasticsearch/issues/28806#issuecomment-369303620 */ - it('should generate 200 signals when timestamp override does not exist', async () => { + it('should generate 200 alerts when timestamp override does not exist', async () => { const rule: QueryRuleCreateProps = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), timestamp_override: 'event.fakeingested', max_signals: 200, }; @@ -390,11 +386,11 @@ export default ({ getService }: FtrProviderContext) => { log, id, }); - await waitForSignalsToBePresent(supertest, log, 200, [id]); - const signalsResponse = await getSignalsByIds(supertest, log, [id], 200); - const signals = signalsResponse.hits.hits.map((hit) => hit._source); + await waitForAlertsToBePresent(supertest, log, 200, [id]); + const alertsResponse = await getAlertsByIds(supertest, log, [id], 200); + const alerts = alertsResponse.hits.hits.map((hit) => hit._source); - expect(signals.length).equal(200); + expect(alerts.length).equal(200); }); }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/README.md b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/README.md similarity index 100% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/README.md rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/README.md diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/configs/ess.config.ts similarity index 63% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group5/config.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/configs/ess.config.ts index 2430b8f2148d9..787542036e084 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group5/config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/configs/ess.config.ts @@ -7,12 +7,16 @@ import { FtrConfigProviderContext } from '@kbn/test'; -// eslint-disable-next-line import/no-default-export export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const functionalConfig = await readConfigFile(require.resolve('../config.base.ts')); + const functionalConfig = await readConfigFile( + require.resolve('../../../../../config/ess/config.base.trial') + ); return { ...functionalConfig.getAll(), - testFiles: [require.resolve('.')], + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine API Integration Tests - ESS - Telemetry', + }, }; } diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/configs/serverless.config.ts new file mode 100644 index 0000000000000..99bd2458c69a4 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/configs/serverless.config.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 { createTestConfig } from '../../../../../config/serverless/config.base'; + +export default createTestConfig({ + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine API Integration Tests - Serverless - Telemetry', + }, + kbnTestServerArgs: [ + `--xpack.securitySolution.enableExperimental=${JSON.stringify(['previewTelemetryUrlEnabled'])}`, + ], +}); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/index.ts similarity index 83% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/index.ts index 4e180f73dc742..5fef7869ba7c8 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/index.ts @@ -4,15 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { FtrProviderContext } from '../../../../ftr_provider_context'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; - -// eslint-disable-next-line import/no-default-export export default ({ loadTestFile }: FtrProviderContext): void => { describe('Detection rule type telemetry', function () { loadTestFile(require.resolve('./usage_collector/all_types')); loadTestFile(require.resolve('./usage_collector/detection_rules')); loadTestFile(require.resolve('./usage_collector/detection_rule_status')); + loadTestFile(require.resolve('./usage_collector/detection_rules_legacy_action')); loadTestFile(require.resolve('./task_based/all_types')); loadTestFile(require.resolve('./task_based/detection_rules')); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/task_based/all_types.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/task_based/all_types.ts similarity index 82% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/task_based/all_types.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/task_based/all_types.ts index 576f00b563724..26ac4627a0260 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/task_based/all_types.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/task_based/all_types.ts @@ -6,17 +6,18 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + import { - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, getSecurityTelemetryStats, removeTimeFieldsFromTelemetryStats, -} from '../../../../utils'; -import { deleteAllExceptions } from '../../../../../lists_api_integration/utils'; +} from '../../../utils'; +import { deleteAllExceptions } from '../../../../../../lists_api_integration/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'); @@ -24,7 +25,7 @@ export default ({ getService }: FtrProviderContext) => { const retry = getService('retry'); const es = getService('es'); - describe('All task telemetry types generically', async () => { + describe('@ess @serverless All task telemetry types generically', async () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/security_solution/telemetry'); }); @@ -34,7 +35,7 @@ export default ({ getService }: FtrProviderContext) => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -43,7 +44,7 @@ export default ({ getService }: FtrProviderContext) => { await deleteAllExceptions(supertest, log); }); - it('should only have task metric values when no rules are running', async () => { + it('@skipInQA should only have task metric values when no rules are running', async () => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); removeTimeFieldsFromTelemetryStats(stats); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/task_based/detection_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/task_based/detection_rules.ts similarity index 92% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/task_based/detection_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/task_based/detection_rules.ts index 684fc752c152e..bed9457c34707 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/task_based/detection_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/task_based/detection_rules.ts @@ -10,23 +10,22 @@ import expect from '@kbn/expect'; import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; import { ELASTIC_SECURITY_RULE_ID } from '@kbn/security-solution-plugin/common'; -import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import { createRule, - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, - getRule, - getRuleForSignalTesting, + fetchRule, + getRuleForAlertTesting, installMockPrebuiltRules, getSecurityTelemetryStats, createExceptionList, createExceptionListItem, removeTimeFieldsFromTelemetryStats, -} from '../../../../utils'; -import { deleteAllExceptions } from '../../../../../lists_api_integration/utils'; +} from '../../../utils'; +import { deleteAllExceptions } from '../../../../../../lists_api_integration/utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const es = getService('es'); const supertest = getService('supertest'); @@ -34,7 +33,7 @@ export default ({ getService }: FtrProviderContext) => { const log = getService('log'); const retry = getService('retry'); - describe('Detection rule task telemetry', async () => { + describe('@ess @serverless Detection rule task telemetry', async () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/security_solution/telemetry'); }); @@ -44,7 +43,7 @@ export default ({ getService }: FtrProviderContext) => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -54,8 +53,8 @@ export default ({ getService }: FtrProviderContext) => { }); describe('custom rules should never show any detection_rules telemetry data for each list type', () => { - it('should NOT give telemetry/stats for an exception list of type "detection"', async () => { - const rule = getRuleForSignalTesting(['telemetry'], 'rule-1', false); + it('@skipInQA should NOT give telemetry/stats for an exception list of type "detection"', async () => { + const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false); // create an exception list container of type "detection" const { id, list_id, namespace_type, type } = await createExceptionList(supertest, log, { @@ -110,8 +109,8 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should NOT give telemetry/stats for an exception list of type "endpoint"', async () => { - const rule = getRuleForSignalTesting(['telemetry'], 'rule-1', false); + it('@skipInQA should NOT give telemetry/stats for an exception list of type "endpoint"', async () => { + const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false); // create an exception list container of type "detection" const { id, list_id, namespace_type, type } = await createExceptionList(supertest, log, { @@ -166,8 +165,8 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should NOT give telemetry/stats for an exception list of type "endpoint_trusted_apps"', async () => { - const rule = getRuleForSignalTesting(['telemetry'], 'rule-1', false); + it('@skipInQA should NOT give telemetry/stats for an exception list of type "endpoint_trusted_apps"', async () => { + const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false); // create an exception list container of type "detection" const { id, list_id, namespace_type, type } = await createExceptionList(supertest, log, { @@ -222,8 +221,8 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should NOT give telemetry/stats for an exception list of type "endpoint_events"', async () => { - const rule = getRuleForSignalTesting(['telemetry'], 'rule-1', false); + it('@skipInQA should NOT give telemetry/stats for an exception list of type "endpoint_events"', async () => { + const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false); // create an exception list container of type "detection" const { id, list_id, namespace_type, type } = await createExceptionList(supertest, log, { @@ -278,8 +277,8 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should NOT give telemetry/stats for an exception list of type "endpoint_host_isolation_exceptions"', async () => { - const rule = getRuleForSignalTesting(['telemetry'], 'rule-1', false); + it('@skipInQA should NOT give telemetry/stats for an exception list of type "endpoint_host_isolation_exceptions"', async () => { + const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false); // create an exception list container of type "detection" const { id, list_id, namespace_type, type } = await createExceptionList(supertest, log, { @@ -335,7 +334,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - describe('pre-built/immutable/elastic rules should show detection_rules telemetry data for each list type', () => { + describe('@skipInQA pre-built/immutable/elastic rules should show detection_rules telemetry data for each list type', () => { beforeEach(async () => { // install prepackaged rules to get immutable rules for testing await installMockPrebuiltRules(supertest, es); @@ -368,7 +367,9 @@ export default ({ getService }: FtrProviderContext) => { }); // add the exception list to the pre-built/immutable/elastic rule using "PATCH" endpoint - const { exceptions_list } = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); + const { exceptions_list } = await fetchRule(supertest, { + ruleId: ELASTIC_SECURITY_RULE_ID, + }); await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') @@ -427,7 +428,7 @@ export default ({ getService }: FtrProviderContext) => { }); // add the exception list to the pre-built/immutable/elastic rule - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') @@ -504,7 +505,7 @@ export default ({ getService }: FtrProviderContext) => { }); // add the exception list to the pre-built/immutable/elastic rule - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') @@ -581,7 +582,7 @@ export default ({ getService }: FtrProviderContext) => { }); // add the exception list to the pre-built/immutable/elastic rule - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') @@ -658,7 +659,7 @@ export default ({ getService }: FtrProviderContext) => { }); // add the exception list to the pre-built/immutable/elastic rule - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') @@ -735,7 +736,7 @@ export default ({ getService }: FtrProviderContext) => { }); // add the exception list to the pre-built/immutable/elastic rule - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') @@ -786,7 +787,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - describe('pre-built/immutable/elastic rules should show detection_rules telemetry data for multiple list items and types', () => { + describe('@skipInQA pre-built/immutable/elastic rules should show detection_rules telemetry data for multiple list items and types', () => { beforeEach(async () => { // install prepackaged rules to get immutable rules for testing await installMockPrebuiltRules(supertest, es); @@ -836,7 +837,7 @@ export default ({ getService }: FtrProviderContext) => { }); // add the exception list to the pre-built/immutable/elastic rule - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/task_based/security_lists.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/task_based/security_lists.ts similarity index 97% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/task_based/security_lists.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/task_based/security_lists.ts index 50661a537472d..d654cba35902f 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/task_based/security_lists.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/task_based/security_lists.ts @@ -11,19 +11,18 @@ import { ENDPOINT_LIST_ID, ENDPOINT_TRUSTED_APPS_LIST_ID, } from '@kbn/securitysolution-list-constants'; -import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import { - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, getSecurityTelemetryStats, createExceptionListItem, createExceptionList, removeTimeFieldsFromTelemetryStats, -} from '../../../../utils'; -import { deleteAllExceptions } from '../../../../../lists_api_integration/utils'; +} from '../../../utils'; +import { deleteAllExceptions } from '../../../../../../lists_api_integration/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'); @@ -32,7 +31,7 @@ export default ({ getService }: FtrProviderContext) => { const es = getService('es'); // Failing: See https://github.com/elastic/kibana/issues/164334 - describe.skip('Security lists task telemetry', async () => { + describe.skip('@ess @serverless Security lists task telemetry', async () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/security_solution/telemetry'); }); @@ -42,7 +41,7 @@ export default ({ getService }: FtrProviderContext) => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); // Calling stats endpoint once like this guarantees that the trusted applications and exceptions lists are created for us. await getSecurityTelemetryStats(supertest, log); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/all_types.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/all_types.ts similarity index 80% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/all_types.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/all_types.ts index 503fcc3c1a5da..93e16cefa19ff 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/all_types.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/all_types.ts @@ -7,10 +7,10 @@ import expect from '@kbn/expect'; import { getInitialDetectionMetrics } from '@kbn/security-solution-plugin/server/usage/detections/get_initial_usage'; -import type { FtrProviderContext } from '../../../../common/ftr_provider_context'; -import { createSignalsIndex, deleteAllRules, deleteAllAlerts, getStats } from '../../../../utils'; -// eslint-disable-next-line import/no-default-export +import { createAlertsIndex, deleteAllRules, deleteAllAlerts, getStats } from '../../../utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; + export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); @@ -18,7 +18,7 @@ export default ({ getService }: FtrProviderContext) => { const retry = getService('retry'); const es = getService('es'); - describe('Detection rule telemetry', async () => { + describe('@ess @serverless @skipInQA Detection rule telemetry', async () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/security_solution/telemetry'); }); @@ -28,7 +28,7 @@ export default ({ getService }: FtrProviderContext) => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/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 similarity index 96% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/detection_rule_status.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rule_status.ts index 233244ff5a05d..6007c3d37c6dc 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/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 @@ -22,21 +22,20 @@ import { } from '@kbn/security-solution-plugin/server/usage/detections/rules/get_initial_usage'; import { createRule, - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, - getEqlRuleForSignalTesting, - getRuleForSignalTesting, + getEqlRuleForAlertTesting, + getRuleForAlertTesting, getSimpleThreatMatch, getStats, - getThresholdRuleForSignalTesting, + getThresholdRuleForAlertTesting, waitForRuleSuccess, - waitForSignalsToBePresent, + waitForAlertsToBePresent, deleteAllEventLogExecutionEvents, -} from '../../../../utils'; -import type { FtrProviderContext } from '../../../../common/ftr_provider_context'; +} 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'); @@ -46,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('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); @@ -58,7 +58,7 @@ export default ({ getService }: FtrProviderContext) => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -67,13 +67,14 @@ export default ({ getService }: FtrProviderContext) => { await deleteAllEventLogExecutionEvents(es, log); }); - describe('"kql" rule type', () => { + // FLAKY: https://github.com/elastic/kibana/issues/171438 + describe.skip('"kql" rule type', () => { let stats: DetectionMetrics | undefined; before(async () => { - const rule = getRuleForSignalTesting(['telemetry']); + const rule = getRuleForAlertTesting(['telemetry']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); // get the stats for all the tests where we at least have the expected "query" to reduce chances of flake by checking that at least one custom rule passed await retry.try(async () => { stats = await getStats(supertest, log); @@ -120,7 +121,7 @@ export default ({ getService }: FtrProviderContext) => { expect(stats?.detection_rules.detection_rule_usage).to.eql(expectedRuleUsage); }); - it('should have zero values for "detection_rule_status.all_rules" rules that are not query based', () => { + it('@skipInQA should have zero values for "detection_rule_status.all_rules" rules that are not query based', () => { expect(stats?.detection_rules.detection_rule_status.all_rules.eql).to.eql( getInitialSingleEventMetric() ); @@ -172,7 +173,7 @@ export default ({ getService }: FtrProviderContext) => { ); }); - it('should have non zero values for "index_duration"', () => { + it('@skipInQA should have non zero values for "index_duration"', () => { expect( stats?.detection_rules.detection_rule_status.custom_rules.query.index_duration.max ).to.be.above(1); @@ -205,11 +206,11 @@ export default ({ getService }: FtrProviderContext) => { ).to.be.above(1); }); - it('should have non zero values for "succeeded"', () => { + it('@skipInQA should have non zero values for "succeeded"', () => { expect(stats?.detection_rules.detection_rule_status.custom_rules.query.succeeded).to.eql(1); }); - it('should have non zero values for "succeeded", "index_duration", "search_duration" and "enrichment_duration"', () => { + it('@skipInQA should have non zero values for "succeeded", "index_duration", "search_duration" and "enrichment_duration"', () => { expect( stats?.detection_rules.detection_rule_status.custom_rules.query.index_duration.max ).to.be.above(1); @@ -257,10 +258,10 @@ export default ({ getService }: FtrProviderContext) => { describe('"eql" rule type', () => { let stats: DetectionMetrics | undefined; before(async () => { - const rule = getEqlRuleForSignalTesting(['telemetry']); + const rule = getEqlRuleForAlertTesting(['telemetry']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); // get the stats for all the tests where we at least have the expected "query" to reduce chances of flake by checking that at least one custom rule passed await retry.try(async () => { stats = await getStats(supertest, log); @@ -445,7 +446,7 @@ export default ({ getService }: FtrProviderContext) => { let stats: DetectionMetrics | undefined; before(async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['telemetry']), + ...getThresholdRuleForAlertTesting(['telemetry']), threshold: { field: 'keyword', value: 1, @@ -453,7 +454,7 @@ export default ({ getService }: FtrProviderContext) => { }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); // get the stats for all the tests where we at least have the expected "query" to reduce chances of flake by checking that at least one custom rule passed await retry.try(async () => { stats = await getStats(supertest, log); @@ -662,7 +663,7 @@ export default ({ getService }: FtrProviderContext) => { }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); // get the stats for all the tests where we at least have the expected "query" to reduce chances of flake by checking that at least one custom rule passed await retry.try(async () => { stats = await getStats(supertest, log); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/detection_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rules.ts similarity index 86% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/detection_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rules.ts index 652d13fd32a53..b81ced41b2511 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/telemetry/usage_collector/detection_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rules.ts @@ -14,34 +14,34 @@ import type { import { getInitialDetectionMetrics } from '@kbn/security-solution-plugin/server/usage/detections/get_initial_usage'; import { ELASTIC_SECURITY_RULE_ID } from '@kbn/security-solution-plugin/common'; import { RulesTypeUsage } from '@kbn/security-solution-plugin/server/usage/detections/rules/types'; -import type { FtrProviderContext } from '../../../../common/ftr_provider_context'; import { createLegacyRuleAction, - createNewAction, + createWebHookRuleAction, createRule, - createSignalsIndex, + createAlertsIndex, deleteAllRules, deleteAllAlerts, - getEqlRuleForSignalTesting, - getRule, - getRuleForSignalTesting, + getEqlRuleForAlertTesting, + fetchRule, + getRuleForAlertTesting, getRuleWithWebHookAction, getSimpleMlRule, getSimpleRule, getSimpleThreatMatch, getStats, - getThresholdRuleForSignalTesting, + getThresholdRuleForAlertTesting, installMockPrebuiltRules, waitForRuleSuccess, - waitForSignalsToBePresent, + waitForAlertsToBePresent, updateRule, deleteAllEventLogExecutionEvents, getRuleSavedObjectWithLegacyInvestigationFields, getRuleSavedObjectWithLegacyInvestigationFieldsEmptyArray, createRuleThroughAlertingEndpoint, -} from '../../../../utils'; +} 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'); @@ -49,7 +49,7 @@ export default ({ getService }: FtrProviderContext) => { const retry = getService('retry'); const es = getService('es'); - describe('Detection rule telemetry', async () => { + describe('@ess @serverless Detection rule 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); @@ -61,7 +61,7 @@ export default ({ getService }: FtrProviderContext) => { }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -72,7 +72,7 @@ export default ({ getService }: FtrProviderContext) => { describe('"kql" rule type', () => { it('should show "notifications_enabled", "notifications_disabled" "legacy_notifications_enabled", "legacy_notifications_disabled", all to be "0" for "disabled"/"in-active" rule that does not have any actions', async () => { - const rule = getRuleForSignalTesting(['telemetry'], 'rule-1', false); + const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false); await createRule(supertest, log, rule); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -102,10 +102,10 @@ export default ({ getService }: FtrProviderContext) => { }); it('should show "notifications_enabled", "notifications_disabled" "legacy_notifications_enabled", "legacy_notifications_disabled", all to be "0" for "enabled"/"active" rule that does not have any actions', async () => { - const rule = getRuleForSignalTesting(['telemetry']); + const rule = getRuleForAlertTesting(['telemetry']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); const expected: RulesTypeUsage = { @@ -136,8 +136,8 @@ export default ({ getService }: FtrProviderContext) => { }); it('should show "notifications_disabled" to be "1" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { - const rule = getRuleForSignalTesting(['telemetry']); - const hookAction = await createNewAction(supertest, log); + const rule = getRuleForAlertTesting(['telemetry']); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, false, rule); await createRule(supertest, log, ruleToCreate); @@ -160,13 +160,13 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "notifications_enabled" to be "1" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { - const rule = getRuleForSignalTesting(['telemetry']); - const hookAction = await createNewAction(supertest, log); + it('@brokenInServerless should show "notifications_enabled" to be "1" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { + const rule = getRuleForAlertTesting(['telemetry']); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, true, rule); const { id } = await createRule(supertest, log, ruleToCreate); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -189,10 +189,10 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { - const rule = getRuleForSignalTesting(['telemetry'], 'rule-1', false); + it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false); const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await retry.try(async () => { @@ -215,13 +215,13 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { - const rule = getRuleForSignalTesting(['telemetry']); + it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + const rule = getRuleForAlertTesting(['telemetry']); const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -244,7 +244,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - describe('legacy investigation fields', () => { + describe('@brokenInServerless legacy investigation fields', () => { beforeEach(async () => { await deleteAllRules(supertest, log); await createRuleThroughAlertingEndpoint( @@ -294,7 +294,7 @@ export default ({ getService }: FtrProviderContext) => { describe('"eql" rule type', () => { it('should show "notifications_enabled", "notifications_disabled" "legacy_notifications_enabled", "legacy_notifications_disabled", all to be "0" for "disabled"/"in-active" rule that does not have any actions', async () => { - const rule = getEqlRuleForSignalTesting(['telemetry'], 'rule-1', false); + const rule = getEqlRuleForAlertTesting(['telemetry'], 'rule-1', false); await createRule(supertest, log, rule); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -322,10 +322,10 @@ export default ({ getService }: FtrProviderContext) => { }); it('should show "notifications_enabled", "notifications_disabled" "legacy_notifications_enabled", "legacy_notifications_disabled", all to be "0" for "enabled"/"active" rule that does not have any actions', async () => { - const rule = getEqlRuleForSignalTesting(['telemetry']); + const rule = getEqlRuleForAlertTesting(['telemetry']); const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); const expected: RulesTypeUsage = { @@ -356,8 +356,8 @@ export default ({ getService }: FtrProviderContext) => { }); it('should show "notifications_disabled" to be "1" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { - const rule = getEqlRuleForSignalTesting(['telemetry']); - const hookAction = await createNewAction(supertest, log); + const rule = getEqlRuleForAlertTesting(['telemetry']); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, false, rule); await createRule(supertest, log, ruleToCreate); @@ -381,12 +381,12 @@ export default ({ getService }: FtrProviderContext) => { }); it('should show "notifications_enabled" to be "1" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { - const rule = getEqlRuleForSignalTesting(['telemetry']); - const hookAction = await createNewAction(supertest, log); + const rule = getEqlRuleForAlertTesting(['telemetry']); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, true, rule); const { id } = await createRule(supertest, log, ruleToCreate); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -409,10 +409,10 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { - const rule = getEqlRuleForSignalTesting(['telemetry'], 'rule-1', false); + it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + const rule = getEqlRuleForAlertTesting(['telemetry'], 'rule-1', false); const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await retry.try(async () => { @@ -434,13 +434,13 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { - const rule = getEqlRuleForSignalTesting(['telemetry']); + it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + const rule = getEqlRuleForAlertTesting(['telemetry']); const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -467,7 +467,7 @@ export default ({ getService }: FtrProviderContext) => { describe('"threshold" rule type', () => { it('should show "notifications_enabled", "notifications_disabled" "legacy_notifications_enabled", "legacy_notifications_disabled", all to be "0" for "disabled"/"in-active" rule that does not have any actions', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['telemetry'], 'rule-1', false), + ...getThresholdRuleForAlertTesting(['telemetry'], 'rule-1', false), threshold: { field: 'keyword', value: 1, @@ -503,7 +503,7 @@ export default ({ getService }: FtrProviderContext) => { it('should show "notifications_enabled", "notifications_disabled" "legacy_notifications_enabled", "legacy_notifications_disabled", all to be "0" for "enabled"/"active" rule that does not have any actions', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['telemetry']), + ...getThresholdRuleForAlertTesting(['telemetry']), threshold: { field: 'keyword', value: 1, @@ -511,7 +511,7 @@ export default ({ getService }: FtrProviderContext) => { }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); const expected: RulesTypeUsage = { @@ -543,13 +543,13 @@ export default ({ getService }: FtrProviderContext) => { it('should show "notifications_disabled" to be "1" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['telemetry'], 'rule-1', false), + ...getThresholdRuleForAlertTesting(['telemetry'], 'rule-1', false), threshold: { field: 'keyword', value: 1, }, }; - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, false, rule); await createRule(supertest, log, ruleToCreate); @@ -574,17 +574,17 @@ export default ({ getService }: FtrProviderContext) => { it('should show "notifications_enabled" to be "1" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['telemetry']), + ...getThresholdRuleForAlertTesting(['telemetry']), threshold: { field: 'keyword', value: 1, }, }; - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, true, rule); const { id } = await createRule(supertest, log, ruleToCreate); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -607,16 +607,16 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['telemetry'], 'rule-1', false), + ...getThresholdRuleForAlertTesting(['telemetry'], 'rule-1', false), threshold: { field: 'keyword', value: 1, }, }; const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await retry.try(async () => { @@ -638,19 +638,19 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { const rule: ThresholdRuleCreateProps = { - ...getThresholdRuleForSignalTesting(['telemetry']), + ...getThresholdRuleForAlertTesting(['telemetry']), threshold: { field: 'keyword', value: 1, }, }; const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -738,7 +738,7 @@ export default ({ getService }: FtrProviderContext) => { it('should show "notifications_disabled" to be "1" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { const rule = getSimpleMlRule(); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, false, rule); await createRule(supertest, log, ruleToCreate); @@ -763,7 +763,7 @@ export default ({ getService }: FtrProviderContext) => { it('should show "notifications_enabled" to be "1" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { const rule = getSimpleMlRule('rule-1', true); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, true, rule); await createRule(supertest, log, ruleToCreate); @@ -786,10 +786,10 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { const rule = getSimpleMlRule(); const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await retry.try(async () => { @@ -811,10 +811,10 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { const rule = getSimpleMlRule('rule-1', true); const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await retry.try(async () => { @@ -887,7 +887,7 @@ export default ({ getService }: FtrProviderContext) => { }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); const expected: RulesTypeUsage = { @@ -919,7 +919,7 @@ export default ({ getService }: FtrProviderContext) => { it('should show "notifications_disabled" to be "1" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { const rule = getSimpleThreatMatch(); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, false, rule); await createRule(supertest, log, ruleToCreate); @@ -959,11 +959,11 @@ export default ({ getService }: FtrProviderContext) => { }, ], }; - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); const ruleToCreate = getRuleWithWebHookAction(hookAction.id, true, rule); const { id } = await createRule(supertest, log, ruleToCreate); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -986,10 +986,10 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + it('@brokenInServerless should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { const rule = getSimpleThreatMatch(); const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await retry.try(async () => { @@ -1011,7 +1011,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + it('@brokenInServerless should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { const rule: ThreatMatchRuleCreateProps = { ...getSimpleThreatMatch('rule-1', true), index: ['telemetry'], @@ -1029,10 +1029,10 @@ export default ({ getService }: FtrProviderContext) => { ], }; const { id } = await createRule(supertest, log, rule); - const hookAction = await createNewAction(supertest, log); + const hookAction = await createWebHookRuleAction(supertest); await createLegacyRuleAction(supertest, id, hookAction.id); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 4, [id]); + await waitForAlertsToBePresent(supertest, log, 4, [id]); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -1057,7 +1057,7 @@ export default ({ getService }: FtrProviderContext) => { }); describe('"pre-packaged"/"immutable" rules', async () => { - it('should show stats for totals for in-active pre-packaged rules', async () => { + it('@skipInQA should show stats for totals for in-active pre-packaged rules', async () => { await installMockPrebuiltRules(supertest, es); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -1090,7 +1090,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show stats for the detection_rule_details for a specific pre-packaged rule', async () => { + it('@skipInQA should show stats for the detection_rule_details for a specific pre-packaged rule', async () => { await installMockPrebuiltRules(supertest, es); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -1121,13 +1121,13 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "notifications_disabled" to be "1", "has_notification" to be "true, "has_legacy_notification" to be "false" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { + it('@skipInQA should show "notifications_disabled" to be "1", "has_notification" to be "true, "has_legacy_notification" to be "false" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { await installMockPrebuiltRules(supertest, es); - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); - const hookAction = await createNewAction(supertest, log); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); + const hookAction = await createWebHookRuleAction(supertest); const newRuleToUpdate = getSimpleRule(immutableRule.rule_id); const ruleToUpdate = getRuleWithWebHookAction(hookAction.id, false, newRuleToUpdate); - await updateRule(supertest, log, ruleToUpdate); + await updateRule(supertest, ruleToUpdate); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -1174,13 +1174,13 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "notifications_enabled" to be "1", "has_notification" to be "true, "has_legacy_notification" to be "false" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { + it('@skipInQA should show "notifications_enabled" to be "1", "has_notification" to be "true, "has_legacy_notification" to be "false" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { await installMockPrebuiltRules(supertest, es); - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); - const hookAction = await createNewAction(supertest, log); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); + const hookAction = await createWebHookRuleAction(supertest); const newRuleToUpdate = getSimpleRule(immutableRule.rule_id); const ruleToUpdate = getRuleWithWebHookAction(hookAction.id, true, newRuleToUpdate); - await updateRule(supertest, log, ruleToUpdate); + await updateRule(supertest, ruleToUpdate); await retry.try(async () => { const stats = await getStats(supertest, log); @@ -1227,12 +1227,12 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_disabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { + it('@brokenInServerless should show "legacy_notifications_disabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { await installMockPrebuiltRules(supertest, es); - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); - const hookAction = await createNewAction(supertest, log); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); + const hookAction = await createWebHookRuleAction(supertest); const newRuleToUpdate = getSimpleRule(immutableRule.rule_id, false); - await updateRule(supertest, log, newRuleToUpdate); + await updateRule(supertest, newRuleToUpdate); await createLegacyRuleAction(supertest, immutableRule.id, hookAction.id); await retry.try(async () => { @@ -1280,12 +1280,12 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('should show "legacy_notifications_enabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { + it('@brokenInServerless should show "legacy_notifications_enabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { await installMockPrebuiltRules(supertest, es); - const immutableRule = await getRule(supertest, log, ELASTIC_SECURITY_RULE_ID); - const hookAction = await createNewAction(supertest, log); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); + const hookAction = await createWebHookRuleAction(supertest); const newRuleToUpdate = getSimpleRule(immutableRule.rule_id, true); - await updateRule(supertest, log, newRuleToUpdate); + await updateRule(supertest, newRuleToUpdate); await createLegacyRuleAction(supertest, immutableRule.id, hookAction.id); await retry.try(async () => { diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rules_legacy_action.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rules_legacy_action.ts new file mode 100644 index 0000000000000..b0e40253bb8c2 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rules_legacy_action.ts @@ -0,0 +1,512 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { + ThreatMatchRuleCreateProps, + ThresholdRuleCreateProps, +} from '@kbn/security-solution-plugin/common/api/detection_engine'; +import { getInitialDetectionMetrics } from '@kbn/security-solution-plugin/server/usage/detections/get_initial_usage'; +import { ELASTIC_SECURITY_RULE_ID } from '@kbn/security-solution-plugin/common'; +import { RulesTypeUsage } from '@kbn/security-solution-plugin/server/usage/detections/rules/types'; +import { + createLegacyRuleAction, + createWebHookRuleAction, + createRule, + createAlertsIndex, + deleteAllRules, + deleteAllAlerts, + getEqlRuleForAlertTesting, + fetchRule, + getRuleForAlertTesting, + getRuleWithWebHookAction, + getSimpleMlRule, + getSimpleRule, + getSimpleThreatMatch, + getStats, + getThresholdRuleForAlertTesting, + installMockPrebuiltRules, + waitForRuleSuccess, + waitForAlertsToBePresent, + updateRule, + deleteAllEventLogExecutionEvents, +} 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 retry = getService('retry'); + const es = getService('es'); + + describe('@ess Detection rule legacy actions 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); + await esArchiver.load('x-pack/test/functional/es_archives/security_solution/telemetry'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/security_solution/telemetry'); + }); + + beforeEach(async () => { + await createAlertsIndex(supertest, log); + }); + + afterEach(async () => { + await deleteAllAlerts(supertest, log, es); + await deleteAllRules(supertest, log); + await deleteAllEventLogExecutionEvents(es, log); + }); + + describe('"kql" rule type', () => { + it('should show "notifications_enabled" to be "1" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { + const rule = getRuleForAlertTesting(['telemetry']); + const hookAction = await createWebHookRuleAction(supertest); + const ruleToCreate = getRuleWithWebHookAction(hookAction.id, true, rule); + const { id } = await createRule(supertest, log, ruleToCreate); + await waitForRuleSuccess({ supertest, log, id }); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + query: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.query, + enabled: 1, + alerts: 4, + notifications_enabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + enabled: 1, + alerts: 4, + notifications_enabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + + it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + const rule = getRuleForAlertTesting(['telemetry'], 'rule-1', false); + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + query: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.query, + disabled: 1, + legacy_notifications_disabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + disabled: 1, + legacy_notifications_disabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + + it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + const rule = getRuleForAlertTesting(['telemetry']); + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + await waitForRuleSuccess({ supertest, log, id }); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + query: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.query, + alerts: 4, + enabled: 1, + legacy_notifications_enabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + alerts: 4, + enabled: 1, + legacy_notifications_enabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + }); + + describe('"eql" rule type', () => { + it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + const rule = getEqlRuleForAlertTesting(['telemetry'], 'rule-1', false); + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + eql: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.eql, + disabled: 1, + legacy_notifications_disabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + disabled: 1, + legacy_notifications_disabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + + it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + const rule = getEqlRuleForAlertTesting(['telemetry']); + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + await waitForRuleSuccess({ supertest, log, id }); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + eql: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.eql, + alerts: 4, + enabled: 1, + legacy_notifications_enabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + alerts: 4, + enabled: 1, + legacy_notifications_enabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + }); + + describe('"threshold" rule type', () => { + it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + const rule: ThresholdRuleCreateProps = { + ...getThresholdRuleForAlertTesting(['telemetry'], 'rule-1', false), + threshold: { + field: 'keyword', + value: 1, + }, + }; + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + threshold: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.threshold, + disabled: 1, + legacy_notifications_disabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + disabled: 1, + legacy_notifications_disabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + + it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + const rule: ThresholdRuleCreateProps = { + ...getThresholdRuleForAlertTesting(['telemetry']), + threshold: { + field: 'keyword', + value: 1, + }, + }; + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + await waitForRuleSuccess({ supertest, log, id }); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + threshold: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.threshold, + alerts: 4, + enabled: 1, + legacy_notifications_enabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + alerts: 4, + enabled: 1, + legacy_notifications_enabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + }); + + // Note: We don't actually find signals with these tests as we don't have a good way of signal finding with ML rules. + describe('"ml" rule type', () => { + it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + const rule = getSimpleMlRule(); + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + machine_learning: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.machine_learning, + disabled: 1, + legacy_notifications_disabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + disabled: 1, + legacy_notifications_disabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + + it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + const rule = getSimpleMlRule('rule-1', true); + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + machine_learning: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.machine_learning, + enabled: 1, + legacy_notifications_enabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + enabled: 1, + legacy_notifications_enabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + }); + + describe('"indicator_match/threat_match" rule type', () => { + it('should show "legacy_notifications_disabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "disabled"/"in-active"', async () => { + const rule = getSimpleThreatMatch(); + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + threat_match: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.threat_match, + disabled: 1, + legacy_notifications_disabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + disabled: 1, + legacy_notifications_disabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + + it('should show "legacy_notifications_enabled" to be "1" for rule that has at least "1" legacy action(s) and the alert is "enabled"/"active"', async () => { + const rule: ThreatMatchRuleCreateProps = { + ...getSimpleThreatMatch('rule-1', true), + index: ['telemetry'], + threat_index: ['telemetry'], + threat_mapping: [ + { + entries: [ + { + field: 'keyword', + value: 'keyword', + type: 'mapping', + }, + ], + }, + ], + }; + const { id } = await createRule(supertest, log, rule); + const hookAction = await createWebHookRuleAction(supertest); + await createLegacyRuleAction(supertest, id, hookAction.id); + await waitForRuleSuccess({ supertest, log, id }); + await waitForAlertsToBePresent(supertest, log, 4, [id]); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + const expected: RulesTypeUsage = { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage, + threat_match: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.threat_match, + alerts: 4, + enabled: 1, + legacy_notifications_enabled: 1, + }, + custom_total: { + ...getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total, + alerts: 4, + enabled: 1, + legacy_notifications_enabled: 1, + }, + }; + expect(stats.detection_rules.detection_rule_usage).to.eql(expected); + }); + }); + }); + + describe('"pre-packaged"/"immutable" rules', async () => { + it('should show "legacy_notifications_disabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "disabled"/"in-active"', async () => { + await installMockPrebuiltRules(supertest, es); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); + const hookAction = await createWebHookRuleAction(supertest); + const newRuleToUpdate = getSimpleRule(immutableRule.rule_id, false); + await updateRule(supertest, newRuleToUpdate); + await createLegacyRuleAction(supertest, immutableRule.id, hookAction.id); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + // We have to search by "rule_name" since the "rule_id" it is storing is the Saved Object ID and not the rule_id + const foundRule = stats.detection_rules.detection_rule_detail.find( + (rule) => rule.rule_id === ELASTIC_SECURITY_RULE_ID + ); + if (foundRule == null) { + throw new Error('Found rule should not be null. Please change this end to end test.'); + } + const { + created_on: createdOn, + updated_on: updatedOn, + rule_id: ruleId, + rule_version: ruleVersion, + ...omittedFields + } = foundRule; + expect(omittedFields).to.eql({ + rule_name: 'Simple Rule Query', + rule_type: 'query', + enabled: false, + elastic_rule: true, + alert_count_daily: 0, + cases_count_total: 0, + has_notification: false, + has_legacy_notification: true, + has_legacy_investigation_field: false, + }); + expect( + stats.detection_rules.detection_rule_usage.elastic_total.notifications_disabled + ).to.eql(0); + expect( + stats.detection_rules.detection_rule_usage.elastic_total.legacy_notifications_enabled + ).to.eql(0); + expect( + stats.detection_rules.detection_rule_usage.elastic_total.legacy_notifications_disabled + ).to.eql(1); + expect( + stats.detection_rules.detection_rule_usage.elastic_total.notifications_enabled + ).to.eql(0); + expect(stats.detection_rules.detection_rule_usage.custom_total).to.eql( + getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total + ); + }); + }); + + it('should show "legacy_notifications_enabled" to be "1", "has_notification" to be "false, "has_legacy_notification" to be "true" for rule that has at least "1" action(s) and the alert is "enabled"/"active"', async () => { + await installMockPrebuiltRules(supertest, es); + const immutableRule = await fetchRule(supertest, { ruleId: ELASTIC_SECURITY_RULE_ID }); + const hookAction = await createWebHookRuleAction(supertest); + const newRuleToUpdate = getSimpleRule(immutableRule.rule_id, true); + await updateRule(supertest, newRuleToUpdate); + await createLegacyRuleAction(supertest, immutableRule.id, hookAction.id); + + await retry.try(async () => { + const stats = await getStats(supertest, log); + // We have to search by "rule_name" since the "rule_id" it is storing is the Saved Object ID and not the rule_id + const foundRule = stats.detection_rules.detection_rule_detail.find( + (rule) => rule.rule_id === ELASTIC_SECURITY_RULE_ID + ); + if (foundRule == null) { + throw new Error('Found rule should not be null. Please change this end to end test.'); + } + const { + created_on: createdOn, + updated_on: updatedOn, + rule_id: ruleId, + rule_version: ruleVersion, + ...omittedFields + } = foundRule; + expect(omittedFields).to.eql({ + rule_name: 'Simple Rule Query', + rule_type: 'query', + enabled: true, + elastic_rule: true, + alert_count_daily: 0, + cases_count_total: 0, + has_notification: false, + has_legacy_notification: true, + has_legacy_investigation_field: false, + }); + expect( + stats.detection_rules.detection_rule_usage.elastic_total.notifications_disabled + ).to.eql(0); + expect( + stats.detection_rules.detection_rule_usage.elastic_total.legacy_notifications_enabled + ).to.eql(1); + expect( + stats.detection_rules.detection_rule_usage.elastic_total.legacy_notifications_disabled + ).to.eql(0); + expect( + stats.detection_rules.detection_rule_usage.elastic_total.notifications_enabled + ).to.eql(0); + expect(stats.detection_rules.detection_rule_usage.custom_total).to.eql( + getInitialDetectionMetrics().detection_rules.detection_rule_usage.custom_total + ); + }); + }); + }); + }); +}; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/configs/ess.config.ts similarity index 63% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/config.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/configs/ess.config.ts index 2430b8f2148d9..59e01e74c719c 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/configs/ess.config.ts @@ -7,12 +7,16 @@ import { FtrConfigProviderContext } from '@kbn/test'; -// eslint-disable-next-line import/no-default-export export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const functionalConfig = await readConfigFile(require.resolve('../config.base.ts')); + const functionalConfig = await readConfigFile( + require.resolve('../../../../../config/ess/config.base.trial') + ); return { ...functionalConfig.getAll(), - testFiles: [require.resolve('.')], + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine ESS - User roles API Integration Tests', + }, }; } diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/configs/serverless.config.ts new file mode 100644 index 0000000000000..d8e9843c3eb92 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/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'; + +export default createTestConfig({ + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine Serverless - User roles API Integration Tests', + }, +}); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/index.ts similarity index 55% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group4/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/index.ts index 9394e81017aba..7c1d0fe7cc751 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group4/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/index.ts @@ -4,12 +4,10 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { FtrProviderContext } from '../../../../ftr_provider_context'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; - -// eslint-disable-next-line import/no-default-export export default ({ loadTestFile }: FtrProviderContext): void => { - describe('detection engine api security and spaces enabled - Group 4', function () { - loadTestFile(require.resolve('./telemetry')); + describe('Detection User Roles APIs', function () { + loadTestFile(require.resolve('./read_privileges')); }); }; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/read_privileges.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/read_privileges.ts similarity index 98% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/group10/read_privileges.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/read_privileges.ts index b95c6771367f4..ee55d4ebfb331 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group10/read_privileges.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/read_privileges.ts @@ -9,15 +9,17 @@ import expect from '@kbn/expect'; import { DETECTION_ENGINE_PRIVILEGES_URL } from '@kbn/security-solution-plugin/common/constants'; import { ROLES } from '@kbn/security-solution-plugin/common/test'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { createUserAndRole, deleteUserAndRole } from '../../../common/services/security_solution'; +import { + createUserAndRole, + deleteUserAndRole, +} from '../../../../../common/services/security_solution'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const supertestWithoutAuth = getService('supertestWithoutAuth'); - describe('read_privileges', () => { + describe('@ess @serverless @brokenInServerless read_privileges', () => { it('should return expected privileges for elastic admin', async () => { const { body } = await supertest.get(DETECTION_ENGINE_PRIVILEGES_URL).send().expect(200); expect(body).to.eql({ diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/create_new_action.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/create_new_webhook_action.ts similarity index 87% rename from x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/create_new_action.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/create_new_webhook_action.ts index 1ddce1f07114c..79ea9738372f0 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/create_new_action.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/create_new_webhook_action.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { RuleAction } from '@kbn/security-solution-plugin/common/api/detection_engine'; import type SuperTest from 'supertest'; @@ -23,7 +24,7 @@ export const createWebHookRuleAction = async ( await supertest .post('/api/actions/action') .set('kbn-xsrf', 'true') - .set('x-elastic-internal-origin', 'foo') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'foo') .send(getWebHookAction()) .expect(200) ).body; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/index.ts index f91323f94de59..9accb2b089280 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/index.ts @@ -6,5 +6,5 @@ */ export * from './get_slack_action'; export * from './get_web_hook_action'; -export * from './create_new_action'; +export * from './create_new_webhook_action'; export * from './legacy_actions'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/get_preview_alerts.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/get_preview_alerts.ts new file mode 100644 index 0000000000000..744027c3fd4eb --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/get_preview_alerts.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Client } from '@elastic/elasticsearch'; +import { ALERT_RULE_UUID } from '@kbn/rule-data-utils'; +import { DetectionAlert } from '@kbn/security-solution-plugin/common/api/detection_engine'; +import { RiskEnrichmentFields } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/enrichments/types'; +import { refreshIndex } from '../refresh_index'; + +/** + * Refresh an index, making changes available to search. + * Useful for tests where we want to ensure that a rule does NOT create alerts, e.g. testing exceptions. + * @param es The ElasticSearch handle + */ +export const getPreviewAlerts = async ({ + es, + previewId, + size, + sort, +}: { + es: Client; + previewId: string; + size?: number; + sort?: string[]; +}) => { + const index = '.preview.alerts-security.alerts-*'; + await refreshIndex(es, index); + const query = { + bool: { + filter: { + term: { + [ALERT_RULE_UUID]: previewId, + }, + }, + }, + }; + const result = await es.search({ + index, + size, + query, + sort, + }); + return result.hits.hits; +}; 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 ce29837b34f6e..975c6ffa509cc 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 @@ -14,9 +14,10 @@ export * from './get_open_alerts'; export * from './get_alerts_by_ids'; export * from './get_query_alerts_ids'; export * from './get_alerts_by_id'; -export * from './remove_random_valued_properties'; +export * from './remove_random_valued_properties_from_alert'; export * from './set_alert_status'; 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 './migrations'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/remove_random_valued_properties.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/remove_random_valued_properties.ts deleted file mode 100644 index 8530c085e1a5d..0000000000000 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/remove_random_valued_properties.ts +++ /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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { DetectionAlert } from '@kbn/security-solution-plugin/common/api/detection_engine'; -import { ALERT_LAST_DETECTED, ALERT_START } from '@kbn/rule-data-utils'; - -export const removeRandomValuedProperties = (alert: DetectionAlert | undefined) => { - if (!alert) { - return undefined; - } - const { - 'kibana.version': version, - 'kibana.alert.rule.execution.uuid': execUuid, - 'kibana.alert.rule.uuid': uuid, - '@timestamp': timestamp, - 'kibana.alert.rule.created_at': createdAt, - 'kibana.alert.rule.updated_at': updatedAt, - 'kibana.alert.uuid': alertUuid, - [ALERT_START]: alertStart, - [ALERT_LAST_DETECTED]: lastDetected, - ...restOfAlert - } = alert; - return restOfAlert; -}; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/utils.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/remove_random_valued_properties_from_alert.ts similarity index 87% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/utils.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/remove_random_valued_properties_from_alert.ts index 8530c085e1a5d..3161fe1a61a6e 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/utils.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/remove_random_valued_properties_from_alert.ts @@ -8,7 +8,7 @@ import { DetectionAlert } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { ALERT_LAST_DETECTED, ALERT_START } from '@kbn/rule-data-utils'; -export const removeRandomValuedProperties = (alert: DetectionAlert | undefined) => { +export const removeRandomValuedPropertiesFromAlert = (alert: DetectionAlert | undefined) => { if (!alert) { return undefined; } @@ -20,6 +20,7 @@ export const removeRandomValuedProperties = (alert: DetectionAlert | undefined) 'kibana.alert.rule.created_at': createdAt, 'kibana.alert.rule.updated_at': updatedAt, 'kibana.alert.uuid': alertUuid, + 'kibana.alert.url': alertURL, [ALERT_START]: alertStart, [ALERT_LAST_DETECTED]: lastDetected, ...restOfAlert diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/event_log/delete_all_event_log_execution_events.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/event_log/delete_all_event_log_execution_events.ts new file mode 100644 index 0000000000000..998033d185486 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/event_log/delete_all_event_log_execution_events.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ToolingLog } from '@kbn/tooling-log'; +import type { Client } from '@elastic/elasticsearch'; + +import { countDownES } from '../count_down_es'; + +/** + * Remove all .kibana-event-log-* documents with an execution.uuid + * This will retry 50 times before giving up and hopefully still not interfere with other tests + * @param es The ElasticSearch handle + * @param log The tooling logger + */ +export const deleteAllEventLogExecutionEvents = async ( + es: Client, + log: ToolingLog +): Promise => { + return countDownES( + async () => { + return es.deleteByQuery( + { + index: '.kibana-event-log-*', + q: '_exists_:kibana.alert.rule.execution.uuid', + wait_for_completion: true, + refresh: true, + body: {}, + }, + { meta: true } + ); + }, + 'deleteAllEventLogExecutionEvents', + log + ); +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/event_log/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/event_log/index.ts new file mode 100644 index 0000000000000..c10ed51052bc3 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/event_log/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +export * from './delete_all_event_log_execution_events'; diff --git a/x-pack/test/detection_engine_api_integration/utils/get_detection_metrics_from_body.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/get_detection_metrics_from_body.ts similarity index 59% rename from x-pack/test/detection_engine_api_integration/utils/get_detection_metrics_from_body.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/get_detection_metrics_from_body.ts index 92e17ba61fe03..20febd5e9180f 100644 --- a/x-pack/test/detection_engine_api_integration/utils/get_detection_metrics_from_body.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/get_detection_metrics_from_body.ts @@ -6,7 +6,6 @@ */ import type { DetectionMetrics } from '@kbn/security-solution-plugin/server/usage/detections/types'; -import type { RiskEngineMetrics } from '@kbn/security-solution-plugin/server/usage/risk_engine/types'; /** * Given a body this will return the detection metrics from it. @@ -24,20 +23,3 @@ export const getDetectionMetricsFromBody = ( ): DetectionMetrics => { return body[0].stats.stack_stats.kibana.plugins.security_solution.detectionMetrics; }; - -/** - * Given a body this will return the risk engine metrics from it. - * @param body The Stats body - * @returns Detection metrics - */ -export const getRiskEngineMetricsFromBody = ( - body: Array<{ - stats: { - stack_stats: { - kibana: { plugins: { security_solution: { riskEngineMetrics: {} } } }; - }; - }; - }> -): RiskEngineMetrics => { - return body[0].stats.stack_stats.kibana.plugins.security_solution.riskEngineMetrics; -}; diff --git a/x-pack/test/detection_engine_api_integration/utils/get_stats.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/get_stats.ts similarity index 57% rename from x-pack/test/detection_engine_api_integration/utils/get_stats.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/get_stats.ts index d042bdc4d53f7..9415f6900a54f 100644 --- a/x-pack/test/detection_engine_api_integration/utils/get_stats.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/get_stats.ts @@ -8,17 +8,13 @@ import type { ToolingLog } from '@kbn/tooling-log'; import type SuperTest from 'supertest'; import type { DetectionMetrics } from '@kbn/security-solution-plugin/server/usage/detections/types'; -import type { RiskEngineMetrics } from '@kbn/security-solution-plugin/server/usage/risk_engine/types'; import { ELASTIC_HTTP_VERSION_HEADER, X_ELASTIC_INTERNAL_ORIGIN_REQUEST, } from '@kbn/core-http-common'; import { getStatsUrl } from './get_stats_url'; -import { - getDetectionMetricsFromBody, - getRiskEngineMetricsFromBody, -} from './get_detection_metrics_from_body'; +import { getDetectionMetricsFromBody } from './get_detection_metrics_from_body'; /** * Gets the stats from the stats endpoint. @@ -45,29 +41,3 @@ export const getStats = async ( return getDetectionMetricsFromBody(response.body); }; - -/** - * Gets the stats from the stats endpoint. - * @param supertest The supertest agent. - * @returns The detection metrics - */ -export const getRiskEngineStats = async ( - supertest: SuperTest.SuperTest, - log: ToolingLog -): Promise => { - const response = await supertest - .post(getStatsUrl()) - .set('kbn-xsrf', 'true') - .set(ELASTIC_HTTP_VERSION_HEADER, '2') - .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') - .send({ unencrypted: true, refreshCache: true }); - if (response.status !== 200) { - log.error( - `Did not get an expected 200 "ok" when getting the stats for risk engine. CI issues could happen. Suspect this line if you are seeing CI issues. body: ${JSON.stringify( - response.body - )}, status: ${JSON.stringify(response.status)}` - ); - } - - return getRiskEngineMetricsFromBody(response.body); -}; diff --git a/x-pack/test/detection_engine_api_integration/utils/get_stats_url.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/get_stats_url.ts similarity index 100% rename from x-pack/test/detection_engine_api_integration/utils/get_stats_url.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/get_stats_url.ts diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/index.ts index 9af5821d08ac3..0b7c66f57cb2a 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/index.ts @@ -9,12 +9,11 @@ export * from './exception_list_and_item'; export * from './alerts'; export * from './actions'; export * from './data_generator'; +export * from './telemetry'; +export * from './event_log'; +export * from './machine_learning'; -export * from './rules/get_rule_so_by_id'; -export * from './rules/create_rule_saved_object'; -export * from './rules/get_rule_with_legacy_investigation_fields'; export * from './get_index_name_from_load'; - export * from './count_down_test'; export * from './count_down_es'; export * from './update_username'; @@ -22,3 +21,6 @@ export * from './refresh_index'; export * from './wait_for'; export * from './route_with_namespace'; export * from './wait_for_index_to_populate'; +export * from './get_stats'; +export * from './get_detection_metrics_from_body'; +export * from './get_stats_url'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/machine_learning/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/machine_learning/index.ts new file mode 100644 index 0000000000000..6d6870b7ac92a --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/machine_learning/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +export * from './machine_learning_setup'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/machine_learning/machine_learning_setup.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/machine_learning/machine_learning_setup.ts new file mode 100644 index 0000000000000..d7c7e6387c739 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/machine_learning/machine_learning_setup.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type SuperTest from 'supertest'; +import { getCommonRequestHeader } from '../../../../../functional/services/ml/common_api'; + +export const executeSetupModuleRequest = async ({ + module, + rspCode, + supertest, +}: { + module: string; + rspCode: number; + supertest: SuperTest.SuperTest; +}) => { + const { body } = await supertest + .post(`/internal/ml/modules/setup/${module}`) + .set(getCommonRequestHeader('1')) + .send({ + prefix: '', + groups: ['auditbeat'], + indexPatternName: 'auditbeat-*', + startDatafeed: false, + useDedicatedIndex: true, + applyToAllSpaces: true, + }) + .expect(rspCode); + + return body; +}; + +export const forceStartDatafeeds = async ({ + jobId, + rspCode, + supertest, +}: { + jobId: string; + rspCode: number; + supertest: SuperTest.SuperTest; +}) => { + const { body } = await supertest + .post(`/internal/ml/jobs/force_start_datafeeds`) + .set(getCommonRequestHeader('1')) + .send({ + datafeedIds: [`datafeed-${jobId}`], + start: new Date().getUTCMilliseconds(), + }) + .expect(rspCode); + + return body; +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/create_legacy_rule_action.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/create_legacy_rule_action.ts new file mode 100644 index 0000000000000..8e0cb59d5ee90 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/create_legacy_rule_action.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type SuperTest from 'supertest'; + +import { UPDATE_OR_CREATE_LEGACY_ACTIONS } from '@kbn/security-solution-plugin/common/constants'; + +export const createLegacyRuleAction = async ( + supertest: SuperTest.SuperTest, + alertId: string, + connectorId: string +): Promise => + supertest + .post(UPDATE_OR_CREATE_LEGACY_ACTIONS) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '1') + .query({ alert_id: alertId }) + .send({ + name: 'Legacy notification with one action', + interval: '1h', + actions: [ + { + id: connectorId, + group: 'default', + params: { + message: 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: '.slack', + }, + ], + }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/create_rule.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/create_rule.ts index cd3fb09ced4e9..ac6e44b2aab83 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/create_rule.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/create_rule.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import type { ToolingLog } from '@kbn/tooling-log'; import type SuperTest from 'supertest'; import type { @@ -35,7 +36,7 @@ export const createRule = async ( const response = await supertest .post(route) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') .send(rule); if (response.status === 409) { if (rule.rule_id != null) { diff --git a/x-pack/test/detection_engine_api_integration/utils/create_rule_with_auth.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/create_rule_with_auth.ts similarity index 100% rename from x-pack/test/detection_engine_api_integration/utils/create_rule_with_auth.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/create_rule_with_auth.ts diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_rule_for_alert_testing.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_rule_for_alert_testing.ts index d6d51ebb52d00..5649031185feb 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_rule_for_alert_testing.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_rule_for_alert_testing.ts @@ -19,7 +19,7 @@ export const getRuleForAlertTesting = ( ruleId = 'rule-1', enabled = true ): QueryRuleCreateProps => ({ - name: 'Signal Testing Query', + name: 'Alert Testing Query', description: 'Tests a simple query', enabled, risk_score: 1, diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_rule_for_alert_testing_with_timestamp_override.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_rule_for_alert_testing_with_timestamp_override.ts new file mode 100644 index 0000000000000..86fc55bd29652 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_rule_for_alert_testing_with_timestamp_override.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { QueryRuleCreateProps } from '@kbn/security-solution-plugin/common/api/detection_engine'; + +export const getRuleForAlertTestingWithTimestampOverride = ( + index: string[], + ruleId = 'rule-1', + enabled = true, + timestampOverride = 'event.ingested' +): QueryRuleCreateProps => ({ + name: 'Alert Testing Query', + description: 'Tests a simple query', + enabled, + risk_score: 1, + rule_id: ruleId, + severity: 'high', + index, + type: 'query', + query: '*:*', + timestamp_override: timestampOverride, + from: '1900-01-01T00:00:00.000Z', +}); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_ml_rule.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_ml_rule.ts new file mode 100644 index 0000000000000..a8fe28d54f24e --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_ml_rule.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RuleCreateProps } from '@kbn/security-solution-plugin/common/api/detection_engine'; + +/** + * This is a representative ML rule payload as expected by the server + * @param ruleId The rule id + * @param enabled Set to tru to enable it, by default it is off + */ +export const getSimpleMlRule = (ruleId = 'rule-1', enabled = false): RuleCreateProps => ({ + name: 'Simple ML Rule', + description: 'Simple Machine Learning Rule', + enabled, + anomaly_threshold: 44, + risk_score: 1, + rule_id: ruleId, + severity: 'high', + machine_learning_job_id: ['some_job_id'], + type: 'machine_learning', +}); diff --git a/x-pack/test/detection_engine_api_integration/utils/get_simple_threat_match.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_threat_match.ts similarity index 100% rename from x-pack/test/detection_engine_api_integration/utils/get_simple_threat_match.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_threat_match.ts 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 3e22a15665fc2..db5ccb307395e 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 @@ -31,6 +31,13 @@ export * from './get_saved_query_rule_for_alert_testing'; export * from './get_rule_so_by_id'; export * from './create_rule_saved_object'; export * from './get_rule_with_legacy_investigation_fields'; +export * from './create_rule_with_auth'; +export * from './preview_rule'; +export * from './preview_rule_with_exception_entries'; +export * from './patch_rule'; export * from './generate_event'; +export * from './create_legacy_rule_action'; +export * from './get_simple_threat_match'; +export * from './get_simple_ml_rule'; export * from './prebuilt_rules'; diff --git a/x-pack/test/detection_engine_api_integration/utils/patch_rule.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/patch_rule.ts similarity index 100% rename from x-pack/test/detection_engine_api_integration/utils/patch_rule.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/patch_rule.ts diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/preview_rule.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/preview_rule.ts new file mode 100644 index 0000000000000..ec060c4076404 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/preview_rule.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 SuperTest from 'supertest'; +import type { + RuleCreateProps, + PreviewRulesSchema, + RulePreviewLogs, +} from '@kbn/security-solution-plugin/common/api/detection_engine'; + +import { DETECTION_ENGINE_RULES_PREVIEW } from '@kbn/security-solution-plugin/common/constants'; + +/** + * Runs the preview for a rule. Any generated alerts will be written to .preview.alerts. + * This is much faster than actually running the rule, and can also quickly simulate multiple + * consecutive rule runs, e.g. for ensuring that rule state is properly handled across runs. + * @param supertest The supertest deps + * @param rule The rule to create + */ +export const previewRule = async ({ + supertest, + rule, + invocationCount = 1, + timeframeEnd = new Date(), +}: { + supertest: SuperTest.SuperTest; + rule: RuleCreateProps; + invocationCount?: number; + timeframeEnd?: Date; +}): Promise<{ + previewId: string; + logs: RulePreviewLogs[]; + isAborted: boolean; +}> => { + const previewRequest: PreviewRulesSchema = { + ...rule, + invocationCount, + timeframeEnd: timeframeEnd.toISOString(), + }; + const response = await supertest + .post(DETECTION_ENGINE_RULES_PREVIEW) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '2023-10-31') + .send(previewRequest) + .expect(200); + return response.body; +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/preview_rule_with_exception_entries.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/preview_rule_with_exception_entries.ts new file mode 100644 index 0000000000000..fb5d480bbbffc --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/preview_rule_with_exception_entries.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ToolingLog } from '@kbn/tooling-log'; +import type SuperTest from 'supertest'; +import type { NonEmptyEntriesArray, OsTypeArray } from '@kbn/securitysolution-io-ts-list-types'; +import type { RuleCreateProps } from '@kbn/security-solution-plugin/common/api/detection_engine'; + +import { + createContainerWithEntries, + createContainerWithEndpointEntries, +} from '../exception_list_and_item'; +import { previewRule } from './preview_rule'; + +/** + * Convenience testing function where you can pass in just the entries and you will + * get a rule created with the entries added to an exception list and exception list item + * all auto-created at once. + * @param supertest super test agent + * @param rule The rule to create and attach an exception list to + * @param entries The entries to create the rule and exception list from + * @param endpointEntries The endpoint entries to create the rule and exception list from + * @param osTypes The os types to optionally add or not to add to the container + */ +export const previewRuleWithExceptionEntries = async ({ + supertest, + log, + rule, + entries, + endpointEntries, + invocationCount, + timeframeEnd, +}: { + supertest: SuperTest.SuperTest; + log: ToolingLog; + rule: RuleCreateProps; + entries: NonEmptyEntriesArray[]; + endpointEntries?: Array<{ + entries: NonEmptyEntriesArray; + osTypes: OsTypeArray | undefined; + }>; + invocationCount?: number; + timeframeEnd?: Date; +}) => { + const maybeExceptionList = await createContainerWithEntries(supertest, log, entries); + const maybeEndpointList = await createContainerWithEndpointEntries( + supertest, + log, + endpointEntries ?? [] + ); + + return previewRule({ + supertest, + rule: { + ...rule, + exceptions_list: [...maybeExceptionList, ...maybeEndpointList], + }, + invocationCount, + timeframeEnd, + }); +}; diff --git a/x-pack/test/detection_engine_api_integration/utils/get_security_telemetry_stats.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/get_security_telemetry_stats.ts similarity index 86% rename from x-pack/test/detection_engine_api_integration/utils/get_security_telemetry_stats.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/get_security_telemetry_stats.ts index 7eb00b7ff3138..462cdecbb498d 100644 --- a/x-pack/test/detection_engine_api_integration/utils/get_security_telemetry_stats.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/get_security_telemetry_stats.ts @@ -9,6 +9,10 @@ import type { ToolingLog } from '@kbn/tooling-log'; import type SuperTest from 'supertest'; import { SECURITY_TELEMETRY_URL } from '@kbn/security-solution-plugin/common/constants'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; /** * Gets the stats from the stats endpoint within specifically the security_solutions application. @@ -23,7 +27,8 @@ export const getSecurityTelemetryStats = async ( const response = await supertest .get(SECURITY_TELEMETRY_URL) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') + .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ unencrypted: true, refreshCache: true }); if (response.status !== 200) { log.error( diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/index.ts new file mode 100644 index 0000000000000..c784edd7f618b --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/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 './get_security_telemetry_stats'; +export * from './remove_time_fields_from_telemetry_stats'; diff --git a/x-pack/test/detection_engine_api_integration/utils/remove_time_fields_from_telemetry_stats.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/remove_time_fields_from_telemetry_stats.ts similarity index 100% rename from x-pack/test/detection_engine_api_integration/utils/remove_time_fields_from_telemetry_stats.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/remove_time_fields_from_telemetry_stats.ts diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/wait_for_index_to_populate.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/wait_for_index_to_populate.ts index 74e3e8a253769..ceba42efd1793 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/wait_for_index_to_populate.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/wait_for_index_to_populate.ts @@ -7,7 +7,7 @@ import type { ToolingLog } from '@kbn/tooling-log'; import type { Client } from '@elastic/elasticsearch'; -import { waitFor } from '../../../../detection_engine_api_integration/utils/wait_for'; +import { waitFor } from './wait_for'; /** * Waits for the given index to contain documents diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/get_risk_engine_metrics_from_body.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/get_risk_engine_metrics_from_body.ts new file mode 100644 index 0000000000000..c8ec19e448402 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/get_risk_engine_metrics_from_body.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { RiskEngineMetrics } from '@kbn/security-solution-plugin/server/usage/risk_engine/types'; + +/** + * Given a body this will return the risk engine metrics from it. + * @param body The Stats body + * @returns Detection metrics + */ +export const getRiskEngineMetricsFromBody = ( + body: Array<{ + stats: { + stack_stats: { + kibana: { plugins: { security_solution: { riskEngineMetrics: {} } } }; + }; + }; + }> +): RiskEngineMetrics => { + return body[0].stats.stack_stats.kibana.plugins.security_solution.riskEngineMetrics; +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/get_risk_engine_stats.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/get_risk_engine_stats.ts index c5343372ce99a..5629e0da9a89d 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/get_risk_engine_stats.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/get_risk_engine_stats.ts @@ -7,44 +7,14 @@ import type { ToolingLog } from '@kbn/tooling-log'; import type SuperTest from 'supertest'; -import type { DetectionMetrics } from '@kbn/security-solution-plugin/server/usage/detections/types'; import type { RiskEngineMetrics } from '@kbn/security-solution-plugin/server/usage/risk_engine/types'; import { ELASTIC_HTTP_VERSION_HEADER, X_ELASTIC_INTERNAL_ORIGIN_REQUEST, } from '@kbn/core-http-common'; -import { getStatsUrl } from '../../../../detection_engine_api_integration/utils/get_stats_url'; -import { - getDetectionMetricsFromBody, - getRiskEngineMetricsFromBody, -} from '../../../../detection_engine_api_integration/utils/get_detection_metrics_from_body'; - -/** - * Gets the stats from the stats endpoint. - * @param supertest The supertest agent. - * @returns The detection metrics - */ -export const getStats = async ( - supertest: SuperTest.SuperTest, - log: ToolingLog -): Promise => { - const response = await supertest - .post(getStatsUrl()) - .set('kbn-xsrf', 'true') - .set(ELASTIC_HTTP_VERSION_HEADER, '2') - .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') - .send({ unencrypted: true, refreshCache: true }); - if (response.status !== 200) { - log.error( - `Did not get an expected 200 "ok" when getting the stats for detections. CI issues could happen. Suspect this line if you are seeing CI issues. body: ${JSON.stringify( - response.body - )}, status: ${JSON.stringify(response.status)}` - ); - } - - return getDetectionMetricsFromBody(response.body); -}; +import { getStatsUrl } from '../../detections_response/utils/get_stats_url'; +import { getRiskEngineMetricsFromBody } from './get_risk_engine_metrics_from_body'; /** * Gets the stats from the stats endpoint. diff --git a/x-pack/test/security_solution_api_integration/tsconfig.json b/x-pack/test/security_solution_api_integration/tsconfig.json index 4dfd3ef6ba30d..782bc4fd46b32 100644 --- a/x-pack/test/security_solution_api_integration/tsconfig.json +++ b/x-pack/test/security_solution_api_integration/tsconfig.json @@ -30,6 +30,8 @@ "@kbn/core-saved-objects-server", "@kbn/core", "@kbn/alerting-plugin", + "@kbn/securitysolution-ecs", + "@kbn/securitysolution-rules", "@kbn/core-http-common", "@kbn/securitysolution-ecs", "@kbn/fleet-plugin", diff --git a/x-pack/test/security_solution_cypress/cypress/README.md b/x-pack/test/security_solution_cypress/cypress/README.md index c85ba1bea305f..8940d6c86e73e 100644 --- a/x-pack/test/security_solution_cypress/cypress/README.md +++ b/x-pack/test/security_solution_cypress/cypress/README.md @@ -42,11 +42,10 @@ Please, before opening a PR with the new test, please make sure that the test fa Note that we use tags in order to select which tests we want to execute: -- `@serverless` includes a test in the Serverless test suite for PRs (the so-called first quality gate). You need to explicitly add this tag to any test you want to run in CI for open PRs. These tests will run against a local, "simulated" serverless environment. -- `@serverlessQA` includes a test in the Serverless test suite for QA (the so-called second quality gate). You need to explicitly add this tag to any test you want to run in the CD pipeline against real serverless projects deployed in the Serverless QA environment. - - **NOTE:** We are adding this tag temporarily until we check the behavior of our tests in the second quality gate. +- `@serverless` includes a test in the Serverless test suite for PRs (the so-called first quality gate) and QA environemnt (the so-called second quality gate). You need to explicitly add this tag to any test you want to run in CI for serverless. - `@ess` includes a test in the normal, non-Serverless test suite. You need to explicitly add this tag to any test you want to run against a non-Serverless environment. - `@brokenInServerless` excludes a test from the Serverless test suite (even if it's tagged as `@serverless`). Indicates that a test should run in Serverless, but currently is broken. +- `@brokenInServerlessQA` excludes a test form the Serverless QA enviornment (second quality gate). Indicates that a test should run on it, but currently is broken. - `@skipInServerless` excludes a test from the Serverless test suite (even if it's tagged as `@serverless`). Could indicate many things, e.g. "the test is flaky in Serverless", "the test is Flaky in any type of environemnt", "the test has been temporarily excluded, see the comment above why". Please, before opening a PR with a new test, make sure that the test fails. If you never see your test fail you don’t know if your test is actually testing the right thing, or testing anything at all. @@ -72,6 +71,10 @@ Run the tests with the following yarn scripts from `x-pack/test/security_solutio | cypress:explore:run:ess | Runs all tests tagged as ESS in the `e2e/explore` directory in headless mode | | cypress:investigations:run:serverless | Runs all tests tagged as SERVERLESS in the `e2e/investigations` directory in headless mode | | cypress:explore:run:serverless | Runs all tests tagged as SERVERLESS in the `e2e/explore` directory in headless mode | +| cypress:open:qa:serverless | Opens the Cypress UI with all tests in the `e2e` directory tagged as SERVERLESS. This also creates an MKI project in console.qa enviornment. The kibana instance will reload when you make code changes. This is the recommended way to debug tests in QA. Follow the readme in order to learn about the known limitations. | +| cypress:run:qa:serverless | Runs all tests tagged as SERVERLESS placed in the `e2e` directory excluding `investigations` and `explore` directories in headless mode using the QA environment and real MKI projects.| +| cypress:run:qa:serverless:explore | Runs all tests tagged as SERVERLESS in the `e2e/explore` directory in headless mode using the QA environment and real MKI prorjects. | +| cypress:run:qa:serverless:investigations | Runs all tests tagged as SERVERLESS in the `e2e/investigations` directory in headless mode using the QA environment and reak MKI projects. | | junit:merge | Merges individual test reports into a single report and moves the report to the `junit` directory | Please note that all the headless mode commands do not open the Cypress UI and are typically used in CI/CD environments. The scripts that open the Cypress UI are useful for development and debugging. @@ -190,7 +193,7 @@ Task [cypress/support/es_archiver.ts](https://github.com/elastic/kibana/blob/mai Note that we use tags in order to select which tests we want to execute, if you want a test to be executed on serverless you need to add @serverless tag to it. -### Running the serverless tests locally +### Running serverless tests locally pointing to FTR serverless (First Quality Gate) Run the tests with the following yarn scripts from `x-pack/test/security_solution_cypress`: @@ -203,7 +206,7 @@ Run the tests with the following yarn scripts from `x-pack/test/security_solutio Please note that all the headless mode commands do not open the Cypress UI and are typically used in CI/CD environments. The scripts that open the Cypress UI are useful for development and debugging. -### PLIs +#### PLIs When running serverless Cypress tests, the following PLIs are set by default: ``` @@ -234,6 +237,97 @@ Per the way we set the environment during the execution process on CI, the above For test developing or test debugging purposes, you need to modify the configuration but without committing and pushing the changes in `x-pack/test/security_solution_cypress/serverless_config.ts`. + +### Running serverless tests locally pointing to a MKI project created in QA environment (Second Quality Gate) + +Run the tests with the following yarn scripts from `x-pack/test/security_solution_cypress`: + +| Script Name | Description | +| ----------- | ----------- | +| cypress:open:qa:serverless | Opens the Cypress UI with all tests in the `e2e` directory tagged as SERVERLESS. This also creates an MKI project in console.qa enviornment. The kibana instance will reload when you make code changes. This is the recommended way to debug tests in QA. Follow the readme in order to learn about the known limitations. | +| cypress:run:qa:serverless | Runs all tests tagged as SERVERLESS placed in the `e2e` directory excluding `investigations` and `explore` directories in headless mode using the QA environment and real MKI projects.| +| cypress:run:qa:serverless:explore | Runs all tests tagged as SERVERLESS in the `e2e/explore` directory in headless mode using the QA environment and real MKI prorjects. | +| cypress:run:qa:serverless:investigations | Runs all tests tagged as SERVERLESS in the `e2e/investigations` directory in headless mode using the QA environment and reak MKI projects. | + +Please note that all the headless mode commands do not open the Cypress UI and are typically used in CI/CD environments. The scripts that open the Cypress UI are useful for development and debugging. + + +#### Setup required + +Setup a valid Elastic Cloud API key for QA environment: + +1. Navigate to QA environment. +2. Click on the `User menu button` located on the top right of the header. +3. Click on `Organization`. +4. Click on the `API keys` tab. +5. Click on `Create API key` button. +6. Add a name, set an expiration date, assign an organization owner role. +7. Click on `Create API key` +8. Save the value of the key + +Store the saved key on `~/.elastic/cloud.json` using the following format: + +```json +{ + "api_key": { + "qa": "" + } +} +``` + +#### Known limitations +- Currently RBAC cannot be tested. + +#### PLIs + +When running serverless Cypress tests on QA environment, the following PLIs are set by default: +``` + { product_line: 'security', product_tier: 'complete' }, + { product_line: 'endpoint', product_tier: 'complete' }, + { product_line: 'cloud', product_tier: 'complete' }, +``` + +With the above configuration we'll be able to cover most of the scenarios, but there are some cases were we might want to use a different configuration. In that case, we just need to pass to the header of the test, which is the configuration we want for it. + +```typescript +describe( + 'Entity Analytics Dashboard in Serverless', + { + tags: '@serverless', + env: { + ftrConfig: { + productTypes: [ + { product_line: 'security', product_tier: 'essentials' }, + { product_line: 'endpoint', product_tier: 'essentials' }, + ], + }, + }, + }, +``` + +For test developing or test debugging purposes on QA, you have avaialable the following options: + +``` +yarn cypress:open:qa:serverless --tier +``` + +The above command will open the Cypress UI with all tests in the `e2e` directory tagged as SERVERLESS. This also creates an MKI project in console.qa enviornment with the passed tier essentials or complete. If no flag is passed, the project will be cretaed as complete. + +``` +yarn cypress:open:qa:serverless --no-endpoint-addon +``` + +The above command will open the Cypress UI with all tests in the `e2e` directory tagged as SERVERLESS. This also creates an MKI project in console.qa enviornment without the endpoint add-on. + +``` +yarn cypress:open:qa:serverless --no-cloud-addon +``` + +The above command will open the Cypress UI with all tests in the `e2e` directory tagged as SERVERLESS. This also creates an MKI project in console.qa enviornment without the cloud add-on. + +Note that all the above flags can be combined. + + ## Development Best Practices Below you will a set of best practices that should be followed when writing Cypress tests. diff --git a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts index 4688cbe343e1c..342c3da34bef6 100644 --- a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts +++ b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts @@ -41,6 +41,7 @@ export default defineCypressConfig({ specPattern: './cypress/e2e/**/*.cy.ts', setupNodeEvents(on, config) { esArchiver(on, config); + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; // eslint-disable-next-line @typescript-eslint/no-var-requires require('@cypress/grep/src/plugin')(config); return config; 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 2ec99abb00db4..e7f17ddcc8cb2 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 @@ -37,7 +37,8 @@ import { visit } from '../../../tasks/navigation'; import { ALERTS_URL } from '../../../urls/navigation'; -describe('Changing alert status', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/169091 +describe.skip('Changing alert status', { tags: ['@ess', '@serverless'] }, () => { before(() => { cy.task('esArchiverLoad', { archiveName: 'auditbeat_multiple' }); }); 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/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/explore/overview/overview.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts index 1205d2420b7ab..f857805462877 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts @@ -16,7 +16,7 @@ import { OVERVIEW_URL } from '../../../urls/navigation'; import { createTimeline, favoriteTimeline } from '../../../tasks/api_calls/timelines'; import { getTimeline } from '../../../objects/timeline'; -describe('Overview Page', { tags: ['@ess', '@serverless', '@serverlessQA'] }, () => { +describe('Overview Page', { tags: ['@ess', '@serverless'] }, () => { before(() => { cy.task('esArchiverLoad', { archiveName: 'overview' }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts index 426193bbf72ba..448687ae956c5 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_charts.cy.ts @@ -37,7 +37,7 @@ describe( selectAlertsHistogram(); }); - it('Filter in/out should add a filter to KQL bar', function () { + it('Filter in should add a filter to KQL bar', function () { const expectedNumberOfAlerts = 1; clickAlertsHistogramLegend(); clickAlertsHistogramLegendFilterFor(ruleConfigs.name); @@ -46,7 +46,9 @@ describe( `kibana.alert.rule.name: ${ruleConfigs.name}` ); cy.get(ALERTS_COUNT).should('have.text', `${expectedNumberOfAlerts} alert`); + }); + it('Filter out should add a filter to KQL bar', function () { clickAlertsHistogramLegend(); clickAlertsHistogramLegendFilterOut(ruleConfigs.name); cy.get(GLOBAL_SEARCH_BAR_FILTER_ITEM).should( diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts index f16f7120dd0fb..dcf847224067a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts @@ -24,7 +24,8 @@ import { hostsUrl } from '../../../urls/navigation'; // Flaky on serverless const defaultPageSize = 25; -describe('Pagination', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/169413 +describe.skip('Pagination', { tags: ['@ess', '@serverless'] }, () => { before(() => { cy.task('esArchiverLoad', { archiveName: 'timeline' }); }); 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/e2e/urls/state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/urls/state.cy.ts index 9e2e09ec79087..0f2d2ad9cac3d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/urls/state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/urls/state.cy.ts @@ -50,7 +50,6 @@ 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 { GLOBAL_SEARCH_BAR_FILTER_ITEM_AT, GLOBAL_SEARCH_BAR_PINNED_FILTER, @@ -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/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/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/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/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/package.json b/x-pack/test/security_solution_cypress/package.json index 0e34d7867d37a..e43f32a447575 100644 --- a/x-pack/test/security_solution_cypress/package.json +++ b/x-pack/test/security_solution_cypress/package.json @@ -28,6 +28,7 @@ "cypress:changed-specs-only:serverless": "yarn cypress:serverless --changed-specs-only --env burn=5", "cypress:burn:serverless": "yarn cypress:serverless --env burn=2", "cypress:qa:serverless": "TZ=UTC NODE_OPTIONS=--openssl-legacy-provider node ../../plugins/security_solution/scripts/start_cypress_parallel_serverless --config-file ../../test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts", + "cypress:open:qa:serverless": "yarn cypress:qa:serverless open", "cypress:run:qa:serverless": "yarn cypress:qa:serverless --spec './cypress/e2e/!(investigations|explore)/**/*.cy.ts'", "cypress:run:qa:serverless:investigations": "yarn cypress:qa:serverless --spec './cypress/e2e/investigations/**/*.cy.ts'", "cypress:run:qa:serverless:explore": "yarn cypress:qa:serverless --spec './cypress/e2e/explore/**/*.cy.ts'" 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..67c21417beed8 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; 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..fd925a975ba14 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 @@ -33,7 +33,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/tsconfig.json b/x-pack/test/tsconfig.json index 3d9c0dfd47d99..025dff494c5fe 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -86,7 +86,6 @@ "@kbn/data-views-plugin", "@kbn/datemath", "@kbn/safer-lodash-set", - "@kbn/securitysolution-rules", "@kbn/es-archiver", "@kbn/config-schema", "@kbn/kubernetes-security-plugin", @@ -146,6 +145,7 @@ "@kbn/coloring", "@kbn/es", "@kbn/metrics-data-access-plugin", + "@kbn/dataset-quality-plugin", "@kbn/reporting-export-types-csv-common", "@kbn/reporting-export-types-pdf-common", "@kbn/reporting-export-types-png-common", 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/index.ts b/x-pack/test_serverless/functional/services/index.ts index dd4ec37f21501..a1c381331f6bc 100644 --- a/x-pack/test_serverless/functional/services/index.ts +++ b/x-pack/test_serverless/functional/services/index.ts @@ -16,6 +16,7 @@ import { SvlCommonScreenshotsProvider } from './svl_common_screenshots'; import { SvlCasesServiceProvider } from '../../api_integration/services/svl_cases'; import { MachineLearningProvider } from './ml'; import { SvlReportingServiceProvider } from './svl_reporting'; +import { LogsSynthtraceProvider } from './log'; export const services = { // deployment agnostic FTR services @@ -31,4 +32,7 @@ export const services = { svlCases: SvlCasesServiceProvider, svlMl: MachineLearningProvider, svlReportingApi: SvlReportingServiceProvider, + + // log services + svlLogsSynthtraceClient: LogsSynthtraceProvider, }; diff --git a/x-pack/test_serverless/functional/services/log/index.ts b/x-pack/test_serverless/functional/services/log/index.ts new file mode 100644 index 0000000000000..0aadf7b9bf292 --- /dev/null +++ b/x-pack/test_serverless/functional/services/log/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 { createLogger, LogLevel, LogsSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export function LogsSynthtraceProvider(context: FtrProviderContext) { + return new LogsSynthtraceEsClient({ + client: context.getService('es'), + logger: createLogger(LogLevel.info), + refreshAfterIndex: true, + }); +} 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/examples/data_view_field_editor_example/index.ts b/x-pack/test_serverless/functional/test_suites/common/examples/data_view_field_editor_example/index.ts index 106f504cae82b..f8f96c0bbdd20 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/data_view_field_editor_example/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/data_view_field_editor_example/index.ts @@ -55,7 +55,15 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid } return false; }); - await PageObjects.settings.createIndexPattern('blogs', null); + // re-create default dataview : default_all_data_id which was created when serverles_search plugin was started. + await PageObjects.settings.createIndexPattern( + 'blogs', + null, + true, + 'default_all_data_id', + 'default:all-data' + ); + await PageObjects.common.navigateToApp('dataViewFieldEditorExample'); }); 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/management/index_management/create_enrich_policy.ts b/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts index c54baeed37066..81a8551a0b8b4 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts @@ -6,7 +6,6 @@ */ import expect from '@kbn/expect'; -import { SLO_SUMMARY_ENRICH_POLICY_NAME } from '@kbn/observability-plugin/server/assets/constants'; import { FtrProviderContext } from '../../../../ftr_provider_context'; export default ({ getPageObjects, getService }: FtrProviderContext) => { @@ -26,8 +25,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { before(async () => { log.debug('Creating test index'); try { - await es.ingest.deletePipeline({ id: '.slo-*' }, { ignore: [404] }); - await es.enrich.deletePolicy({ name: SLO_SUMMARY_ENRICH_POLICY_NAME }, { ignore: [404] }); await es.indices.create({ index: INDEX_NAME, body: { 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/observability/observability_log_explorer/app.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/app.ts index fc03be6e0c125..271bba6b45035 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/app.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/app.ts @@ -5,15 +5,19 @@ * 2.0. */ import expect from '@kbn/expect'; +import { log, timerange } from '@kbn/apm-synthtrace-client'; import { FtrProviderContext } from '../../../ftr_provider_context'; -export default function ({ getPageObjects }: FtrProviderContext) { +export default function ({ getPageObjects, getService }: FtrProviderContext) { const PageObjects = getPageObjects([ 'observabilityLogExplorer', 'svlCommonNavigation', 'svlCommonPage', ]); + const synthtrace = getService('svlLogsSynthtraceClient'); + const dataGrid = getService('dataGrid'); + describe('Application', () => { before(async () => { await PageObjects.svlCommonPage.login(); @@ -25,6 +29,7 @@ export default function ({ getPageObjects }: FtrProviderContext) { it('is shown in the global search', async () => { await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.svlCommonNavigation.search.showSearch(); await PageObjects.svlCommonNavigation.search.searchFor('log explorer'); @@ -33,5 +38,32 @@ export default function ({ getPageObjects }: FtrProviderContext) { await PageObjects.svlCommonNavigation.search.hideSearch(); }); + + it('should load logs', async () => { + const from = '2023-08-03T10:24:14.035Z'; + const to = '2023-08-03T10:24:14.091Z'; + const COUNT = 5; + await synthtrace.index(generateLogsData({ from, to, count: COUNT })); + await PageObjects.observabilityLogExplorer.navigateTo(); + const docCount = await dataGrid.getDocCount(); + + expect(docCount).to.be(COUNT); + await synthtrace.clean(); + }); }); } + +function generateLogsData({ from, to, count = 1 }: { from: string; to: string; count: number }) { + const range = timerange(from, to); + + return range + .interval('1m') + .rate(1) + .generator((timestamp) => + Array(count) + .fill(0) + .map(() => { + return log.create().message('A sample log').timestamp(timestamp); + }) + ); +} diff --git a/x-pack/test_serverless/functional/test_suites/search/cases/attachment_framework.ts b/x-pack/test_serverless/functional/test_suites/search/cases/attachment_framework.ts index bff6144d44bb2..3cf087eb1ae9b 100644 --- a/x-pack/test_serverless/functional/test_suites/search/cases/attachment_framework.ts +++ b/x-pack/test_serverless/functional/test_suites/search/cases/attachment_framework.ts @@ -39,7 +39,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { await dashboard.clickNewDashboard(); - await lens.createAndAddLensFromDashboard({}); + await lens.createAndAddLensFromDashboard({ ignoreTimeFilter: true }); }); after(async () => { 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 d91d296c75624..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,6 +45,7 @@ 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(); }); diff --git a/x-pack/test_serverless/functional/test_suites/search/empty_page.ts b/x-pack/test_serverless/functional/test_suites/search/default_dataview.ts similarity index 66% rename from x-pack/test_serverless/functional/test_suites/search/empty_page.ts rename to x-pack/test_serverless/functional/test_suites/search/default_dataview.ts index 18af7995b1419..2beb234f688f4 100644 --- a/x-pack/test_serverless/functional/test_suites/search/empty_page.ts +++ b/x-pack/test_serverless/functional/test_suites/search/default_dataview.ts @@ -13,7 +13,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { const svlCommonNavigation = getPageObject('svlCommonNavigation'); const svlCommonPage = getPageObject('svlCommonPage'); - describe('empty pages', function () { + describe('default dataView', function () { // Error: expected testSubject(kbnOverviewElasticsearchGettingStarted) to exist this.tags(['failsOnMKI']); before(async () => { @@ -25,28 +25,32 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonPage.forceLogout(); }); - it('should show search specific empty page in discover', async () => { + it('should show dashboard but with no data', async () => { await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'discover' }); await testSubjects.existOrFail('~breadcrumb-deepLinkId-discover'); - await testSubjects.existOrFail('kbnOverviewElasticsearchGettingStarted'); - await testSubjects.click('kbnOverviewElasticsearchGettingStarted'); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Get started' }); + await testSubjects.existOrFail('discover-dataView-switch-link'); + await testSubjects.click('discover-dataView-switch-link'); + await testSubjects.existOrFail('indexPattern-add-field'); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Discover' }); }); - it('should show search specific empty page in visualize', async () => { - await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'visualize' }); - await testSubjects.existOrFail('~breadcrumb-deepLinkId-visualize'); - await testSubjects.existOrFail('kbnOverviewElasticsearchGettingStarted'); - await testSubjects.click('kbnOverviewElasticsearchGettingStarted'); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Get started' }); - }); - - it('should show search specific empty page in dashboards', async () => { + it('should show dashboard but with no data in dashboard', async () => { await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'dashboards' }); await testSubjects.existOrFail('~breadcrumb-deepLinkId-dashboards'); - await testSubjects.existOrFail('kbnOverviewElasticsearchGettingStarted'); - await testSubjects.click('kbnOverviewElasticsearchGettingStarted'); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Get started' }); + await testSubjects.existOrFail('emptyListPrompt'); + await testSubjects.click('newItemButton'); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ + text: 'Editing New Dashboard', + }); + }); + + it('should show dashboard but with no data in visualize', async () => { + await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'visualize' }); + await testSubjects.existOrFail('~breadcrumb-deepLinkId-visualize'); + await testSubjects.existOrFail('top-nav'); + await testSubjects.click('newItemButton'); + await testSubjects.existOrFail('visType-lens'); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Visualizations' }); }); }); } diff --git a/x-pack/test_serverless/functional/test_suites/search/index.ts b/x-pack/test_serverless/functional/test_suites/search/index.ts index 6ed8a9f62c222..6d0987d0292ce 100644 --- a/x-pack/test_serverless/functional/test_suites/search/index.ts +++ b/x-pack/test_serverless/functional/test_suites/search/index.ts @@ -10,7 +10,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('serverless search UI', function () { loadTestFile(require.resolve('./landing_page')); - loadTestFile(require.resolve('./empty_page')); + loadTestFile(require.resolve('./default_dataview')); loadTestFile(require.resolve('./navigation')); loadTestFile(require.resolve('./cases/attachment_framework')); loadTestFile(require.resolve('./dashboards/build_dashboard')); 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/tsconfig.json b/x-pack/test_serverless/tsconfig.json index a53a1f655dbea..e825bff536d8e 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -49,6 +49,7 @@ "@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,6 +64,9 @@ "@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", ] } diff --git a/yarn.lock b/yarn.lock index b35cb584ca5cc..8016568cd10f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -91,6 +91,39 @@ resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== +"@aws-crypto/crc32@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" + integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/util@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" + integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/types@^3.222.0": + version "3.433.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.433.0.tgz#0f94eae2a4a3525ca872c9ab04e143c01806d755" + integrity sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA== + dependencies: + "@smithy/types" "^2.4.0" + tslib "^2.5.0" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.259.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" + "@babel/cli@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.21.0.tgz#1868eb70e9824b427fc607610cce8e9e7889e7e1" @@ -3108,6 +3141,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 "" @@ -4096,6 +4133,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 "" @@ -4268,6 +4309,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 "" @@ -7358,6 +7403,53 @@ "@types/node" ">=8.9.0" axios "^0.21.1" +"@smithy/eventstream-codec@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz#99fab750d0ac3941f341d912d3c3a1ab985e1a7a" + integrity sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@smithy/types" "^2.4.0" + "@smithy/util-hex-encoding" "^2.0.0" + tslib "^2.5.0" + +"@smithy/is-array-buffer@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz#8fa9b8040651e7ba0b2f6106e636a91354ff7d34" + integrity sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug== + dependencies: + tslib "^2.5.0" + +"@smithy/types@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.4.0.tgz#ed35e429e3ea3d089c68ed1bf951d0ccbdf2692e" + integrity sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g== + dependencies: + tslib "^2.5.0" + +"@smithy/util-buffer-from@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz#7eb75d72288b6b3001bc5f75b48b711513091deb" + integrity sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw== + dependencies: + "@smithy/is-array-buffer" "^2.0.0" + tslib "^2.5.0" + +"@smithy/util-hex-encoding@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz#0aa3515acd2b005c6d55675e377080a7c513b59e" + integrity sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA== + dependencies: + tslib "^2.5.0" + +"@smithy/util-utf8@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.0.0.tgz#b4da87566ea7757435e153799df9da717262ad42" + integrity sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ== + dependencies: + "@smithy/util-buffer-from" "^2.0.0" + tslib "^2.5.0" + "@storybook/addon-a11y@^6.5.16": version "6.5.16" resolved "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-6.5.16.tgz#9288a6c1d111fa4ec501d213100ffff91757d3fc" @@ -17779,13 +17871,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: @@ -22582,7 +22674,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== @@ -29056,10 +29148,10 @@ tslib@2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.5.2: version "2.6.2"