From 1dcdc7b0de73935aeb40e43a4363ccc792328475 Mon Sep 17 00:00:00 2001 From: Kaarina Tungseth Date: Wed, 20 Apr 2022 09:48:19 -0500 Subject: [PATCH 01/22] [DOCS] Adds advanced settings for data views (#130294) * Adds advanced settings for data views * Update docs/concepts/data-views.asciidoc Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- docs/concepts/data-views.asciidoc | 54 +++++++++++++++++-------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/docs/concepts/data-views.asciidoc b/docs/concepts/data-views.asciidoc index 807b829c7481a..f8040d1885907 100644 --- a/docs/concepts/data-views.asciidoc +++ b/docs/concepts/data-views.asciidoc @@ -1,11 +1,11 @@ [[data-views]] -=== Create a data view +=== Create a {data-source} -{kib} requires a data view to access the {es} data that you want to explore. -A data view selects the data to use and allows you to define properties of the fields. +{kib} requires a {data-source} to access the {es} data that you want to explore. +A {data-source} selects the data to use and allows you to define properties of the fields. -A data view can point to one or more indices, {ref}/data-streams.html[data stream], or {ref}/alias.html[index aliases]. -For example, a data view can point to your log data from yesterday, +A {data-source} can point to one or more indices, {ref}/data-streams.html[data streams], or {ref}/alias.html[index aliases]. +For example, a {data-source} can point to your log data from yesterday, or all indices that contain your data. [float] @@ -15,12 +15,12 @@ or all indices that contain your data. * Access to *Data Views* requires the <> `Data View Management`. -* To create a data view, you must have the <> +* To create a {data-source}, you must have the <> `view_index_metadata`. * If a read-only indicator appears in {kib}, you have insufficient privileges -to create or save data views. The buttons to create new data views or -save existing data views are not visible. For more information, +to create or save {data-sources}. The buttons to create {data-sources} or +save existing {data-sources} are not visible. For more information, refer to <>. [float] @@ -29,12 +29,12 @@ refer to <>. If you collected data using one of the {kib} <>, uploaded a file, or added sample data, -you get a data view for free, and can start exploring your data. -If you loaded your own data, follow these steps to create a data view. +you get a {data-source} for free, and can start exploring your data. +If you loaded your own data, follow these steps to create a {data-source}. . Open the main menu, then click *Stack Management > Data Views*. -. Click *Create data view*. +. Click *Create {data-source}*. . Start typing in the *name* field, and {kib} looks for the names of indices, data streams, and aliases that match your input. @@ -61,21 +61,25 @@ global time filters on your dashboards. This is useful if you have multiple time fields and want to create dashboards that combine visualizations based on different timestamps. -. Click *Create data view*. +. To display all indices, click *Show advanced settings*, then select *Allow hidden and system indices*. + +. To specify your own {data-source} name, click *Show advanced settings*, then enter the name in the *Custom {data-source} ID* field. For example, enter your {es} index alias name. + +. Click *Create {data-source}*. + [[reload-fields]] {kib} is now configured to use your {es} data. When a new field is added to an index, -the data view field list is updated -the next time the data view is loaded, for example, when you load the page or +the {data-source} field list is updated +the next time the {data-source} is loaded, for example, when you load the page or move between {kib} apps. -. Select this data view when you search and visualize your data. +. Select this {data-source} when you search and visualize your data. [float] [[rollup-data-view]] ==== Create a data view for rolled up data -A data view can match one rollup index. For a combination rollup -data view with both raw and rolled up data, use the standard notation: +A {data-source} can match one rollup index. For a combination rollup +{data-source} with both raw and rolled up data, use the standard notation: ```ts rollup_logstash,kibana_sample_data_logs @@ -130,20 +134,20 @@ To exclude a cluster having a name starting with `cluster_`: `cluster_*:logstash-*,cluster_one:-*` ``` -Once you configure a data view to use the {ccs} syntax, all searches and -aggregations using that data view in {kib} take advantage of {ccs}. +Once you configure a {data-source} to use the {ccs} syntax, all searches and +aggregations using that {data-source} in {kib} take advantage of {ccs}. [float] [[delete-data-view]] -=== Delete data views +=== Delete {data-sources} -When you delete a data view, you cannot recover the associated field formatters, runtime fields, source filters, -and field popularity data. Deleting a data view does not remove any indices or data documents from {es}. +When you delete a {data-source}, you cannot recover the associated field formatters, runtime fields, source filters, +and field popularity data. Deleting a {data-source} does not remove any indices or data documents from {es}. -WARNING: Deleting a data view breaks all visualizations, saved searches, and other saved objects that reference the data view. +WARNING: Deleting a {data-source} breaks all visualizations, saved searches, and other saved objects that reference the data view. . Open the main menu, then click *Stack Management > Data Views*. -. Click the data view to delete. +. Click the {data-source} to delete. -. Delete (image:management/index-patterns/images/delete.png[Delete icon]) the data view. +. Delete (image:management/index-patterns/images/delete.png[Delete icon]) the {data-source}. From 5f003a4de0703ddc504e9811d163b54df66d9f49 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 20 Apr 2022 09:56:05 -0500 Subject: [PATCH 02/22] [artifacts] Publish kibana cloud docker context (#130415) --- .buildkite/scripts/steps/artifacts/publish.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.buildkite/scripts/steps/artifacts/publish.sh b/.buildkite/scripts/steps/artifacts/publish.sh index c16d7a02d6cd9..ed4cb5ca1d4b9 100644 --- a/.buildkite/scripts/steps/artifacts/publish.sh +++ b/.buildkite/scripts/steps/artifacts/publish.sh @@ -26,6 +26,7 @@ download "kibana-$FULL_VERSION-x86_64.rpm" download "kibana-$FULL_VERSION-aarch64.rpm" download "kibana-$FULL_VERSION-docker-build-context.tar.gz" +download "kibana-cloud-$FULL_VERSION-docker-build-context.tar.gz" download "kibana-ironbank-$FULL_VERSION-docker-build-context.tar.gz" download "kibana-ubi8-$FULL_VERSION-docker-build-context.tar.gz" From e2202609e88ccf3d8fb69c16e3c18ca14ea07c79 Mon Sep 17 00:00:00 2001 From: spalger Date: Wed, 20 Apr 2022 10:03:33 -0500 Subject: [PATCH 03/22] skip suite failing es promotion (#130692) --- .../apis/security_solution/matrix_dns_histogram.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts b/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts index 50722c39476c6..543c20fd95e45 100644 --- a/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts +++ b/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts @@ -20,7 +20,8 @@ export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const bsearch = getService('bsearch'); - describe('Matrix DNS Histogram', () => { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/130692 + describe.skip('Matrix DNS Histogram', () => { describe('Large data set', () => { before( async () => From 3648f747a90710de6f3885c5faefdab3b172def8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Wed, 20 Apr 2022 17:05:28 +0200 Subject: [PATCH 04/22] [EBT] Rename `esOrgId` to `cloudId` (#130663) --- packages/analytics/client/src/events/types.ts | 4 ++-- .../fullstory/src/fullstory_shipper.test.ts | 10 +++++----- .../shippers/fullstory/src/fullstory_shipper.ts | 8 ++++---- x-pack/plugins/cloud/public/plugin.tsx | 14 +++++++------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/analytics/client/src/events/types.ts b/packages/analytics/client/src/events/types.ts index 5f1f587d3b284..bc193a2788db1 100644 --- a/packages/analytics/client/src/events/types.ts +++ b/packages/analytics/client/src/events/types.ts @@ -17,9 +17,9 @@ export interface EventContext { */ userId?: string; /** - * The user's organization ID. + * The Cloud ID. */ - esOrgId?: string; + cloudId?: string; /** * The product's version. */ diff --git a/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.ts b/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.ts index 67797a629c828..4b60ba661fe14 100644 --- a/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.ts +++ b/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.ts @@ -62,13 +62,13 @@ describe('FullStoryShipper', () => { }); }); - test('calls `setUserVars` when esOrgId is provided', () => { - fullstoryShipper.extendContext({ esOrgId: 'test-es-org-id' }); + test('calls `setUserVars` when cloudId is provided', () => { + fullstoryShipper.extendContext({ cloudId: 'test-es-org-id' }); expect(fullStoryApiMock.setUserVars).toHaveBeenCalledWith({ org_id_str: 'test-es-org-id' }); }); - test('merges both: version and esOrgId if both are provided', () => { - fullstoryShipper.extendContext({ version: '1.2.3', esOrgId: 'test-es-org-id' }); + test('merges both: version and cloudId if both are provided', () => { + fullstoryShipper.extendContext({ version: '1.2.3', cloudId: 'test-es-org-id' }); expect(fullStoryApiMock.setUserVars).toHaveBeenCalledWith({ org_id_str: 'test-es-org-id', version_str: '1.2.3', @@ -84,7 +84,7 @@ describe('FullStoryShipper', () => { const context = { userId: 'test-user-id', version: '1.2.3', - esOrgId: 'test-es-org-id', + cloudId: 'test-es-org-id', foo: 'bar', }; fullstoryShipper.extendContext(context); diff --git a/packages/analytics/shippers/fullstory/src/fullstory_shipper.ts b/packages/analytics/shippers/fullstory/src/fullstory_shipper.ts index 6f74a3085ab62..ef9d5d662813d 100644 --- a/packages/analytics/shippers/fullstory/src/fullstory_shipper.ts +++ b/packages/analytics/shippers/fullstory/src/fullstory_shipper.ts @@ -36,7 +36,7 @@ export class FullStoryShipper implements IShipper { this.initContext.logger.debug(`Received context ${JSON.stringify(newContext)}`); // FullStory requires different APIs for different type of contexts. - const { userId, version, esOrgId, ...nonUserContext } = newContext; + const { userId, version, cloudId, ...nonUserContext } = newContext; // Call it only when the userId changes if (userId && userId !== this.lastUserId) { @@ -47,13 +47,13 @@ export class FullStoryShipper implements IShipper { } // User-level context - if (version || esOrgId) { + if (version || cloudId) { this.initContext.logger.debug( - `Calling FS.setUserVars with version ${version} and esOrgId ${esOrgId}` + `Calling FS.setUserVars with version ${version} and cloudId ${cloudId}` ); this.fullStoryApi.setUserVars({ ...(version ? getParsedVersion(version) : {}), - ...(esOrgId ? { org_id_str: esOrgId } : {}), + ...(cloudId ? { org_id_str: cloudId } : {}), }); } diff --git a/x-pack/plugins/cloud/public/plugin.tsx b/x-pack/plugins/cloud/public/plugin.tsx index 2aaf9549e9a22..bffc1d9496422 100644 --- a/x-pack/plugins/cloud/public/plugin.tsx +++ b/x-pack/plugins/cloud/public/plugin.tsx @@ -93,7 +93,7 @@ interface SetupFullStoryDeps { interface SetupTelemetryContextDeps extends CloudSetupDependencies { analytics: AnalyticsServiceSetup; executionContextPromise: Promise; - esOrgId?: string; + cloudId?: string; } interface SetupChatDeps extends Pick { @@ -120,7 +120,7 @@ export class CloudPlugin implements Plugin { analytics: core.analytics, security, executionContextPromise, - esOrgId: this.config.id, + cloudId: this.config.id, }).catch((e) => { // eslint-disable-next-line no-console console.debug(`Error setting up TelemetryContext: ${e.toString()}`); @@ -278,7 +278,7 @@ export class CloudPlugin implements Plugin { analytics, security, executionContextPromise, - esOrgId, + cloudId, }: SetupTelemetryContextDeps) { // Some context providers can be moved to other places for better domain isolation. // Let's use https://github.com/elastic/kibana/issues/125690 for that purpose. @@ -290,11 +290,11 @@ export class CloudPlugin implements Plugin { analytics.registerContextProvider({ name: 'cloud_org_id', - context$: of({ esOrgId }), + context$: of({ cloudId }), schema: { - esOrgId: { + cloudId: { type: 'keyword', - _meta: { description: 'The Cloud Organization ID', optional: true }, + _meta: { description: 'The Cloud ID', optional: true }, }, }, }); @@ -310,7 +310,7 @@ export class CloudPlugin implements Plugin { const { sha256 } = await import('js-sha256'); // Join the cloud org id and the user to create a truly unique user id. // The hashing here is to keep it at clear as possible in our source code that we do not send literal user IDs - return { userId: sha256(esOrgId ? `${esOrgId}:${userId}` : `${userId}`) }; + return { userId: sha256(cloudId ? `${cloudId}:${userId}` : `${userId}`) }; }) ), schema: { From 830d231cc09642b115702799fc2ee91075d6cd25 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 20 Apr 2022 11:12:34 -0400 Subject: [PATCH 05/22] [es-snapshots] Fix promotion not triggering due to missing dependency (#130693) --- .buildkite/pipelines/es_snapshots/verify.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.buildkite/pipelines/es_snapshots/verify.yml b/.buildkite/pipelines/es_snapshots/verify.yml index 70b540f12686e..23ec38085c3d9 100755 --- a/.buildkite/pipelines/es_snapshots/verify.yml +++ b/.buildkite/pipelines/es_snapshots/verify.yml @@ -79,7 +79,6 @@ steps: queue: kibana-default depends_on: - default-cigroup - - default-cigroup-docker - oss-cigroup - jest-integration - api-integration From 473781ad068605d0728df77ea496fa4b636a9a6e Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 20 Apr 2022 10:25:41 -0500 Subject: [PATCH 06/22] add kibana.json json-schema for VSCode users (#130625) * add kibana.json json-schema for VSCode users * make kibanaVersion description more clear --- package.json | 3 + packages/BUILD.bazel | 2 + packages/kbn-dev-utils/BUILD.bazel | 2 + .../src/vscode_config/managed_config_keys.ts | 15 ++ .../update_vscode_config.test.ts | 56 +++++-- .../src/vscode_config/update_vscode_config.ts | 18 ++- .../vscode_config/update_vscode_config_cli.ts | 20 ++- packages/kbn-kibana-json-schema/BUILD.bazel | 117 ++++++++++++++ packages/kbn-kibana-json-schema/README.md | 3 + .../kbn-kibana-json-schema/jest.config.js | 13 ++ packages/kbn-kibana-json-schema/package.json | 7 + packages/kbn-kibana-json-schema/src/index.ts | 9 ++ .../src/kibana_json_schema.ts | 145 ++++++++++++++++++ packages/kbn-kibana-json-schema/tsconfig.json | 17 ++ yarn.lock | 13 ++ 15 files changed, 419 insertions(+), 21 deletions(-) create mode 100644 packages/kbn-kibana-json-schema/BUILD.bazel create mode 100644 packages/kbn-kibana-json-schema/README.md create mode 100644 packages/kbn-kibana-json-schema/jest.config.js create mode 100644 packages/kbn-kibana-json-schema/package.json create mode 100644 packages/kbn-kibana-json-schema/src/index.ts create mode 100644 packages/kbn-kibana-json-schema/src/kibana_json_schema.ts create mode 100644 packages/kbn-kibana-json-schema/tsconfig.json diff --git a/package.json b/package.json index fc3433f84802a..43d47614b7fd2 100644 --- a/package.json +++ b/package.json @@ -151,6 +151,7 @@ "@kbn/i18n-react": "link:bazel-bin/packages/kbn-i18n-react", "@kbn/interpreter": "link:bazel-bin/packages/kbn-interpreter", "@kbn/io-ts-utils": "link:bazel-bin/packages/kbn-io-ts-utils", + "@kbn/kibana-json-schema": "link:bazel-bin/packages/kbn-kibana-json-schema", "@kbn/logging": "link:bazel-bin/packages/kbn-logging", "@kbn/logging-mocks": "link:bazel-bin/packages/kbn-logging-mocks", "@kbn/mapbox-gl": "link:bazel-bin/packages/kbn-mapbox-gl", @@ -635,6 +636,7 @@ "@types/kbn__interpreter": "link:bazel-bin/packages/kbn-interpreter/npm_module_types", "@types/kbn__io-ts-utils": "link:bazel-bin/packages/kbn-io-ts-utils/npm_module_types", "@types/kbn__jest-serializers": "link:bazel-bin/packages/kbn-jest-serializers/npm_module_types", + "@types/kbn__kibana-json-schema": "link:bazel-bin/packages/kbn-kibana-json-schema/npm_module_types", "@types/kbn__logging": "link:bazel-bin/packages/kbn-logging/npm_module_types", "@types/kbn__logging-mocks": "link:bazel-bin/packages/kbn-logging-mocks/npm_module_types", "@types/kbn__mapbox-gl": "link:bazel-bin/packages/kbn-mapbox-gl/npm_module_types", @@ -877,6 +879,7 @@ "jest-styled-components": "^7.0.3", "jimp": "^0.14.0", "jsdom": "13.1.0", + "json-schema-typed": "^7.0.3", "json5": "^1.0.1", "jsondiffpatch": "0.4.1", "license-checker": "^16.0.0", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 3fe72a6c642d6..567e5dd65d664 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -54,6 +54,7 @@ filegroup( "//packages/kbn-interpreter:build", "//packages/kbn-io-ts-utils:build", "//packages/kbn-jest-serializers:build", + "//packages/kbn-kibana-json-schema:build", "//packages/kbn-logging-mocks:build", "//packages/kbn-logging:build", "//packages/kbn-mapbox-gl:build", @@ -149,6 +150,7 @@ filegroup( "//packages/kbn-interpreter:build_types", "//packages/kbn-io-ts-utils:build_types", "//packages/kbn-jest-serializers:build_types", + "//packages/kbn-kibana-json-schema:build_types", "//packages/kbn-logging-mocks:build_types", "//packages/kbn-logging:build_types", "//packages/kbn-mapbox-gl:build_types", diff --git a/packages/kbn-dev-utils/BUILD.bazel b/packages/kbn-dev-utils/BUILD.bazel index 5513aff23f15a..cf12092007987 100644 --- a/packages/kbn-dev-utils/BUILD.bazel +++ b/packages/kbn-dev-utils/BUILD.bazel @@ -47,6 +47,7 @@ RUNTIME_DEPS = [ "//packages/kbn-stdio-dev-helpers", "//packages/kbn-ci-stats-reporter", "//packages/kbn-jest-serializers", + "//packages/kbn-kibana-json-schema", "@npm//@babel/core", "@npm//axios", "@npm//chalk", @@ -77,6 +78,7 @@ TYPES_DEPS = [ "//packages/kbn-stdio-dev-helpers:npm_module_types", "//packages/kbn-ci-stats-reporter:npm_module_types", "//packages/kbn-jest-serializers:npm_module_types", + "//packages/kbn-kibana-json-schema:npm_module_types", "@npm//@babel/parser", "@npm//@babel/types", "@npm//@types/babel__core", diff --git a/packages/kbn-dev-utils/src/vscode_config/managed_config_keys.ts b/packages/kbn-dev-utils/src/vscode_config/managed_config_keys.ts index 4fccc9937b1f6..55a44564d29ea 100644 --- a/packages/kbn-dev-utils/src/vscode_config/managed_config_keys.ts +++ b/packages/kbn-dev-utils/src/vscode_config/managed_config_keys.ts @@ -6,6 +6,8 @@ * Side Public License, v 1. */ +import { KibanaJsonSchema } from '@kbn/kibana-json-schema'; + export interface ManagedConfigKey { key: string; value: string | Record | boolean | number; @@ -58,4 +60,17 @@ export const MANAGED_CONFIG_KEYS: ManagedConfigKey[] = [ key: 'typescript.tsserver.maxTsServerMemory', value: 4096, }, + { + key: 'json.schemas', + value: [ + { + fileMatch: ['kibana.json'], + url: './.vscode/kibana-json-schema.json', + }, + ], + }, +]; + +export const MANAGED_CONFIG_FILES = [ + { name: 'kibana-json-schema.json', content: JSON.stringify(KibanaJsonSchema, null, 2) }, ]; diff --git a/packages/kbn-dev-utils/src/vscode_config/update_vscode_config.test.ts b/packages/kbn-dev-utils/src/vscode_config/update_vscode_config.test.ts index 3573acd59559f..f9e3aecb89b93 100644 --- a/packages/kbn-dev-utils/src/vscode_config/update_vscode_config.test.ts +++ b/packages/kbn-dev-utils/src/vscode_config/update_vscode_config.test.ts @@ -26,6 +26,10 @@ const TEST_KEYS: ManagedConfigKey[] = [ key: 'stringKey', value: 'foo', }, + { + key: 'arrayKey', + value: ['foo', 'bar'], + }, ]; const run = (json?: string) => updateVscodeConfig(TEST_KEYS, '', json); @@ -41,7 +45,9 @@ it('updates the passed JSON with the managed settings', () => { "world": [1, 2, 3] }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -58,7 +64,9 @@ it('initialized empty or undefined json values', () => { "world": [1, 2, 3] }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -73,7 +81,9 @@ it('initialized empty or undefined json values', () => { "world": [1, 2, 3] }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -90,7 +100,9 @@ it('replaces conflicting managed keys which do not have matching value types', ( "world": [1, 2, 3] }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -136,7 +148,9 @@ it('persists comments in the original file', () => { "world": [1, 2, 3] }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -164,7 +178,9 @@ it('overrides old values for managed keys', () => { "world": [1, 2, 3] }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -206,7 +222,9 @@ it('does not modify properties with leading `// self managed` comment', () => { "world": [5] }, // self managed - "stringKey": "--" + "stringKey": "--", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -232,7 +250,9 @@ it('does not modify child properties with leading `// self managed` comment', () "hello": true }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -260,7 +280,9 @@ it('does not modify unknown child properties', () => { "hello": true }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -288,7 +310,9 @@ it('removes managed properties which are no longer managed', () => { "hello": true }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -314,7 +338,9 @@ it('wipes out child keys which conflict with newly managed child keys', () => { "world": [1, 2, 3] }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -338,7 +364,9 @@ it('correctly formats info text when specified', () => { "world": [1, 2, 3] }, // @managed - "stringKey": "foo" + "stringKey": "foo", + // @managed + "arrayKey": ["foo", "bar"] } `); @@ -368,7 +396,9 @@ it('allows "// self managed" comments conflicting with "// @managed" comments to "world": [1, 2, 3] }, // self managed - "stringKey": 12345 + "stringKey": 12345, + // @managed + "arrayKey": ["foo", "bar"] } `); diff --git a/packages/kbn-dev-utils/src/vscode_config/update_vscode_config.ts b/packages/kbn-dev-utils/src/vscode_config/update_vscode_config.ts index 5c33b00262cc6..d327ab98ae82c 100644 --- a/packages/kbn-dev-utils/src/vscode_config/update_vscode_config.ts +++ b/packages/kbn-dev-utils/src/vscode_config/update_vscode_config.ts @@ -69,9 +69,9 @@ const createObjectPropOfManagedValues = (key: string, value: Record const addManagedProp = ( ast: t.ObjectExpression, key: string, - value: string | Record | boolean | number + value: string | Record | boolean | number | any[] ) => { - if (['number', 'string', 'boolean'].includes(typeof value)) { + if (['number', 'string', 'boolean'].includes(typeof value) || Array.isArray(value)) { ast.properties.push(createManagedProp(key, value)); } else { ast.properties.push(createObjectPropOfManagedValues(key, value as Record)); @@ -183,6 +183,20 @@ export function updateVscodeConfig(keys: ManagedConfigKey[], infoText: string, j continue; } + if (Array.isArray(value)) { + if (!existingProp) { + addManagedProp(ast, key, value); + continue; + } + + if (!isSelfManaged(existingProp)) { + replaceManagedProp(ast, existingProp, value); + continue; + } + + continue; + } + if (typeof value === 'object') { if (existingProp && existingProp.value.type === 'ObjectExpression') { // setting exists and is an object so merge properties of `value` with it diff --git a/packages/kbn-dev-utils/src/vscode_config/update_vscode_config_cli.ts b/packages/kbn-dev-utils/src/vscode_config/update_vscode_config_cli.ts index 273aed9585572..70ae7c35765f5 100644 --- a/packages/kbn-dev-utils/src/vscode_config/update_vscode_config_cli.ts +++ b/packages/kbn-dev-utils/src/vscode_config/update_vscode_config_cli.ts @@ -7,23 +7,25 @@ */ import Path from 'path'; -import Fs from 'fs/promises'; +import Fsp from 'fs/promises'; import { REPO_ROOT } from '@kbn/utils'; import dedent from 'dedent'; import { run } from '../run'; -import { MANAGED_CONFIG_KEYS } from './managed_config_keys'; +import { MANAGED_CONFIG_KEYS, MANAGED_CONFIG_FILES } from './managed_config_keys'; import { updateVscodeConfig } from './update_vscode_config'; +const CONFIG_DIR = Path.resolve(REPO_ROOT, '.vscode'); + export function runUpdateVscodeConfigCli() { run(async ({ log }) => { - const path = Path.resolve(REPO_ROOT, '.vscode/settings.json'); + const path = Path.resolve(CONFIG_DIR, 'settings.json'); let json; try { - json = await Fs.readFile(path, 'utf-8'); + json = await Fsp.readFile(path, 'utf-8'); } catch (error) { if (error.code !== 'ENOENT') { throw error; @@ -40,8 +42,14 @@ export function runUpdateVscodeConfigCli() { `, json ); - await Fs.mkdir(Path.dirname(path), { recursive: true }); - await Fs.writeFile(path, updatedJson); + await Fsp.mkdir(Path.dirname(path), { recursive: true }); + + // write managed config files + for (const { name, content } of MANAGED_CONFIG_FILES) { + await Fsp.writeFile(Path.resolve(CONFIG_DIR, name), content); + } + + await Fsp.writeFile(path, updatedJson); log.success('updated', path); }); diff --git a/packages/kbn-kibana-json-schema/BUILD.bazel b/packages/kbn-kibana-json-schema/BUILD.bazel new file mode 100644 index 0000000000000..ff863dd7d6d0a --- /dev/null +++ b/packages/kbn-kibana-json-schema/BUILD.bazel @@ -0,0 +1,117 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") + +PKG_DIRNAME = "kbn-kibana-json-schema" +PKG_REQUIRE_NAME = "@kbn/kibana-json-schema" + +SOURCE_FILES = glob( + [ + "src/**/*.ts", + ], + exclude = [ + "**/*.test.*", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +# In this array place runtime dependencies, including other packages and NPM packages +# which must be available for this code to run. +# +# To reference other packages use: +# "//repo/relative/path/to/package" +# eg. "//packages/kbn-utils" +# +# To reference a NPM package use: +# "@npm//name-of-package" +# eg. "@npm//lodash" +RUNTIME_DEPS = [ + "@npm//dedent", +] + +# In this array place dependencies necessary to build the types, which will include the +# :npm_module_types target of other packages and packages from NPM, including @types/* +# packages. +# +# To reference the types for another package use: +# "//repo/relative/path/to/package:npm_module_types" +# eg. "//packages/kbn-utils:npm_module_types" +# +# References to NPM packages work the same as RUNTIME_DEPS +TYPES_DEPS = [ + "@npm//@types/dedent", + "@npm//@types/node", + "@npm//@types/jest", + "@npm//json-schema-typed" +] + +jsts_transpiler( + name = "target_node", + srcs = SRCS, + build_pkg_name = package_name(), +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + "//:tsconfig.base.json", + "//:tsconfig.bazel.json", + ], +) + +ts_project( + name = "tsc_types", + args = ['--pretty'], + srcs = SRCS, + deps = TYPES_DEPS, + declaration = True, + emit_declaration_only = True, + out_dir = "target_types", + root_dir = "src", + tsconfig = ":tsconfig", +) + +js_library( + name = PKG_DIRNAME, + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node"], + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [":" + PKG_DIRNAME], +) + +filegroup( + name = "build", + srcs = [":npm_module"], + visibility = ["//visibility:public"], +) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-kibana-json-schema/README.md b/packages/kbn-kibana-json-schema/README.md new file mode 100644 index 0000000000000..f1edda001081b --- /dev/null +++ b/packages/kbn-kibana-json-schema/README.md @@ -0,0 +1,3 @@ +# @kbn/kibana-json-schema + +The JSON Schema used for kibana.json files \ No newline at end of file diff --git a/packages/kbn-kibana-json-schema/jest.config.js b/packages/kbn-kibana-json-schema/jest.config.js new file mode 100644 index 0000000000000..00bc8f55adc57 --- /dev/null +++ b/packages/kbn-kibana-json-schema/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-kibana-json-schema'], +}; diff --git a/packages/kbn-kibana-json-schema/package.json b/packages/kbn-kibana-json-schema/package.json new file mode 100644 index 0000000000000..12df4c2d199a2 --- /dev/null +++ b/packages/kbn-kibana-json-schema/package.json @@ -0,0 +1,7 @@ +{ + "name": "@kbn/kibana-json-schema", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/packages/kbn-kibana-json-schema/src/index.ts b/packages/kbn-kibana-json-schema/src/index.ts new file mode 100644 index 0000000000000..57d8be3e215e6 --- /dev/null +++ b/packages/kbn-kibana-json-schema/src/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 { KibanaJsonSchema } from './kibana_json_schema'; diff --git a/packages/kbn-kibana-json-schema/src/kibana_json_schema.ts b/packages/kbn-kibana-json-schema/src/kibana_json_schema.ts new file mode 100644 index 0000000000000..40686a9230cc6 --- /dev/null +++ b/packages/kbn-kibana-json-schema/src/kibana_json_schema.ts @@ -0,0 +1,145 @@ +/* + * Copyright 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 { JSONSchema } from 'json-schema-typed'; +import dedent from 'dedent'; + +export const KibanaJsonSchema: JSONSchema = { + type: 'object', + required: ['id', 'version', 'owner'], + properties: { + id: { + description: dedent` + Identifier of the plugin. Must be a string in camelCase. Part of a plugin + public contract. Other plugins leverage it to access plugin API, navigate + to the plugin, etc. + `, + type: 'string', + pattern: '^[a-z]{1}([a-zA-Z0-9]{1,})$', + }, + version: { + description: 'Version of the plugin.', + type: 'string', + pattern: '^(kibana|v?\\d+(\\.\\d+){0,2})$', + }, + kibanaVersion: { + description: dedent` + The version of Kibana the plugin is compatible with, defaults to the value of the version field. + `, + type: 'string', + pattern: '^(kibana|)$', + }, + type: { + description: 'Type of the plugin, defaults to `standard`.', + enum: ['standard', 'preboot'], + }, + configPath: { + description: + 'Root configuration path used by the plugin, defaults to "id" in snake_case format.', + oneOf: [ + { type: 'string' }, + { + type: 'array', + items: { type: 'string' }, + }, + ], + }, + requiredPlugins: { + description: dedent` + An optional list of the other plugins that MUST BE installed and enabled for this + plugin to function properly. + `, + type: 'array', + items: { type: 'string' }, + }, + optionalPlugins: { + description: dedent` + An optional list of the other plugins that if installed and enabled **may be** + leveraged by this plugin for some additional functionality but otherwise are + not required for this plugin to work properly. + `, + type: 'array', + items: { type: 'string' }, + }, + requiredBundles: { + description: dedent` + An optional list of the other plugins that if installed and enabled MAY BE leveraged + by this plugin for some additional functionality but otherwise are not required for + this plugin to work properly. + + The plugins listed here will be loaded in the browser, even if the plugin is + disabled. Required by \`@kbn/optimizer\` to support cross-plugin imports. + "core" and plugins already listed in \`requiredPlugins\` do not need to be + duplicated here. + `, + type: 'array', + items: { type: 'string' }, + }, + ui: { + description: dedent` + Specifies whether plugin includes some client/browser specific functionality + that should be included into client bundle via \`public/ui_plugin.js\` file. + `, + type: 'boolean', + }, + server: { + description: dedent` + Specifies whether plugin includes some server-side specific functionality. + `, + type: 'boolean', + }, + extraPublicDirs: { + description: dedent` + Specifies directory names that can be imported by other ui-plugins built + using the same instance of the @kbn/optimizer. A temporary measure we plan + to replace with better mechanisms for sharing static code between plugins + @deprecated To be deleted when https://github.com/elastic/kibana/issues/101948 is done. + `, + type: 'array', + items: { type: 'string' }, + }, + serviceFolders: { + description: dedent` + Only used for the automatically generated API documentation. Specifying service + folders will cause your plugin API reference to be broken up into sub sections. + `, + type: 'array', + items: { type: 'string' }, + }, + owner: { + type: 'object', + required: ['name'], + properties: { + name: { + description: 'The name of the team that currently owns this plugin.', + type: 'string', + }, + githubTeam: { + description: dedent` + All internal plugins should have a github team specified. GitHub teams can be + viewed here: https://github.com/orgs/elastic/teams + `, + type: 'string', + }, + }, + }, + description: { + description: dedent` + A brief description of what this plugin does and any capabilities it provides. + `, + type: 'string', + }, + enabledOnAnonymousPages: { + description: dedent` + Specifies whether this plugin - and its required dependencies - will be enabled for anonymous pages (login page, status page when + configured, etc.) Default is false. + `, + type: 'boolean', + }, + }, +}; diff --git a/packages/kbn-kibana-json-schema/tsconfig.json b/packages/kbn-kibana-json-schema/tsconfig.json new file mode 100644 index 0000000000000..a8cfc2cceb08b --- /dev/null +++ b/packages/kbn-kibana-json-schema/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "rootDir": "src", + "stripInternal": false, + "types": [ + "jest", + "node" + ] + }, + "include": [ + "src/**/*" + ] +} diff --git a/yarn.lock b/yarn.lock index b6caac62d279a..a1c9373e08175 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3080,6 +3080,10 @@ version "0.0.0" uid "" +"@kbn/kibana-json-schema@link:bazel-bin/packages/kbn-kibana-json-schema": + version "0.0.0" + uid "" + "@kbn/logging-mocks@link:bazel-bin/packages/kbn-logging-mocks": version "0.0.0" uid "" @@ -6148,6 +6152,10 @@ version "0.0.0" uid "" +"@types/kbn__kibana-json-schema@link:bazel-bin/packages/kbn-kibana-json-schema/npm_module_types": + version "0.0.0" + uid "" + "@types/kbn__logging-mocks@link:bazel-bin/packages/kbn-logging-mocks/npm_module_types": version "0.0.0" uid "" @@ -18585,6 +18593,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema-typed@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" + integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== + json-schema@0.2.3, json-schema@0.4.0, json-schema@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" From 8c991cfaefdf7139588ce0d6f849c77a1217bcf2 Mon Sep 17 00:00:00 2001 From: Kerry Gallagher Date: Wed, 20 Apr 2022 16:28:34 +0100 Subject: [PATCH 07/22] [Stack Monitoring] Convert APM routes to TypeScript (#130097) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Felix Stürmer --- .../monitoring/common/http_api/apm/index.ts | 10 +++++ .../common/http_api/apm/post_apm_instance.ts | 31 +++++++++++++++ .../common/http_api/apm/post_apm_instances.ts | 30 +++++++++++++++ .../common/http_api/apm/post_apm_overview.ts | 30 +++++++++++++++ .../monitoring/common/runtime_types.ts | 34 +++++++++++++++++ .../server/lib/apm/_get_time_of_last_event.ts | 4 +- .../monitoring/server/lib/apm/get_apm_info.ts | 4 +- .../lib/cluster/flag_supported_clusters.ts | 10 ++--- .../lib/create_route_validation_function.ts | 27 +++++++++++++ .../server/lib/elasticsearch/get_ml_jobs.ts | 6 +-- x-pack/plugins/monitoring/server/plugin.ts | 31 +++++++++------ ...r_status.js => _get_apm_cluster_status.ts} | 10 ++++- .../routes/api/v1/apm/{index.js => index.ts} | 0 .../api/v1/apm/{instance.js => instance.ts} | 38 +++++++++---------- .../api/v1/apm/{instances.js => instances.ts} | 31 +++++++-------- ...set_instance.js => metric_set_instance.ts} | 0 ...set_overview.js => metric_set_overview.ts} | 0 .../api/v1/apm/{overview.js => overview.ts} | 33 ++++++++-------- .../server/routes/api/v1/beats/beat_detail.js | 2 +- .../server/routes/api/v1/beats/beats.js | 2 +- .../server/routes/api/v1/beats/overview.js | 2 +- .../server/routes/api/v1/cluster/cluster.ts | 2 +- .../server/routes/api/v1/elasticsearch/ccr.ts | 2 +- .../routes/api/v1/elasticsearch/ccr_shard.ts | 2 +- .../api/v1/elasticsearch/index_detail.js | 2 +- .../routes/api/v1/elasticsearch/indices.js | 2 +- .../routes/api/v1/elasticsearch/ml_jobs.js | 2 +- .../api/v1/elasticsearch/node_detail.js | 2 +- .../routes/api/v1/elasticsearch/nodes.js | 2 +- .../routes/api/v1/elasticsearch/overview.js | 2 +- .../api/v1/enterprise_search/overview.js | 2 +- .../server/routes/api/v1/kibana/instance.ts | 2 +- .../server/routes/api/v1/kibana/instances.js | 2 +- .../server/routes/api/v1/kibana/overview.js | 2 +- .../server/routes/api/v1/logstash/node.js | 2 +- .../server/routes/api/v1/logstash/nodes.js | 2 +- .../server/routes/api/v1/logstash/overview.js | 2 +- .../server/routes/api/v1/logstash/pipeline.js | 2 +- .../pipelines/cluster_pipeline_ids.js | 2 +- .../logstash/pipelines/cluster_pipelines.js | 2 +- .../v1/logstash/pipelines/node_pipelines.js | 2 +- .../api/v1/setup/cluster_setup_status.js | 2 +- .../routes/api/v1/setup/node_setup_status.js | 2 +- x-pack/plugins/monitoring/server/types.ts | 14 ++++++- 44 files changed, 285 insertions(+), 108 deletions(-) create mode 100644 x-pack/plugins/monitoring/common/http_api/apm/index.ts create mode 100644 x-pack/plugins/monitoring/common/http_api/apm/post_apm_instance.ts create mode 100644 x-pack/plugins/monitoring/common/http_api/apm/post_apm_instances.ts create mode 100644 x-pack/plugins/monitoring/common/http_api/apm/post_apm_overview.ts create mode 100644 x-pack/plugins/monitoring/common/runtime_types.ts create mode 100644 x-pack/plugins/monitoring/server/lib/create_route_validation_function.ts rename x-pack/plugins/monitoring/server/routes/api/v1/apm/{_get_apm_cluster_status.js => _get_apm_cluster_status.ts} (75%) rename x-pack/plugins/monitoring/server/routes/api/v1/apm/{index.js => index.ts} (100%) rename x-pack/plugins/monitoring/server/routes/api/v1/apm/{instance.js => instance.ts} (72%) rename x-pack/plugins/monitoring/server/routes/api/v1/apm/{instances.js => instances.ts} (67%) rename x-pack/plugins/monitoring/server/routes/api/v1/apm/{metric_set_instance.js => metric_set_instance.ts} (100%) rename x-pack/plugins/monitoring/server/routes/api/v1/apm/{metric_set_overview.js => metric_set_overview.ts} (100%) rename x-pack/plugins/monitoring/server/routes/api/v1/apm/{overview.js => overview.ts} (66%) diff --git a/x-pack/plugins/monitoring/common/http_api/apm/index.ts b/x-pack/plugins/monitoring/common/http_api/apm/index.ts new file mode 100644 index 0000000000000..b2d5888abf9d7 --- /dev/null +++ b/x-pack/plugins/monitoring/common/http_api/apm/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './post_apm_instance'; +export * from './post_apm_instances'; +export * from './post_apm_overview'; diff --git a/x-pack/plugins/monitoring/common/http_api/apm/post_apm_instance.ts b/x-pack/plugins/monitoring/common/http_api/apm/post_apm_instance.ts new file mode 100644 index 0000000000000..537b68dabd888 --- /dev/null +++ b/x-pack/plugins/monitoring/common/http_api/apm/post_apm_instance.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 * as rt from 'io-ts'; + +export const postApmInstanceRequestParamsRT = rt.type({ + clusterUuid: rt.string, + apmUuid: rt.string, +}); + +export const postApmInstanceRequestPayloadRT = rt.intersection([ + rt.partial({ + ccs: rt.string, + }), + rt.type({ + timeRange: rt.type({ + min: rt.string, + max: rt.string, + }), + }), +]); + +export type PostApmInstanceRequestPayload = rt.TypeOf; + +export const postApmInstanceResponsePayloadRT = rt.type({ + data: rt.string, +}); diff --git a/x-pack/plugins/monitoring/common/http_api/apm/post_apm_instances.ts b/x-pack/plugins/monitoring/common/http_api/apm/post_apm_instances.ts new file mode 100644 index 0000000000000..9e5510ed7a8f9 --- /dev/null +++ b/x-pack/plugins/monitoring/common/http_api/apm/post_apm_instances.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 * as rt from 'io-ts'; + +export const postApmInstancesRequestParamsRT = rt.type({ + clusterUuid: rt.string, +}); + +export const postApmInstancesRequestPayloadRT = rt.intersection([ + rt.partial({ + ccs: rt.string, + }), + rt.type({ + timeRange: rt.type({ + min: rt.string, + max: rt.string, + }), + }), +]); + +export type PostApmInstancesRequestPayload = rt.TypeOf; + +export const postApmInstancesResponsePayloadRT = rt.type({ + data: rt.string, +}); diff --git a/x-pack/plugins/monitoring/common/http_api/apm/post_apm_overview.ts b/x-pack/plugins/monitoring/common/http_api/apm/post_apm_overview.ts new file mode 100644 index 0000000000000..e7da157984b1d --- /dev/null +++ b/x-pack/plugins/monitoring/common/http_api/apm/post_apm_overview.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 * as rt from 'io-ts'; + +export const postApmOverviewRequestParamsRT = rt.type({ + clusterUuid: rt.string, +}); + +export const postApmOverviewRequestPayloadRT = rt.intersection([ + rt.partial({ + ccs: rt.string, + }), + rt.type({ + timeRange: rt.type({ + min: rt.string, + max: rt.string, + }), + }), +]); + +export type PostApmOverviewRequestPayload = rt.TypeOf; + +export const postApmOverviewResponsePayloadRT = rt.type({ + data: rt.string, +}); diff --git a/x-pack/plugins/monitoring/common/runtime_types.ts b/x-pack/plugins/monitoring/common/runtime_types.ts new file mode 100644 index 0000000000000..3b49cc628be84 --- /dev/null +++ b/x-pack/plugins/monitoring/common/runtime_types.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 { Context, IntersectionType, UnionType, ValidationError } from 'io-ts'; + +const getErrorPath = ([first, ...rest]: Context): string[] => { + if (typeof first === 'undefined') { + return []; + } else if (first.type instanceof IntersectionType) { + const [, ...next] = rest; + return getErrorPath(next); + } else if (first.type instanceof UnionType) { + const [, ...next] = rest; + return [first.key, ...getErrorPath(next)]; + } + + return [first.key, ...getErrorPath(rest)]; +}; + +const getErrorType = ({ context }: ValidationError) => + context[context.length - 1]?.type?.name ?? 'unknown'; + +const formatError = (error: ValidationError) => + error.message ?? + `in ${getErrorPath(error.context).join('/')}: ${JSON.stringify( + error.value + )} does not match expected type ${getErrorType(error)}`; + +export const formatErrors = (errors: ValidationError[]) => + `Failed to validate: \n${errors.map((error) => ` ${formatError(error)}`).join('\n')}`; diff --git a/x-pack/plugins/monitoring/server/lib/apm/_get_time_of_last_event.ts b/x-pack/plugins/monitoring/server/lib/apm/_get_time_of_last_event.ts index 0ad1ff7370a9a..d4580ab1e0a90 100644 --- a/x-pack/plugins/monitoring/server/lib/apm/_get_time_of_last_event.ts +++ b/x-pack/plugins/monitoring/server/lib/apm/_get_time_of_last_event.ts @@ -21,8 +21,8 @@ export async function getTimeOfLastEvent({ req: LegacyRequest; callWithRequest: (_req: any, endpoint: string, params: any) => Promise; apmIndexPattern: string; - start: number; - end: number; + start?: number; + end?: number; clusterUuid: string; }) { const params = { diff --git a/x-pack/plugins/monitoring/server/lib/apm/get_apm_info.ts b/x-pack/plugins/monitoring/server/lib/apm/get_apm_info.ts index d12d69f9a18da..92f5b19165916 100644 --- a/x-pack/plugins/monitoring/server/lib/apm/get_apm_info.ts +++ b/x-pack/plugins/monitoring/server/lib/apm/get_apm_info.ts @@ -85,8 +85,8 @@ export async function getApmInfo( }: { clusterUuid: string; apmUuid: string; - start: number; - end: number; + start?: number; + end?: number; } ) { checkParam(apmIndexPattern, 'apmIndexPattern in beats/getBeatSummary'); diff --git a/x-pack/plugins/monitoring/server/lib/cluster/flag_supported_clusters.ts b/x-pack/plugins/monitoring/server/lib/cluster/flag_supported_clusters.ts index 4c23ff858f471..189f94976a035 100644 --- a/x-pack/plugins/monitoring/server/lib/cluster/flag_supported_clusters.ts +++ b/x-pack/plugins/monitoring/server/lib/cluster/flag_supported_clusters.ts @@ -8,14 +8,14 @@ // @ts-ignore import { checkParam } from '../error_missing_required'; import { STANDALONE_CLUSTER_CLUSTER_UUID } from '../../../common/constants'; -import { ElasticsearchResponse, ElasticsearchModifiedSource } from '../../../common/types/es'; -import { LegacyRequest } from '../../types'; +import { ElasticsearchResponse } from '../../../common/types/es'; +import { LegacyRequest, Cluster } from '../../types'; import { getNewIndexPatterns } from './get_index_patterns'; import { Globals } from '../../static_globals'; async function findSupportedBasicLicenseCluster( req: LegacyRequest, - clusters: ElasticsearchModifiedSource[], + clusters: Cluster[], ccs: string, kibanaUuid: string, serverLog: (message: string) => void @@ -90,7 +90,7 @@ async function findSupportedBasicLicenseCluster( */ export function flagSupportedClusters(req: LegacyRequest, ccs: string) { const serverLog = (message: string) => req.getLogger('supported-clusters').debug(message); - const flagAllSupported = (clusters: ElasticsearchModifiedSource[]) => { + const flagAllSupported = (clusters: Cluster[]) => { clusters.forEach((cluster) => { if (cluster.license || cluster.elasticsearch?.cluster?.stats?.license) { cluster.isSupported = true; @@ -99,7 +99,7 @@ export function flagSupportedClusters(req: LegacyRequest, ccs: string) { return clusters; }; - return async function (clusters: ElasticsearchModifiedSource[]) { + return async function (clusters: Cluster[]) { // Standalone clusters are automatically supported in the UI so ignore those for // our calculations here let linkedClusterCount = 0; diff --git a/x-pack/plugins/monitoring/server/lib/create_route_validation_function.ts b/x-pack/plugins/monitoring/server/lib/create_route_validation_function.ts new file mode 100644 index 0000000000000..4ed1276d039b1 --- /dev/null +++ b/x-pack/plugins/monitoring/server/lib/create_route_validation_function.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 { RouteValidationFunction } from '@kbn/core/server'; +import { fold } from 'fp-ts/lib/Either'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { Errors, Type } from 'io-ts'; +import { formatErrors } from '../../common/runtime_types'; + +type ValdidationResult = ReturnType>; + +export const createValidationFunction = + ( + runtimeType: Type + ): RouteValidationFunction => + (inputValue, { badRequest, ok }) => + pipe( + runtimeType.decode(inputValue), + fold>( + (errors: Errors) => badRequest(formatErrors(errors)), + (result: DecodedValue) => ok(result) + ) + ); diff --git a/x-pack/plugins/monitoring/server/lib/elasticsearch/get_ml_jobs.ts b/x-pack/plugins/monitoring/server/lib/elasticsearch/get_ml_jobs.ts index 881643c8b33df..0a2143a185c16 100644 --- a/x-pack/plugins/monitoring/server/lib/elasticsearch/get_ml_jobs.ts +++ b/x-pack/plugins/monitoring/server/lib/elasticsearch/get_ml_jobs.ts @@ -13,8 +13,8 @@ import { createQuery } from '../create_query'; // @ts-ignore import { ElasticsearchMetric } from '../metrics'; import { ML_SUPPORTED_LICENSES } from '../../../common/constants'; -import { ElasticsearchResponse, ElasticsearchSource } from '../../../common/types/es'; -import { LegacyRequest } from '../../types'; +import { ElasticsearchResponse } from '../../../common/types/es'; +import { LegacyRequest, Cluster } from '../../types'; import { getNewIndexPatterns } from '../cluster/get_index_patterns'; import { Globals } from '../../static_globals'; @@ -100,7 +100,7 @@ export function getMlJobs(req: LegacyRequest) { * cardinality isn't guaranteed to be accurate is the issue * but it will be as long as the precision threshold is >= the actual value */ -export function getMlJobsForCluster(req: LegacyRequest, cluster: ElasticsearchSource, ccs: string) { +export function getMlJobsForCluster(req: LegacyRequest, cluster: Cluster, ccs: string) { const license = cluster.license ?? cluster.elasticsearch?.cluster?.stats?.license ?? {}; if (license.status === 'active' && includes(ML_SUPPORTED_LICENSES, license.type)) { diff --git a/x-pack/plugins/monitoring/server/plugin.ts b/x-pack/plugins/monitoring/server/plugin.ts index 44117a747cbc3..ef2cc93bff652 100644 --- a/x-pack/plugins/monitoring/server/plugin.ts +++ b/x-pack/plugins/monitoring/server/plugin.ts @@ -22,6 +22,7 @@ import { } from '@kbn/core/server'; import { get } from 'lodash'; import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; +import { RouteMethod } from '@kbn/core/server'; import { KIBANA_MONITORING_LOGGING_TAG, KIBANA_STATS_TYPE_MONITORING, @@ -50,6 +51,7 @@ import { PluginsSetup, PluginsStart, RequestHandlerContextMonitoringPlugin, + MonitoringRouteConfig, } from './types'; // This is used to test the version of kibana @@ -314,7 +316,9 @@ export class MonitoringPlugin return { config, log: this.log, - route: (options: any) => { + route: ( + options: MonitoringRouteConfig + ) => { const method = options.method; const handler = async ( context: RequestHandlerContextMonitoringPlugin, @@ -389,18 +393,23 @@ export class MonitoringPlugin } }; - const validate: any = get(options, 'config.validate', false); - if (validate && validate.payload) { - validate.body = validate.payload; - } + const validate: MonitoringRouteConfig['validate'] = + // NOTE / TODO: "config.validate" is a legacy convention and should be converted over during the TS conversion work + get(options, 'validate', false) || get(options, 'config.validate', false); + options.validate = validate; - if (method === 'POST') { - router.post(options, handler); - } else if (method === 'GET') { - router.get(options, handler); - } else if (method === 'PUT') { - router.put(options, handler); + const routeConfig = { + path: options.path, + validate: options.validate, + }; + + if (method.toLowerCase() === 'post') { + router.post(routeConfig, handler); + } else if (method.toLowerCase() === 'get') { + router.get(routeConfig, handler); + } else if (method.toLowerCase() === 'put') { + router.put(routeConfig, handler); } else { throw new Error('Unsupported API method: ' + method); } diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/_get_apm_cluster_status.js b/x-pack/plugins/monitoring/server/routes/api/v1/apm/_get_apm_cluster_status.ts similarity index 75% rename from x-pack/plugins/monitoring/server/routes/api/v1/apm/_get_apm_cluster_status.js rename to x-pack/plugins/monitoring/server/routes/api/v1/apm/_get_apm_cluster_status.ts index bd0198ffcc3b2..50ae3b574deb9 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/apm/_get_apm_cluster_status.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/apm/_get_apm_cluster_status.ts @@ -6,8 +6,16 @@ */ import { getApmsForClusters } from '../../../../lib/apm/get_apms_for_clusters'; +import { LegacyRequest } from '../../../../types'; -export const getApmClusterStatus = (req, { clusterUuid }) => { +export const getApmClusterStatus = ( + req: LegacyRequest, + { + clusterUuid, + }: { + clusterUuid: string; + } +) => { const clusters = [{ cluster_uuid: clusterUuid }]; return getApmsForClusters(req, clusters).then((apms) => { const [{ stats, config }] = apms; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/index.js b/x-pack/plugins/monitoring/server/routes/api/v1/apm/index.ts similarity index 100% rename from x-pack/plugins/monitoring/server/routes/api/v1/apm/index.js rename to x-pack/plugins/monitoring/server/routes/api/v1/apm/index.ts diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.js b/x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.ts similarity index 72% rename from x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.js rename to x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.ts index 61530a52ddd19..69b226ef3eaed 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/apm/instance.ts @@ -5,32 +5,26 @@ * 2.0. */ -import { schema } from '@kbn/config-schema'; import { prefixIndexPatternWithCcs } from '../../../../../common/ccs_utils'; +import { INDEX_PATTERN_BEATS } from '../../../../../common/constants'; +import { + postApmInstanceRequestParamsRT, + postApmInstanceRequestPayloadRT, +} from '../../../../../common/http_api/apm'; +import { getApmInfo } from '../../../../lib/apm'; +import { createValidationFunction } from '../../../../lib/create_route_validation_function'; import { getMetrics } from '../../../../lib/details/get_metrics'; -import { metricSet } from './metric_set_instance'; import { handleError } from '../../../../lib/errors'; -import { getApmInfo } from '../../../../lib/apm'; -import { INDEX_PATTERN_BEATS } from '../../../../../common/constants'; +import { MonitoringCore } from '../../../../types'; +import { metricSet } from './metric_set_instance'; -export function apmInstanceRoute(server) { +export function apmInstanceRoute(server: MonitoringCore) { server.route({ - method: 'POST', + method: 'post', path: '/api/monitoring/v1/clusters/{clusterUuid}/apm/{apmUuid}', - config: { - validate: { - params: schema.object({ - clusterUuid: schema.string(), - apmUuid: schema.string(), - }), - payload: schema.object({ - ccs: schema.maybe(schema.string()), - timeRange: schema.object({ - min: schema.string(), - max: schema.string(), - }), - }), - }, + validate: { + params: createValidationFunction(postApmInstanceRequestParamsRT), + body: createValidationFunction(postApmInstanceRequestPayloadRT), }, async handler(req) { const apmUuid = req.params.apmUuid; @@ -42,7 +36,9 @@ export function apmInstanceRoute(server) { const showCgroupMetrics = config.ui.container.apm.enabled; if (showCgroupMetrics) { const metricCpu = metricSet.find((m) => m.name === 'apm_cpu'); - metricCpu.keys = ['apm_cgroup_cpu']; + if (metricCpu) { + metricCpu.keys = ['apm_cgroup_cpu']; + } } try { diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.js b/x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.ts similarity index 67% rename from x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.js rename to x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.ts index c1ba44bff590a..960a8dc3627b0 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/apm/instances.ts @@ -5,29 +5,24 @@ * 2.0. */ -import { schema } from '@kbn/config-schema'; import { prefixIndexPatternWithCcs } from '../../../../../common/ccs_utils'; -import { getStats, getApms } from '../../../../lib/apm'; -import { handleError } from '../../../../lib/errors'; import { INDEX_PATTERN_BEATS } from '../../../../../common/constants'; +import { + postApmInstancesRequestParamsRT, + postApmInstancesRequestPayloadRT, +} from '../../../../../common/http_api/apm'; +import { getApms, getStats } from '../../../../lib/apm'; +import { createValidationFunction } from '../../../../lib/create_route_validation_function'; +import { handleError } from '../../../../lib/errors'; +import { MonitoringCore } from '../../../../types'; -export function apmInstancesRoute(server) { +export function apmInstancesRoute(server: MonitoringCore) { server.route({ - method: 'POST', + method: 'post', path: '/api/monitoring/v1/clusters/{clusterUuid}/apm/instances', - config: { - validate: { - params: schema.object({ - clusterUuid: schema.string(), - }), - payload: schema.object({ - ccs: schema.maybe(schema.string()), - timeRange: schema.object({ - min: schema.string(), - max: schema.string(), - }), - }), - }, + validate: { + params: createValidationFunction(postApmInstancesRequestParamsRT), + body: createValidationFunction(postApmInstancesRequestPayloadRT), }, async handler(req) { const config = server.config; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/metric_set_instance.js b/x-pack/plugins/monitoring/server/routes/api/v1/apm/metric_set_instance.ts similarity index 100% rename from x-pack/plugins/monitoring/server/routes/api/v1/apm/metric_set_instance.js rename to x-pack/plugins/monitoring/server/routes/api/v1/apm/metric_set_instance.ts diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/metric_set_overview.js b/x-pack/plugins/monitoring/server/routes/api/v1/apm/metric_set_overview.ts similarity index 100% rename from x-pack/plugins/monitoring/server/routes/api/v1/apm/metric_set_overview.js rename to x-pack/plugins/monitoring/server/routes/api/v1/apm/metric_set_overview.ts diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.js b/x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.ts similarity index 66% rename from x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.js rename to x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.ts index 1e5e125d7e6c9..532b5fa4dc4c8 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/apm/overview.ts @@ -5,29 +5,24 @@ * 2.0. */ -import { schema } from '@kbn/config-schema'; +import { + postApmOverviewRequestParamsRT, + postApmOverviewRequestPayloadRT, +} from '../../../../../common/http_api/apm'; +import { createValidationFunction } from '../../../../lib/create_route_validation_function'; import { getMetrics } from '../../../../lib/details/get_metrics'; -import { metricSet } from './metric_set_overview'; import { handleError } from '../../../../lib/errors'; +import { MonitoringCore } from '../../../../types'; +import { metricSet } from './metric_set_overview'; import { getApmClusterStatus } from './_get_apm_cluster_status'; -export function apmOverviewRoute(server) { +export function apmOverviewRoute(server: MonitoringCore) { server.route({ - method: 'POST', + method: 'post', path: '/api/monitoring/v1/clusters/{clusterUuid}/apm', - config: { - validate: { - params: schema.object({ - clusterUuid: schema.string(), - }), - payload: schema.object({ - ccs: schema.maybe(schema.string()), - timeRange: schema.object({ - min: schema.string(), - max: schema.string(), - }), - }), - }, + validate: { + params: createValidationFunction(postApmOverviewRequestParamsRT), + body: createValidationFunction(postApmOverviewRequestPayloadRT), }, async handler(req) { const config = server.config; @@ -36,7 +31,9 @@ export function apmOverviewRoute(server) { const showCgroupMetrics = config.ui.container.apm.enabled; if (showCgroupMetrics) { const metricCpu = metricSet.find((m) => m.name === 'apm_cpu'); - metricCpu.keys = ['apm_cgroup_cpu']; + if (metricCpu) { + metricCpu.keys = ['apm_cgroup_cpu']; + } } try { diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/beats/beat_detail.js b/x-pack/plugins/monitoring/server/routes/api/v1/beats/beat_detail.js index 96851b4e7f3d8..8c28dd420675a 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/beats/beat_detail.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/beats/beat_detail.js @@ -23,7 +23,7 @@ export function beatsDetailRoute(server) { clusterUuid: schema.string(), beatUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/beats/beats.js b/x-pack/plugins/monitoring/server/routes/api/v1/beats/beats.js index 0a44b657afa78..83403eaa355bd 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/beats/beats.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/beats/beats.js @@ -20,7 +20,7 @@ export function beatsListingRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/beats/overview.js b/x-pack/plugins/monitoring/server/routes/api/v1/beats/overview.js index 49da476e166e7..9cd9bcd9787e2 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/beats/overview.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/beats/overview.js @@ -22,7 +22,7 @@ export function beatsOverviewRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/cluster/cluster.ts b/x-pack/plugins/monitoring/server/routes/api/v1/cluster/cluster.ts index ecfb62c7d2c4b..30749f2e95c9f 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/cluster/cluster.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/cluster/cluster.ts @@ -24,7 +24,7 @@ export function clusterRoute(server: LegacyServer) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr.ts index 2e7ebe753e8a1..3dd4feb3db805 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr.ts @@ -204,7 +204,7 @@ export function ccrRoute(server: { route: (p: any) => void; config: MonitoringCo params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr_shard.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr_shard.ts index 91d616d776f26..44a1eb1807595 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr_shard.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ccr_shard.ts @@ -89,7 +89,7 @@ export function ccrShardRoute(server: { route: (p: any) => void; config: () => { index: schema.string(), shardId: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/index_detail.js b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/index_detail.js index 2d405f8d2a517..b4f317c9a435d 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/index_detail.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/index_detail.js @@ -29,7 +29,7 @@ export function esIndexRoute(server) { clusterUuid: schema.string(), id: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/indices.js b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/indices.js index ea490a1547116..de41137791108 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/indices.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/indices.js @@ -24,7 +24,7 @@ export function esIndicesRoute(server) { query: schema.object({ show_system_indices: schema.boolean(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ml_jobs.js b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ml_jobs.js index d27ec8ce3cc83..f2f0698bae18c 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ml_jobs.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/ml_jobs.js @@ -21,7 +21,7 @@ export function mlJobRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/node_detail.js b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/node_detail.js index cb7fc1a455c61..1504bb076101e 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/node_detail.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/node_detail.js @@ -29,7 +29,7 @@ export function esNodeRoute(server) { clusterUuid: schema.string(), nodeUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), showSystemIndices: schema.boolean({ defaultValue: false }), // show/hide system indices in shard allocation table timeRange: schema.object({ diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/nodes.js b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/nodes.js index d6cff7ecd9ae9..fa0329f957f54 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/nodes.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/nodes.js @@ -24,7 +24,7 @@ export function esNodesRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/overview.js b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/overview.js index 57b3d2d267831..35066bb33784d 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/overview.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch/overview.js @@ -26,7 +26,7 @@ export function esOverviewRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/enterprise_search/overview.js b/x-pack/plugins/monitoring/server/routes/api/v1/enterprise_search/overview.js index 97ab818a82992..e3e269d8b3148 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/enterprise_search/overview.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/enterprise_search/overview.js @@ -20,7 +20,7 @@ export function entSearchOverviewRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instance.ts b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instance.ts index dfbd8e82bb29b..b899697cbc7b3 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instance.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instance.ts @@ -31,7 +31,7 @@ export function kibanaInstanceRoute(server: LegacyServer) { clusterUuid: schema.string(), kibanaUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instances.js b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instances.js index f1e872d6436f2..a406d2a2896e6 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instances.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/instances.js @@ -22,7 +22,7 @@ export function kibanaInstancesRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/overview.js b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/overview.js index 8f77dea99868a..ff34c2735bd57 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/kibana/overview.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/kibana/overview.js @@ -23,7 +23,7 @@ export function kibanaOverviewRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/node.js b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/node.js index be7ce5ad0d3c2..cf1551d260e17 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/node.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/node.js @@ -36,7 +36,7 @@ export function logstashNodeRoute(server) { clusterUuid: schema.string(), logstashUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/nodes.js b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/nodes.js index dd27dcec80605..c483a4ac905dd 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/nodes.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/nodes.js @@ -32,7 +32,7 @@ export function logstashNodesRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/overview.js b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/overview.js index 81d64e8fcdc2b..797365da6e308 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/overview.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/overview.js @@ -33,7 +33,7 @@ export function logstashOverviewRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipeline.js b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipeline.js index a9c3906dad675..128df1b147cc6 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipeline.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipeline.js @@ -38,7 +38,7 @@ export function logstashPipelineRoute(server) { pipelineId: schema.string(), pipelineHash: schema.maybe(schema.string()), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), detailVertexId: schema.maybe(schema.string()), }), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipeline_ids.js b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipeline_ids.js index bd9de876f8903..ebe3f1a308ff3 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipeline_ids.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipeline_ids.js @@ -21,7 +21,7 @@ export function logstashClusterPipelineIdsRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipelines.js b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipelines.js index ace5661b9bf98..38ba810ca5a23 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipelines.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/cluster_pipelines.js @@ -22,7 +22,7 @@ export function logstashClusterPipelinesRoute(server) { params: schema.object({ clusterUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/node_pipelines.js b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/node_pipelines.js index c232da925e74c..d47f1e6e88ec8 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/node_pipelines.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/logstash/pipelines/node_pipelines.js @@ -23,7 +23,7 @@ export function logstashNodePipelinesRoute(server) { clusterUuid: schema.string(), logstashUuid: schema.string(), }), - payload: schema.object({ + body: schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ min: schema.string(), diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/setup/cluster_setup_status.js b/x-pack/plugins/monitoring/server/routes/api/v1/setup/cluster_setup_status.js index 7608d3527f235..bc8b722d22214 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/setup/cluster_setup_status.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/setup/cluster_setup_status.js @@ -35,7 +35,7 @@ export function clusterSetupStatusRoute(server) { // in our testing environment. skipLiveData: schema.boolean({ defaultValue: false }), }), - payload: schema.nullable( + body: schema.nullable( schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.object({ diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/setup/node_setup_status.js b/x-pack/plugins/monitoring/server/routes/api/v1/setup/node_setup_status.js index 42e77eb2b8b11..1f93e92843ea8 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/setup/node_setup_status.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/setup/node_setup_status.js @@ -35,7 +35,7 @@ export function nodeSetupStatusRoute(server) { // in our testing environment. skipLiveData: schema.boolean({ defaultValue: false }), }), - payload: schema.nullable( + body: schema.nullable( schema.object({ ccs: schema.maybe(schema.string()), timeRange: schema.maybe( diff --git a/x-pack/plugins/monitoring/server/types.ts b/x-pack/plugins/monitoring/server/types.ts index 37881544f8c1b..ee7deb63ec848 100644 --- a/x-pack/plugins/monitoring/server/types.ts +++ b/x-pack/plugins/monitoring/server/types.ts @@ -34,6 +34,7 @@ import { LicensingPluginStart } from '@kbn/licensing-plugin/server'; import { PluginSetupContract as FeaturesPluginSetupContract } from '@kbn/features-plugin/server'; import { EncryptedSavedObjectsPluginSetup } from '@kbn/encrypted-saved-objects-plugin/server'; import { CloudSetup } from '@kbn/cloud-plugin/server'; +import { RouteConfig, RouteMethod } from '@kbn/core/server'; import { ElasticsearchModifiedSource } from '../common/types/es'; import { RulesByType } from '../common/types/alerts'; import { configSchema, MonitoringConfig } from './config'; @@ -79,10 +80,18 @@ export interface RouteDependencies { logger: Logger; } +export type MonitoringRouteConfig = { + method: RouteMethod; +} & RouteConfig & { + handler: (request: LegacyRequest) => any; + }; + export interface MonitoringCore { config: MonitoringConfig; log: Logger; - route: (options: any) => void; + route: ( + options: MonitoringRouteConfig + ) => void; } export interface LegacyShimDependencies { @@ -144,7 +153,8 @@ export interface LegacyServer { }; } -export type Cluster = ElasticsearchModifiedSource & { +export type Cluster = Omit & { + timestamp?: string; ml?: { jobs: any }; logs?: any; alerts?: AlertsOnCluster; From 7df6a0dad5189748966a65bace56475a434f059f Mon Sep 17 00:00:00 2001 From: Or Ouziel Date: Wed, 20 Apr 2022 18:33:36 +0300 Subject: [PATCH 08/22] [Cloud Posture] add findings group by resource table (#130455) --- .../common/hooks/use_navigate_findings.ts | 4 +- .../findings_by_resource_table.test.tsx | 68 ++++++++ .../findings/findings_by_resource_table.tsx | 109 +++++++++++++ .../pages/findings/findings_container.tsx | 146 +++++++----------- .../findings/findings_group_by_selector.tsx | 8 +- .../pages/findings/findings_search_bar.tsx | 5 +- .../public/pages/findings/findings_table.tsx | 12 +- .../public/pages/findings/test_subjects.ts | 2 + .../public/pages/findings/types.ts | 27 ++++ .../public/pages/findings/use_findings.ts | 45 +++--- .../findings/use_findings_by_resource.ts | 101 ++++++++++++ .../pages/findings/use_findings_count.ts | 10 +- 12 files changed, 406 insertions(+), 131 deletions(-) create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/findings_by_resource_table.test.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/findings_by_resource_table.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings_by_resource.ts diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts index 6cc1582d7ff7b..b5ce12095f99a 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts @@ -9,9 +9,9 @@ import { useHistory } from 'react-router-dom'; import { Query } from '@kbn/es-query'; import { allNavigationItems } from '../navigation/constants'; import { encodeQuery } from '../navigation/query_utils'; -import { CspFindingsRequest } from '../../pages/findings/use_findings'; +import { FindingsBaseURLQuery } from '../../pages/findings/types'; -const getFindingsQuery = (queryValue: Query['query']): Pick => { +const getFindingsQuery = (queryValue: Query['query']): Pick => { const query = typeof queryValue === 'string' ? queryValue diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_by_resource_table.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_by_resource_table.test.tsx new file mode 100644 index 0000000000000..3018de31aeb58 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_by_resource_table.test.tsx @@ -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 React from 'react'; +import { render, screen, within } from '@testing-library/react'; +import * as TEST_SUBJECTS from './test_subjects'; +import { FindingsByResourceTable, formatNumber, getResourceId } from './findings_by_resource_table'; +import * as TEXT from './translations'; +import type { PropsOf } from '@elastic/eui'; +import Chance from 'chance'; +import numeral from '@elastic/numeral'; + +const chance = new Chance(); + +const getFakeFindingsByResource = () => ({ + resource_id: chance.guid(), + cluster_id: chance.guid(), + cis_section: chance.word(), + failed_findings: { + total: chance.integer(), + normalized: chance.integer({ min: 0, max: 1 }), + }, +}); + +type TableProps = PropsOf; + +describe('', () => { + it('renders the zero state when status success and data has a length of zero ', async () => { + const props: TableProps = { + loading: false, + data: { page: [] }, + error: null, + }; + + render(); + + expect(screen.getByText(TEXT.NO_FINDINGS)).toBeInTheDocument(); + }); + + it('renders the table with provided items', () => { + const data = Array.from({ length: 10 }, getFakeFindingsByResource); + + const props: TableProps = { + loading: false, + data: { page: data }, + error: null, + }; + + render(); + + data.forEach((item, i) => { + const row = screen.getByTestId( + TEST_SUBJECTS.getFindingsByResourceTableRowTestId(getResourceId(item)) + ); + expect(row).toBeInTheDocument(); + expect(within(row).getByText(item.resource_id)).toBeInTheDocument(); + expect(within(row).getByText(item.cluster_id)).toBeInTheDocument(); + expect(within(row).getByText(item.cis_section)).toBeInTheDocument(); + expect(within(row).getByText(formatNumber(item.failed_findings.total))).toBeInTheDocument(); + expect( + within(row).getByText(new RegExp(numeral(item.failed_findings.normalized).format('0%'))) + ).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_by_resource_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_by_resource_table.tsx new file mode 100644 index 0000000000000..d2acee177686a --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_by_resource_table.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { + EuiTableFieldDataColumnType, + EuiEmptyPrompt, + EuiBasicTable, + EuiTextColor, + EuiFlexGroup, + EuiFlexItem, + EuiLink, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import numeral from '@elastic/numeral'; +import { extractErrorMessage } from '../../../common/utils/helpers'; +import * as TEST_SUBJECTS from './test_subjects'; +import * as TEXT from './translations'; +import type { CspFindingsByResourceResult } from './use_findings_by_resource'; + +export const formatNumber = (value: number) => + value < 1000 ? value : numeral(value).format('0.0a'); + +type FindingsGroupByResourceProps = CspFindingsByResourceResult; +type CspFindingsByResource = NonNullable['page'][number]; + +export const getResourceId = (resource: CspFindingsByResource) => + [resource.resource_id, resource.cluster_id, resource.cis_section].join('/'); + +const FindingsByResourceTableComponent = ({ + error, + data, + loading, +}: FindingsGroupByResourceProps) => { + const getRowProps = (row: CspFindingsByResource) => ({ + 'data-test-subj': TEST_SUBJECTS.getFindingsByResourceTableRowTestId(getResourceId(row)), + }); + + if (!loading && !data?.page.length) + return {TEXT.NO_FINDINGS}} />; + + return ( + + ); +}; + +const columns: Array> = [ + { + field: 'resource_id', + name: ( + + ), + render: (resourceId: CspFindingsByResource['resource_id']) => {resourceId}, + }, + { + field: 'cis_section', + truncateText: true, + name: ( + + ), + }, + { + field: 'cluster_id', + truncateText: true, + name: ( + + ), + }, + { + field: 'failed_findings', + truncateText: true, + name: ( + + ), + render: (failedFindings: CspFindingsByResource['failed_findings']) => ( + + + {formatNumber(failedFindings.total)} + + + ({numeral(failedFindings.normalized).format('0%')}) + + + ), + }, +]; + +export const FindingsByResourceTable = React.memo(FindingsByResourceTableComponent); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_container.tsx index e41a4be639d20..213592d50e069 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_container.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_container.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useEffect, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { EuiComboBoxOptionOption, EuiSpacer, EuiTitle, useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -16,20 +16,18 @@ import { FindingsTable } from './findings_table'; import { FindingsSearchBar } from './findings_search_bar'; import * as TEST_SUBJECTS from './test_subjects'; import { useUrlQuery } from '../../common/hooks/use_url_query'; -import { useFindings, type CspFindingsRequest } from './use_findings'; +import { useFindings } from './use_findings'; +import type { FindingsGroupByNoneQuery } from './use_findings'; +import type { FindingsBaseURLQuery } from './types'; +import { useFindingsByResource } from './use_findings_by_resource'; import { FindingsGroupBySelector } from './findings_group_by_selector'; import { INTERNAL_FEATURE_FLAGS } from '../../../common/constants'; import { useFindingsCounter } from './use_findings_count'; import { FindingsDistributionBar } from './findings_distribution_bar'; -import type { CspClientPluginStartDeps } from '../../types'; -import { useKibana } from '../../common/hooks/use_kibana'; -import * as TEXT from './translations'; - -export type GroupBy = 'none' | 'resourceType'; -export type FindingsBaseQuery = ReturnType; +import { FindingsByResourceTable } from './findings_by_resource_table'; // TODO: define this as a schema with default values -export const getDefaultQuery = (): CspFindingsRequest & { groupBy: GroupBy } => ({ +export const getDefaultQuery = (): FindingsBaseURLQuery & FindingsGroupByNoneQuery => ({ query: { language: 'kuery', query: '' }, filters: [], sort: [{ ['@timestamp']: SortDirection.desc }], @@ -38,7 +36,7 @@ export const getDefaultQuery = (): CspFindingsRequest & { groupBy: GroupBy } => groupBy: 'none', }); -const getGroupByOptions = (): Array> => [ +const getGroupByOptions = (): Array> => [ { value: 'none', label: i18n.translate('xpack.csp.findings.groupBySelector.groupByNoneLabel', { @@ -46,88 +44,55 @@ const getGroupByOptions = (): Array> => [ }), }, { - value: 'resourceType', - label: i18n.translate('xpack.csp.findings.groupBySelector.groupByResourceTypeLabel', { - defaultMessage: 'Resource Type', + value: 'resource', + label: i18n.translate('xpack.csp.findings.groupBySelector.groupByResourceIdLabel', { + defaultMessage: 'Resource', }), }, ]; -const getFindingsBaseEsQuery = ({ - query, - dataView, - filters, - queryService, -}: Pick & { - dataView: DataView; - queryService: CspClientPluginStartDeps['data']['query']; -}) => { - if (query) queryService.queryString.setQuery(query); - queryService.filterManager.setFilters(filters); - - try { - return { - index: dataView.title, - query: buildEsQuery( - dataView, - queryService.queryString.getQuery(), - queryService.filterManager.getFilters() - ), - }; - } catch (error) { - return { - error: - error instanceof Error - ? error - : new Error( - i18n.translate('xpack.csp.findings.unknownError', { - defaultMessage: 'Unknown Error', - }) - ), - }; - } -}; - export const FindingsContainer = ({ dataView }: { dataView: DataView }) => { const { euiTheme } = useEuiTheme(); const groupByOptions = useMemo(getGroupByOptions, []); - const { - data, - notifications: { toasts }, - } = useKibana().services; - - const { - urlQuery: { groupBy, ...findingsQuery }, - setUrlQuery, - } = useUrlQuery(getDefaultQuery); + const { urlQuery, setUrlQuery } = useUrlQuery(getDefaultQuery); - const baseQuery = useMemo( - () => getFindingsBaseEsQuery({ ...findingsQuery, dataView, queryService: data.query }), - [data.query, dataView, findingsQuery] + const baseEsQuery = useMemo( + () => ({ + index: dataView.title, + // TODO: this will throw for malformed query + // page will display an error boundary with the JS error + // will be accounted for before releasing the feature + query: buildEsQuery(dataView, urlQuery.query, urlQuery.filters), + }), + [dataView, urlQuery] ); - const countResult = useFindingsCounter(baseQuery); - const findingsResult = useFindings({ - ...baseQuery, - size: findingsQuery.size, - from: findingsQuery.from, - sort: findingsQuery.sort, + const findingsGroupByResource = useFindingsByResource({ + ...baseEsQuery, + enabled: urlQuery.groupBy === 'resource', }); - useEffect(() => { - if (baseQuery.error) { - toasts.addError(baseQuery.error, { title: TEXT.SEARCH_FAILED }); - } - }, [baseQuery.error, toasts]); + const findingsCount = useFindingsCounter({ + ...baseEsQuery, + enabled: urlQuery.groupBy === 'none', + }); + + const findingsGroupByNone = useFindings({ + ...baseEsQuery, + enabled: urlQuery.groupBy === 'none', + size: urlQuery.size, + from: urlQuery.from, + sort: urlQuery.sort, + }); return (
{ {INTERNAL_FEATURE_FLAGS.showFindingsGroupBy && ( setUrlQuery({ groupBy: type[0]?.value })} options={groupByOptions} /> )} - {groupBy === 'none' && ( + {urlQuery.groupBy === 'none' && ( <> + + )} + {urlQuery.groupBy === 'resource' && ( + <> + )} - {groupBy === 'resourceType' &&
}
); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_group_by_selector.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_group_by_selector.tsx index c6e61c16299a3..84adf919a5fe1 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_group_by_selector.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_group_by_selector.tsx @@ -7,12 +7,12 @@ import React from 'react'; import { EuiComboBox, EuiFormLabel, type EuiComboBoxOptionOption } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { GroupBy } from './findings_container'; +import type { FindingsGroupByKind } from './types'; interface Props { - type: GroupBy; - options: Array>; - onChange(selectedOptions: Array>): void; + type: FindingsGroupByKind; + options: Array>; + onChange(selectedOptions: Array>): void; } export const FindingsGroupBySelector = ({ type, options, onChange }: Props) => ( diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_search_bar.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_search_bar.tsx index a3c1a0bfccb9a..89673dabbf91f 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_search_bar.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_search_bar.tsx @@ -10,12 +10,13 @@ import { EuiThemeComputed, useEuiTheme } from '@elastic/eui'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import type { DataView } from '@kbn/data-plugin/common'; import * as TEST_SUBJECTS from './test_subjects'; -import type { CspFindingsRequest, CspFindingsResult } from './use_findings'; +import type { CspFindingsResult } from './use_findings'; +import type { FindingsBaseURLQuery } from './types'; import type { CspClientPluginStartDeps } from '../../types'; import { PLUGIN_NAME } from '../../../common'; import { FINDINGS_SEARCH_PLACEHOLDER } from './translations'; -type SearchBarQueryProps = Pick; +type SearchBarQueryProps = Pick; interface FindingsSearchBarProps extends SearchBarQueryProps { setQuery(v: Partial): void; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.tsx index b1e404767d03e..189cf42994382 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.tsx @@ -22,13 +22,11 @@ import * as TEST_SUBJECTS from './test_subjects'; import * as TEXT from './translations'; import type { CspFinding } from './types'; import { CspEvaluationBadge } from '../../components/csp_evaluation_badge'; -import type { CspFindingsRequest, CspFindingsResult } from './use_findings'; +import type { FindingsGroupByNoneQuery, CspFindingsResult } from './use_findings'; import { FindingsRuleFlyout } from './findings_flyout'; -type TableQueryProps = Pick; - -interface BaseFindingsTableProps extends TableQueryProps { - setQuery(query: Partial): void; +interface BaseFindingsTableProps extends FindingsGroupByNoneQuery { + setQuery(query: Partial): void; } type FindingsTableProps = CspFindingsResult & BaseFindingsTableProps; @@ -119,7 +117,7 @@ const getEuiPaginationFromEsSearchSource = ({ }); const getEuiSortFromEsSearchSource = ( - sort: TableQueryProps['sort'] + sort: FindingsGroupByNoneQuery['sort'] ): EuiBasicTableProps['sorting'] => { if (!sort.length) return; @@ -133,7 +131,7 @@ const getEuiSortFromEsSearchSource = ( const getEsSearchQueryFromEuiTableParams = ({ page, sort, -}: Criteria): Partial => ({ +}: Criteria): Partial => ({ ...(!!page && { from: page.index * page.size, size: page.size }), sort: sort ? [{ [sort.field]: SortDirection[sort.direction] }] : undefined, }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/test_subjects.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/test_subjects.ts index 51bcafd46060d..778e54de82db6 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/test_subjects.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/test_subjects.ts @@ -9,3 +9,5 @@ export const FINDINGS_SEARCH_BAR = 'findings_search_bar'; export const FINDINGS_TABLE = 'findings_table'; export const FINDINGS_CONTAINER = 'findings_container'; export const FINDINGS_TABLE_ZERO_STATE = 'findings_table_zero_state'; +export const getFindingsByResourceTableRowTestId = (id: string) => + `findings_resource_table_row_${id}`; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/types.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/types.ts index efa2a04e06bc1..79d8f3507c896 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/types.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/types.ts @@ -4,6 +4,33 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import type { BoolQuery, Filter, Query } from '@kbn/es-query'; +import { UseQueryResult } from 'react-query'; + +export type FindingsGroupByKind = 'none' | 'resource'; + +export interface FindingsBaseURLQuery { + groupBy: FindingsGroupByKind; + query: Query; + filters: Filter[]; +} + +export interface FindingsBaseEsQuery { + index: string; + query?: { + bool: BoolQuery; + }; +} + +export interface FindingsQueryStatus { + enabled: boolean; +} + +export interface FindingsQueryResult { + loading: UseQueryResult['isLoading']; + error: TError; + data: TData; +} // TODO: this needs to be defined in a versioned schema export interface CspFinding { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts index 8754bdf390ef7..1f7e8dae483bf 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts @@ -4,41 +4,35 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { type UseQueryResult, useQuery } from 'react-query'; +import { useQuery } from 'react-query'; import { number } from 'io-ts'; -import type { Filter } from '@kbn/es-query'; import { lastValueFrom } from 'rxjs'; -import type { - EsQuerySortValue, - IEsSearchResponse, - SerializedSearchSourceFields, -} from '@kbn/data-plugin/common'; +import type { EsQuerySortValue, IEsSearchResponse } from '@kbn/data-plugin/common'; import type { CoreStart } from '@kbn/core/public'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { extractErrorMessage } from '../../../common/utils/helpers'; import * as TEXT from './translations'; -import type { CspFinding } from './types'; +import type { CspFinding, FindingsQueryResult } from './types'; import { useKibana } from '../../common/hooks/use_kibana'; -import type { FindingsBaseQuery } from './findings_container'; +import type { FindingsBaseEsQuery, FindingsQueryStatus } from './types'; -export interface CspFindingsRequest - extends Required> { - filters: Filter[]; -} +interface UseFindingsOptions + extends FindingsBaseEsQuery, + FindingsGroupByNoneQuery, + FindingsQueryStatus {} -type UseFindingsOptions = FindingsBaseQuery & Omit; +export interface FindingsGroupByNoneQuery { + from: NonNullable; + size: NonNullable; + sort: EsQuerySortValue[]; +} interface CspFindingsData { page: CspFinding[]; total: number; } -type Result = UseQueryResult; - -export interface CspFindingsResult { - loading: Result['isLoading']; - error: Result['error']; - data: CspFindingsData | undefined; -} +export type CspFindingsResult = FindingsQueryResult; const FIELDS_WITHOUT_KEYWORD_MAPPING = new Set(['@timestamp']); @@ -77,7 +71,7 @@ export const getFindingsQuery = ({ size, from, sort, -}: Omit) => ({ +}: Omit) => ({ index, query, size, @@ -85,14 +79,14 @@ export const getFindingsQuery = ({ sort: mapEsQuerySortKey(sort), }); -export const useFindings = ({ error, index, query, sort, from, size }: UseFindingsOptions) => { +export const useFindings = ({ enabled, index, query, sort, from, size }: UseFindingsOptions) => { const { data, notifications: { toasts }, } = useKibana().services; return useQuery( - ['csp_findings', { from, size, query, sort }], + ['csp_findings', { index, query, sort, from, size }], () => lastValueFrom>( data.search.search({ @@ -100,9 +94,8 @@ export const useFindings = ({ error, index, query, sort, from, size }: UseFindin }) ), { - enabled: !error, + enabled, select: ({ rawResponse: { hits } }) => ({ - // TODO: use 'fields' instead of '_source' ? page: hits.hits.map((hit) => hit._source!), total: number.is(hits.total) ? hits.total : 0, }), diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings_by_resource.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings_by_resource.ts new file mode 100644 index 0000000000000..b5596d55a6664 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings_by_resource.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 { useQuery } from 'react-query'; +import { lastValueFrom } from 'rxjs'; +import { IKibanaSearchRequest, IKibanaSearchResponse } from '@kbn/data-plugin/common'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { useKibana } from '../../common/hooks/use_kibana'; +import { showErrorToast } from './use_findings'; +import type { FindingsBaseEsQuery, FindingsQueryResult, FindingsQueryStatus } from './types'; + +interface UseFindingsByResourceOptions extends FindingsBaseEsQuery, FindingsQueryStatus {} + +type FindingsAggRequest = IKibanaSearchRequest; +type FindingsAggResponse = IKibanaSearchResponse< + estypes.SearchResponse<{}, FindingsByResourceAggs> +>; + +export type CspFindingsByResourceResult = FindingsQueryResult< + ReturnType['data'] | undefined, + unknown +>; + +interface FindingsByResourceAggs extends estypes.AggregationsCompositeAggregate { + groupBy: { + buckets: FindingsAggBucket[]; + }; +} + +interface FindingsAggBucket { + doc_count: number; + failed_findings: { doc_count: number }; + key: { + resource_id: string; + cluster_id: string; + cis_section: string; + }; +} + +export const getFindingsByResourceAggQuery = ({ + index, + query, +}: Omit): estypes.SearchRequest => ({ + index, + size: 0, + body: { + query, + aggs: { + groupBy: { + composite: { + size: 10 * 1000, + sources: [ + { resource_id: { terms: { field: 'resource_id.keyword' } } }, + { cluster_id: { terms: { field: 'cluster_id.keyword' } } }, + { cis_section: { terms: { field: 'rule.section' } } }, + ], + }, + aggs: { + failed_findings: { + filter: { term: { 'result.evaluation.keyword': 'failed' } }, + }, + }, + }, + }, + }, +}); + +export const useFindingsByResource = ({ enabled, index, query }: UseFindingsByResourceOptions) => { + const { + data, + notifications: { toasts }, + } = useKibana().services; + + return useQuery( + ['csp_findings_resource', { index, query }], + () => + lastValueFrom( + data.search.search({ + params: getFindingsByResourceAggQuery({ index, query }), + }) + ), + { + enabled, + select: ({ rawResponse }) => ({ + page: rawResponse.aggregations?.groupBy.buckets.map(createFindingsByResource) || [], + }), + onError: (err) => showErrorToast(toasts, err), + } + ); +}; + +const createFindingsByResource = (bucket: FindingsAggBucket) => ({ + ...bucket.key, + failed_findings: { + total: bucket.failed_findings.doc_count, + normalized: bucket.doc_count > 0 ? bucket.failed_findings.doc_count / bucket.doc_count : 0, + }, +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings_count.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings_count.ts index 5a9e0411910e6..6ed56ea1d4397 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings_count.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings_count.ts @@ -10,7 +10,9 @@ import { lastValueFrom } from 'rxjs'; import type { IKibanaSearchRequest, IKibanaSearchResponse } from '@kbn/data-plugin/public'; import { useKibana } from '../../common/hooks/use_kibana'; import { showErrorToast } from './use_findings'; -import type { FindingsBaseQuery } from './findings_container'; +import type { FindingsBaseEsQuery, FindingsQueryStatus } from './types'; + +interface UseFindingsCountOptions extends FindingsBaseEsQuery, FindingsQueryStatus {} type FindingsAggRequest = IKibanaSearchRequest; type FindingsAggResponse = IKibanaSearchResponse>; @@ -23,7 +25,7 @@ interface FindingsAggs extends estypes.AggregationsMultiBucketAggregateBase { }; } -export const getFindingsCountAggQuery = ({ index, query }: Omit) => ({ +export const getFindingsCountAggQuery = ({ index, query }: FindingsBaseEsQuery) => ({ index, size: 0, track_total_hits: true, @@ -33,7 +35,7 @@ export const getFindingsCountAggQuery = ({ index, query }: Omit { +export const useFindingsCounter = ({ enabled, index, query }: UseFindingsCountOptions) => { const { data, notifications: { toasts }, @@ -48,7 +50,7 @@ export const useFindingsCounter = ({ index, query, error }: FindingsBaseQuery) = }) ), { - enabled: !error, + enabled, onError: (err) => showErrorToast(toasts, err), select: (response) => Object.fromEntries( From 37bfb5066348812ff41a96bdf9474f110161cc0a Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 20 Apr 2022 10:36:20 -0500 Subject: [PATCH 09/22] [generate/package] run ESLint and auto-fix generated files (#130676) --- packages/kbn-generate/src/commands/package_command.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/kbn-generate/src/commands/package_command.ts b/packages/kbn-generate/src/commands/package_command.ts index 9b369c3201939..92362e7feb35f 100644 --- a/packages/kbn-generate/src/commands/package_command.ts +++ b/packages/kbn-generate/src/commands/package_command.ts @@ -11,6 +11,7 @@ import Path from 'path'; import normalizePath from 'normalize-path'; import globby from 'globby'; +import { ESLint } from 'eslint'; import micromatch from 'micromatch'; import { REPO_ROOT } from '@kbn/utils'; @@ -129,6 +130,15 @@ ${BAZEL_PACKAGE_DIRS.map((dir) => ` ./${dir}/*\n`).join log.info('Wrote plugin files to', packageDir); + log.info('Linting files'); + const eslint = new ESLint({ + cache: false, + cwd: REPO_ROOT, + fix: true, + extensions: ['.js', '.mjs', '.ts', '.tsx'], + }); + await ESLint.outputFixes(await eslint.lintFiles([packageDir])); + const packageJsonPath = Path.resolve(REPO_ROOT, 'package.json'); const packageJson = JSON.parse(await Fsp.readFile(packageJsonPath, 'utf8')); From 146a3e9e4ee91b391d6b10f6d5c0aceb4757d7e5 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 20 Apr 2022 17:51:54 +0200 Subject: [PATCH 10/22] [Synthetics] Skip unecessary keys (#130667) --- .../lib/synthetics_service/formatters/format_configs.test.ts | 2 -- .../server/lib/synthetics_service/formatters/format_configs.ts | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.test.ts b/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.test.ts index 815a02b9d4b3a..a54e777c13eee 100644 --- a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.test.ts +++ b/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.test.ts @@ -53,7 +53,6 @@ describe('formatMonitorConfig', () => { expect(yamlConfig).toEqual({ 'check.request.method': 'GET', enabled: true, - locations: [], max_redirects: '0', name: 'Test', password: '3z9SBOQWW5F0UrdqLVFqlF6z', @@ -110,7 +109,6 @@ describe('formatMonitorConfig', () => { enabled: true, 'filter_journeys.tags': ['dev'], ignore_https_errors: false, - locations: [], name: 'Test', schedule: '@every 3m', screenshots: 'on', diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.ts b/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.ts index 5c7f538f18ce1..f3b9787ce628d 100644 --- a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.ts +++ b/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.ts @@ -15,6 +15,9 @@ const UI_KEYS_TO_SKIP = [ ConfigKey.DOWNLOAD_SPEED, ConfigKey.LATENCY, ConfigKey.IS_THROTTLING_ENABLED, + ConfigKey.LOCATIONS, + ConfigKey.REVISION, + 'secrets', ]; const uiToHeartbeatKeyMap = { From 88c8ed92f9e77255c42560ce815571e3517cdbd3 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 20 Apr 2022 10:04:32 -0600 Subject: [PATCH 11/22] [Maps] support term joins for Elasticsearch document source with vector tile scaling (#129771) * support join configuration * set feature state * pluckStyleMetaFromFeatures * pluck style meta from joins * refactor * eslint * clear feature state on update * fit to bounds * remove unneeded cast * filter out features without join results * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * remove/add source if promoteId changes * hide all features when there are no results * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * disable layout styles * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * disable add join button * remove multiple term joins when switching to vector tiles * update scaling type in-product help * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * update chropleth wizard to use MVT scaling * clean up * i18n fixes * remove unused i18n tags * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * fix jest tests * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * tslint * fix jest test * add functional test * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * more jest fixes * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * Update x-pack/plugins/maps/public/actions/layer_actions.ts Co-authored-by: Nick Peihl Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Nick Peihl --- .../data_request_descriptor_types.ts | 6 +- .../maps/public/actions/layer_actions.ts | 49 +- .../layers/vector_layer/bounds_data.ts | 1 + .../geojson_vector_layer.tsx | 136 +----- .../perform_inner_joins.ts | 9 +- .../pluck_style_meta_from_features.test.ts | 417 ++++++++++++++++++ .../pluck_style_meta_from_features.ts | 190 ++++++++ .../mvt_vector_layer/mvt_vector_layer.tsx | 162 ++++++- .../mvt_vector_layer/pluck_style_meta.tsx | 110 +++++ .../classes/layers/vector_layer/types.ts | 15 + .../layers/vector_layer/vector_layer.tsx | 134 +++++- .../create_choropleth_layer_descriptor.ts | 72 +-- .../update_source_editor.test.js.snap | 2 + .../es_search_source/es_search_source.test.ts | 13 +- .../es_search_source/es_search_source.tsx | 7 +- .../es_search_source/update_source_editor.js | 6 +- .../update_source_editor.test.js | 1 + .../util/scaling_documenation_popover.tsx | 36 +- .../util/scaling_form.test.tsx | 3 +- .../es_search_source/util/scaling_form.tsx | 53 ++- .../classes/sources/es_source/es_source.ts | 3 + .../maps/public/classes/sources/source.ts | 3 +- .../sources/vector_source/vector_source.tsx | 1 + .../vector_style_editor.test.tsx.snap | 5 + .../styles/vector/components/field_select.tsx | 7 +- .../components/vector_style_editor.test.tsx | 3 + .../vector/components/vector_style_editor.tsx | 138 +++--- .../dynamic_color_property.test.tsx | 33 -- .../dynamic_orientation_property.ts | 9 +- .../properties/dynamic_size_property.tsx | 4 +- .../properties/dynamic_style_property.tsx | 157 +++---- .../properties/dynamic_text_property.ts | 2 +- .../styles/vector/style_fields_helper.ts | 42 +- .../classes/styles/vector/style_util.test.ts | 67 +-- .../classes/styles/vector/style_util.ts | 24 +- .../styles/vector/vector_style.test.js | 171 +------ .../classes/styles/vector/vector_style.tsx | 196 ++------ .../classes/util/mb_filter_expressions.ts | 28 +- .../edit_layer_panel.test.tsx.snap | 2 + .../edit_layer_panel.test.tsx | 4 +- .../edit_layer_panel/edit_layer_panel.tsx | 17 +- .../edit_layer_panel/index.ts | 6 +- .../add_join_button.test.tsx.snap | 44 ++ .../__snapshots__/join_editor.test.tsx.snap | 17 +- .../join_editor/add_join_button.test.tsx | 31 ++ .../join_editor/add_join_button.tsx | 47 ++ .../join_editor/join_editor.test.tsx | 8 + .../join_editor/join_editor.tsx | 32 +- .../tooltip_control/tooltip_control.tsx | 11 +- .../reducers/map/data_request_utils.test.ts | 5 +- .../public/reducers/map/data_request_utils.ts | 3 +- .../plugins/maps/public/reducers/map/map.ts | 6 +- .../maps/public/selectors/map_selectors.ts | 41 +- .../translations/translations/fr-FR.json | 7 - .../translations/translations/ja-JP.json | 7 - .../translations/translations/zh-CN.json | 7 - .../apis/maps/maps_telemetry.ts | 136 +++--- x-pack/test/functional/apps/maps/index.js | 1 + x-pack/test/functional/apps/maps/mvt_joins.ts | 95 ++++ .../fixtures/kbn_archiver/maps.json | 29 ++ 60 files changed, 1843 insertions(+), 1028 deletions(-) create mode 100644 x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/pluck_style_meta_from_features.test.ts create mode 100644 x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/pluck_style_meta_from_features.ts create mode 100644 x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/pluck_style_meta.tsx create mode 100644 x-pack/plugins/maps/public/classes/layers/vector_layer/types.ts create mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/add_join_button.test.tsx.snap create mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.test.tsx create mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.tsx create mode 100644 x-pack/test/functional/apps/maps/mvt_joins.ts 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 ad802e3fab9fa..f3132d145c7a2 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 @@ -28,6 +28,7 @@ export type DataFilters = { timeslice?: Timeslice; zoom: number; isReadOnly: boolean; + joinKeyFilter?: Filter; }; export type VectorSourceRequestMeta = DataFilters & { @@ -77,7 +78,10 @@ export type VectorTileLayerMeta = { }; // Partial because objects are justified downstream in constructors -export type DataRequestMeta = Partial< +export type DataRequestMeta = { + // request stop time in milliseconds since epoch + requestStopTime?: number; +} & Partial< VectorSourceRequestMeta & VectorJoinSourceRequestMeta & VectorStyleRequestMeta & diff --git a/x-pack/plugins/maps/public/actions/layer_actions.ts b/x-pack/plugins/maps/public/actions/layer_actions.ts index b184cab70d1a7..25ba0ac862db8 100644 --- a/x-pack/plugins/maps/public/actions/layer_actions.ts +++ b/x-pack/plugins/maps/public/actions/layer_actions.ts @@ -13,6 +13,7 @@ import { createLayerInstance, getEditState, getLayerById, + getLayerDescriptor, getLayerList, getLayerListRaw, getMapColors, @@ -55,11 +56,12 @@ import { LayerDescriptor, StyleDescriptor, TileMetaFeature, + VectorLayerDescriptor, } from '../../common/descriptor_types'; import { ILayer } from '../classes/layers/layer'; import { IVectorLayer } from '../classes/layers/vector_layer'; import { OnSourceChangeArgs } from '../classes/sources/source'; -import { DRAW_MODE, LAYER_STYLE_TYPE, LAYER_TYPE } from '../../common/constants'; +import { DRAW_MODE, LAYER_STYLE_TYPE, LAYER_TYPE, SCALING_TYPES } from '../../common/constants'; import { IVectorStyle } from '../classes/styles/vector/vector_style'; import { notifyLicensedFeatureUsage } from '../licensed_features'; import { IESAggField } from '../classes/fields/agg'; @@ -362,13 +364,17 @@ function updateSourcePropWithoutSync( value: unknown, newLayerType?: LAYER_TYPE ) { - return async (dispatch: ThunkDispatch) => { + return async ( + dispatch: ThunkDispatch, + getState: () => MapStoreState + ) => { if (propName === 'metrics') { if (newLayerType) { throw new Error('May not change layer-type when modifying metrics source-property'); } return await dispatch(updateMetricsProp(layerId, value)); } + dispatch({ type: UPDATE_SOURCE_PROP, layerId, @@ -378,6 +384,37 @@ function updateSourcePropWithoutSync( if (newLayerType) { dispatch(updateLayerType(layerId, newLayerType)); } + + if (propName === 'scalingType') { + // get joins from layer descriptor instead of layer.getJoins() + // 1) IVectorLayer implementations may return empty array when descriptor has joins + // 2) getJoins returns instances and descriptors are needed. + const layerDescriptor = getLayerDescriptor(getState(), layerId) as VectorLayerDescriptor; + const joins = layerDescriptor.joins ? layerDescriptor.joins : []; + if (value === SCALING_TYPES.CLUSTERS && joins.length) { + // Blended scaling type does not support joins + // It is not possible to display join metrics when showing clusters + dispatch({ + type: SET_JOINS, + layerId, + joins: [], + }); + await dispatch(updateStyleProperties(layerId)); + } else if (value === SCALING_TYPES.MVT) { + if (joins.length > 1) { + // Maplibre feature-state join uses promoteId and there is a limit to one promoteId + // Therefore, Vector tile scaling supports only one join + dispatch({ + type: SET_JOINS, + layerId, + joins: [joins[0]], + }); + } + // update style props regardless of updating joins + // Allow style to clean-up data driven style properties with join fields that do not support feature-state. + await dispatch(updateStyleProperties(layerId)); + } + } }; } @@ -562,7 +599,7 @@ function removeLayerFromLayerList(layerId: string) { }; } -function updateStyleProperties(layerId: string, previousFields: IField[]) { +function updateStyleProperties(layerId: string, previousFields?: IField[]) { return async ( dispatch: ThunkDispatch, getState: () => MapStoreState @@ -584,7 +621,7 @@ function updateStyleProperties(layerId: string, previousFields: IField[]) { const nextFields = await (targetLayer as IVectorLayer).getFields(); // take into account all fields, since labels can be driven by any field (source or join) const { hasChanges, nextStyleDescriptor } = await ( style as IVectorStyle - ).getDescriptorWithUpdatedStyleProps(nextFields, previousFields, getMapColors(getState())); + ).getDescriptorWithUpdatedStyleProps(nextFields, getMapColors(getState()), previousFields); if (hasChanges && nextStyleDescriptor) { dispatch(updateLayerStyle(layerId, nextStyleDescriptor)); } @@ -626,9 +663,9 @@ export function updateLayerStyleForSelectedLayer(styleDescriptor: StyleDescripto export function setJoinsForLayer(layer: ILayer, joins: JoinDescriptor[]) { return async (dispatch: ThunkDispatch) => { const previousFields = await (layer as IVectorLayer).getFields(); - await dispatch({ + dispatch({ type: SET_JOINS, - layer, + layerId: layer.getId(), joins, }); await dispatch(updateStyleProperties(layer.getId(), previousFields)); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/bounds_data.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/bounds_data.ts index 863f4b7f1cb68..29ecf1635d626 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/bounds_data.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/bounds_data.ts @@ -34,6 +34,7 @@ export async function syncBoundsData({ timeFilters: dataFilters.timeFilters, timeslice: dataFilters.timeslice, filters: dataFilters.filters, + joinKeyFilter: dataFilters.joinKeyFilter, applyGlobalQuery: source.getApplyGlobalQuery(), applyGlobalTime: source.getApplyGlobalTime(), }; 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 42303bc0b4c31..18972e89607e4 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 @@ -5,6 +5,7 @@ * 2.0. */ +import _ from 'lodash'; import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiIcon } from '@elastic/eui'; @@ -13,35 +14,30 @@ import type { Map as MbMap, GeoJSONSource as MbGeoJSONSource } from '@kbn/mapbox import { EMPTY_FEATURE_COLLECTION, FEATURE_VISIBLE_PROPERTY_NAME, - FIELD_ORIGIN, LAYER_TYPE, } from '../../../../../common/constants'; import { StyleMetaDescriptor, Timeslice, - VectorJoinSourceRequestMeta, VectorLayerDescriptor, } from '../../../../../common/descriptor_types'; -import { PropertiesMap } from '../../../../../common/elasticsearch_util'; import { TimesliceMaskConfig } from '../../../util/mb_filter_expressions'; 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, LayerIcon } from '../../layer'; -import { InnerJoin } from '../../../joins/inner_join'; import { AbstractVectorLayer, noResultsIcon, NO_RESULTS_ICON_AND_TOOLTIPCONTENT, } from '../vector_layer'; import { DataRequestAbortError } from '../../../util/data_request'; -import { canSkipSourceUpdate } from '../../../util/can_skip_fetch'; import { getFeatureCollectionBounds } from '../../../util/get_feature_collection_bounds'; import { GEOJSON_FEATURE_ID_PROPERTY_NAME } from './assign_feature_ids'; import { syncGeojsonSourceData } from './geojson_source_data'; -import { JoinState, performInnerJoins } from './perform_inner_joins'; -import { buildVectorRequestMeta } from '../../build_vector_request_meta'; +import { performInnerJoins } from './perform_inner_joins'; +import { pluckStyleMetaFromFeatures } from './pluck_style_meta_from_features'; export class GeoJsonVectorLayer extends AbstractVectorLayer { static createDescriptor( @@ -127,7 +123,12 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { if (!style || !sourceDataRequest) { return null; } - return await style.pluckStyleMetaFromSourceDataRequest(sourceDataRequest); + + return await pluckStyleMetaFromFeatures( + _.get(sourceDataRequest.getData(), 'features', []), + await this.getSource().getSupportedShapeTypes(), + this.getCurrentStyle().getDynamicPropertiesArray() + ); } _requiresPrevSourceCleanup(mbMap: MbMap) { @@ -159,6 +160,13 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { this._setMbLinePolygonProperties(mbMap, undefined, timesliceMaskConfig); } + _getJoinFilterExpression(): unknown | undefined { + return this.hasJoins() + ? // Remove unjoined source features by filtering out features without GeoJSON feature.property[FEATURE_VISIBLE_PROPERTY_NAME] is true + ['==', ['get', FEATURE_VISIBLE_PROPERTY_NAME], true] + : undefined; + } + _syncFeatureCollectionWithMb(mbMap: MbMap) { const mbGeoJSONSource = mbMap.getSource(this.getId()) as MbGeoJSONSource; const featureCollection = this._getSourceFeatureCollection(); @@ -260,118 +268,6 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { } } - async _syncJoin({ - join, - startLoading, - stopLoading, - onLoadError, - registerCancelCallback, - dataFilters, - isForceRefresh, - }: { join: InnerJoin } & DataRequestContext): Promise { - const joinSource = join.getRightJoinSource(); - const sourceDataId = join.getSourceDataRequestId(); - const requestToken = Symbol(`layer-join-refresh:${this.getId()} - ${sourceDataId}`); - - const joinRequestMeta: VectorJoinSourceRequestMeta = buildVectorRequestMeta( - joinSource, - joinSource.getFieldNames(), - dataFilters, - joinSource.getWhereQuery(), - isForceRefresh - ) as VectorJoinSourceRequestMeta; - - const prevDataRequest = this.getDataRequest(sourceDataId); - const canSkipFetch = await canSkipSourceUpdate({ - source: joinSource, - prevDataRequest, - nextRequestMeta: joinRequestMeta, - extentAware: false, // join-sources are term-aggs that are spatially unaware (e.g. ESTermSource/TableSource). - getUpdateDueToTimeslice: () => { - return true; - }, - }); - - if (canSkipFetch) { - return { - dataHasChanged: false, - join, - propertiesMap: prevDataRequest?.getData() as PropertiesMap, - }; - } - - try { - startLoading(sourceDataId, requestToken, joinRequestMeta); - const leftSourceName = await this._source.getDisplayName(); - const propertiesMap = await joinSource.getPropertiesMap( - joinRequestMeta, - leftSourceName, - join.getLeftField().getName(), - registerCancelCallback.bind(null, requestToken) - ); - stopLoading(sourceDataId, requestToken, propertiesMap); - return { - dataHasChanged: true, - join, - propertiesMap, - }; - } catch (error) { - if (!(error instanceof DataRequestAbortError)) { - onLoadError(sourceDataId, requestToken, `Join error: ${error.message}`); - } - throw error; - } - } - - async _syncJoins(syncContext: DataRequestContext, style: IVectorStyle) { - const joinSyncs = this.getValidJoins().map(async (join) => { - await this._syncJoinStyleMeta(syncContext, join, style); - await this._syncJoinFormatters(syncContext, join, style); - return this._syncJoin({ join, ...syncContext }); - }); - - return await Promise.all(joinSyncs); - } - - async _syncJoinStyleMeta(syncContext: DataRequestContext, join: InnerJoin, style: IVectorStyle) { - const joinSource = join.getRightJoinSource(); - return this._syncStyleMeta({ - source: joinSource, - style, - sourceQuery: joinSource.getWhereQuery(), - dataRequestId: join.getSourceMetaDataRequestId(), - dynamicStyleProps: this.getCurrentStyle() - .getDynamicPropertiesArray() - .filter((dynamicStyleProp) => { - const matchingField = joinSource.getFieldByName(dynamicStyleProp.getFieldName()); - return ( - dynamicStyleProp.getFieldOrigin() === FIELD_ORIGIN.JOIN && - !!matchingField && - dynamicStyleProp.isFieldMetaEnabled() - ); - }), - ...syncContext, - }); - } - - async _syncJoinFormatters(syncContext: DataRequestContext, join: InnerJoin, style: IVectorStyle) { - const joinSource = join.getRightJoinSource(); - return this._syncFormatters({ - source: joinSource, - dataRequestId: join.getSourceFormattersDataRequestId(), - fields: style - .getDynamicPropertiesArray() - .filter((dynamicStyleProp) => { - const matchingField = joinSource.getFieldByName(dynamicStyleProp.getFieldName()); - return dynamicStyleProp.getFieldOrigin() === FIELD_ORIGIN.JOIN && !!matchingField; - }) - .map((dynamicStyleProp) => { - return dynamicStyleProp.getField()!; - }), - ...syncContext, - }); - } - _getSourceFeatureCollection() { const sourceDataRequest = this.getSourceDataRequest(); return sourceDataRequest ? (sourceDataRequest.getData() as FeatureCollection) : null; 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 d02f1c1a99bb7..5fd7dc4b94397 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 @@ -9,20 +9,13 @@ import { FeatureCollection } from 'geojson'; import { i18n } from '@kbn/i18n'; import { FEATURE_VISIBLE_PROPERTY_NAME } from '../../../../../common/constants'; import { DataRequestContext } from '../../../../actions'; -import { InnerJoin } from '../../../joins/inner_join'; -import { PropertiesMap } from '../../../../../common/elasticsearch_util'; +import { JoinState } from '../types'; interface SourceResult { refreshed: boolean; featureCollection: FeatureCollection; } -export interface JoinState { - dataHasChanged: boolean; - join: InnerJoin; - propertiesMap?: PropertiesMap; -} - export async function performInnerJoins( sourceResult: SourceResult, joinStates: JoinState[], diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/pluck_style_meta_from_features.test.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/pluck_style_meta_from_features.test.ts new file mode 100644 index 0000000000000..5c609f66e3f53 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/pluck_style_meta_from_features.test.ts @@ -0,0 +1,417 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { Feature } from 'geojson'; +import { + COLOR_MAP_TYPE, + FIELD_ORIGIN, + VECTOR_SHAPE_TYPE, + VECTOR_STYLES, +} from '../../../../../common/constants'; +import { ColorDynamicOptions } from '../../../../../common/descriptor_types'; +import { IVectorLayer } from '../vector_layer'; +import { IVectorSource } from '../../../sources/vector_source'; +import { DynamicColorProperty } from '../../../styles/vector/properties/dynamic_color_property'; +import { InlineField } from '../../../fields/inline_field'; +import { + isOnlySingleFeatureType, + pluckCategoricalStyleMetaFromFeatures, + pluckStyleMetaFromFeatures, +} from './pluck_style_meta_from_features'; + +describe('pluckStyleMetaFromFeatures', () => { + test('Should identify when feature collection only contains points', async () => { + const features = [ + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [0, 0], + }, + properties: {}, + }, + { + type: 'Feature', + geometry: { + type: 'MultiPoint', + coordinates: [ + [10.0, 40.0], + [40.0, 30.0], + [20.0, 20.0], + [30.0, 10.0], + ], + }, + properties: {}, + }, + ] as Feature[]; + + const styleMeta = await pluckStyleMetaFromFeatures( + features, + Object.values(VECTOR_SHAPE_TYPE), + [] + ); + expect(styleMeta).toEqual({ + fieldMeta: {}, + geometryTypes: { + isLinesOnly: false, + isPointsOnly: true, + isPolygonsOnly: false, + }, + }); + }); + + test('Should identify when feature collection only contains lines', async () => { + const features = [ + { + type: 'Feature', + geometry: { + type: 'LineString', + coordinates: [ + [30.0, 10.0], + [10.0, 30.0], + [40.0, 40.0], + ], + }, + properties: {}, + }, + { + type: 'Feature', + geometry: { + type: 'MultiLineString', + coordinates: [ + [ + [10.0, 10.0], + [20.0, 20.0], + [10.0, 40.0], + ], + [ + [40.0, 40.0], + [30.0, 30.0], + [40.0, 20.0], + [30.0, 10.0], + ], + ], + }, + properties: {}, + }, + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [0, 0], + }, + properties: { + __kbn_is_centroid_feature__: true, + }, + }, + ] as Feature[]; + + const styleMeta = await pluckStyleMetaFromFeatures( + features, + Object.values(VECTOR_SHAPE_TYPE), + [] + ); + expect(styleMeta).toEqual({ + fieldMeta: {}, + geometryTypes: { + isLinesOnly: true, + isPointsOnly: false, + isPolygonsOnly: false, + }, + }); + }); + + test('Should not extract scaled field range when scaled field has no values', async () => { + const features = [ + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [0, 0], + }, + properties: { + myDynamicField: 1, + }, + }, + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [0, 0], + }, + properties: { + myDynamicField: 10, + }, + }, + ] as Feature[]; + const dynamicColorOptions = { + type: COLOR_MAP_TYPE.ORDINAL, + field: { + origin: FIELD_ORIGIN.SOURCE, + name: 'myDynamicFieldWithNoValues', + }, + } as ColorDynamicOptions; + const field = new InlineField({ + fieldName: dynamicColorOptions.field!.name, + source: {} as unknown as IVectorSource, + origin: dynamicColorOptions.field!.origin, + dataType: 'number', + }); + const dynamicColorProperty = new DynamicColorProperty( + dynamicColorOptions, + VECTOR_STYLES.FILL_COLOR, + field, + {} as unknown as IVectorLayer, + () => { + return null; + } // getFieldFormatter + ); + + const styleMeta = await pluckStyleMetaFromFeatures(features, Object.values(VECTOR_SHAPE_TYPE), [ + dynamicColorProperty, + ]); + expect(styleMeta).toEqual({ + fieldMeta: { + myDynamicFieldWithNoValues: { + categories: [], + }, + }, + geometryTypes: { + isLinesOnly: false, + isPointsOnly: true, + isPolygonsOnly: false, + }, + }); + }); + + test('Should extract scaled field range', async () => { + const features = [ + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [0, 0], + }, + properties: { + myDynamicField: 1, + }, + }, + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [0, 0], + }, + properties: { + myDynamicField: 10, + }, + }, + ] as Feature[]; + const dynamicColorOptions = { + type: COLOR_MAP_TYPE.ORDINAL, + field: { + origin: FIELD_ORIGIN.SOURCE, + name: 'myDynamicField', + }, + } as ColorDynamicOptions; + const field = new InlineField({ + fieldName: dynamicColorOptions.field!.name, + source: {} as unknown as IVectorSource, + origin: dynamicColorOptions.field!.origin, + dataType: 'number', + }); + const dynamicColorProperty = new DynamicColorProperty( + dynamicColorOptions, + VECTOR_STYLES.FILL_COLOR, + field, + {} as unknown as IVectorLayer, + () => { + return null; + } // getFieldFormatter + ); + + const styleMeta = await pluckStyleMetaFromFeatures(features, Object.values(VECTOR_SHAPE_TYPE), [ + dynamicColorProperty, + ]); + expect(styleMeta).toEqual({ + fieldMeta: { + myDynamicField: { + categories: [], + range: { + delta: 9, + max: 10, + min: 1, + }, + }, + }, + geometryTypes: { + isLinesOnly: false, + isPointsOnly: true, + isPolygonsOnly: false, + }, + }); + }); +}); + +describe('pluckCategoricalStyleMetaFromFeatures', () => { + test('Should pluck the categorical style-meta', async () => { + const field = new InlineField({ + fieldName: 'foobar', + source: {} as unknown as IVectorSource, + origin: FIELD_ORIGIN.SOURCE, + dataType: 'number', + }); + const dynamicColorProperty = new DynamicColorProperty( + { + type: COLOR_MAP_TYPE.CATEGORICAL, + colorCategory: 'palette_0', + fieldMetaOptions: { isEnabled: true }, + }, + VECTOR_STYLES.LINE_COLOR, + field, + {} as unknown as IVectorLayer, + () => { + return null; + } // getFieldFormatter + ); + + const features = [ + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [-10, 0], + }, + properties: { + foobar: 'CN', + }, + }, + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [-10, 0], + }, + properties: { + foobar: 'CN', + }, + }, + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [-10, 0], + }, + properties: { + foobar: 'US', + }, + }, + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [-10, 0], + }, + properties: { + foobar: 'CN', + }, + }, + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [-10, 0], + }, + properties: { + foobar: 'US', + }, + }, + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [-10, 0], + }, + properties: { + foobar: 'IN', + }, + }, + ] as Feature[]; + + const categories = pluckCategoricalStyleMetaFromFeatures(dynamicColorProperty, features); + + expect(categories).toEqual([ + { key: 'CN', count: 3 }, + { key: 'US', count: 2 }, + { key: 'IN', count: 1 }, + ]); + }); +}); + +describe('isOnlySingleFeatureType', () => { + describe('source supports single feature type', () => { + const supportedFeatures = [VECTOR_SHAPE_TYPE.POINT]; + const hasFeatureType = { + [VECTOR_SHAPE_TYPE.POINT]: false, + [VECTOR_SHAPE_TYPE.LINE]: false, + [VECTOR_SHAPE_TYPE.POLYGON]: false, + }; + + test('Is only single feature type when only supported feature type is target feature type', () => { + expect( + isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.POINT, supportedFeatures, hasFeatureType) + ).toBe(true); + }); + + test('Is not single feature type when only supported feature type is not target feature type', () => { + expect( + isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.LINE, supportedFeatures, hasFeatureType) + ).toBe(false); + }); + }); + + describe('source supports multiple feature types', () => { + const supportedFeatures = [ + VECTOR_SHAPE_TYPE.POINT, + VECTOR_SHAPE_TYPE.LINE, + VECTOR_SHAPE_TYPE.POLYGON, + ]; + + test('Is only single feature type when data only has target feature type', () => { + const hasFeatureType = { + [VECTOR_SHAPE_TYPE.POINT]: true, + [VECTOR_SHAPE_TYPE.LINE]: false, + [VECTOR_SHAPE_TYPE.POLYGON]: false, + }; + expect( + isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.POINT, supportedFeatures, hasFeatureType) + ).toBe(true); + }); + + test('Is not single feature type when data has multiple feature types', () => { + const hasFeatureType = { + [VECTOR_SHAPE_TYPE.POINT]: true, + [VECTOR_SHAPE_TYPE.LINE]: true, + [VECTOR_SHAPE_TYPE.POLYGON]: true, + }; + expect( + isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.LINE, supportedFeatures, hasFeatureType) + ).toBe(false); + }); + + test('Is not single feature type when data does not have target feature types', () => { + const hasFeatureType = { + [VECTOR_SHAPE_TYPE.POINT]: false, + [VECTOR_SHAPE_TYPE.LINE]: true, + [VECTOR_SHAPE_TYPE.POLYGON]: false, + }; + expect( + isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.POINT, supportedFeatures, hasFeatureType) + ).toBe(false); + }); + }); +}); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/pluck_style_meta_from_features.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/pluck_style_meta_from_features.ts new file mode 100644 index 0000000000000..2ea0fef1bf648 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/pluck_style_meta_from_features.ts @@ -0,0 +1,190 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { Feature } from 'geojson'; +import { + GEO_JSON_TYPE, + KBN_IS_CENTROID_FEATURE, + VECTOR_SHAPE_TYPE, +} from '../../../../../common/constants'; +import { + Category, + DynamicStylePropertyOptions, + RangeFieldMeta, + StyleMetaDescriptor, +} from '../../../../../common/descriptor_types'; +import { IDynamicStyleProperty } from '../../../styles/vector/properties/dynamic_style_property'; + +const POINTS = [GEO_JSON_TYPE.POINT, GEO_JSON_TYPE.MULTI_POINT]; +const LINES = [GEO_JSON_TYPE.LINE_STRING, GEO_JSON_TYPE.MULTI_LINE_STRING]; +const POLYGONS = [GEO_JSON_TYPE.POLYGON, GEO_JSON_TYPE.MULTI_POLYGON]; + +export async function pluckStyleMetaFromFeatures( + features: Feature[], + supportedShapeTypes: VECTOR_SHAPE_TYPE[], + dynamicProperties: Array> +): Promise { + const hasFeatureType = { + [VECTOR_SHAPE_TYPE.POINT]: false, + [VECTOR_SHAPE_TYPE.LINE]: false, + [VECTOR_SHAPE_TYPE.POLYGON]: false, + }; + if (supportedShapeTypes.length > 1) { + for (let i = 0; i < features.length; i++) { + const feature = features[i]; + + // ignore centroid features as they are added for styling and not part of the real data set + if (feature.properties?.[KBN_IS_CENTROID_FEATURE]) { + continue; + } + + if ( + !hasFeatureType[VECTOR_SHAPE_TYPE.POINT] && + POINTS.includes(feature.geometry.type as GEO_JSON_TYPE) + ) { + hasFeatureType[VECTOR_SHAPE_TYPE.POINT] = true; + } + if ( + !hasFeatureType[VECTOR_SHAPE_TYPE.LINE] && + LINES.includes(feature.geometry.type as GEO_JSON_TYPE) + ) { + hasFeatureType[VECTOR_SHAPE_TYPE.LINE] = true; + } + if ( + !hasFeatureType[VECTOR_SHAPE_TYPE.POLYGON] && + POLYGONS.includes(feature.geometry.type as GEO_JSON_TYPE) + ) { + hasFeatureType[VECTOR_SHAPE_TYPE.POLYGON] = true; + } + } + } + + const styleMeta = { + geometryTypes: { + isPointsOnly: isOnlySingleFeatureType( + VECTOR_SHAPE_TYPE.POINT, + supportedShapeTypes, + hasFeatureType + ), + isLinesOnly: isOnlySingleFeatureType( + VECTOR_SHAPE_TYPE.LINE, + supportedShapeTypes, + hasFeatureType + ), + isPolygonsOnly: isOnlySingleFeatureType( + VECTOR_SHAPE_TYPE.POLYGON, + supportedShapeTypes, + hasFeatureType + ), + }, + fieldMeta: {}, + } as StyleMetaDescriptor; + + if (dynamicProperties.length === 0 || features.length === 0) { + // no additional meta data to pull from source data request. + return styleMeta; + } + + dynamicProperties.forEach( + (dynamicProperty: IDynamicStyleProperty) => { + const name = dynamicProperty.getFieldName(); + if (!styleMeta.fieldMeta[name]) { + styleMeta.fieldMeta[name] = { categories: [] }; + } + const categories = pluckCategoricalStyleMetaFromFeatures(dynamicProperty, features); + if (categories.length) { + styleMeta.fieldMeta[name].categories = categories; + } + const ordinalStyleMeta = pluckOrdinalStyleMetaFromFeatures(dynamicProperty, features); + if (ordinalStyleMeta) { + styleMeta.fieldMeta[name].range = ordinalStyleMeta; + } + } + ); + + return styleMeta; +} + +function pluckOrdinalStyleMetaFromFeatures( + property: IDynamicStyleProperty, + features: Feature[] +): RangeFieldMeta | null { + if (!property.isOrdinal()) { + return null; + } + + const name = property.getFieldName(); + let min = Infinity; + let max = -Infinity; + for (let i = 0; i < features.length; i++) { + const feature = features[i]; + const newValue = feature.properties ? parseFloat(feature.properties[name]) : NaN; + if (!isNaN(newValue)) { + min = Math.min(min, newValue); + max = Math.max(max, newValue); + } + } + + return min === Infinity || max === -Infinity + ? null + : { + min, + max, + delta: max - min, + }; +} + +export function pluckCategoricalStyleMetaFromFeatures( + property: IDynamicStyleProperty, + features: Feature[] +): Category[] { + const size = property.getNumberOfCategories(); + if (!property.isCategorical() || size <= 0) { + return []; + } + + const counts = new Map(); + for (let i = 0; i < features.length; i++) { + const feature = features[i]; + const term = feature.properties ? feature.properties[property.getFieldName()] : undefined; + // properties object may be sparse, so need to check if the field is effectively present + if (typeof term !== undefined) { + if (counts.has(term)) { + counts.set(term, counts.get(term) + 1); + } else { + counts.set(term, 1); + } + } + } + + const ordered: Category[] = []; + for (const [key, value] of counts) { + ordered.push({ key, count: value }); + } + + ordered.sort((a, b) => { + return b.count - a.count; + }); + return ordered.slice(0, size); +} + +export function isOnlySingleFeatureType( + featureType: VECTOR_SHAPE_TYPE, + supportedShapeTypes: VECTOR_SHAPE_TYPE[], + hasFeatureType: { [key in keyof typeof VECTOR_SHAPE_TYPE]: boolean } +): boolean { + if (supportedShapeTypes.length === 1) { + return supportedShapeTypes[0] === featureType; + } + + const featureTypes = Object.keys(hasFeatureType); + // @ts-expect-error + return featureTypes.reduce((accumulator: boolean, featureTypeKey: VECTOR_SHAPE_TYPE) => { + const hasFeature = hasFeatureType[featureTypeKey]; + return featureTypeKey === featureType ? accumulator && hasFeature : accumulator && !hasFeature; + }, true); +} diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx index 325e302c0941a..4d15cddcf44db 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx @@ -5,7 +5,9 @@ * 2.0. */ +import _ from 'lodash'; import type { + FeatureIdentifier, Map as MbMap, AnyLayer as MbLayer, GeoJSONSource as MbGeoJSONSource, @@ -13,7 +15,9 @@ import type { } from '@kbn/mapbox-gl'; import { Feature } from 'geojson'; import { i18n } from '@kbn/i18n'; +import { buildPhrasesFilter } from '@kbn/es-query'; import { VectorStyle } from '../../../styles/vector/vector_style'; +import { getField } from '../../../../../common/elasticsearch_util'; import { LAYER_TYPE, SOURCE_TYPES } from '../../../../../common/constants'; import { NO_RESULTS_ICON_AND_TOOLTIPCONTENT, @@ -23,13 +27,18 @@ import { import { IMvtVectorSource } from '../../../sources/vector_source'; import { DataRequestContext } from '../../../../actions'; import { + DataRequestMeta, StyleMetaDescriptor, TileMetaFeature, VectorLayerDescriptor, } from '../../../../../common/descriptor_types'; import { ESSearchSource } from '../../../sources/es_search_source'; +import { IESSource } from '../../../sources/es_source'; +import { InnerJoin } from '../../../joins/inner_join'; import { LayerIcon } from '../../layer'; import { MvtSourceData, syncMvtSourceData } from './mvt_source_data'; +import { PropertiesMap } from '../../../../../common/elasticsearch_util'; +import { pluckStyleMeta } from './pluck_style_meta'; export const ES_MVT_META_LAYER_NAME = 'meta'; const ES_MVT_HITS_TOTAL_RELATION = 'hits.total.relation'; @@ -54,9 +63,34 @@ export class MvtVectorLayer extends AbstractVectorLayer { readonly _source: IMvtVectorSource; - constructor({ layerDescriptor, source, customIcons }: VectorLayerArguments) { - super({ layerDescriptor, source, customIcons }); - this._source = source as IMvtVectorSource; + constructor(args: VectorLayerArguments) { + super(args); + this._source = args.source as IMvtVectorSource; + } + + async getBounds(syncContext: DataRequestContext) { + // Add filter to narrow bounds to features with matching join keys + let joinKeyFilter; + if (this.getSource().isESSource()) { + const { join, joinPropertiesMap } = this._getJoinResults(); + if (join && joinPropertiesMap) { + const indexPattern = await (this.getSource() as IESSource).getIndexPattern(); + const joinField = getField(indexPattern, join.getLeftField().getName()); + joinKeyFilter = buildPhrasesFilter( + joinField, + Array.from(joinPropertiesMap.keys()), + indexPattern + ); + } + } + + return super.getBounds({ + ...syncContext, + dataFilters: { + ...syncContext.dataFilters, + joinKeyFilter, + }, + }); } getFeatureId(feature: Feature): string | number | undefined { @@ -203,6 +237,10 @@ export class MvtVectorLayer extends AbstractVectorLayer { source: this.getSource() as IMvtVectorSource, syncContext, }); + + if (this.hasJoins()) { + await this._syncJoins(syncContext, this.getCurrentStyle()); + } } _syncSourceBindingWithMb(mbMap: MbMap) { @@ -229,6 +267,7 @@ export class MvtVectorLayer extends AbstractVectorLayer { tiles: [sourceData.tileUrl], minzoom: sourceData.tileMinZoom, maxzoom: sourceData.tileMaxZoom, + promoteId: this._getSourcePromoteId(), }); } @@ -240,10 +279,99 @@ export class MvtVectorLayer extends AbstractVectorLayer { return this.getMbSourceId() === mbSourceId; } + _getJoinResults(): { + join?: InnerJoin; + joinPropertiesMap?: PropertiesMap; + joinRequestMeta?: DataRequestMeta; + } { + const joins = this.getValidJoins(); + if (!joins || !joins.length) { + return {}; + } + + const join = joins[0]; + const joinDataRequest = this.getDataRequest(join.getSourceDataRequestId()); + return { + join, + joinPropertiesMap: joinDataRequest?.getData() as PropertiesMap | undefined, + joinRequestMeta: joinDataRequest?.getMeta(), + }; + } + _getMbTooManyFeaturesLayerId() { return this.makeMbLayerId('toomanyfeatures'); } + _getJoinFilterExpression(): unknown | undefined { + const { join, joinPropertiesMap } = this._getJoinResults(); + if (!join) { + return undefined; + } + + // When there are no join results, return a filter that hides all features + // work around for 'match' with empty array not filtering out features + // This filter always returns false because features will never have `__kbn_never_prop__` property + const hideAllFilter = ['has', '__kbn_never_prop__']; + + if (!joinPropertiesMap) { + return hideAllFilter; + } + + const joinKeys = Array.from(joinPropertiesMap.keys()); + return joinKeys.length + ? // Unable to check FEATURE_VISIBLE_PROPERTY_NAME flag since filter expressions do not support feature-state + // Instead, remove unjoined source features by filtering out features without matching join keys + [ + 'match', + ['get', join.getLeftField().getName()], + joinKeys, + true, // match value + false, // fallback - value with no match + ] + : hideAllFilter; + } + + _syncFeatureState(mbMap: MbMap) { + const { joinPropertiesMap, joinRequestMeta } = this._getJoinResults(); + if (!joinPropertiesMap) { + return; + } + + const [firstKey] = joinPropertiesMap.keys(); + const firstKeyFeatureState = mbMap.getFeatureState({ + source: this.getMbSourceId(), + sourceLayer: this._source.getTileSourceLayer(), + id: firstKey, + }); + const joinRequestStopTime = joinRequestMeta?.requestStopTime; + if (firstKeyFeatureState?.requestStopTime === joinRequestStopTime) { + // Do not update feature state when it already contains current join results + return; + } + + // Clear existing feature state + mbMap.removeFeatureState({ + source: this.getMbSourceId(), + sourceLayer: this._source.getTileSourceLayer(), + // by omitting 'id' argument, all feature state is cleared for source + }); + + // Set feature state for join results + // reusing featureIdentifier to avoid creating new object in tight loops + const featureIdentifier: FeatureIdentifier = { + source: this.getMbSourceId(), + sourceLayer: this._source.getTileSourceLayer(), + id: undefined, + }; + joinPropertiesMap.forEach((value: object, key: string) => { + featureIdentifier.id = key; + mbMap.setFeatureState(featureIdentifier, { + ...value, + requestStopTime: joinRequestStopTime, + }); + }); + } + _syncStylePropertiesWithMb(mbMap: MbMap) { // @ts-ignore const mbSource = mbMap.getSource(this.getMbSourceId()); @@ -307,6 +435,18 @@ export class MvtVectorLayer extends AbstractVectorLayer { mbMap.setLayerZoomRange(tooManyFeaturesLayerId, this.getMinZoom(), this.getMaxZoom()); } + _getSourcePromoteId() { + const { join } = this._getJoinResults(); + return join + ? { + [this._source.getTileSourceLayer()]: join.getLeftField().getName(), + } + : undefined; + } + + // Maplibre does not expose API for updating source attributes. + // Must remove/add vector source to update source attributes. + // _requiresPrevSourceCleanup returns true when vector source needs to be removed so it can be re-added with updated attributes _requiresPrevSourceCleanup(mbMap: MbMap): boolean { const mbSource = mbMap.getSource(this.getMbSourceId()) as MbVectorSource | MbGeoJSONSource; if (!mbSource) { @@ -330,7 +470,8 @@ export class MvtVectorLayer extends AbstractVectorLayer { const isSourceDifferent = mbTileSource.tiles?.[0] !== sourceData.tileUrl || mbTileSource.minzoom !== sourceData.tileMinZoom || - mbTileSource.maxzoom !== sourceData.tileMaxZoom; + mbTileSource.maxzoom !== sourceData.tileMaxZoom || + !_.isEqual(mbTileSource.promoteId, this._getSourcePromoteId()); if (isSourceDifferent) { return true; @@ -360,13 +501,10 @@ export class MvtVectorLayer extends AbstractVectorLayer { syncLayerWithMB(mbMap: MbMap) { this._removeStaleMbSourcesAndLayers(mbMap); this._syncSourceBindingWithMb(mbMap); + this._syncFeatureState(mbMap); this._syncStylePropertiesWithMb(mbMap); } - getJoins() { - return []; - } - getMinZoom() { // higher resolution vector tiles cannot be displayed at lower-res return Math.max(this._source.getMinZoom(), super.getMinZoom()); @@ -377,6 +515,12 @@ export class MvtVectorLayer extends AbstractVectorLayer { } async getStyleMetaDescriptorFromLocalFeatures(): Promise { - return await this.getCurrentStyle().pluckStyleMetaFromTileMeta(this._getMetaFromTiles()); + const { joinPropertiesMap } = this._getJoinResults(); + return await pluckStyleMeta( + this._getMetaFromTiles(), + joinPropertiesMap, + await this.getSource().getSupportedShapeTypes(), + this.getCurrentStyle().getDynamicPropertiesArray() + ); } } diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/pluck_style_meta.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/pluck_style_meta.tsx new file mode 100644 index 0000000000000..1f9784fb65dc0 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/pluck_style_meta.tsx @@ -0,0 +1,110 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FIELD_ORIGIN, VECTOR_SHAPE_TYPE } from '../../../../../common/constants'; +import { + Category, + DynamicStylePropertyOptions, + RangeFieldMeta, + StyleMetaDescriptor, + TileMetaFeature, +} from '../../../../../common/descriptor_types'; +import { PropertiesMap } from '../../../../../common/elasticsearch_util'; +import { IDynamicStyleProperty } from '../../../styles/vector/properties/dynamic_style_property'; + +export async function pluckStyleMeta( + metaFeatures: TileMetaFeature[], + joinPropertiesMap: PropertiesMap | undefined, + supportedShapeTypes: VECTOR_SHAPE_TYPE[], + dynamicProperties: Array> +): Promise { + const styleMeta: StyleMetaDescriptor = { + geometryTypes: { + isPointsOnly: + supportedShapeTypes.length === 1 && supportedShapeTypes.includes(VECTOR_SHAPE_TYPE.POINT), + isLinesOnly: + supportedShapeTypes.length === 1 && supportedShapeTypes.includes(VECTOR_SHAPE_TYPE.LINE), + isPolygonsOnly: + supportedShapeTypes.length === 1 && supportedShapeTypes.includes(VECTOR_SHAPE_TYPE.POLYGON), + }, + fieldMeta: {}, + }; + + if (dynamicProperties.length === 0 || !metaFeatures) { + // no additional meta data to pull from source data request. + return styleMeta; + } + + dynamicProperties.forEach((dynamicProperty) => { + const name = dynamicProperty.getFieldName(); + if (!styleMeta.fieldMeta[name]) { + styleMeta.fieldMeta[name] = { categories: [] }; + } + + const categories = pluckCategoricalStyleMeta(dynamicProperty, metaFeatures, joinPropertiesMap); + if (categories.length) { + styleMeta.fieldMeta[name].categories = categories; + } + const ordinalStyleMeta = pluckOrdinalStyleMeta( + dynamicProperty, + metaFeatures, + joinPropertiesMap + ); + if (ordinalStyleMeta) { + styleMeta.fieldMeta[name].range = ordinalStyleMeta; + } + }); + + return styleMeta; +} + +function pluckCategoricalStyleMeta( + property: IDynamicStyleProperty, + metaFeatures: TileMetaFeature[], + joinPropertiesMap: PropertiesMap | undefined +): Category[] { + return []; +} + +function pluckOrdinalStyleMeta( + property: IDynamicStyleProperty, + metaFeatures: TileMetaFeature[], + joinPropertiesMap: PropertiesMap | undefined +): RangeFieldMeta | null { + const field = property.getField(); + if (!field || !property.isOrdinal()) { + return null; + } + + let min = Infinity; + let max = -Infinity; + if (property.getFieldOrigin() === FIELD_ORIGIN.SOURCE) { + for (let i = 0; i < metaFeatures.length; i++) { + const range = field.pluckRangeFromTileMetaFeature(metaFeatures[i]); + if (range) { + min = Math.min(range.min, min); + max = Math.max(range.max, max); + } + } + } else if (property.getFieldOrigin() === FIELD_ORIGIN.JOIN && joinPropertiesMap) { + joinPropertiesMap.forEach((value: { [key: string]: unknown }) => { + const propertyValue = value[field.getName()]; + if (typeof propertyValue === 'number') { + min = Math.min(propertyValue as number, min); + max = Math.max(propertyValue as number, max); + } + }); + } + + return min === Infinity || max === -Infinity + ? null + : { + min, + max, + delta: max - min, + }; +} 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 new file mode 100644 index 0000000000000..0c368de63fe16 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/types.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 { InnerJoin } from '../../joins/inner_join'; +import { PropertiesMap } from '../../../../common/elasticsearch_util'; + +export interface JoinState { + dataHasChanged: boolean; + join: InnerJoin; + propertiesMap?: 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 a66135748c521..23c76924e911e 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 @@ -44,6 +44,7 @@ import { ESTermSourceDescriptor, JoinDescriptor, StyleMetaDescriptor, + VectorJoinSourceRequestMeta, VectorLayerDescriptor, VectorSourceRequestMeta, VectorStyleRequestMeta, @@ -60,6 +61,9 @@ import { ITermJoinSource } from '../../sources/term_join_source'; import { buildVectorRequestMeta } from '../build_vector_request_meta'; import { getJoinAggKey } from '../../../../common/get_agg_key'; import { syncBoundsData } from './bounds_data'; +import { JoinState } from './types'; +import { canSkipSourceUpdate } from '../../util/can_skip_fetch'; +import { PropertiesMap } from '../../../../common/elasticsearch_util'; const SUPPORTS_FEATURE_EDITING_REQUEST_ID = 'SUPPORTS_FEATURE_EDITING_REQUEST_ID'; @@ -530,6 +534,118 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { } } + async _syncJoin({ + join, + startLoading, + stopLoading, + onLoadError, + registerCancelCallback, + dataFilters, + isForceRefresh, + }: { join: InnerJoin } & DataRequestContext): Promise { + const joinSource = join.getRightJoinSource(); + const sourceDataId = join.getSourceDataRequestId(); + const requestToken = Symbol(`layer-join-refresh:${this.getId()} - ${sourceDataId}`); + + const joinRequestMeta: VectorJoinSourceRequestMeta = buildVectorRequestMeta( + joinSource, + joinSource.getFieldNames(), + dataFilters, + joinSource.getWhereQuery(), + isForceRefresh + ) as VectorJoinSourceRequestMeta; + + const prevDataRequest = this.getDataRequest(sourceDataId); + const canSkipFetch = await canSkipSourceUpdate({ + source: joinSource, + prevDataRequest, + nextRequestMeta: joinRequestMeta, + extentAware: false, // join-sources are term-aggs that are spatially unaware (e.g. ESTermSource/TableSource). + getUpdateDueToTimeslice: () => { + return true; + }, + }); + + if (canSkipFetch) { + return { + dataHasChanged: false, + join, + propertiesMap: prevDataRequest?.getData() as PropertiesMap, + }; + } + + try { + startLoading(sourceDataId, requestToken, joinRequestMeta); + const leftSourceName = await this._source.getDisplayName(); + const propertiesMap = await joinSource.getPropertiesMap( + joinRequestMeta, + leftSourceName, + join.getLeftField().getName(), + registerCancelCallback.bind(null, requestToken) + ); + stopLoading(sourceDataId, requestToken, propertiesMap); + return { + dataHasChanged: true, + join, + propertiesMap, + }; + } catch (error) { + if (!(error instanceof DataRequestAbortError)) { + onLoadError(sourceDataId, requestToken, `Join error: ${error.message}`); + } + throw error; + } + } + + async _syncJoins(syncContext: DataRequestContext, style: IVectorStyle) { + const joinSyncs = this.getValidJoins().map(async (join) => { + await this._syncJoinStyleMeta(syncContext, join, style); + await this._syncJoinFormatters(syncContext, join, style); + return this._syncJoin({ join, ...syncContext }); + }); + + return await Promise.all(joinSyncs); + } + + async _syncJoinStyleMeta(syncContext: DataRequestContext, join: InnerJoin, style: IVectorStyle) { + const joinSource = join.getRightJoinSource(); + return this._syncStyleMeta({ + source: joinSource, + style, + sourceQuery: joinSource.getWhereQuery(), + dataRequestId: join.getSourceMetaDataRequestId(), + dynamicStyleProps: this.getCurrentStyle() + .getDynamicPropertiesArray() + .filter((dynamicStyleProp) => { + const matchingField = joinSource.getFieldByName(dynamicStyleProp.getFieldName()); + return ( + dynamicStyleProp.getFieldOrigin() === FIELD_ORIGIN.JOIN && + !!matchingField && + dynamicStyleProp.isFieldMetaEnabled() + ); + }), + ...syncContext, + }); + } + + async _syncJoinFormatters(syncContext: DataRequestContext, join: InnerJoin, style: IVectorStyle) { + const joinSource = join.getRightJoinSource(); + return this._syncFormatters({ + source: joinSource, + dataRequestId: join.getSourceFormattersDataRequestId(), + fields: style + .getDynamicPropertiesArray() + .filter((dynamicStyleProp) => { + const matchingField = joinSource.getFieldByName(dynamicStyleProp.getFieldName()); + return dynamicStyleProp.getFieldOrigin() === FIELD_ORIGIN.JOIN && !!matchingField; + }) + .map((dynamicStyleProp) => { + return dynamicStyleProp.getField()!; + }), + ...syncContext, + }); + } + async _syncSupportsFeatureEditing({ syncContext, source, @@ -557,6 +673,10 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { } } + _getJoinFilterExpression(): unknown | undefined { + return undefined; + } + _setMbPointsProperties( mbMap: MbMap, mvtSourceLayer?: string, @@ -611,7 +731,10 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { } } - const filterExpr = getPointFilterExpression(this.hasJoins(), timesliceMaskConfig); + const filterExpr = getPointFilterExpression( + this._getJoinFilterExpression(), + timesliceMaskConfig + ); if (!_.isEqual(filterExpr, mbMap.getFilter(markerLayerId))) { mbMap.setFilter(markerLayerId, filterExpr); } @@ -644,7 +767,6 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { const fillLayerId = this._getMbPolygonLayerId(); const lineLayerId = this._getMbLineLayerId(); - const hasJoins = this.hasJoins(); if (!mbMap.getLayer(fillLayerId)) { const mbLayer: MbLayer = { id: fillLayerId, @@ -677,16 +799,18 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { lineLayerId, }); + const joinFilter = this._getJoinFilterExpression(); + this.syncVisibilityWithMb(mbMap, fillLayerId); mbMap.setLayerZoomRange(fillLayerId, this.getMinZoom(), this.getMaxZoom()); - const fillFilterExpr = getFillFilterExpression(hasJoins, timesliceMaskConfig); + const fillFilterExpr = getFillFilterExpression(joinFilter, timesliceMaskConfig); if (!_.isEqual(fillFilterExpr, mbMap.getFilter(fillLayerId))) { mbMap.setFilter(fillLayerId, fillFilterExpr); } this.syncVisibilityWithMb(mbMap, lineLayerId); mbMap.setLayerZoomRange(lineLayerId, this.getMinZoom(), this.getMaxZoom()); - const lineFilterExpr = getLineFilterExpression(hasJoins, timesliceMaskConfig); + const lineFilterExpr = getLineFilterExpression(joinFilter, timesliceMaskConfig); if (!_.isEqual(lineFilterExpr, mbMap.getFilter(lineLayerId))) { mbMap.setFilter(lineLayerId, lineFilterExpr); } @@ -713,8 +837,8 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { const isSourceGeoJson = !this.getSource().isMvt(); const filterExpr = getLabelFilterExpression( - this.hasJoins(), isSourceGeoJson, + this._getJoinFilterExpression(), timesliceMaskConfig ); if (!_.isEqual(filterExpr, mbMap.getFilter(labelLayerId))) { diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/create_choropleth_layer_descriptor.ts b/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/create_choropleth_layer_descriptor.ts index dc647089b3516..92045f5911176 100644 --- a/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/create_choropleth_layer_descriptor.ts +++ b/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/create_choropleth_layer_descriptor.ts @@ -21,6 +21,7 @@ import { CountAggDescriptor, EMSFileSourceDescriptor, ESSearchSourceDescriptor, + VectorStylePropertiesDescriptor, } from '../../../../../common/descriptor_types'; import { VectorStyle } from '../../../styles/vector/vector_style'; import { GeoJsonVectorLayer } from '../../vector_layer'; @@ -37,12 +38,14 @@ function createChoroplethLayerDescriptor({ rightIndexPatternId, rightIndexPatternTitle, rightTermField, + setLabelStyle, }: { sourceDescriptor: EMSFileSourceDescriptor | ESSearchSourceDescriptor; leftField: string; rightIndexPatternId: string; rightIndexPatternTitle: string; rightTermField: string; + setLabelStyle: boolean; }) { const metricsDescriptor: CountAggDescriptor = { type: AGG_TYPE.COUNT }; const joinId = uuid(); @@ -51,6 +54,40 @@ function createChoroplethLayerDescriptor({ aggFieldName: '', rightSourceId: joinId, }); + + const styleProperties: Partial = { + [VECTOR_STYLES.FILL_COLOR]: { + type: STYLE_TYPE.DYNAMIC, + options: { + ...(defaultDynamicProperties[VECTOR_STYLES.FILL_COLOR].options as ColorDynamicOptions), + field: { + name: joinKey, + origin: FIELD_ORIGIN.JOIN, + }, + color: 'Yellow to Red', + type: COLOR_MAP_TYPE.ORDINAL, + }, + }, + [VECTOR_STYLES.LINE_COLOR]: { + type: STYLE_TYPE.STATIC, + options: { + color: '#3d3d3d', + }, + }, + }; + if (setLabelStyle) { + styleProperties[VECTOR_STYLES.LABEL_TEXT] = { + type: STYLE_TYPE.DYNAMIC, + options: { + ...defaultDynamicProperties[VECTOR_STYLES.LABEL_TEXT].options, + field: { + name: joinKey, + origin: FIELD_ORIGIN.JOIN, + }, + }, + }; + } + return GeoJsonVectorLayer.createDescriptor({ joins: [ { @@ -69,36 +106,7 @@ function createChoroplethLayerDescriptor({ }, ], sourceDescriptor, - style: VectorStyle.createDescriptor({ - [VECTOR_STYLES.FILL_COLOR]: { - type: STYLE_TYPE.DYNAMIC, - options: { - ...(defaultDynamicProperties[VECTOR_STYLES.FILL_COLOR].options as ColorDynamicOptions), - field: { - name: joinKey, - origin: FIELD_ORIGIN.JOIN, - }, - color: 'Yellow to Red', - type: COLOR_MAP_TYPE.ORDINAL, - }, - }, - [VECTOR_STYLES.LINE_COLOR]: { - type: STYLE_TYPE.STATIC, - options: { - color: '#3d3d3d', - }, - }, - [VECTOR_STYLES.LABEL_TEXT]: { - type: STYLE_TYPE.DYNAMIC, - options: { - ...defaultDynamicProperties[VECTOR_STYLES.LABEL_TEXT].options, - field: { - name: joinKey, - origin: FIELD_ORIGIN.JOIN, - }, - }, - }, - }), + style: VectorStyle.createDescriptor(styleProperties), }); } @@ -124,6 +132,7 @@ export function createEmsChoroplethLayerDescriptor({ rightIndexPatternId, rightIndexPatternTitle, rightTermField, + setLabelStyle: true, }); } @@ -146,7 +155,7 @@ export function createEsChoroplethLayerDescriptor({ sourceDescriptor: ESSearchSource.createDescriptor({ indexPatternId: leftIndexPatternId, geoField: leftGeoField, - scalingType: SCALING_TYPES.LIMIT, + scalingType: SCALING_TYPES.MVT, tooltipProperties: [leftJoinField], applyGlobalQuery: false, applyGlobalTime: false, @@ -156,5 +165,6 @@ export function createEsChoroplethLayerDescriptor({ rightIndexPatternId, rightIndexPatternTitle, rightTermField, + setLabelStyle: false, // Styling label by join metric with MVT is not supported }); } diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap b/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap index 0ff94163f9230..60d7be79d35e3 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap @@ -95,6 +95,7 @@ exports[`should enable sort order select when sort field provided 1`] = ` clusteringDisabledReason={null} filterByMapBounds={true} indexPatternId="indexPattern1" + numberOfJoins={0} onChange={[Function]} scalingType="LIMIT" supportsClustering={false} @@ -200,6 +201,7 @@ exports[`should render update source editor 1`] = ` clusteringDisabledReason={null} filterByMapBounds={true} indexPatternId="indexPattern1" + numberOfJoins={0} onChange={[Function]} scalingType="LIMIT" supportsClustering={false} diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts index 6983c1d43faa2..54071848f9a40 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts @@ -146,14 +146,21 @@ describe('ESSearchSource', () => { }); expect(esSearchSource.getJoinsDisabledReason()).toBe(null); }); - it('mvt', () => { + it('blended layer', () => { const esSearchSource = new ESSearchSource({ ...mockDescriptor, - scalingType: SCALING_TYPES.MVT, + scalingType: SCALING_TYPES.CLUSTERS, }); expect(esSearchSource.getJoinsDisabledReason()).toBe( - 'Joins are not supported when scaling by vector tiles' + 'Joins are not supported when scaling by clusters' ); }); + it('mvt', () => { + const esSearchSource = new ESSearchSource({ + ...mockDescriptor, + scalingType: SCALING_TYPES.MVT, + }); + expect(esSearchSource.getJoinsDisabledReason()).toBe(null); + }); }); }); 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 34bd92a428a58..f021772e59756 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 @@ -181,8 +181,7 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource sortOrder={this._descriptor.sortOrder} scalingType={this._descriptor.scalingType} filterByMapBounds={this.isFilterByMapBounds()} - hasJoins={sourceEditorArgs.hasJoins} - clearJoins={sourceEditorArgs.clearJoins} + numberOfJoins={sourceEditorArgs.numberOfJoins} /> ); } @@ -759,10 +758,6 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource reason = i18n.translate('xpack.maps.source.esSearch.joinsDisabledReason', { defaultMessage: 'Joins are not supported when scaling by clusters', }); - } else if (this._descriptor.scalingType === SCALING_TYPES.MVT) { - reason = i18n.translate('xpack.maps.source.esSearch.joinsDisabledReasonMvt', { - defaultMessage: 'Joins are not supported when scaling by vector tiles', - }); } else { reason = null; } diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.js index aa31e9ef85947..7addffc286bd0 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.js +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.js @@ -35,8 +35,7 @@ export class UpdateSourceEditor extends Component { sortOrder: PropTypes.string.isRequired, scalingType: PropTypes.string.isRequired, source: PropTypes.object, - hasJoins: PropTypes.bool.isRequired, - clearJoins: PropTypes.func.isRequired, + numberOfJoins: PropTypes.number.isRequired, }; state = { @@ -207,8 +206,7 @@ export class UpdateSourceEditor extends Component { scalingType={this.props.scalingType} supportsClustering={this.state.supportsClustering} clusteringDisabledReason={this.state.clusteringDisabledReason} - hasJoins={this.props.hasJoins} - clearJoins={this.props.clearJoins} + numberOfJoins={this.props.numberOfJoins} /> ); diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.test.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.test.js index cfc2090f537f2..264bb0d95c2a9 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.test.js +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.test.js @@ -26,6 +26,7 @@ const defaultProps = { tooltipFields: [], sortOrder: 'DESC', scalingType: SCALING_TYPES.LIMIT, + numberOfJoins: 0, }; test('should render update source editor', async () => { diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_documenation_popover.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_documenation_popover.tsx index 1733856a4734d..3da6099f71bf7 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_documenation_popover.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_documenation_popover.tsx @@ -43,19 +43,19 @@ export class ScalingDocumenationPopover extends Component {
-
{this.props.mvtOptionLabel}
+
{this.props.mvtOptionLabel} (Default)

@@ -88,9 +88,35 @@ export class ScalingDocumenationPopover extends Component {

+

    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +

diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.test.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.test.tsx index aa3c7b51df5bb..38137ffcd72df 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.test.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.test.tsx @@ -26,8 +26,7 @@ const defaultProps = { scalingType: SCALING_TYPES.LIMIT, supportsClustering: true, termFields: [], - hasJoins: false, - clearJoins: () => {}, + numberOfJoins: 0, }; describe('scaling form', () => { diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx index fcf915618a0b7..a76c1e8c7b609 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx @@ -35,19 +35,20 @@ interface Props { scalingType: SCALING_TYPES; supportsClustering: boolean; clusteringDisabledReason?: string | null; - hasJoins: boolean; - clearJoins: () => void; + numberOfJoins: number; } interface State { nextScalingType?: SCALING_TYPES; maxResultWindow: string; showModal: boolean; + modalMsg: string | null; } export class ScalingForm extends Component { state: State = { maxResultWindow: DEFAULT_MAX_RESULT_WINDOW.toLocaleString(), + modalMsg: null, showModal: false, }; _isMounted = false; @@ -74,8 +75,23 @@ export class ScalingForm extends Component { } _onScalingTypeSelect = (optionId: SCALING_TYPES): void => { - if (this.props.hasJoins && optionId !== SCALING_TYPES.LIMIT) { - this._openModal(optionId); + if (this.props.numberOfJoins > 0 && optionId === SCALING_TYPES.CLUSTERS) { + this._openModal( + optionId, + i18n.translate('xpack.maps.source.esSearch.clusterScalingJoinMsg', { + defaultMessage: `Scaling with clusters does not support term joins. Switching to clusters will remove all term joins from your layer configuration.`, + }) + ); + } else if (this.props.numberOfJoins > 1 && optionId === SCALING_TYPES.MVT) { + this._openModal( + optionId, + i18n.translate('xpack.maps.source.esSearch.mvtScalingJoinMsg', { + defaultMessage: `Vector tiles support one term join. Your layer has {numberOfJoins} term joins. Switching to vector tiles will keep the first term join and remove all other term joins from your layer configuration.`, + values: { + numberOfJoins: this.props.numberOfJoins, + }, + }) + ); } else { this._onScalingTypeChange(optionId); } @@ -98,8 +114,9 @@ export class ScalingForm extends Component { this.props.onChange({ propName: 'filterByMapBounds', value: event.target.checked }); }; - _openModal = (optionId: SCALING_TYPES) => { + _openModal = (optionId: SCALING_TYPES, modalMsg: string) => { this.setState({ + modalMsg, nextScalingType: optionId, showModal: true, }); @@ -107,14 +124,16 @@ export class ScalingForm extends Component { _closeModal = () => { this.setState({ + modalMsg: null, nextScalingType: undefined, showModal: false, }); }; _acceptModal = () => { - this.props.clearJoins(); - this._onScalingTypeChange(this.state.nextScalingType!); + if (this.state.nextScalingType) { + this._onScalingTypeChange(this.state.nextScalingType); + } this._closeModal(); }; @@ -139,22 +158,14 @@ export class ScalingForm extends Component { } _renderModal() { - if (!this.state.showModal || this.state.nextScalingType === undefined) { + if (!this.state.showModal || !this.state.modalMsg || this.state.nextScalingType === undefined) { return null; } - const scalingOptionLabel = - this.state.nextScalingType === SCALING_TYPES.CLUSTERS - ? i18n.translate('xpack.maps.source.esSearch.scalingModal.clusters', { - defaultMessage: `clusters`, - }) - : i18n.translate('xpack.maps.source.esSearch.scalingModal.vectorTiles', { - defaultMessage: `vector tiles`, - }); return ( { buttonColor="danger" defaultFocusedButton="cancel" > -

- -

+

{this.state.modalMsg}

); } 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 512f7c6bc1501..c0eef8ba1ca22 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 @@ -214,6 +214,9 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource const indexPattern = await this.getIndexPattern(); const globalFilters: Filter[] = searchFilters.applyGlobalQuery ? searchFilters.filters : []; const allFilters: Filter[] = [...globalFilters]; + if (searchFilters.joinKeyFilter) { + allFilters.push(searchFilters.joinKeyFilter); + } if (this.isFilterByMapBounds() && 'buffer' in searchFilters && searchFilters.buffer) { // buffer can be empty const geoField = await this._getGeoField(); diff --git a/x-pack/plugins/maps/public/classes/sources/source.ts b/x-pack/plugins/maps/public/classes/sources/source.ts index 56a49dd3d5fa6..0e5e7174707d1 100644 --- a/x-pack/plugins/maps/public/classes/sources/source.ts +++ b/x-pack/plugins/maps/public/classes/sources/source.ts @@ -29,9 +29,8 @@ export type OnSourceChangeArgs = { }; export type SourceEditorArgs = { - clearJoins: () => void; currentLayerType: string; - hasJoins: boolean; + numberOfJoins: number; onChange: (...args: OnSourceChangeArgs[]) => Promise; }; 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 321e10f19885f..79830068628e5 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 @@ -42,6 +42,7 @@ export interface BoundsRequestMeta { sourceQuery?: Query; timeFilters: TimeRange; timeslice?: Timeslice; + joinKeyFilter?: Filter; } export interface IVectorSource extends ISource { diff --git a/x-pack/plugins/maps/public/classes/styles/vector/components/__snapshots__/vector_style_editor.test.tsx.snap b/x-pack/plugins/maps/public/classes/styles/vector/components/__snapshots__/vector_style_editor.test.tsx.snap index be8c9b0750b94..a95c8194ffdb3 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/components/__snapshots__/vector_style_editor.test.tsx.snap +++ b/x-pack/plugins/maps/public/classes/styles/vector/components/__snapshots__/vector_style_editor.test.tsx.snap @@ -24,6 +24,7 @@ exports[`should render 1`] = ` fields={ Array [ Object { + "isUnsupported": false, "label": "field0", "name": "field0", "origin": "source", @@ -82,6 +83,7 @@ exports[`should render 1`] = ` fields={ Array [ Object { + "isUnsupported": false, "label": "field0", "name": "field0", "origin": "source", @@ -168,6 +170,7 @@ exports[`should render 1`] = ` fields={ Array [ Object { + "isUnsupported": false, "label": "field0", "name": "field0", "origin": "source", @@ -212,6 +215,7 @@ exports[`should render 1`] = ` fields={ Array [ Object { + "isUnsupported": false, "label": "field0", "name": "field0", "origin": "source", @@ -306,6 +310,7 @@ exports[`should render 1`] = ` fields={ Array [ Object { + "isUnsupported": false, "label": "field0", "name": "field0", "origin": "source", diff --git a/x-pack/plugins/maps/public/classes/styles/vector/components/field_select.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/field_select.tsx index 8f61bfd35be85..3de0292292b41 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/components/field_select.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/components/field_select.tsx @@ -51,7 +51,12 @@ function groupFieldsByOrigin(fields: StyleField[]) { function fieldsListToOptions(fieldsList: StyleField[]) { return fieldsList .map((field) => { - return { value: field, label: field.label }; + return { + value: field, + label: field.label, + disabled: field.isUnsupported, + title: field.unsupportedMsg, + }; }) .sort((a, b) => { return a.label.toLowerCase().localeCompare(b.label.toLowerCase()); diff --git a/x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.test.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.test.tsx index 8edb67703a4d1..8d5df5fbad54d 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.test.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.test.tsx @@ -49,6 +49,9 @@ function createLayerMock(numFields: number, supportedShapeTypes: VECTOR_SHAPE_TY getSupportedShapeTypes: async () => { return supportedShapeTypes; }, + isMvt: () => { + return false; + }, } as unknown as IVectorSource; }, } as unknown as IVectorLayer; diff --git a/x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.tsx index 4431cead9b0d1..daf307e85ffc1 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.tsx @@ -179,7 +179,14 @@ export class VectorStyleEditor extends Component { return labelBorderSize.getOptions().size !== LABEL_BORDER_SIZES.NONE; } + _isLayerSourceMvt() { + return this.props.layer.getSource().isMvt(); + } + _renderFillColor(isPointFillColor = false) { + const styleProperty = this.props.styleProperties[VECTOR_STYLES.FILL_COLOR] as IStyleProperty< + ColorDynamicOptions | ColorStaticOptions + >; return ( { swatches={DEFAULT_FILL_COLORS} onStaticStyleChange={this._onStaticStyleChange} onDynamicStyleChange={this._onDynamicStyleChange} - styleProperty={ - this.props.styleProperties[VECTOR_STYLES.FILL_COLOR] as IStyleProperty< - ColorDynamicOptions | ColorStaticOptions - > - } - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.FILL_COLOR)} + styleProperty={styleProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + styleProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.FILL_COLOR].options as ColorStaticOptions } @@ -206,6 +212,9 @@ export class VectorStyleEditor extends Component { _renderLineColor(isPointBorderColor = false) { const disabledByIconSize = isPointBorderColor && !this._hasMarkerOrIcon(); + const styleProperty = this.props.styleProperties[VECTOR_STYLES.LINE_COLOR] as IStyleProperty< + ColorDynamicOptions | ColorStaticOptions + >; return ( { swatches={DEFAULT_LINE_COLORS} onStaticStyleChange={this._onStaticStyleChange} onDynamicStyleChange={this._onDynamicStyleChange} - styleProperty={ - this.props.styleProperties[VECTOR_STYLES.LINE_COLOR] as IStyleProperty< - ColorDynamicOptions | ColorStaticOptions - > - } - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.LINE_COLOR)} + styleProperty={styleProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + styleProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.LINE_COLOR].options as ColorStaticOptions } @@ -231,18 +239,20 @@ export class VectorStyleEditor extends Component { } _renderLineWidth(isPointBorderWidth = false) { + const styleProperty = this.props.styleProperties[VECTOR_STYLES.LINE_WIDTH] as IStyleProperty< + SizeDynamicOptions | SizeStaticOptions + >; return ( - } - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.LINE_WIDTH)} + styleProperty={styleProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + styleProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.LINE_WIDTH].options as SizeStaticOptions } @@ -261,17 +271,28 @@ export class VectorStyleEditor extends Component { | DynamicTextProperty ); const hasLabelBorder = this._hasLabelBorder(); + const labelStyleProperty = this.props.styleProperties[ + VECTOR_STYLES.LABEL_TEXT + ] as IStyleProperty; + const labelColorStyleProperty = this.props.styleProperties[ + VECTOR_STYLES.LABEL_COLOR + ] as IStyleProperty; + const labelSizeStyleProperty = this.props.styleProperties[ + VECTOR_STYLES.LABEL_SIZE + ] as IStyleProperty; + const labelBorderColorProperty = this.props.styleProperties[ + VECTOR_STYLES.LABEL_BORDER_COLOR + ] as IStyleProperty; return ( - } - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.LABEL_TEXT)} + styleProperty={labelStyleProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + labelStyleProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.LABEL_TEXT] .options as LabelStaticOptions @@ -289,12 +310,11 @@ export class VectorStyleEditor extends Component { swatches={DEFAULT_LINE_COLORS} onStaticStyleChange={this._onStaticStyleChange} onDynamicStyleChange={this._onDynamicStyleChange} - styleProperty={ - this.props.styleProperties[VECTOR_STYLES.LABEL_COLOR] as IStyleProperty< - ColorDynamicOptions | ColorStaticOptions - > - } - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.LABEL_COLOR)} + styleProperty={labelColorStyleProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + labelColorStyleProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.LABEL_COLOR] .options as ColorStaticOptions @@ -311,12 +331,11 @@ export class VectorStyleEditor extends Component { disabledBy={VECTOR_STYLES.LABEL_TEXT} onStaticStyleChange={this._onStaticStyleChange} onDynamicStyleChange={this._onDynamicStyleChange} - styleProperty={ - this.props.styleProperties[VECTOR_STYLES.LABEL_SIZE] as IStyleProperty< - SizeDynamicOptions | SizeStaticOptions - > - } - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.LABEL_SIZE)} + styleProperty={labelSizeStyleProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + labelSizeStyleProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.LABEL_SIZE] .options as SizeStaticOptions @@ -334,12 +353,11 @@ export class VectorStyleEditor extends Component { swatches={DEFAULT_LINE_COLORS} onStaticStyleChange={this._onStaticStyleChange} onDynamicStyleChange={this._onDynamicStyleChange} - styleProperty={ - this.props.styleProperties[VECTOR_STYLES.LABEL_BORDER_COLOR] as IStyleProperty< - ColorDynamicOptions | ColorStaticOptions - > - } - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.LABEL_BORDER_COLOR)} + styleProperty={labelBorderColorProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + labelBorderColorProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.LABEL_BORDER_COLOR] .options as ColorStaticOptions @@ -371,6 +389,10 @@ export class VectorStyleEditor extends Component { this.props.styleProperties[VECTOR_STYLES.SYMBOLIZE_AS] as SymbolizeAsProperty ).isSymbolizedAsIcon() ) { + const orientationStyleProperty = this.props.styleProperties[VECTOR_STYLES.ICON_ORIENTATION]; + const iconStyleProperty = this.props.styleProperties[VECTOR_STYLES.ICON] as IStyleProperty< + IconDynamicOptions | IconStaticOptions + >; iconOrientationEditor = ( { disabledBy={VECTOR_STYLES.ICON_SIZE} onStaticStyleChange={this._onStaticStyleChange} onDynamicStyleChange={this._onDynamicStyleChange} - styleProperty={this.props.styleProperties[VECTOR_STYLES.ICON_ORIENTATION]} - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.ICON_ORIENTATION)} + styleProperty={orientationStyleProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + orientationStyleProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.ICON_ORIENTATION].options } @@ -399,12 +424,11 @@ export class VectorStyleEditor extends Component { onStaticStyleChange={this._onStaticStyleChange} onDynamicStyleChange={this._onDynamicStyleChange} onCustomIconsChange={this.props.onCustomIconsChange} - styleProperty={ - this.props.styleProperties[VECTOR_STYLES.ICON] as IStyleProperty< - IconDynamicOptions | IconStaticOptions - > - } - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.ICON)} + styleProperty={iconStyleProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + iconStyleProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.ICON].options as IconStaticOptions } @@ -417,6 +441,9 @@ export class VectorStyleEditor extends Component { ); } + const iconSizeStyleProperty = this.props.styleProperties[ + VECTOR_STYLES.ICON_SIZE + ] as IStyleProperty; return ( { - } - fields={this.state.styleFieldsHelper!.getFieldsForStyle(VECTOR_STYLES.ICON_SIZE)} + styleProperty={iconSizeStyleProperty} + fields={this.state.styleFieldsHelper!.getFieldsForStyle( + iconSizeStyleProperty, + this._isLayerSourceMvt() + )} defaultStaticStyleOptions={ this.state.defaultStaticProperties[VECTOR_STYLES.ICON_SIZE].options as SizeStaticOptions } diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.test.tsx b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.test.tsx index 710824d0e1414..3dd8628339803 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.test.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.test.tsx @@ -13,7 +13,6 @@ jest.mock('../components/vector_style_editor', () => ({ import React from 'react'; import { shallow } from 'enzyme'; -import { Feature, Point } from 'geojson'; import { DynamicColorProperty } from './dynamic_color_property'; import { @@ -208,38 +207,6 @@ describe('renderLegendDetailRow', () => { }); }); -function makeFeatures(foobarPropValues: string[]) { - return foobarPropValues.map((value: string) => { - return { - type: 'Feature', - geometry: { - type: 'Point', - coordinates: [-10, 0], - } as Point, - properties: { - foobar: value, - }, - } as Feature; - }); -} - -test('Should pluck the categorical style-meta', async () => { - const colorStyle = makeProperty({ - type: COLOR_MAP_TYPE.CATEGORICAL, - colorCategory: 'palette_0', - fieldMetaOptions, - }); - - const features = makeFeatures(['CN', 'CN', 'US', 'CN', 'US', 'IN']); - const meta = colorStyle.pluckCategoricalStyleMetaFromFeatures(features); - - expect(meta).toEqual([ - { key: 'CN', count: 3 }, - { key: 'US', count: 2 }, - { key: 'IN', count: 1 }, - ]); -}); - test('Should pluck the categorical style-meta from fieldmeta', async () => { const colorStyle = makeProperty({ type: COLOR_MAP_TYPE.CATEGORICAL, diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_orientation_property.ts b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_orientation_property.ts index afa034b4d395c..1759af0c0f0e9 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_orientation_property.ts +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_orientation_property.ts @@ -6,9 +6,8 @@ */ import type { Map as MbMap } from '@kbn/mapbox-gl'; -import { DynamicStyleProperty, getNumericalMbFeatureStateValue } from './dynamic_style_property'; +import { DynamicStyleProperty } from './dynamic_style_property'; import { OrientationDynamicOptions } from '../../../../../common/descriptor_types'; -import { RawValue } from '../../../../../common/constants'; export class DynamicOrientationProperty extends DynamicStyleProperty { syncIconRotationWithMb(symbolLayerId: string, mbMap: MbMap) { @@ -28,11 +27,7 @@ export class DynamicOrientationProperty extends DynamicStyleProperty extends IStyleProperty { getFieldOrigin(): FIELD_ORIGIN | null; getRangeFieldMeta(): RangeFieldMeta | null; getCategoryFieldMeta(): Category[]; + /* * Returns hash that signals style meta needs to be re-fetched when value changes */ getStyleMetaHash(): string; isFieldMetaEnabled(): boolean; + isCategorical(): boolean; isOrdinal(): boolean; + getNumberOfCategories(): number; supportsFieldMeta(): boolean; + + /* + * Maplibre layers have two sub-properties that determine how data is rendered: layout and paint. + * + * Layout properties are applied early in the rendering process and define how data for that layer is passed to the GPU. + * Changes to a layout property require an asynchronous "layout" step. + * + * Paint properties are applied later in the rendering process. Changes to a paint property are cheap and happen synchronously. + * + * Paint properties support feature-state. Layout properties do not support feature-state + * + * Returns true when the style only sets paints properties. Returns false when the style sets any layout properties. + */ + supportsFeatureState(): boolean; + + /* + * Maplibre stores vector properties in 2 locations: feature.properties and feature-state + * + * Feature-state is a set of runtime defined attributes that can be dynamically assigned to a feature and used to style features. + * Feature-state is paired to a feature by feature id or feature.properties[promoteId] (when 'source.promoteId' is set). + * + * Feature-state provides a significant boost in performance allowing for the update of individual styles + * without the map rendering engine having to re-parse the underlying geometry and feature properties. + * + * 'paint' properties may retrieve style data from feature-state or feature.properties. + * 'layout' properties may only retrieve style from feature.properties. + * + * Returns true when style data is stored in feature-state. Returns false when style data is stored in feature.properties. + */ + usesFeatureState(): boolean; + getFieldMetaRequest(): Promise; - pluckOrdinalStyleMetaFromFeatures(features: Feature[]): RangeFieldMeta | null; - pluckCategoricalStyleMetaFromFeatures(features: Feature[]): Category[]; - pluckOrdinalStyleMetaFromTileMetaFeatures(metaFeatures: TileMetaFeature[]): RangeFieldMeta | null; - pluckCategoricalStyleMetaFromTileMetaFeatures(features: TileMetaFeature[]): Category[]; getValueSuggestions(query: string): Promise; enrichGeoJsonAndMbFeatureState( featureCollection: FeatureCollection, @@ -284,14 +313,20 @@ export class DynamicStyleProperty return null; } - supportsMbFeatureState() { - return !!this._field && !this._field.getSource().isMvt(); + supportsFeatureState() { + return true; + } + + usesFeatureState() { + if (!this._field) { + return false; + } + + return this._field.getSource().isMvt() ? false : this.supportsFeatureState(); } getMbLookupFunction(): MB_LOOKUP_FUNCTION { - return this.supportsMbFeatureState() - ? MB_LOOKUP_FUNCTION.FEATURE_STATE - : MB_LOOKUP_FUNCTION.GET; + return this.usesFeatureState() ? MB_LOOKUP_FUNCTION.FEATURE_STATE : MB_LOOKUP_FUNCTION.GET; } getFieldMetaOptions() { @@ -317,93 +352,6 @@ export class DynamicStyleProperty : DATA_MAPPING_FUNCTION.INTERPOLATE; } - pluckOrdinalStyleMetaFromTileMetaFeatures( - metaFeatures: TileMetaFeature[] - ): RangeFieldMeta | null { - if (!this._field || !this.isOrdinal()) { - return null; - } - - let min = Infinity; - let max = -Infinity; - for (let i = 0; i < metaFeatures.length; i++) { - const range = this._field.pluckRangeFromTileMetaFeature(metaFeatures[i]); - if (range) { - min = Math.min(range.min, min); - max = Math.max(range.max, max); - } - } - - return min === Infinity || max === -Infinity - ? null - : { - min, - max, - delta: max - min, - }; - } - - pluckCategoricalStyleMetaFromTileMetaFeatures(metaFeatures: TileMetaFeature[]): Category[] { - return []; - } - - pluckOrdinalStyleMetaFromFeatures(features: Feature[]): RangeFieldMeta | null { - if (!this.isOrdinal()) { - return null; - } - - const name = this.getFieldName(); - let min = Infinity; - let max = -Infinity; - for (let i = 0; i < features.length; i++) { - const feature = features[i]; - const newValue = feature.properties ? parseFloat(feature.properties[name]) : NaN; - if (!isNaN(newValue)) { - min = Math.min(min, newValue); - max = Math.max(max, newValue); - } - } - - return min === Infinity || max === -Infinity - ? null - : { - min, - max, - delta: max - min, - }; - } - - pluckCategoricalStyleMetaFromFeatures(features: Feature[]): Category[] { - const size = this.getNumberOfCategories(); - if (!this.isCategorical() || size <= 0) { - return []; - } - - const counts = new Map(); - for (let i = 0; i < features.length; i++) { - const feature = features[i]; - const term = feature.properties ? feature.properties[this.getFieldName()] : undefined; - // properties object may be sparse, so need to check if the field is effectively present - if (typeof term !== undefined) { - if (counts.has(term)) { - counts.set(term, counts.get(term) + 1); - } else { - counts.set(term, 1); - } - } - } - - const ordered: Category[] = []; - for (const [key, value] of counts) { - ordered.push({ key, count: value }); - } - - ordered.sort((a, b) => { - return b.count - a.count; - }); - return ordered.slice(0, size); - } - _pluckOrdinalStyleMetaFromFieldMetaData(styleMetaData: StyleMetaData): RangeFieldMeta | null { if (!this.isOrdinal() || !this._field) { return null; @@ -494,7 +442,7 @@ export class DynamicStyleProperty } let targetName; - if (this.supportsMbFeatureState()) { + if (this.usesFeatureState()) { // Base case for any properties that can support feature-state (e.g. color, size, ...) // They just re-use the original property-name targetName = this._field.getName(); @@ -512,10 +460,7 @@ export class DynamicStyleProperty } getMbPropertyValue(rawValue: RawValue): RawValue { - // Maps only uses feature-state for numerical values. - // `supportsMbFeatureState` will only return true when the mb-style rule does a feature-state lookup on a numerical value - // Calling `isOrdinal` would be equivalent. - return this.supportsMbFeatureState() ? getNumericalMbFeatureStateValue(rawValue) : rawValue; + return this.isOrdinal() ? getNumericalMbFeatureStateValue(rawValue) : rawValue; } enrichGeoJsonAndMbFeatureState( @@ -523,7 +468,7 @@ export class DynamicStyleProperty mbMap: MbMap, mbSourceId: string ): boolean { - const supportsFeatureState = this.supportsMbFeatureState(); + const usesFeatureState = this.usesFeatureState(); const featureIdentifier: FeatureIdentifier = { source: mbSourceId, id: undefined, @@ -534,7 +479,7 @@ export class DynamicStyleProperty const feature = featureCollection.features[i]; const rawValue = feature.properties ? feature.properties[this.getFieldName()] : undefined; const targetMbValue = this.getMbPropertyValue(rawValue); - if (supportsFeatureState) { + if (usesFeatureState) { featureState[targetMbName] = targetMbValue; // the same value will be potentially overridden multiple times, if the name remains identical featureIdentifier.id = feature.id; mbMap.setFeatureState(featureIdentifier, featureState); @@ -544,7 +489,7 @@ export class DynamicStyleProperty } } } - return supportsFeatureState; + return usesFeatureState; } } diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.ts b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.ts index daf9fa67d9ee7..55957c6e9721a 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.ts +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.ts @@ -44,7 +44,7 @@ export class DynamicTextProperty extends DynamicStyleProperty { @@ -29,6 +35,7 @@ export async function createStyleFieldsHelper(fields: IField[]): Promise field.getName() === styleField.name); } - getFieldsForStyle(styleName: VECTOR_STYLES): StyleField[] { + _getFieldsForStyle(styleName: VECTOR_STYLES): StyleField[] { switch (styleName) { case VECTOR_STYLES.ICON_ORIENTATION: return this._numberFields; @@ -96,6 +103,37 @@ export class StyleFieldsHelper { } } + getFieldsForStyle( + styleProperty: IStyleProperty, + isLayerSourceMvt: boolean + ): StyleField[] { + const styleFields = this._getFieldsForStyle(styleProperty.getStyleName()); + return styleProperty.isDynamic() && + !(styleProperty as IDynamicStyleProperty).supportsFeatureState() + ? styleFields.map((styleField) => { + // It is not possible to fallback to feature.properties for maplibre 'vector' source + // Join fields that do not support feature-state can not be supported. + if (isLayerSourceMvt && styleField.origin === FIELD_ORIGIN.JOIN) { + return { + ...styleField, + isUnsupported: true, + unsupportedMsg: i18n.translate( + 'xpack.maps.style.field.unsupportedWithVectorTileMsg', + { + defaultMessage: `'{styleLabel}' does not support this field with vector tiles. To style '{styleLabel}' with this field, select 'Limit results' in 'Scaling'.`, + values: { + styleLabel: getVectorStyleLabel(styleProperty.getStyleName()), + }, + } + ), + }; + } + + return styleField; + }) + : styleFields; + } + getStyleFields(): StyleField[] { return this._styleFields; } diff --git a/x-pack/plugins/maps/public/classes/styles/vector/style_util.test.ts b/x-pack/plugins/maps/public/classes/styles/vector/style_util.test.ts index fc57f1b92f5af..a0de940b3dfd9 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/style_util.test.ts +++ b/x-pack/plugins/maps/public/classes/styles/vector/style_util.test.ts @@ -5,72 +5,7 @@ * 2.0. */ -import { isOnlySingleFeatureType, assignCategoriesToPalette, dynamicRound } from './style_util'; -import { VECTOR_SHAPE_TYPE } from '../../../../common/constants'; - -describe('isOnlySingleFeatureType', () => { - describe('source supports single feature type', () => { - const supportedFeatures = [VECTOR_SHAPE_TYPE.POINT]; - const hasFeatureType = { - [VECTOR_SHAPE_TYPE.POINT]: false, - [VECTOR_SHAPE_TYPE.LINE]: false, - [VECTOR_SHAPE_TYPE.POLYGON]: false, - }; - - test('Is only single feature type when only supported feature type is target feature type', () => { - expect( - isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.POINT, supportedFeatures, hasFeatureType) - ).toBe(true); - }); - - test('Is not single feature type when only supported feature type is not target feature type', () => { - expect( - isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.LINE, supportedFeatures, hasFeatureType) - ).toBe(false); - }); - }); - - describe('source supports multiple feature types', () => { - const supportedFeatures = [ - VECTOR_SHAPE_TYPE.POINT, - VECTOR_SHAPE_TYPE.LINE, - VECTOR_SHAPE_TYPE.POLYGON, - ]; - - test('Is only single feature type when data only has target feature type', () => { - const hasFeatureType = { - [VECTOR_SHAPE_TYPE.POINT]: true, - [VECTOR_SHAPE_TYPE.LINE]: false, - [VECTOR_SHAPE_TYPE.POLYGON]: false, - }; - expect( - isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.POINT, supportedFeatures, hasFeatureType) - ).toBe(true); - }); - - test('Is not single feature type when data has multiple feature types', () => { - const hasFeatureType = { - [VECTOR_SHAPE_TYPE.POINT]: true, - [VECTOR_SHAPE_TYPE.LINE]: true, - [VECTOR_SHAPE_TYPE.POLYGON]: true, - }; - expect( - isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.LINE, supportedFeatures, hasFeatureType) - ).toBe(false); - }); - - test('Is not single feature type when data does not have target feature types', () => { - const hasFeatureType = { - [VECTOR_SHAPE_TYPE.POINT]: false, - [VECTOR_SHAPE_TYPE.LINE]: true, - [VECTOR_SHAPE_TYPE.POLYGON]: false, - }; - expect( - isOnlySingleFeatureType(VECTOR_SHAPE_TYPE.POINT, supportedFeatures, hasFeatureType) - ).toBe(false); - }); - }); -}); +import { assignCategoriesToPalette, dynamicRound } from './style_util'; describe('assignCategoriesToPalette', () => { test('Categories and icons have same length', () => { diff --git a/x-pack/plugins/maps/public/classes/styles/vector/style_util.ts b/x-pack/plugins/maps/public/classes/styles/vector/style_util.ts index 11f564f436dd5..ec2ecadf70fe3 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/style_util.ts +++ b/x-pack/plugins/maps/public/classes/styles/vector/style_util.ts @@ -6,12 +6,7 @@ */ import { i18n } from '@kbn/i18n'; -import { - ICON_SOURCE, - MB_LOOKUP_FUNCTION, - VECTOR_SHAPE_TYPE, - VECTOR_STYLES, -} from '../../../../common/constants'; +import { ICON_SOURCE, MB_LOOKUP_FUNCTION, VECTOR_STYLES } from '../../../../common/constants'; import { Category } from '../../../../common/descriptor_types'; import { StaticTextProperty } from './properties/static_text_property'; import { DynamicTextProperty } from './properties/dynamic_text_property'; @@ -30,23 +25,6 @@ export function getComputedFieldNamePrefix(fieldName: string) { return `__kbn__dynamic__${fieldName}`; } -export function isOnlySingleFeatureType( - featureType: VECTOR_SHAPE_TYPE, - supportedFeatures: VECTOR_SHAPE_TYPE[], - hasFeatureType: { [key in keyof typeof VECTOR_SHAPE_TYPE]: boolean } -): boolean { - if (supportedFeatures.length === 1) { - return supportedFeatures[0] === featureType; - } - - const featureTypes = Object.keys(hasFeatureType); - // @ts-expect-error - return featureTypes.reduce((accumulator: boolean, featureTypeKey: VECTOR_SHAPE_TYPE) => { - const hasFeature = hasFeatureType[featureTypeKey]; - return featureTypeKey === featureType ? accumulator && hasFeature : accumulator && !hasFeature; - }, true); -} - export function dynamicRound(value: number | string) { if (typeof value !== 'number') { return value; diff --git a/x-pack/plugins/maps/public/classes/styles/vector/vector_style.test.js b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.test.js index c1aa8e395d8c0..caf0e13ce5a2f 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/vector_style.test.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.test.js @@ -6,7 +6,6 @@ */ import { VectorStyle } from './vector_style'; -import { DataRequest } from '../../util/data_request'; import { FIELD_ORIGIN, STYLE_TYPE, @@ -35,7 +34,15 @@ class MockSource { describe('getDescriptorWithUpdatedStyleProps', () => { const previousFieldName = 'doIStillExist'; const mapColors = []; - const layer = {}; + const layer = { + getSource: () => { + return { + isMvt: () => { + return false; + }, + }; + }, + }; const customIcons = []; const properties = { fillColor: { @@ -76,8 +83,8 @@ describe('getDescriptorWithUpdatedStyleProps', () => { const nextFields = [new MockField({ fieldName: previousFieldName, dataType: 'number' })]; const { hasChanges } = await vectorStyle.getDescriptorWithUpdatedStyleProps( nextFields, - previousFields, - mapColors + mapColors, + previousFields ); expect(hasChanges).toBe(false); }); @@ -89,7 +96,7 @@ describe('getDescriptorWithUpdatedStyleProps', () => { const nextFields = []; const { hasChanges, nextStyleDescriptor } = - await vectorStyle.getDescriptorWithUpdatedStyleProps(nextFields, previousFields, mapColors); + await vectorStyle.getDescriptorWithUpdatedStyleProps(nextFields, mapColors, previousFields); expect(hasChanges).toBe(true); expect(nextStyleDescriptor.properties[VECTOR_STYLES.LINE_COLOR]).toEqual({ options: { @@ -132,7 +139,7 @@ describe('getDescriptorWithUpdatedStyleProps', () => { }, ]; const { hasChanges, nextStyleDescriptor } = - await vectorStyle.getDescriptorWithUpdatedStyleProps(nextFields, previousFields, mapColors); + await vectorStyle.getDescriptorWithUpdatedStyleProps(nextFields, mapColors, previousFields); expect(hasChanges).toBe(true); expect(nextStyleDescriptor.properties[VECTOR_STYLES.ICON_SIZE]).toEqual({ options: { @@ -149,7 +156,7 @@ describe('getDescriptorWithUpdatedStyleProps', () => { const nextFields = [new MockField({ fieldName: 'someOtherField', dataType: 'number' })]; const { hasChanges, nextStyleDescriptor } = - await vectorStyle.getDescriptorWithUpdatedStyleProps(nextFields, previousFields, mapColors); + await vectorStyle.getDescriptorWithUpdatedStyleProps(nextFields, mapColors, previousFields); expect(hasChanges).toBe(true); expect(nextStyleDescriptor.properties[VECTOR_STYLES.LINE_COLOR]).toEqual({ options: { @@ -174,153 +181,3 @@ describe('getDescriptorWithUpdatedStyleProps', () => { }); }); }); - -describe('pluckStyleMetaFromSourceDataRequest', () => { - const layer = {}; - const customIcons = []; - describe('has features', () => { - it('Should identify when feature collection only contains points', async () => { - const sourceDataRequest = new DataRequest({ - data: { - type: 'FeatureCollection', - features: [ - { - geometry: { - type: 'Point', - }, - properties: {}, - }, - { - geometry: { - type: 'MultiPoint', - }, - properties: {}, - }, - ], - }, - }); - const vectorStyle = new VectorStyle({}, new MockSource(), layer, customIcons); - - const featuresMeta = await vectorStyle.pluckStyleMetaFromSourceDataRequest(sourceDataRequest); - expect(featuresMeta.geometryTypes.isPointsOnly).toBe(true); - expect(featuresMeta.geometryTypes.isLinesOnly).toBe(false); - expect(featuresMeta.geometryTypes.isPolygonsOnly).toBe(false); - }); - - it('Should identify when feature collection only contains lines', async () => { - const sourceDataRequest = new DataRequest({ - data: { - type: 'FeatureCollection', - features: [ - { - geometry: { - type: 'LineString', - }, - properties: {}, - }, - { - geometry: { - type: 'MultiLineString', - }, - properties: {}, - }, - { - geometry: { - type: 'Point', - }, - properties: { - __kbn_is_centroid_feature__: true, - }, - }, - ], - }, - }); - const vectorStyle = new VectorStyle({}, new MockSource(), layer, customIcons); - - const featuresMeta = await vectorStyle.pluckStyleMetaFromSourceDataRequest(sourceDataRequest); - expect(featuresMeta.geometryTypes.isPointsOnly).toBe(false); - expect(featuresMeta.geometryTypes.isLinesOnly).toBe(true); - expect(featuresMeta.geometryTypes.isPolygonsOnly).toBe(false); - }); - }); - - describe('scaled field range', () => { - const sourceDataRequest = new DataRequest({ - data: { - type: 'FeatureCollection', - features: [ - { - geometry: { - type: 'Point', - }, - properties: { - myDynamicField: 1, - }, - }, - { - geometry: { - type: 'Point', - }, - properties: { - myDynamicField: 10, - }, - }, - ], - }, - }); - - it('Should not extract scaled field range when scaled field has no values', async () => { - const vectorStyle = new VectorStyle( - { - properties: { - fillColor: { - type: STYLE_TYPE.DYNAMIC, - options: { - field: { - origin: FIELD_ORIGIN.SOURCE, - name: 'myDynamicFieldWithNoValues', - }, - }, - }, - }, - }, - new MockSource(), - layer, - customIcons - ); - - const featuresMeta = await vectorStyle.pluckStyleMetaFromSourceDataRequest(sourceDataRequest); - expect(featuresMeta.geometryTypes.isPointsOnly).toBe(true); - expect(featuresMeta.geometryTypes.isLinesOnly).toBe(false); - expect(featuresMeta.geometryTypes.isPolygonsOnly).toBe(false); - }); - - it('Should extract scaled field range', async () => { - const vectorStyle = new VectorStyle( - { - properties: { - fillColor: { - type: STYLE_TYPE.DYNAMIC, - options: { - field: { - origin: FIELD_ORIGIN.SOURCE, - name: 'myDynamicField', - }, - }, - }, - }, - }, - new MockSource(), - layer, - customIcons - ); - - const styleMeta = await vectorStyle.pluckStyleMetaFromSourceDataRequest(sourceDataRequest); - expect(styleMeta.fieldMeta.myDynamicField.range).toEqual({ - delta: 9, - max: 10, - min: 1, - }); - }); - }); -}); diff --git a/x-pack/plugins/maps/public/classes/styles/vector/vector_style.tsx b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.tsx index 52209563e9807..395f8b6391cad 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/vector_style.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.tsx @@ -19,13 +19,10 @@ import { import { DEFAULT_ICON, FIELD_ORIGIN, - GEO_JSON_TYPE, ICON_SOURCE, - KBN_IS_CENTROID_FEATURE, LAYER_STYLE_TYPE, SOURCE_FORMATTERS_DATA_REQUEST_ID, STYLE_TYPE, - VECTOR_SHAPE_TYPE, VECTOR_STYLES, } from '../../../../common/constants'; import { StyleMeta } from './style_meta'; @@ -33,7 +30,7 @@ import { StyleMeta } from './style_meta'; import { getMakiSymbol, PREFERRED_ICONS } from './symbol_utils'; import { VectorIcon } from './components/legend/vector_icon'; import { VectorStyleLegend } from './components/legend/vector_style_legend'; -import { isOnlySingleFeatureType, getHasLabel } from './style_util'; +import { getHasLabel } from './style_util'; import { StaticStyleProperty } from './properties/static_style_property'; import { DynamicStyleProperty, IDynamicStyleProperty } from './properties/dynamic_style_property'; import { DynamicSizeProperty } from './properties/dynamic_size_property'; @@ -69,14 +66,11 @@ import { SizeStaticOptions, SizeStylePropertyDescriptor, StyleDescriptor, - StyleMetaDescriptor, StylePropertyField, StylePropertyOptions, - TileMetaFeature, VectorStyleDescriptor, VectorStylePropertiesDescriptor, } from '../../../../common/descriptor_types'; -import { DataRequest } from '../../util/data_request'; import { IStyle } from '../style'; import { IStyleProperty } from './properties/style_property'; import { IField } from '../../fields/field'; @@ -85,20 +79,29 @@ import { IVectorSource } from '../../sources/vector_source'; import { createStyleFieldsHelper, StyleFieldsHelper } from './style_fields_helper'; import { IESAggField } from '../../fields/agg'; -const POINTS = [GEO_JSON_TYPE.POINT, GEO_JSON_TYPE.MULTI_POINT]; -const LINES = [GEO_JSON_TYPE.LINE_STRING, GEO_JSON_TYPE.MULTI_LINE_STRING]; -const POLYGONS = [GEO_JSON_TYPE.POLYGON, GEO_JSON_TYPE.MULTI_POLYGON]; - export interface IVectorStyle extends IStyle { getAllStyleProperties(): Array>; getDynamicPropertiesArray(): Array>; getSourceFieldNames(): string[]; getStyleMeta(): StyleMeta; + + /* + * Changes to source descriptor and join descriptor will impact style properties. + * For instance, a style property may be dynamically tied to the value of an ordinal field defined + * by a join or a metric aggregation. The metric aggregation or join may be edited or removed. + * When this happens, the style will be linked to a no-longer-existing field. + * This method provides a way for a style to clean itself and return a descriptor that unsets any dynamic + * properties that are tied to missing fields + * + * This method does not update its descriptor. It just returns a new descriptor that the caller + * can then use to update store state via dispatch. + */ getDescriptorWithUpdatedStyleProps( nextFields: IField[], - previousFields: IField[], - mapColors: string[] + mapColors: string[], + previousFields?: IField[] ): Promise<{ hasChanges: boolean; nextStyleDescriptor?: VectorStyleDescriptor }>; + getIsPointsOnly(): boolean; isTimeAware(): boolean; getPrimaryColor(): string; @@ -319,7 +322,6 @@ export class VectorStyle implements IVectorStyle { }); return this._deleteFieldsFromDescriptorAndUpdateStyling( - nextFields, updatedProperties, hasChanges, styleFieldsHelper, @@ -328,13 +330,11 @@ export class VectorStyle implements IVectorStyle { } async _deleteFieldsFromDescriptorAndUpdateStyling( - nextFields: IField[], originalProperties: VectorStylePropertiesDescriptor, hasChanges: boolean, styleFieldsHelper: StyleFieldsHelper, mapColors: string[] ) { - // const originalProperties = this.getRawProperties(); const updatedProperties = {} as VectorStylePropertiesDescriptor; const dynamicProperties = (Object.keys(originalProperties) as VECTOR_STYLES[]).filter((key) => { @@ -343,9 +343,21 @@ export class VectorStyle implements IVectorStyle { }); dynamicProperties.forEach((key: VECTOR_STYLES) => { + // TODO instead of looking up instance by key, update argument originalProperties to be instances instead of descriptors + const styleProperty = this.getAllStyleProperties().find((property) => { + return property.getStyleName() === key; + }); + if (!styleProperty) { + return; + } + const nextStyleFields = styleFieldsHelper + .getFieldsForStyle(styleProperty, this._layer.getSource().isMvt()) + .filter((styleField) => { + return !styleField.isUnsupported; + }); + // Convert dynamic styling to static stying when there are no style fields - const styleFields = styleFieldsHelper.getFieldsForStyle(key); - if (styleFields.length === 0) { + if (nextStyleFields.length === 0) { const staticProperties = getDefaultStaticProperties(mapColors); updatedProperties[key] = staticProperties[key] as any; return; @@ -355,16 +367,16 @@ export class VectorStyle implements IVectorStyle { if (!dynamicProperty || !dynamicProperty.options) { return; } - const fieldName = (dynamicProperty.options as DynamicStylePropertyOptions).field!.name; + const fieldName = (dynamicProperty.options as DynamicStylePropertyOptions).field?.name; if (!fieldName) { return; } - const matchingOrdinalField = nextFields.find((ordinalField) => { - return fieldName === ordinalField.getName(); + const fieldStillExists = nextStyleFields.some((nextStyleField) => { + return fieldName === nextStyleField.name; }); - if (matchingOrdinalField) { + if (fieldStillExists) { return; } @@ -404,25 +416,14 @@ export class VectorStyle implements IVectorStyle { } } - /* - * Changes to source descriptor and join descriptor will impact style properties. - * For instance, a style property may be dynamically tied to the value of an ordinal field defined - * by a join or a metric aggregation. The metric aggregation or join may be edited or removed. - * When this happens, the style will be linked to a no-longer-existing ordinal field. - * This method provides a way for a style to clean itself and return a descriptor that unsets any dynamic - * properties that are tied to missing oridinal fields - * - * This method does not update its descriptor. It just returns a new descriptor that the caller - * can then use to update store state via dispatch. - */ async getDescriptorWithUpdatedStyleProps( nextFields: IField[], - previousFields: IField[], - mapColors: string[] + mapColors: string[], + previousFields?: IField[] ) { const styleFieldsHelper = await createStyleFieldsHelper(nextFields); - return previousFields.length === nextFields.length + return previousFields && previousFields.length === nextFields.length ? // Field-config changed await this._updateFieldsInDescriptor( nextFields, @@ -432,7 +433,6 @@ export class VectorStyle implements IVectorStyle { ) : // Deletions or additions await this._deleteFieldsFromDescriptorAndUpdateStyling( - nextFields, this.getRawProperties(), false, styleFieldsHelper, @@ -509,128 +509,6 @@ export class VectorStyle implements IVectorStyle { ); } - async pluckStyleMetaFromTileMeta(metaFeatures: TileMetaFeature[]): Promise { - const supportedShapeTypes = await this._source.getSupportedShapeTypes(); - const styleMeta: StyleMetaDescriptor = { - geometryTypes: { - isPointsOnly: - supportedShapeTypes.length === 1 && supportedShapeTypes.includes(VECTOR_SHAPE_TYPE.POINT), - isLinesOnly: - supportedShapeTypes.length === 1 && supportedShapeTypes.includes(VECTOR_SHAPE_TYPE.LINE), - isPolygonsOnly: - supportedShapeTypes.length === 1 && - supportedShapeTypes.includes(VECTOR_SHAPE_TYPE.POLYGON), - }, - fieldMeta: {}, - }; - - const dynamicProperties = this.getDynamicPropertiesArray(); - if (dynamicProperties.length === 0 || !metaFeatures) { - // no additional meta data to pull from source data request. - return styleMeta; - } - - dynamicProperties.forEach((dynamicProperty) => { - const name = dynamicProperty.getFieldName(); - if (!styleMeta.fieldMeta[name]) { - styleMeta.fieldMeta[name] = { categories: [] }; - } - const categories = - dynamicProperty.pluckCategoricalStyleMetaFromTileMetaFeatures(metaFeatures); - if (categories.length) { - styleMeta.fieldMeta[name].categories = categories; - } - const ordinalStyleMeta = - dynamicProperty.pluckOrdinalStyleMetaFromTileMetaFeatures(metaFeatures); - if (ordinalStyleMeta) { - styleMeta.fieldMeta[name].range = ordinalStyleMeta; - } - }); - - return styleMeta; - } - - async pluckStyleMetaFromSourceDataRequest( - sourceDataRequest: DataRequest - ): Promise { - const features = _.get(sourceDataRequest.getData(), 'features', []); - const supportedFeatures = await this._source.getSupportedShapeTypes(); - const hasFeatureType = { - [VECTOR_SHAPE_TYPE.POINT]: false, - [VECTOR_SHAPE_TYPE.LINE]: false, - [VECTOR_SHAPE_TYPE.POLYGON]: false, - }; - if (supportedFeatures.length > 1) { - for (let i = 0; i < features.length; i++) { - const feature = features[i]; - - // ignore centroid features as they are added for styling and not part of the real data set - if (feature.properties[KBN_IS_CENTROID_FEATURE]) { - continue; - } - - if (!hasFeatureType[VECTOR_SHAPE_TYPE.POINT] && POINTS.includes(feature.geometry.type)) { - hasFeatureType[VECTOR_SHAPE_TYPE.POINT] = true; - } - if (!hasFeatureType[VECTOR_SHAPE_TYPE.LINE] && LINES.includes(feature.geometry.type)) { - hasFeatureType[VECTOR_SHAPE_TYPE.LINE] = true; - } - if ( - !hasFeatureType[VECTOR_SHAPE_TYPE.POLYGON] && - POLYGONS.includes(feature.geometry.type) - ) { - hasFeatureType[VECTOR_SHAPE_TYPE.POLYGON] = true; - } - } - } - - const styleMeta = { - geometryTypes: { - isPointsOnly: isOnlySingleFeatureType( - VECTOR_SHAPE_TYPE.POINT, - supportedFeatures, - hasFeatureType - ), - isLinesOnly: isOnlySingleFeatureType( - VECTOR_SHAPE_TYPE.LINE, - supportedFeatures, - hasFeatureType - ), - isPolygonsOnly: isOnlySingleFeatureType( - VECTOR_SHAPE_TYPE.POLYGON, - supportedFeatures, - hasFeatureType - ), - }, - fieldMeta: {}, - } as StyleMetaDescriptor; - - const dynamicProperties = this.getDynamicPropertiesArray(); - if (dynamicProperties.length === 0 || features.length === 0) { - // no additional meta data to pull from source data request. - return styleMeta; - } - - dynamicProperties.forEach( - (dynamicProperty: IDynamicStyleProperty) => { - const name = dynamicProperty.getFieldName(); - if (!styleMeta.fieldMeta[name]) { - styleMeta.fieldMeta[name] = { categories: [] }; - } - const categories = dynamicProperty.pluckCategoricalStyleMetaFromFeatures(features); - if (categories.length) { - styleMeta.fieldMeta[name].categories = categories; - } - const ordinalStyleMeta = dynamicProperty.pluckOrdinalStyleMetaFromFeatures(features); - if (ordinalStyleMeta) { - styleMeta.fieldMeta[name].range = ordinalStyleMeta; - } - } - ); - - return styleMeta; - } - getSourceFieldNames() { const fieldNames: string[] = []; this.getDynamicPropertiesArray().forEach((styleProperty) => { diff --git a/x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts b/x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts index ed6c01ac32dfa..025d1d830c87d 100644 --- a/x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts +++ b/x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts @@ -5,11 +5,7 @@ * 2.0. */ -import { - GEO_JSON_TYPE, - FEATURE_VISIBLE_PROPERTY_NAME, - KBN_IS_CENTROID_FEATURE, -} from '../../../common/constants'; +import { GEO_JSON_TYPE, KBN_IS_CENTROID_FEATURE } from '../../../common/constants'; import { Timeslice } from '../../../common/descriptor_types'; @@ -22,13 +18,13 @@ export const EXCLUDE_CENTROID_FEATURES = ['!=', ['get', KBN_IS_CENTROID_FEATURE] function getFilterExpression( filters: unknown[], - hasJoins: boolean, + joinFilter?: unknown, timesliceMaskConfig?: TimesliceMaskConfig ) { const allFilters: unknown[] = [...filters]; - if (hasJoins) { - allFilters.push(['==', ['get', FEATURE_VISIBLE_PROPERTY_NAME], true]); + if (joinFilter) { + allFilters.push(joinFilter); } if (timesliceMaskConfig) { @@ -49,7 +45,7 @@ function getFilterExpression( } export function getFillFilterExpression( - hasJoins: boolean, + joinFilter?: unknown, timesliceMaskConfig?: TimesliceMaskConfig ): unknown[] { return getFilterExpression( @@ -61,13 +57,13 @@ export function getFillFilterExpression( ['==', ['geometry-type'], GEO_JSON_TYPE.MULTI_POLYGON], ], ], - hasJoins, + joinFilter, timesliceMaskConfig ); } export function getLineFilterExpression( - hasJoins: boolean, + joinFilter?: unknown, timesliceMaskConfig?: TimesliceMaskConfig ): unknown[] { return getFilterExpression( @@ -81,7 +77,7 @@ export function getLineFilterExpression( ['==', ['geometry-type'], GEO_JSON_TYPE.MULTI_LINE_STRING], ], ], - hasJoins, + joinFilter, timesliceMaskConfig ); } @@ -93,19 +89,19 @@ const IS_POINT_FEATURE = [ ]; export function getPointFilterExpression( - hasJoins: boolean, + joinFilter?: unknown, timesliceMaskConfig?: TimesliceMaskConfig ): unknown[] { return getFilterExpression( [EXCLUDE_CENTROID_FEATURES, IS_POINT_FEATURE], - hasJoins, + joinFilter, timesliceMaskConfig ); } export function getLabelFilterExpression( - hasJoins: boolean, isSourceGeoJson: boolean, + joinFilter?: unknown, timesliceMaskConfig?: TimesliceMaskConfig ): unknown[] { const filters: unknown[] = []; @@ -117,5 +113,5 @@ export function getLabelFilterExpression( filters.push(IS_POINT_FEATURE); } - return getFilterExpression(filters, hasJoins, timesliceMaskConfig); + return getFilterExpression(filters, joinFilter, timesliceMaskConfig); } diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap index 03e8b4a90c0ca..224bc52f7ffaa 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap @@ -96,6 +96,7 @@ exports[`EditLayerPanel is rendered 1`] = ` layer={ Object { "canShowTooltip": [Function], + "getDescriptor": [Function], "getDisplayName": [Function], "getId": [Function], "getImmutableSourceProperties": [Function], @@ -119,6 +120,7 @@ exports[`EditLayerPanel is rendered 1`] = ` layer={ Object { "canShowTooltip": [Function], + "getDescriptor": [Function], "getDisplayName": [Function], "getId": [Function], "getImmutableSourceProperties": [Function], diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx index ebe0cc6a4178d..c073eb8ec4675 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx @@ -89,13 +89,15 @@ const mockLayer = { supportsFitToBounds: () => { return true; }, + getDescriptor: () => { + return {}; + }, } as unknown as ILayer; const defaultProps = { selectedLayer: mockLayer, fitToBounds: () => {}, updateSourceProps: async () => {}, - clearJoins: () => {}, }; describe('EditLayerPanel', () => { diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx index bc0071c9dc62c..a0f8539190a1a 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx @@ -29,7 +29,7 @@ import { JoinEditor, JoinField } from './join_editor'; import { FlyoutFooter } from './flyout_footer'; import { LayerSettings } from './layer_settings'; import { StyleSettings } from './style_settings'; - +import { VectorLayerDescriptor } from '../../../common/descriptor_types'; import { getData, getCore } from '../../kibana_services'; import { ILayer } from '../../classes/layers/layer'; import { isVectorLayer, IVectorLayer } from '../../classes/layers/vector_layer'; @@ -39,7 +39,6 @@ import { IField } from '../../classes/fields/field'; const localStorage = new Storage(window.localStorage); export interface Props { - clearJoins: (layer: ILayer) => void; selectedLayer?: ILayer; updateSourceProps: (layerId: string, sourcePropChanges: OnSourceChangeArgs[]) => Promise; } @@ -139,12 +138,6 @@ export class EditLayerPanel extends Component { return this.props.updateSourceProps(this.props.selectedLayer!.getId(), args); }; - _clearJoins = () => { - if (this.props.selectedLayer) { - this.props.clearJoins(this.props.selectedLayer); - } - }; - _renderLayerErrors() { if (!this.props.selectedLayer || !this.props.selectedLayer.hasErrors()) { return null; @@ -230,6 +223,9 @@ export class EditLayerPanel extends Component { return null; } + const descriptor = this.props.selectedLayer.getDescriptor() as VectorLayerDescriptor; + const numberOfJoins = descriptor.joins ? descriptor.joins.length : 0; + return ( { /> {this.props.selectedLayer.renderSourceSettingsEditor({ - clearJoins: this._clearJoins, currentLayerType: this.props.selectedLayer.getType(), - hasJoins: isVectorLayer(this.props.selectedLayer) - ? (this.props.selectedLayer as IVectorLayer).hasJoins() - : false, + numberOfJoins, onChange: this._onSourceChange, })} diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/index.ts b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/index.ts index 5f9a920d38494..5773d93221508 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/index.ts +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/index.ts @@ -10,9 +10,8 @@ import { ThunkDispatch } from 'redux-thunk'; import { connect } from 'react-redux'; import { EditLayerPanel } from './edit_layer_panel'; import { getSelectedLayer } from '../../selectors/map_selectors'; -import { setJoinsForLayer, updateSourceProps } from '../../actions'; +import { updateSourceProps } from '../../actions'; import { MapStoreState } from '../../reducers/store'; -import { ILayer } from '../../classes/layers/layer'; import { isVectorLayer, IVectorLayer } from '../../classes/layers/vector_layer'; import { OnSourceChangeArgs } from '../../classes/sources/source'; @@ -32,9 +31,6 @@ function mapStateToProps(state: MapStoreState) { function mapDispatchToProps(dispatch: ThunkDispatch) { return { - clearJoins: (layer: ILayer) => { - dispatch(setJoinsForLayer(layer, [])); - }, updateSourceProps: async (id: string, sourcePropChanges: OnSourceChangeArgs[]) => await dispatch(updateSourceProps(id, sourcePropChanges)), }; diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/add_join_button.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/add_join_button.test.tsx.snap new file mode 100644 index 0000000000000..6da0a04523c16 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/add_join_button.test.tsx.snap @@ -0,0 +1,44 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Should disable add button when layer source is MVT and there is one join 1`] = ` + + + Add join + + +`; + +exports[`Should enable add button when layer source is MVT and there is no join 1`] = ` + + Add join + +`; + +exports[`Should render add join button 1`] = ` + + Add join + +`; diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/join_editor.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/join_editor.test.tsx.snap index 0a79b21175d1e..7daacae707ecb 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/join_editor.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/join_editor.test.tsx.snap @@ -85,18 +85,11 @@ exports[`Should render join editor 1`] = ` - - - +
`; diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.test.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.test.tsx new file mode 100644 index 0000000000000..2a017b8dd183f --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.test.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; +import { AddJoinButton } from './add_join_button'; + +test('Should render add join button', () => { + const component = shallow( + {}} isLayerSourceMvt={false} numJoins={0} /> + ); + expect(component).toMatchSnapshot(); +}); + +test('Should enable add button when layer source is MVT and there is no join', () => { + const component = shallow( + {}} isLayerSourceMvt={true} numJoins={0} /> + ); + expect(component).toMatchSnapshot(); +}); + +test('Should disable add button when layer source is MVT and there is one join', () => { + const component = shallow( + {}} isLayerSourceMvt={true} numJoins={1} /> + ); + expect(component).toMatchSnapshot(); +}); diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.tsx new file mode 100644 index 0000000000000..2aee26fbbaeac --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { EuiButtonEmpty, EuiToolTip } from '@elastic/eui'; + +const BUTTON_LABEL = i18n.translate('xpack.maps.layerPanel.joinEditor.addJoinButton.label', { + defaultMessage: 'Add join', +}); + +export interface Props { + addJoin: () => void; + isLayerSourceMvt: boolean; + numJoins: number; +} + +export function AddJoinButton({ addJoin, isLayerSourceMvt, numJoins }: Props) { + const isDisabled = isLayerSourceMvt && numJoins >= 1; + const button = ( + + {BUTTON_LABEL} + + ); + + return isDisabled ? ( + + {button} + + ) : ( + button + ); +} diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.test.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.test.tsx index 6da05ef0b4092..cb007110f7d35 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.test.tsx @@ -21,6 +21,14 @@ class MockLayer { getJoinsDisabledReason() { return this._disableReason; } + + getSource() { + return { + isMvt: () => { + return false; + }, + }; + } } const defaultProps = { diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx index 3483b0011b127..cfa46ecf32b32 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx @@ -8,14 +8,7 @@ import React, { Fragment } from 'react'; import uuid from 'uuid/v4'; -import { - EuiButtonEmpty, - EuiTitle, - EuiSpacer, - EuiToolTip, - EuiTextAlign, - EuiCallOut, -} from '@elastic/eui'; +import { EuiTitle, EuiSpacer, EuiToolTip, EuiTextAlign, EuiCallOut } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; @@ -23,6 +16,7 @@ import { Join } from './resources/join'; import { IVectorLayer } from '../../../classes/layers/vector_layer'; import { JoinDescriptor } from '../../../../common/descriptor_types'; import { SOURCE_TYPES } from '../../../../common/constants'; +import { AddJoinButton } from './add_join_button'; export interface JoinField { label: string; @@ -83,7 +77,7 @@ export function JoinEditor({ joins, layer, onChange, leftJoinFields, layerDispla ]); }; - const renderContent = () => { + function renderContent() { const disabledReason = layer.getJoinsDisabledReason(); return disabledReason ? ( {disabledReason} @@ -92,23 +86,15 @@ export function JoinEditor({ joins, layer, onChange, leftJoinFields, layerDispla {renderJoins()} - - - + ); - }; + } return (
diff --git a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/tooltip_control.tsx b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/tooltip_control.tsx index 05c1c8dc8bdfa..bb4d68f59d4f9 100644 --- a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/tooltip_control.tsx +++ b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/tooltip_control.tsx @@ -223,13 +223,10 @@ export class TooltipControl extends Component { } } if (!match) { - // "tags" (aka properties) are optional in .mvt tiles. - // It's not entirely clear how mapbox-gl handles those. - // - As null value (as defined in https://tools.ietf.org/html/rfc7946#section-3.2) - // - As undefined value - // - As empty object literal - // To avoid ambiguity, normalize properties to empty object literal. - const mbProperties = mbFeature.properties ? mbFeature.properties : {}; + const mbProperties = { + ...(mbFeature.properties ? mbFeature.properties : {}), + ...(mbFeature.state ? mbFeature.state : {}), + }; const actions: TooltipFeatureAction[] = isLocked ? this._getFeatureActions({ layerId, featureId, tooltipId }) : []; diff --git a/x-pack/plugins/maps/public/reducers/map/data_request_utils.test.ts b/x-pack/plugins/maps/public/reducers/map/data_request_utils.test.ts index f878b8be0d84b..745a02ed72259 100644 --- a/x-pack/plugins/maps/public/reducers/map/data_request_utils.test.ts +++ b/x-pack/plugins/maps/public/reducers/map/data_request_utils.test.ts @@ -280,7 +280,10 @@ describe('stopDataRequest', () => { const stateClone = _.cloneDeep(state); const reponseMeta = { responseProp1: 'response' } as DataRequestMeta; const data = { prop1: 'new data' }; - expect(stopDataRequest(state, 'layer1', 'source', REQUEST_TOKEN, reponseMeta, data)).toEqual({ + const newState = stopDataRequest(state, 'layer1', 'source', REQUEST_TOKEN, reponseMeta, data); + // remove timestamp since it changes every run + delete newState.layerList[0].__dataRequests![0].dataRequestMeta!.requestStopTime; + expect(newState).toEqual({ layerList: [ { id: 'layer1', diff --git a/x-pack/plugins/maps/public/reducers/map/data_request_utils.ts b/x-pack/plugins/maps/public/reducers/map/data_request_utils.ts index ec97203deb520..9e32cd469ecc4 100644 --- a/x-pack/plugins/maps/public/reducers/map/data_request_utils.ts +++ b/x-pack/plugins/maps/public/reducers/map/data_request_utils.ts @@ -60,9 +60,10 @@ export function stopDataRequest( dataRequestMeta: { ...(dataRequest.dataRequestMetaAtStart ? dataRequest.dataRequestMetaAtStart : {}), ...(responseMeta ? responseMeta : {}), + requestStopTime: Date.now(), }, dataRequestMetaAtStart: undefined, - dataRequestToken: undefined, + dataRequestToken: undefined, // active data request }) : state; } diff --git a/x-pack/plugins/maps/public/reducers/map/map.ts b/x-pack/plugins/maps/public/reducers/map/map.ts index c747f45f5f17a..6bd57fda01803 100644 --- a/x-pack/plugins/maps/public/reducers/map/map.ts +++ b/x-pack/plugins/maps/public/reducers/map/map.ts @@ -251,13 +251,11 @@ export function map(state: MapState = DEFAULT_MAP_STATE, action: Record descriptor.id === action.layer.getId() + (descriptor) => descriptor.id === action.layerId ); if (layerDescriptor) { const newLayerDescriptor = { ...layerDescriptor, joins: action.joins.slice() }; - const index = state.layerList.findIndex( - (descriptor) => descriptor.id === action.layer.getId() - ); + const index = state.layerList.findIndex((descriptor) => descriptor.id === action.layerId); const newLayerList = state.layerList.slice(); newLayerList[index] = newLayerDescriptor; return { ...state, layerList: newLayerList }; diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.ts b/x-pack/plugins/maps/public/selectors/map_selectors.ts index 7a3b1972671f6..2c964f6ef0843 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.ts +++ b/x-pack/plugins/maps/public/selectors/map_selectors.ts @@ -64,6 +64,14 @@ import { EMSTMSSource } from '../classes/sources/ems_tms_source'; import { ILayer } from '../classes/layers/layer'; import { getIsReadOnly } from './ui_selectors'; +function createJoinInstances(vectorLayerDescriptor: VectorLayerDescriptor, source: IVectorSource) { + return vectorLayerDescriptor.joins + ? vectorLayerDescriptor.joins.map((joinDescriptor) => { + return new InnerJoin(joinDescriptor, source); + }) + : []; +} + export function createLayerInstance( layerDescriptor: LayerDescriptor, customIcons: CustomIcon[], @@ -75,22 +83,6 @@ export function createLayerInstance( switch (layerDescriptor.type) { case LAYER_TYPE.RASTER_TILE: return new RasterTileLayer({ layerDescriptor, source: source as ITMSSource }); - case LAYER_TYPE.GEOJSON_VECTOR: - const joins: InnerJoin[] = []; - const vectorLayerDescriptor = layerDescriptor as VectorLayerDescriptor; - if (vectorLayerDescriptor.joins) { - vectorLayerDescriptor.joins.forEach((joinDescriptor) => { - const join = new InnerJoin(joinDescriptor, source as IVectorSource); - joins.push(join); - }); - } - return new GeoJsonVectorLayer({ - layerDescriptor: vectorLayerDescriptor, - source: source as IVectorSource, - joins, - customIcons, - chartsPaletteServiceGetColor, - }); case LAYER_TYPE.EMS_VECTOR_TILE: return new EmsVectorTileLayer({ layerDescriptor, source: source as EMSTMSSource }); case LAYER_TYPE.HEATMAP: @@ -98,6 +90,17 @@ export function createLayerInstance( layerDescriptor: layerDescriptor as HeatmapLayerDescriptor, source: source as ESGeoGridSource, }); + case LAYER_TYPE.GEOJSON_VECTOR: + return new GeoJsonVectorLayer({ + layerDescriptor: layerDescriptor as VectorLayerDescriptor, + source: source as IVectorSource, + joins: createJoinInstances( + layerDescriptor as VectorLayerDescriptor, + source as IVectorSource + ), + customIcons, + chartsPaletteServiceGetColor, + }); case LAYER_TYPE.BLENDED_VECTOR: return new BlendedVectorLayer({ layerDescriptor: layerDescriptor as VectorLayerDescriptor, @@ -109,6 +112,10 @@ export function createLayerInstance( return new MvtVectorLayer({ layerDescriptor: layerDescriptor as VectorLayerDescriptor, source: source as IVectorSource, + joins: createJoinInstances( + layerDescriptor as VectorLayerDescriptor, + source as IVectorSource + ), customIcons, }); default: @@ -215,7 +222,7 @@ export const getDrawState = ({ map }: MapStoreState): DrawState | undefined => export const getEditState = ({ map }: MapStoreState): EditState | undefined => map.mapState.editState; -function getLayerDescriptor(state: MapStoreState, layerId: string) { +export function getLayerDescriptor(state: MapStoreState, layerId: string) { const layerListRaw = getLayerListRaw(state); return layerListRaw.find((layer) => layer.id === layerId); } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 418a08161d7ef..78881eab1f93b 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -16826,8 +16826,6 @@ "xpack.maps.layerPanel.join.applyGlobalTimeCheckboxLabel": "Appliquer une heure globale à la liaison", "xpack.maps.layerPanel.join.deleteJoinAriaLabel": "Supprimer la liaison", "xpack.maps.layerPanel.join.deleteJoinTitle": "Supprimer la liaison", - "xpack.maps.layerPanel.joinEditor.addJoinAriaLabel": "Ajouter une liaison", - "xpack.maps.layerPanel.joinEditor.addJoinButtonLabel": "Ajouter une liaison", "xpack.maps.layerPanel.joinEditor.termJoinsTitle": "Liaisons de terme", "xpack.maps.layerPanel.joinEditor.termJoinTooltip": "Utilisez les liaisons de terme pour ajouter à ce calque les propriétés de style basées sur les données.", "xpack.maps.layerPanel.joinExpression.helpText": "Configurez la clé partagée.", @@ -17002,7 +17000,6 @@ "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.clustersUseCase": "Utilisez cette option pour afficher de grands ensembles de données. Ne prend pas en charge les liaisons de termes.", "xpack.maps.scalingDocs.limitDetails": "Affichez les fonctionnalités des {maxResultWindow} premiers documents.", - "xpack.maps.scalingDocs.limitUseCase": "Utilisez cette option pour créer des cartes chloroplèthes qui comparent les statistiques d’une limite à l’autre.", "xpack.maps.scalingDocs.maxResultWindow": "Contrainte {maxResultWindow} fournie par le paramètre d’index {link}.", "xpack.maps.scalingDocs.mvtDetails": "Partitionnez votre carte en tuiles, chacune affichant les fonctionnalités des {maxResultWindow} premiers documents. Les résultats dépassant {maxResultWindow} ne sont pas affichés en tuile. Une zone de délimitation indique la zone où les données sont incomplètes.", "xpack.maps.scalingDocs.mvtUseCase": "Utilisez cette option pour afficher de grands ensembles de données avec les temps de chargement les plus courts. Ne prend pas en charge les liaisons de termes, les étiquettes formatées et les styles fondés sur les données à partir de champs scriptés.", @@ -17110,15 +17107,11 @@ "xpack.maps.source.esSearch.indexOverOneLengthEditError": "Votre vue de données pointe vers plusieurs index. Un seul index est autorisé par vue de données.", "xpack.maps.source.esSearch.indexZeroLengthEditError": "Votre vue de données ne pointe vers aucun index.", "xpack.maps.source.esSearch.joinsDisabledReason": "Les liaisons ne sont pas prises en charge lors de la montée en charge par rapport aux clusters", - "xpack.maps.source.esSearch.joinsDisabledReasonMvt": "Les liaisons ne sont pas prises en charge lors de la montée en charge par rapport aux tuiles vectorielles.", "xpack.maps.source.esSearch.limitScalingLabel": "Limiter les résultats à {maxResultWindow}", "xpack.maps.source.esSearch.loadTooltipPropertiesErrorMsg": "Document introuvable, _id : {docId}", "xpack.maps.source.esSearch.scalingModal.cancelBtnLabel": "Annuler", - "xpack.maps.source.esSearch.scalingModal.clusters": "clusters", "xpack.maps.source.esSearch.scalingModal.confirmBtnLabel": "Accepter", - "xpack.maps.source.esSearch.scalingModal.message": "L’option de montée en charge {scalingOptionLabel} ne prend pas en charge les liaisons de termes. Le passage à l’option {scalingOptionLabel} entraînera la suppression de toutes les liaisons de termes de la configuration de calque.", "xpack.maps.source.esSearch.scalingModal.title": "Liaisons de termes non prises en charge", - "xpack.maps.source.esSearch.scalingModal.vectorTiles": "tuiles vectorielles", "xpack.maps.source.esSearch.selectLabel": "Sélectionner un champ géographique", "xpack.maps.source.esSearch.sortFieldLabel": "Champ", "xpack.maps.source.esSearch.sortFieldSelectPlaceholder": "Sélectionner le champ de tri", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 766819d1f68fc..c1936e8ef5bf8 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16959,8 +16959,6 @@ "xpack.maps.layerPanel.join.applyGlobalTimeCheckboxLabel": "結合するグローバル時刻を適用", "xpack.maps.layerPanel.join.deleteJoinAriaLabel": "ジョブの削除", "xpack.maps.layerPanel.join.deleteJoinTitle": "ジョブの削除", - "xpack.maps.layerPanel.joinEditor.addJoinAriaLabel": "結合を追加", - "xpack.maps.layerPanel.joinEditor.addJoinButtonLabel": "結合を追加", "xpack.maps.layerPanel.joinEditor.termJoinsTitle": "用語結合", "xpack.maps.layerPanel.joinEditor.termJoinTooltip": "用語結合を使用すると、データに基づくスタイル設定のプロパティでこのレイヤーを強化します。", "xpack.maps.layerPanel.joinExpression.helpText": "共有キーを構成します。", @@ -17141,7 +17139,6 @@ "xpack.maps.scalingDocs.clustersDetails": "結果が{maxResultWindow}ドキュメントを超えたときにクラスターを表示します。結果が{maxResultWindow}未満のときにドキュメントを表示します。", "xpack.maps.scalingDocs.clustersUseCase": "このオプションを使用して、大きいデータセットを表示します。用語結合はサポートされていません。", "xpack.maps.scalingDocs.limitDetails": "最初の{maxResultWindow}ドキュメントから特徴量を表示します。", - "xpack.maps.scalingDocs.limitUseCase": "このオプションを使用すると、境界を越えて統計情報を比較する階級区分図を作成します。", "xpack.maps.scalingDocs.maxResultWindow": "{link}インデックス設定で提供された{maxResultWindow}制約。", "xpack.maps.scalingDocs.mvtDetails": "マップをタイルに区分します。各タイルには、最初の{maxResultWindow}ドキュメントの特徴量が表示されます。{maxResultWindow}を超える結果はタイルに表示されません。バウンディングボックスは、データが不完全である領域を示します。", "xpack.maps.scalingDocs.mvtUseCase": "このオプションを使用すると、最速読み込み時間で大きいデータセットを表示します。用語結合、書式設定されたラベル、スクリプトフィールドからのデータドリブンスタイルはサポートされません。", @@ -17249,15 +17246,11 @@ "xpack.maps.source.esSearch.indexOverOneLengthEditError": "データビューは複数のインデックスを参照しています。データビューごとに1つのインデックスのみが許可されています。", "xpack.maps.source.esSearch.indexZeroLengthEditError": "データビューはどのインデックスも参照していません。", "xpack.maps.source.esSearch.joinsDisabledReason": "クラスターでスケーリングするときに、結合はサポートされていません", - "xpack.maps.source.esSearch.joinsDisabledReasonMvt": "ベクトルタイルでスケーリングするときに、結合はサポートされていません", "xpack.maps.source.esSearch.limitScalingLabel": "結果を{maxResultWindow}に限定", "xpack.maps.source.esSearch.loadTooltipPropertiesErrorMsg": "ドキュメントが見つかりません。_id:{docId}", "xpack.maps.source.esSearch.scalingModal.cancelBtnLabel": "キャンセル", - "xpack.maps.source.esSearch.scalingModal.clusters": "クラスター", "xpack.maps.source.esSearch.scalingModal.confirmBtnLabel": "承諾", - "xpack.maps.source.esSearch.scalingModal.message": "スケーリングオプション{scalingOptionLabel}は用語結合をサポートしていません。{scalingOptionLabel}に切り替えると、すべての用語結合がレイヤー構成から削除されます。", "xpack.maps.source.esSearch.scalingModal.title": "用語結合はサポートされていません", - "xpack.maps.source.esSearch.scalingModal.vectorTiles": "ベクトルタイル", "xpack.maps.source.esSearch.selectLabel": "ジオフィールドを選択", "xpack.maps.source.esSearch.sortFieldLabel": "フィールド", "xpack.maps.source.esSearch.sortFieldSelectPlaceholder": "ソートフィールドを選択", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9497d12240aca..0199af8d8f9da 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16984,8 +16984,6 @@ "xpack.maps.layerPanel.join.applyGlobalTimeCheckboxLabel": "应用全局时间到联接", "xpack.maps.layerPanel.join.deleteJoinAriaLabel": "删除联接", "xpack.maps.layerPanel.join.deleteJoinTitle": "删除联接", - "xpack.maps.layerPanel.joinEditor.addJoinAriaLabel": "添加联接", - "xpack.maps.layerPanel.joinEditor.addJoinButtonLabel": "添加联接", "xpack.maps.layerPanel.joinEditor.termJoinsTitle": "词联接", "xpack.maps.layerPanel.joinEditor.termJoinTooltip": "使用词联接及属性增强此图层,以实现数据驱动的样式。", "xpack.maps.layerPanel.joinExpression.helpText": "配置共享密钥。", @@ -17166,7 +17164,6 @@ "xpack.maps.scalingDocs.clustersDetails": "结果超过 {maxResultWindow} 个文档时显示集群。结果数小于 {maxResultWindow} 时显示文档。", "xpack.maps.scalingDocs.clustersUseCase": "使用此选项可显示大型数据集。不支持词联接。", "xpack.maps.scalingDocs.limitDetails": "显示前 {maxResultWindow} 个文档中的特征。", - "xpack.maps.scalingDocs.limitUseCase": "使用此选项可创建跨边界比较统计信息的分级统计图。", "xpack.maps.scalingDocs.maxResultWindow": "{link} 索引设置提供的 {maxResultWindow} 限制。", "xpack.maps.scalingDocs.mvtDetails": "将地图分区为磁贴,每个磁贴显示前 {maxResultWindow} 个文档中的特征。超出 {maxResultWindow} 的结果不在磁贴中显示。边界框指示数据不完整的区域。", "xpack.maps.scalingDocs.mvtUseCase": "使用此选项可显示加载时间最快的大型数据集。不支持词联接、格式化标签和脚本字段的数据驱动样式。", @@ -17274,15 +17271,11 @@ "xpack.maps.source.esSearch.indexOverOneLengthEditError": "您的数据视图指向多个索引。每个数据视图只允许一个索引。", "xpack.maps.source.esSearch.indexZeroLengthEditError": "您的数据视图未指向任何索引。", "xpack.maps.source.esSearch.joinsDisabledReason": "按集群缩放时不支持联接", - "xpack.maps.source.esSearch.joinsDisabledReasonMvt": "按矢量磁贴缩放时不支持联接", "xpack.maps.source.esSearch.limitScalingLabel": "将结果数限制到 {maxResultWindow}", "xpack.maps.source.esSearch.loadTooltipPropertiesErrorMsg": "找不到文档,_id:{docId}", "xpack.maps.source.esSearch.scalingModal.cancelBtnLabel": "取消", - "xpack.maps.source.esSearch.scalingModal.clusters": "集群", "xpack.maps.source.esSearch.scalingModal.confirmBtnLabel": "接受", - "xpack.maps.source.esSearch.scalingModal.message": "缩放选项 {scalingOptionLabel} 不支持词联接。切换到 {scalingOptionLabel} 将从您的图层配置中移除所有词联接。", "xpack.maps.source.esSearch.scalingModal.title": "不支持词联接", - "xpack.maps.source.esSearch.scalingModal.vectorTiles": "矢量磁贴", "xpack.maps.source.esSearch.selectLabel": "选择地理字段", "xpack.maps.source.esSearch.sortFieldLabel": "字段", "xpack.maps.source.esSearch.sortFieldSelectPlaceholder": "选择排序字段", diff --git a/x-pack/test/api_integration/apis/maps/maps_telemetry.ts b/x-pack/test/api_integration/apis/maps/maps_telemetry.ts index 31ea0c35bba7f..34a7bbb1b2186 100644 --- a/x-pack/test/api_integration/apis/maps/maps_telemetry.ts +++ b/x-pack/test/api_integration/apis/maps/maps_telemetry.ts @@ -27,83 +27,81 @@ export default function ({ getService }: FtrProviderContext) { const mapUsage = apiResponse.stack_stats.kibana.plugins.maps; delete mapUsage.timeCaptured; - expect(mapUsage).eql({ - geoShapeAggLayersCount: 1, - indexPatternsWithGeoFieldCount: 6, - indexPatternsWithGeoPointFieldCount: 4, - indexPatternsWithGeoShapeFieldCount: 2, - mapsTotalCount: 25, - basemaps: {}, - joins: { term: { min: 1, max: 1, total: 3, avg: 0.12 } }, - layerTypes: { - es_docs: { min: 1, max: 2, total: 17, avg: 0.68 }, - es_agg_grids: { min: 1, max: 1, total: 6, avg: 0.24 }, - es_point_to_point: { min: 1, max: 1, total: 1, avg: 0.04 }, - es_top_hits: { min: 1, max: 1, total: 2, avg: 0.08 }, - es_agg_heatmap: { min: 1, max: 1, total: 1, avg: 0.04 }, - kbn_tms_raster: { min: 1, max: 1, total: 1, avg: 0.04 }, - ems_basemap: { min: 1, max: 1, total: 1, avg: 0.04 }, - ems_region: { min: 1, max: 1, total: 1, avg: 0.04 }, - }, - resolutions: { - coarse: { min: 1, max: 1, total: 4, avg: 0.16 }, - super_fine: { min: 1, max: 1, total: 3, avg: 0.12 }, + expect(mapUsage.geoShapeAggLayersCount).eql(1); + expect(mapUsage.indexPatternsWithGeoFieldCount).eql(6); + expect(mapUsage.indexPatternsWithGeoPointFieldCount).eql(4); + expect(mapUsage.indexPatternsWithGeoShapeFieldCount).eql(2); + expect(mapUsage.mapsTotalCount).eql(26); + expect(mapUsage.basemaps).eql({}); + expect(mapUsage.joins).eql({ term: { min: 1, max: 1, total: 3, avg: 0.11538461538461539 } }); + expect(mapUsage.layerTypes).eql({ + es_docs: { min: 1, max: 2, total: 18, avg: 0.6923076923076923 }, + es_agg_grids: { min: 1, max: 1, total: 6, avg: 0.23076923076923078 }, + es_point_to_point: { min: 1, max: 1, total: 1, avg: 0.038461538461538464 }, + es_top_hits: { min: 1, max: 1, total: 2, avg: 0.07692307692307693 }, + es_agg_heatmap: { min: 1, max: 1, total: 1, avg: 0.038461538461538464 }, + kbn_tms_raster: { min: 1, max: 1, total: 1, avg: 0.038461538461538464 }, + ems_basemap: { min: 1, max: 1, total: 1, avg: 0.038461538461538464 }, + ems_region: { min: 1, max: 1, total: 1, avg: 0.038461538461538464 }, + }); + expect(mapUsage.resolutions).eql({ + coarse: { min: 1, max: 1, total: 4, avg: 0.15384615384615385 }, + super_fine: { min: 1, max: 1, total: 3, avg: 0.11538461538461539 }, + }); + expect(mapUsage.scalingOptions).eql({ + limit: { min: 1, max: 2, total: 14, avg: 0.5384615384615384 }, + clusters: { min: 1, max: 1, total: 1, avg: 0.038461538461538464 }, + mvt: { min: 1, max: 1, total: 3, avg: 0.11538461538461539 }, + }); + expect(mapUsage.attributesPerMap).eql({ + dataSourcesCount: { + avg: 1.1538461538461537, + max: 5, + min: 1, }, - scalingOptions: { - limit: { min: 1, max: 2, total: 14, avg: 0.56 }, - clusters: { min: 1, max: 1, total: 1, avg: 0.04 }, - mvt: { min: 1, max: 1, total: 2, avg: 0.08 }, + emsVectorLayersCount: { + idThatDoesNotExitForEMSFileSource: { + avg: 0.038461538461538464, + max: 1, + min: 1, + }, }, - attributesPerMap: { - dataSourcesCount: { - avg: 1.16, - max: 5, + layerTypesCount: { + BLENDED_VECTOR: { + avg: 0.038461538461538464, + max: 1, min: 1, }, - emsVectorLayersCount: { - idThatDoesNotExitForEMSFileSource: { - avg: 0.04, - max: 1, - min: 1, - }, + EMS_VECTOR_TILE: { + avg: 0.038461538461538464, + max: 1, + min: 1, }, - layerTypesCount: { - BLENDED_VECTOR: { - avg: 0.04, - max: 1, - min: 1, - }, - EMS_VECTOR_TILE: { - avg: 0.04, - max: 1, - min: 1, - }, - GEOJSON_VECTOR: { - avg: 0.84, - max: 4, - min: 1, - }, - HEATMAP: { - avg: 0.04, - max: 1, - min: 1, - }, - MVT_VECTOR: { - avg: 0.2, - max: 1, - min: 1, - }, - RASTER_TILE: { - avg: 0.04, - max: 1, - min: 1, - }, + GEOJSON_VECTOR: { + avg: 0.8076923076923077, + max: 4, + min: 1, + }, + HEATMAP: { + avg: 0.038461538461538464, + max: 1, + min: 1, }, - layersCount: { - avg: 1.2, - max: 6, + MVT_VECTOR: { + avg: 0.23076923076923078, + max: 1, min: 1, }, + RASTER_TILE: { + avg: 0.038461538461538464, + max: 1, + min: 1, + }, + }, + layersCount: { + avg: 1.1923076923076923, + max: 6, + min: 1, }, }); }); diff --git a/x-pack/test/functional/apps/maps/index.js b/x-pack/test/functional/apps/maps/index.js index dbfacc7941794..9d7e7a9cbddcc 100644 --- a/x-pack/test/functional/apps/maps/index.js +++ b/x-pack/test/functional/apps/maps/index.js @@ -87,6 +87,7 @@ export default function ({ loadTestFile, getService }) { this.tags('ciGroup10'); loadTestFile(require.resolve('./es_pew_pew_source')); loadTestFile(require.resolve('./joins')); + loadTestFile(require.resolve('./mvt_joins')); loadTestFile(require.resolve('./mapbox_styles')); loadTestFile(require.resolve('./mvt_scaling')); loadTestFile(require.resolve('./mvt_geotile_grid')); diff --git a/x-pack/test/functional/apps/maps/mvt_joins.ts b/x-pack/test/functional/apps/maps/mvt_joins.ts new file mode 100644 index 0000000000000..2ae8f7ea5943b --- /dev/null +++ b/x-pack/test/functional/apps/maps/mvt_joins.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 expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const PageObjects = getPageObjects(['maps']); + const security = getService('security'); + const find = getService('find'); + + describe('vector tile layer with joins', () => { + before(async () => { + await security.testUser.setRoles( + ['global_maps_all', 'geoshape_data_reader', 'meta_for_geoshape_data_reader'], + { skipBrowserRefresh: true } + ); + await PageObjects.maps.loadSavedMap('mvt join example'); + }); + + after(async () => { + await security.testUser.restoreDefaults(); + }); + + it('should show dynamic data range in legend', async () => { + const layerTOCDetails = await PageObjects.maps.getLayerTOCDetails('geo_shapes*'); + const split = layerTOCDetails.trim().split('\n'); + + // field display name + expect(split[0]).to.equal('max prop1'); + + // bands 1-8 + expect(split[1]).to.equal('< 4.13'); + expect(split[2]).to.equal('4.13 up to 5.25'); + expect(split[3]).to.equal('5.25 up to 6.38'); + expect(split[4]).to.equal('6.38 up to 7.5'); + expect(split[5]).to.equal('7.5 up to 8.63'); + expect(split[6]).to.equal('8.63 up to 9.75'); + expect(split[7]).to.equal('9.75 up to 11'); + expect(split[8]).to.equal('>= 11'); + }); + + it('should show join metrics in tooltip', async () => { + // zoom in on feature so tooltip click can not miss + await PageObjects.maps.setView(-1, 60, 9); + await PageObjects.maps.lockTooltipAtPosition(200, -200); + + const tooltipRows = await find.allByCssSelector(`tr[class='mapFeatureTooltip_row']`); + expect(tooltipRows.length).to.equal(2); + expect(await tooltipRows[0].getVisibleText()).to.equal('name charlie'); + expect(await tooltipRows[1].getVisibleText()).to.equal('max prop1 12'); + }); + + describe('query bar', () => { + before(async () => { + await PageObjects.maps.setAndSubmitQuery('prop1 < 10'); + }); + + after(async () => { + await PageObjects.maps.setAndSubmitQuery(''); + }); + + it('should update dynamic data range in legend', async () => { + const layerTOCDetails = await PageObjects.maps.getLayerTOCDetails('geo_shapes*'); + const split = layerTOCDetails.trim().split('\n'); + + // field display name + expect(split[0]).to.equal('max prop1'); + + // bands 1-8 + expect(split[1]).to.equal('< 3.63'); + expect(split[2]).to.equal('3.63 up to 4.25'); + expect(split[3]).to.equal('4.25 up to 4.88'); + expect(split[4]).to.equal('4.88 up to 5.5'); + expect(split[5]).to.equal('5.5 up to 6.13'); + expect(split[6]).to.equal('6.13 up to 6.75'); + expect(split[7]).to.equal('6.75 up to 7.38'); + expect(split[8]).to.equal('>= 7.38'); + }); + + it('fit to bounds should exclude source features without join matches', async () => { + await PageObjects.maps.clickFitToData(); + + const { lat, lon, zoom } = await PageObjects.maps.getView(); + expect(Math.round(lat)).to.equal(0); + expect(Math.round(lon)).to.equal(90); + expect(Math.ceil(zoom)).to.equal(5); + }); + }); + }); +} diff --git a/x-pack/test/functional/fixtures/kbn_archiver/maps.json b/x-pack/test/functional/fixtures/kbn_archiver/maps.json index 5564e8d502944..e9f4f4290c70d 100644 --- a/x-pack/test/functional/fixtures/kbn_archiver/maps.json +++ b/x-pack/test/functional/fixtures/kbn_archiver/maps.json @@ -104,6 +104,35 @@ "version": "WzUxLDJd" } +{ + "attributes": { + "description": "", + "layerListJSON": "[{\"id\":\"n1t6f\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"sourceDescriptor\":{\"id\":\"62eca1fc-fe42-11e8-8eb2-f2801f1b9fd1\",\"type\":\"ES_SEARCH\",\"geoField\":\"geometry\",\"limit\":2048,\"filterByMapBounds\":false,\"showTooltip\":true,\"tooltipProperties\":[\"name\"],\"applyGlobalQuery\":false,\"scalingType\":\"MVT\",\"indexPatternRefName\":\"layer_0_source_index_pattern\"},\"visible\":true,\"temporary\":false,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"DYNAMIC\",\"options\":{\"fieldMetaOptions\":{\"isEnabled\":false,\"sigma\":3},\"field\":{\"label\":\"max(prop1) group by meta_for_geo_shapes*.runtime_shape_name\",\"name\":\"__kbnjoin__max_of_prop1__855ccb86-fe42-11e8-8eb2-f2801f1b9fd1\",\"origin\":\"join\"},\"color\":\"Blues\"}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}},\"symbolizeAs\":{\"options\":{\"value\":\"circle\"}},\"icon\":{\"type\":\"STATIC\",\"options\":{\"value\":\"marker\"}}},\"temporary\":true,\"previousStyle\":null},\"type\":\"MVT_VECTOR\",\"joins\":[{\"leftField\":\"name\",\"right\":{\"id\":\"855ccb86-fe42-11e8-8eb2-f2801f1b9fd1\",\"indexPatternTitle\":\"meta_for_geo_shapes*\",\"term\":\"runtime_shape_name\",\"metrics\":[{\"type\":\"max\",\"field\":\"prop1\"}],\"applyGlobalQuery\":true,\"type\":\"ES_TERM_SOURCE\",\"indexPatternRefName\":\"layer_0_join_0_index_pattern\"}}]}]", + "mapStateJSON": "{\"zoom\":3.02,\"center\":{\"lon\":77.33426,\"lat\":-0.04647},\"timeFilters\":{\"from\":\"now-17m\",\"to\":\"now\",\"mode\":\"quick\"},\"refreshConfig\":{\"isPaused\":true,\"interval\":1000},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"settings\":{\"autoFitToDataBounds\":false,\"backgroundColor\":\"#ffffff\",\"customIcons\":[],\"disableInteractive\":false,\"disableTooltipControl\":false,\"hideToolbarOverlay\":false,\"hideLayerControl\":false,\"hideViewControl\":false,\"initialLocation\":\"LAST_SAVED_LOCATION\",\"fixedLocation\":{\"lat\":0,\"lon\":0,\"zoom\":2},\"browserLocation\":{\"zoom\":2},\"maxZoom\":24,\"minZoom\":0,\"showScaleControl\":false,\"showSpatialFilters\":true,\"showTimesliderToggleButton\":true,\"spatialFiltersAlpa\":0.3,\"spatialFiltersFillColor\":\"#DA8B45\",\"spatialFiltersLineColor\":\"#DA8B45\"}}", + "title": "mvt join example", + "uiStateJSON": "{\"isLayerTOCOpen\":true,\"openTOCDetails\":[\"n1t6f\"]}" + }, + "coreMigrationVersion": "8.3.0", + "id": "f85dc420-ba99-11ec-8403-51529e77089a", + "migrationVersion": { + "map": "8.1.0" + }, + "references": [ + { + "id": "561253e0-f731-11e8-8487-11b9dd924f96", + "name": "layer_0_source_index_pattern", + "type": "index-pattern" + }, + { + "id": "e20b2a30-f735-11e8-8ce0-9723965e01e3", + "name": "layer_0_join_0_index_pattern", + "type": "index-pattern" + } + ], + "type": "map", + "version": "Wzk0LDFd" +} + { "attributes": { "fields": "[{\"name\":\"hour_of_day\",\"type\":\"number\",\"count\":0,\"scripted\":true,\"script\":\"doc['@timestamp'].value.getHour()\",\"lang\":\"painless\",\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false}]", From 0196a8f6f3f546e97237dbef8f72bdd12b2a5212 Mon Sep 17 00:00:00 2001 From: Jack Date: Wed, 20 Apr 2022 12:18:01 -0400 Subject: [PATCH 12/22] [Session View] Update alert icon color to danger (#130612) * Update alert icon color to danger * Add test snapshot to process_tree_alert Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../__snapshots__/index.test.tsx.snap | 152 ++++++++++++++++++ .../process_tree_alert/index.test.tsx | 1 + .../components/process_tree_alert/index.tsx | 2 +- 3 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap b/x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap new file mode 100644 index 0000000000000..e9f66ea10d66e --- /dev/null +++ b/x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap @@ -0,0 +1,152 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ProcessTreeAlerts component When ProcessTreeAlert is mounted should render alert row correctly 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+
+ + +
+ cmd test alert +
+ + + + open + + + +
+
+ , + "container":
+
+ + +
+ cmd test alert +
+ + + + open + + + +
+
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/index.test.tsx b/x-pack/plugins/session_view/public/components/process_tree_alert/index.test.tsx index d0c4ca5256809..7ed1783e2da3f 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_alert/index.test.tsx +++ b/x-pack/plugins/session_view/public/components/process_tree_alert/index.test.tsx @@ -40,6 +40,7 @@ describe('ProcessTreeAlerts component', () => { expect(renderResult.queryByTestId(TEST_ID)).toBeTruthy(); expect(renderResult.queryByText(ALERT_RULE_NAME!)).toBeTruthy(); expect(renderResult.queryByText(ALERT_STATUS!)).toBeTruthy(); + expect(renderResult).toMatchSnapshot(); }); it('should execute onClick callback', async () => { diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx b/x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx index bf4b6f63bbe95..95618123d709f 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx +++ b/x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx @@ -73,7 +73,7 @@ export const ProcessTreeAlert = ({ data-test-subj={`sessionView:sessionViewAlertDetailExpand-${uuid}`} onClick={handleExpandClick} /> - + {dataOrDash(name)} From 4b6c19ae21c20e5bd1eb6cfcef8f11c7958f7293 Mon Sep 17 00:00:00 2001 From: spalger Date: Wed, 20 Apr 2022 12:24:02 -0500 Subject: [PATCH 13/22] skip flaky suite (#130694) --- test/functional/apps/discover/_discover.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/discover/_discover.ts b/test/functional/apps/discover/_discover.ts index 03a8dbcffa2d9..88df8f7798ba8 100644 --- a/test/functional/apps/discover/_discover.ts +++ b/test/functional/apps/discover/_discover.ts @@ -25,7 +25,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { defaultIndex: 'logstash-*', }; - describe('discover test', function describeIndexTests() { + // FLAKY: https://github.com/elastic/kibana/issues/130694 + describe.skip('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'); From 0d233e9ad719ee8905e250f7988c6008bb41d272 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Wed, 20 Apr 2022 11:26:16 -0600 Subject: [PATCH 14/22] [ML] Allow to edit job selection on data frame analytics results and map pages (#130419) * add selection flyout control * always allow selection flyout to be opened * show flyout when no job is selected * lint fix * show badge when id selected --- .../pages/analytics_exploration/page.tsx | 18 ++++- .../analytics_id_selector.tsx | 14 ++-- .../analytics_id_selector_controls.tsx | 65 +++++++++++++++++++ .../components/analytics_selector/index.ts | 1 + .../pages/job_map/page.tsx | 25 +++++-- 5 files changed, 112 insertions(+), 11 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector_controls.tsx diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx index 38cc37aec646c..c35ad5bacf371 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx @@ -18,7 +18,11 @@ import { DataFrameAnalysisConfigType } from '../../../../../common/types/data_fr import { HelpMenu } from '../../../components/help_menu'; import { useMlKibana, useMlApiContext } from '../../../contexts/kibana'; import { MlPageHeader } from '../../../components/page_header'; -import { AnalyticsIdSelector, AnalyticsSelectorIds } from '../components/analytics_selector'; +import { + AnalyticsIdSelector, + AnalyticsSelectorIds, + AnalyticsIdSelectorControls, +} from '../components/analytics_selector'; import { AnalyticsEmptyPrompt } from '../analytics_management/components/empty_prompt'; import { useUrlState } from '../../../util/url_state'; @@ -27,6 +31,7 @@ export const Page: FC<{ analysisType: DataFrameAnalysisConfigType; }> = ({ jobId, analysisType }) => { const [analyticsId, setAnalyticsId] = useState(); + const [isIdSelectorFlyoutVisible, setIsIdSelectorFlyoutVisible] = useState(!jobId); const [jobsExist, setJobsExist] = useState(true); const { services: { docLinks }, @@ -74,7 +79,6 @@ export const Page: FC<{ } return ( <> - + + {isIdSelectorFlyoutVisible ? ( + + ) : null} {jobIdToUse !== undefined && ( >; jobsOnly?: boolean; + setIsIdSelectorFlyoutVisible: React.Dispatch>; } -export function AnalyticsIdSelector({ setAnalyticsId, jobsOnly = false }: Props) { +export function AnalyticsIdSelector({ + setAnalyticsId, + jobsOnly = false, + setIsIdSelectorFlyoutVisible, +}: Props) { const [selected, setSelected] = useState< { model_id?: string; job_id?: string; analysis_type?: string } | undefined >(); const [analyticsJobs, setAnalyticsJobs] = useState([]); const [trainedModels, setTrainedModels] = useState([]); - const [isFlyoutVisible, setIsFlyoutVisible] = useState(true); const [isLoading, setIsLoading] = useState(false); const { displayErrorToast } = useToastNotificationService(); const trainedModelsApiService = useTrainedModelsApiService(); @@ -165,7 +169,7 @@ export function AnalyticsIdSelector({ setAnalyticsId, jobsOnly = false }: Props) } function closeFlyout() { - setIsFlyoutVisible(false); + setIsIdSelectorFlyoutVisible(false); } // Fetch analytics jobs and models on flyout open @@ -258,7 +262,7 @@ export function AnalyticsIdSelector({ setAnalyticsId, jobsOnly = false }: Props) }); } - return isFlyoutVisible ? ( + return ( - ) : null; + ); } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector_controls.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector_controls.tsx new file mode 100644 index 0000000000000..1df676da58aec --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector_controls.tsx @@ -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 React, { FC } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiBadge, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiHorizontalRule, + EuiText, +} from '@elastic/eui'; + +interface Props { + setIsIdSelectorFlyoutVisible: React.Dispatch>; + selectedId?: string; +} + +export const AnalyticsIdSelectorControls: FC = ({ + setIsIdSelectorFlyoutVisible, + selectedId, +}) => ( + <> + + + {selectedId ? ( + + {selectedId} + + ) : null} + {!selectedId ? ( + + + + ) : null} + + + + + + + + + +); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/index.ts index dcd547d84b8f0..8daca8b921480 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/index.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/index.ts @@ -7,3 +7,4 @@ export { AnalyticsIdSelector } from './analytics_id_selector'; export type { AnalyticsSelectorIds } from './analytics_id_selector'; +export { AnalyticsIdSelectorControls } from './analytics_id_selector_controls'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx index 3420f839d592b..47d10b6c08d6e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx @@ -18,16 +18,24 @@ import { HelpMenu } from '../../../components/help_menu'; import { useMlKibana, useMlApiContext } from '../../../contexts/kibana'; import { useRefreshAnalyticsList } from '../../common'; import { MlPageHeader } from '../../../components/page_header'; -import { AnalyticsIdSelector, AnalyticsSelectorIds } from '../components/analytics_selector'; +import { + AnalyticsIdSelector, + AnalyticsSelectorIds, + AnalyticsIdSelectorControls, +} from '../components/analytics_selector'; import { AnalyticsEmptyPrompt } from '../analytics_management/components/empty_prompt'; export const Page: FC = () => { const [globalState, setGlobalState] = useUrlState('_g'); + const mapJobId = globalState?.ml?.jobId; + const mapModelId = globalState?.ml?.modelId; + const [isLoading, setIsLoading] = useState(false); + const [isIdSelectorFlyoutVisible, setIsIdSelectorFlyoutVisible] = useState( + !mapJobId && !mapModelId + ); const [jobsExist, setJobsExist] = useState(true); const { refresh } = useRefreshAnalyticsList({ isLoading: setIsLoading }); - const mapJobId = globalState?.ml?.jobId; - const mapModelId = globalState?.ml?.modelId; const [analyticsId, setAnalyticsId] = useState(); const { services: { docLinks }, @@ -71,7 +79,6 @@ export const Page: FC = () => { } return ( <> - { return ( <> + + {isIdSelectorFlyoutVisible ? ( + + ) : null} {jobId === undefined && modelId === undefined ? ( Date: Wed, 20 Apr 2022 19:26:41 +0200 Subject: [PATCH 15/22] [Uptime][Monitor Management] Report all service locations for Run Once and Test Now (#130076) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: shahzad31 --- .../common/lib/schedule_to_time.test.ts | 23 ++ .../uptime/common/lib/schedule_to_time.ts | 24 ++ .../monitor_management/monitor_types.ts | 6 +- .../plugins/uptime/public/apps/uptime_app.tsx | 7 +- .../hooks/use_run_once_errors.ts | 99 ++++++++ .../browser/browser_test_results.test.tsx | 41 +++- .../browser/browser_test_results.tsx | 146 ++++++------ .../use_browser_run_once_monitors.test.tsx | 34 ++- .../browser/use_browser_run_once_monitors.ts | 214 +++++++++++++++--- .../simple/simple_test_results.test.tsx | 17 +- .../simple/simple_test_results.tsx | 37 ++- .../simple/use_simple_run_once_monitors.ts | 38 +++- .../test_now_mode/test_now_mode.test.tsx | 38 +++- .../test_now_mode/test_now_mode.tsx | 53 +++-- .../test_now_mode/test_result_header.tsx | 17 +- .../test_now_mode/test_run_results.tsx | 18 +- .../columns/monitor_status_column.tsx | 25 +- .../progress/browser_monitor_progress.tsx | 62 ++--- .../columns/progress/monitor_progress.tsx | 12 +- .../progress/simple_monitor_progress.tsx | 29 ++- .../monitor_list/columns/test_now_col.tsx | 13 +- .../public/lib/__mocks__/uptime_store.mock.ts | 4 +- .../uptime/public/state/actions/types.ts | 5 +- .../uptime/public/state/actions/utils.ts | 4 +- .../public/state/api/monitor_management.ts | 10 +- .../uptime/public/state/effects/index.ts | 9 +- .../public/state/effects/monitor_list.ts | 12 +- .../public/state/effects/test_now_runs.ts | 27 +++ x-pack/plugins/uptime/public/state/index.ts | 3 + .../public/state/reducers/test_now_runs.ts | 96 +++++--- .../telemetry/monitor_upgrade_sender.ts | 3 +- .../synthetics_service/test_now_monitor.ts | 15 +- 32 files changed, 851 insertions(+), 290 deletions(-) create mode 100644 x-pack/plugins/uptime/common/lib/schedule_to_time.test.ts create mode 100644 x-pack/plugins/uptime/common/lib/schedule_to_time.ts create mode 100644 x-pack/plugins/uptime/public/components/monitor_management/hooks/use_run_once_errors.ts create mode 100644 x-pack/plugins/uptime/public/state/effects/test_now_runs.ts diff --git a/x-pack/plugins/uptime/common/lib/schedule_to_time.test.ts b/x-pack/plugins/uptime/common/lib/schedule_to_time.test.ts new file mode 100644 index 0000000000000..391963a960be4 --- /dev/null +++ b/x-pack/plugins/uptime/common/lib/schedule_to_time.test.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ScheduleUnit, SyntheticsMonitorSchedule } from '../runtime_types'; +import { scheduleToMilli } from './schedule_to_time'; + +describe('schedule_to_time', () => { + describe('scheduleToMilli', () => { + it('converts seconds schedule to millis', () => { + const schedule: SyntheticsMonitorSchedule = { unit: ScheduleUnit.SECONDS, number: '10' }; + expect(scheduleToMilli(schedule)).toEqual(10 * 1000); + }); + + it('converts minutes schedule to millis', () => { + const schedule: SyntheticsMonitorSchedule = { unit: ScheduleUnit.MINUTES, number: '6' }; + expect(scheduleToMilli(schedule)).toEqual(6 * 60 * 1000); + }); + }); +}); diff --git a/x-pack/plugins/uptime/common/lib/schedule_to_time.ts b/x-pack/plugins/uptime/common/lib/schedule_to_time.ts new file mode 100644 index 0000000000000..d944c35b2ec78 --- /dev/null +++ b/x-pack/plugins/uptime/common/lib/schedule_to_time.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 { ScheduleUnit, SyntheticsMonitorSchedule } from '../runtime_types'; + +export function scheduleToMilli(schedule: SyntheticsMonitorSchedule): number { + const timeValue = parseInt(schedule.number, 10); + return timeValue * getMilliFactorForScheduleUnit(schedule.unit); +} + +function getMilliFactorForScheduleUnit(scheduleUnit: ScheduleUnit): number { + switch (scheduleUnit) { + case ScheduleUnit.SECONDS: + return 1000; + case ScheduleUnit.MINUTES: + return 60 * 1000; + default: + throw new Error(`Unit ${scheduleUnit} is not supported`); + } +} diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts b/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts index fa2f04b641f51..c093705e858d8 100644 --- a/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts +++ b/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts @@ -19,11 +19,13 @@ import { } from './monitor_configs'; import { MetadataCodec } from './monitor_meta_data'; -const Schedule = t.interface({ +const ScheduleCodec = t.interface({ number: t.string, unit: ScheduleUnitCodec, }); +export type SyntheticsMonitorSchedule = t.TypeOf; + // TLSFields export const TLSFieldsCodec = t.partial({ [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: t.string, @@ -65,7 +67,7 @@ export const CommonFieldsCodec = t.intersection([ [ConfigKey.NAMESPACE]: t.string, [ConfigKey.MONITOR_TYPE]: DataStreamCodec, [ConfigKey.ENABLED]: t.boolean, - [ConfigKey.SCHEDULE]: Schedule, + [ConfigKey.SCHEDULE]: ScheduleCodec, [ConfigKey.APM_SERVICE_NAME]: t.string, [ConfigKey.TAGS]: t.array(t.string), [ConfigKey.LOCATIONS]: MonitorServiceLocationsCodec, diff --git a/x-pack/plugins/uptime/public/apps/uptime_app.tsx b/x-pack/plugins/uptime/public/apps/uptime_app.tsx index 91d6ccbfd5267..b106123de1b29 100644 --- a/x-pack/plugins/uptime/public/apps/uptime_app.tsx +++ b/x-pack/plugins/uptime/public/apps/uptime_app.tsx @@ -17,7 +17,6 @@ import { RedirectAppLinks, } from '@kbn/kibana-react-plugin/public'; import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; -import { Storage } from '@kbn/kibana-utils-plugin/public'; import { InspectorContextProvider } from '@kbn/observability-plugin/public'; import { ClientPluginsSetup, ClientPluginsStart } from './plugin'; import { UMUpdateBadge } from '../lib/lib'; @@ -30,8 +29,8 @@ import { import { CommonlyUsedRange } from '../components/common/uptime_date_picker'; import { setBasePath } from '../state/actions'; import { PageRouter } from '../routes'; -import { UptimeAlertsFlyoutWrapper } from '../components/overview/alerts'; -import { store } from '../state'; +import { UptimeAlertsFlyoutWrapper } from '../components/overview'; +import { store, storage } from '../state'; import { kibanaService } from '../state/kibana_service'; import { ActionMenu } from '../components/common/header/action_menu'; import { UptimeIndexPatternContextProvider } from '../contexts/uptime_index_pattern_context'; @@ -102,8 +101,6 @@ const Application = (props: UptimeAppProps) => { store.dispatch(setBasePath(basePath)); - const storage = new Storage(window.localStorage); - return ( diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_run_once_errors.ts b/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_run_once_errors.ts new file mode 100644 index 0000000000000..52218986744c0 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_run_once_errors.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect, useMemo, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { Locations, ServiceLocationErrors } from '../../../../common/runtime_types'; + +export function useRunOnceErrors({ + testRunId, + serviceError, + errors, + locations, +}: { + testRunId: string; + serviceError: null | Error; + errors: ServiceLocationErrors; + locations: Locations; +}) { + const [locationErrors, setLocationErrors] = useState([]); + const [runOnceServiceError, setRunOnceServiceError] = useState(null); + + useEffect(() => { + setLocationErrors([]); + setRunOnceServiceError(null); + }, [testRunId]); + + useEffect(() => { + if (locationErrors.length || errors.length) { + setLocationErrors(errors); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [errors]); + + useEffect(() => { + if (runOnceServiceError?.message !== serviceError?.message) { + setRunOnceServiceError(serviceError); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [serviceError]); + + const locationsById: Record = useMemo( + () => (locations as Locations).reduce((acc, cur) => ({ ...acc, [cur.id]: cur }), {}), + [locations] + ); + + const expectPings = + locations.length - (locationErrors ?? []).filter(({ locationId }) => !!locationId).length; + + const hasBlockingError = + !!runOnceServiceError || + (locationErrors?.length && locationErrors?.length === locations.length); + + const errorMessages = useMemo(() => { + if (hasBlockingError) { + return [{ name: 'Error', message: PushErrorService, title: PushErrorLabel }]; + } else if (locationErrors?.length > 0) { + // If only some of the locations were unsuccessful + return locationErrors + .map(({ locationId }) => locationsById[locationId]) + .filter((location) => !!location) + .map((location) => ({ + name: 'Error', + message: getLocationTestErrorLabel(location.label), + title: RunErrorLabel, + })); + } + + return []; + }, [locationsById, locationErrors, hasBlockingError]); + + return { + expectPings, + hasBlockingError, + blockingErrorMessage: hasBlockingError ? PushErrorService : null, + errorMessages, + }; +} + +const PushErrorLabel = i18n.translate('xpack.uptime.testRun.pushErrorLabel', { + defaultMessage: 'Push error', +}); + +const RunErrorLabel = i18n.translate('xpack.uptime.testRun.runErrorLabel', { + defaultMessage: 'Error running test', +}); + +const getLocationTestErrorLabel = (locationName: string) => + i18n.translate('xpack.uptime.testRun.runErrorLocation', { + defaultMessage: 'Failed to run monitor on location {locationName}.', + values: { locationName }, + }); + +const PushErrorService = i18n.translate('xpack.uptime.testRun.pushError', { + defaultMessage: 'Failed to push the monitor to service.', +}); diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.test.tsx b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.test.tsx index edeb0c57eb31d..2a31d54097d5f 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.test.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.test.tsx @@ -23,7 +23,14 @@ describe('BrowserTestRunResult', function () { }); it('should render properly', async function () { - render(); + render( + + ); expect(await screen.findByText('Test result')).toBeInTheDocument(); expect(await screen.findByText('0 steps completed')).toBeInTheDocument(); const dataApi = (kibanaService.core as any).data.search; @@ -55,18 +62,34 @@ describe('BrowserTestRunResult', function () { ); }); - it('should displays results', async function () { + it('should display results', async function () { jest.spyOn(runOnceHooks, 'useBrowserRunOnceMonitors').mockReturnValue({ data, - stepListData: { steps: [stepEndDoc._source] } as any, - loading: false, - stepsLoading: false, - journeyStarted: true, - summaryDoc: summaryDoc._source, - stepEnds: [stepEndDoc._source], + summariesLoading: false, + stepLoadingInProgress: false, + expectedSummariesLoaded: true, + lastUpdated: Date.now(), + checkGroupResults: [ + { + checkGroupId: 'c01406bf-7467-11ec-9858-aa31996e0afe', + stepsLoading: false, + journeyStarted: true, + summaryDoc: summaryDoc._source, + journeyDoc: summaryDoc._source, + steps: [stepEndDoc._source], + completedSteps: 1, + }, + ], }); - render(); + render( + + ); expect(await screen.findByText('Test result')).toBeInTheDocument(); diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.tsx b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.tsx index af11553d185a5..e5ca115b09b97 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.tsx @@ -7,40 +7,108 @@ import { useEffect } from 'react'; import * as React from 'react'; -import { EuiAccordion, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner, EuiText } from '@elastic/eui'; +import { EuiAccordion, EuiText, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import styled from 'styled-components'; import { StepsList } from '../../../synthetics/check_steps/steps_list'; -import { JourneyStep } from '../../../../../common/runtime_types'; -import { useBrowserRunOnceMonitors } from './use_browser_run_once_monitors'; +import { CheckGroupResult, useBrowserRunOnceMonitors } from './use_browser_run_once_monitors'; import { TestResultHeader } from '../test_result_header'; import { StdErrorLogs } from '../../../synthetics/check_steps/stderr_logs'; interface Props { monitorId: string; isMonitorSaved: boolean; + expectPings: number; onDone: () => void; } -export const BrowserTestRunResult = ({ monitorId, isMonitorSaved, onDone }: Props) => { - const { data, loading, stepsLoading, stepEnds, journeyStarted, summaryDoc, stepListData } = +export const BrowserTestRunResult = ({ monitorId, isMonitorSaved, expectPings, onDone }: Props) => { + const { summariesLoading, expectedSummariesLoaded, stepLoadingInProgress, checkGroupResults } = useBrowserRunOnceMonitors({ configId: monitorId, + expectSummaryDocs: expectPings, }); useEffect(() => { - if (Boolean(summaryDoc)) { + if (expectedSummariesLoaded) { onDone(); } - }, [summaryDoc, onDone]); + }, [onDone, expectedSummariesLoaded]); - const hits = data?.hits.hits; - const doc = hits?.[0]?._source as JourneyStep; + return ( + <> + {checkGroupResults.map((checkGroupResult) => { + const { checkGroupId, journeyStarted, summaryDoc, stepsLoading, steps, completedSteps } = + checkGroupResult; + const isStepsLoading = !summariesLoading && journeyStarted && summaryDoc && stepsLoading; + const isStepsLoadingFailed = + summaryDoc && !summariesLoading && !stepLoadingInProgress && steps.length === 0; + + return ( + + {isStepsLoading && ( + + + {LOADING_STEPS} + + + + + + )} + {isStepsLoadingFailed && ( + {summaryDoc?.error?.message ?? FAILED_TO_RUN} + )} + + {isStepsLoadingFailed && + summaryDoc?.error?.message?.includes('journey did not finish executing') && ( + + )} + + {summaryDoc && completedSteps > 0 && ( + + )} + + ); + })} + + ); +}; + +const AccordionWrapper = styled(EuiAccordion)` + .euiAccordion__buttonContent { + width: 100%; + } +`; - const buttonContent = ( +function getButtonContent({ + journeyDoc, + summaryDoc, + checkGroupId, + journeyStarted, + completedSteps, +}: CheckGroupResult) { + return (
@@ -51,7 +119,7 @@ export const BrowserTestRunResult = ({ monitorId, isMonitorSaved, onDone }: Prop defaultMessage: '{stepCount, number} {stepCount, plural, one {step} other {steps}} completed', values: { - stepCount: stepEnds.length, + stepCount: completedSteps ?? 0, }, })} @@ -59,59 +127,7 @@ export const BrowserTestRunResult = ({ monitorId, isMonitorSaved, onDone }: Prop
); - - const isStepsLoading = - journeyStarted && stepEnds.length === 0 && (!summaryDoc || (summaryDoc && stepsLoading)); - const isStepsLoadingFailed = summaryDoc && stepEnds.length === 0 && !isStepsLoading; - - return ( - - {isStepsLoading && ( - - - {LOADING_STEPS} - - - - - - )} - {isStepsLoadingFailed && ( - {summaryDoc?.error?.message ?? FAILED_TO_RUN} - )} - - {isStepsLoadingFailed && - summaryDoc?.error?.message?.includes('journey did not finish executing') && ( - - )} - - {stepEnds.length > 0 && stepListData?.steps && ( - - )} - - ); -}; - -const AccordionWrapper = styled(EuiAccordion)` - .euiAccordion__buttonContent { - width: 100%; - } -`; +} const FAILED_TO_RUN = i18n.translate('xpack.uptime.monitorManagement.failedRun', { defaultMessage: 'Failed to run steps', diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.test.tsx b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.test.tsx index 285a4a4140c27..332af4403e180 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.test.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.test.tsx @@ -26,18 +26,34 @@ describe('useBrowserRunOnceMonitors', function () { }, }); - const { result } = renderHook(() => useBrowserRunOnceMonitors({ configId: 'test-id' }), { - wrapper: WrappedHelper, - }); + const { result } = renderHook( + () => + useBrowserRunOnceMonitors({ + configId: 'test-id', + testRunId: 'test-run-id', + expectSummaryDocs: 1, + }), + { + wrapper: WrappedHelper, + } + ); expect(result.current).toEqual({ data: undefined, - journeyStarted: false, - loading: true, - stepsLoading: true, - stepEnds: [], - stepListData: undefined, - summaryDoc: undefined, + expectedSummariesLoaded: false, + lastUpdated: expect.any(Number), + stepLoadingInProgress: true, + summariesLoading: true, + checkGroupResults: [ + { + checkGroupId: 'placeholder-check-group-0', + completedSteps: 0, + steps: [], + summaryDoc: undefined, + journeyStarted: false, + stepsLoading: true, + }, + ], }); }); }); diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.ts b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.ts index a54cead8378a1..68f96b5d7b487 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { useEffect, useState } from 'react'; +import { useEffect, useState, useRef } from 'react'; import { createEsParams, useEsSearch, useFetcher } from '@kbn/observability-plugin/public'; import { JourneyStep } from '../../../../../common/runtime_types'; import { useTickTick } from '../use_tick_tick'; @@ -12,6 +12,16 @@ import { fetchJourneySteps } from '../../../../state/api/journey'; import { isStepEnd } from '../../../synthetics/check_steps/steps_list'; import { SYNTHETICS_INDEX_PATTERN } from '../../../../../common/constants'; +export interface CheckGroupResult { + checkGroupId: string; + journeyStarted: boolean; + journeyDoc?: JourneyStep; + summaryDoc?: JourneyStep; + steps: JourneyStep[]; + stepsLoading: boolean; + completedSteps: number; +} + export const useBrowserEsResults = ({ configId, testRunId, @@ -68,59 +78,201 @@ export const useBrowserRunOnceMonitors = ({ testRunId, skipDetails = false, refresh = true, + expectSummaryDocs, }: { configId: string; testRunId?: string; refresh?: boolean; skipDetails?: boolean; + expectSummaryDocs: number; }) => { const { refreshTimer, lastRefresh } = useTickTick(3 * 1000, refresh); - const [checkGroupId, setCheckGroupId] = useState(''); - const [stepEnds, setStepEnds] = useState([]); - const [summary, setSummary] = useState(); + const [checkGroupResults, setCheckGroupResults] = useState(() => { + return new Array(expectSummaryDocs) + .fill({ + checkGroupId: '', + journeyStarted: false, + steps: [], + stepsLoading: false, + completedSteps: 0, + } as CheckGroupResult) + .map((emptyCheckGroup, index) => ({ + ...emptyCheckGroup, + checkGroupId: `placeholder-check-group-${index}`, + })); + }); - const { data, loading } = useBrowserEsResults({ configId, testRunId, lastRefresh }); + const lastUpdated = useRef<{ checksum: string; time: number }>({ + checksum: '', + time: Date.now(), + }); - const { data: stepListData, loading: stepsLoading } = useFetcher(() => { - if (checkGroupId && !skipDetails) { - return fetchJourneySteps({ - checkGroup: checkGroupId, - }); - } - return Promise.resolve(null); - }, [lastRefresh]); + const { data, loading: summariesLoading } = useBrowserEsResults({ + configId, + testRunId, + lastRefresh, + }); useEffect(() => { const hits = data?.hits.hits; if (hits && hits.length > 0) { - hits?.forEach((hit) => { - const doc = hit._source as JourneyStep; - if (doc.synthetics?.type === 'journey/start') { - setCheckGroupId(doc.monitor.check_group); - } - if (doc.synthetics?.type === 'heartbeat/summary') { - setSummary(doc); - clearInterval(refreshTimer); + const allDocs = (hits ?? []).map(({ _source }) => _source as JourneyStep); + const checkGroupsById = allDocs + .filter( + (doc) => + doc.synthetics?.type === 'journey/start' || doc.synthetics?.type === 'heartbeat/summary' + ) + .reduce( + (acc, cur) => ({ + ...acc, + [cur.monitor.check_group]: { + checkGroupId: cur.monitor.check_group, + journeyStarted: true, + journeyDoc: cur, + summaryDoc: null, + steps: [], + stepsLoading: false, + completedSteps: 0, + }, + }), + {} + ) as Record; + + allDocs.forEach((step) => { + if (step.synthetics?.type === 'heartbeat/summary') { + checkGroupsById[step.monitor.check_group].summaryDoc = step; } }); + + const checkGroups = Object.values(checkGroupsById); + const finishedCheckGroups = checkGroups.filter((group) => !!group.summaryDoc); + + if (finishedCheckGroups.length >= expectSummaryDocs) { + clearInterval(refreshTimer); + } + + replaceCheckGroupResults(checkGroups); } - }, [data, refreshTimer]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [expectSummaryDocs, data, refreshTimer]); + + // Loading steps for browser runs + const checkGroupIds = checkGroupResults.map(({ checkGroupId }) => checkGroupId); + const checkGroupCheckSum = checkGroupIds.reduce((acc, cur) => acc + cur, ''); + const { loading: stepLoadingInProgress } = useFetcher(() => { + if (checkGroupIds.length && !skipDetails) { + setCheckGroupResults((prevState) => { + return prevState.map((result) => ({ ...result, stepsLoading: true })); + }); + + return Promise.all( + checkGroupIds.map((id) => { + return fetchJourneySteps({ + checkGroup: id, + }) + .then((stepsData) => { + updateCheckGroupResult(stepsData.checkGroup, { + steps: stepsData.steps, + completedSteps: stepsData.steps.filter(isStepEnd).length, + }); + + return stepsData; + }) + .finally(() => { + updateCheckGroupResult(id, { + stepsLoading: false, + }); + }); + }) + ); + } + + return Promise.resolve(null); + }, [checkGroupCheckSum, setCheckGroupResults, lastRefresh]); + // Whenever a new found document is fetched, update lastUpdated useEffect(() => { - if (stepListData?.steps && stepListData?.steps.length > 0) { - setStepEnds(stepListData.steps.filter(isStepEnd)); + const currentChecksum = getCheckGroupChecksum(checkGroupResults); + if (checkGroupCheckSum !== lastUpdated.current.checksum) { + // Mutating lastUpdated + lastUpdated.current.checksum = currentChecksum; + lastUpdated.current.time = Date.now(); } - }, [stepListData]); + }, [checkGroupResults, checkGroupCheckSum]); + + const updateCheckGroupResult = (id: string, result: Partial) => { + setCheckGroupResults((prevState) => { + return prevState.map((r) => { + if (id !== r.checkGroupId) { + return r; + } + + return mergeCheckGroups(r, result); + }) as CheckGroupResult[]; + }); + }; + + const replaceCheckGroupResults = (curCheckGroups: CheckGroupResult[]) => { + const emptyCheckGroups = checkGroupResults.filter((group) => + group.checkGroupId.startsWith('placeholder-check-group') + ); + + // Padding the collection with placeholders so that rows could be shown on UI with loading state + const paddedCheckGroups = + curCheckGroups.length < expectSummaryDocs + ? [ + ...curCheckGroups, + ...emptyCheckGroups.slice(-1 * (expectSummaryDocs - curCheckGroups.length)), + ] + : curCheckGroups; + + setCheckGroupResults((prevCheckGroups) => { + const newIds = paddedCheckGroups.map(({ checkGroupId }) => checkGroupId); + const newById: Record = paddedCheckGroups.reduce( + (acc, cur) => ({ ...acc, [cur.checkGroupId]: cur }), + {} + ); + const oldById: Record = prevCheckGroups.reduce( + (acc, cur) => ({ ...acc, [cur.checkGroupId]: cur }), + {} + ); + + return newIds.map((id) => mergeCheckGroups(oldById[id], newById[id])); + }); + }; return { data, - stepEnds, - loading, - stepsLoading, - stepListData, - summaryDoc: summary, - journeyStarted: Boolean(checkGroupId), + summariesLoading, + stepLoadingInProgress, + expectedSummariesLoaded: + checkGroupResults.filter(({ summaryDoc }) => !!summaryDoc).length >= expectSummaryDocs, + checkGroupResults, + lastUpdated: lastUpdated.current.time, }; }; + +function mergeCheckGroups(prev: CheckGroupResult, curr: Partial) { + // Once completed steps has been determined and shown, don't lower the number on UI due to re-fetch + const completedSteps = curr.completedSteps + ? Math.max(prev?.completedSteps ?? 0, curr.completedSteps ?? 0) + : prev?.completedSteps ?? 0; + + return { + ...(prev ?? {}), + ...curr, + completedSteps, + }; +} + +function getCheckGroupChecksum(checkGroupResults: CheckGroupResult[]) { + return checkGroupResults.reduce((acc, cur) => { + return ( + acc + cur?.journeyDoc?._id ?? + '' + cur?.summaryDoc?._id ?? + '' + (cur?.steps ?? []).reduce((stepAcc, { _id }) => stepAcc + _id, '') + ); + }, ''); +} diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.test.tsx b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.test.tsx index da27837a34e8c..6ef4daf9fbdf3 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.test.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.test.tsx @@ -23,7 +23,7 @@ describe('SimpleTestResults', function () { }); it('should render properly', async function () { - render(); + render(); expect(await screen.findByText('Test result')).toBeInTheDocument(); const dataApi = (kibanaService.core as any).data.search; @@ -51,15 +51,18 @@ describe('SimpleTestResults', function () { const doc = data.hits.hits[0]; jest.spyOn(runOnceHooks, 'useSimpleRunOnceMonitors').mockReturnValue({ data: data as any, - summaryDoc: { - ...(doc._source as unknown as Ping), - timestamp: (doc._source as unknown as Record)?.['@timestamp'], - docId: doc._id, - }, + summaryDocs: [ + { + ...(doc._source as unknown as Ping), + timestamp: (doc._source as unknown as Record)?.['@timestamp'], + docId: doc._id, + }, + ], loading: false, + lastUpdated: Date.now(), }); - render(); + render(); expect(await screen.findByText('Test result')).toBeInTheDocument(); diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.tsx b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.tsx index 4fb27fb83d560..b1ac899a8951e 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.tsx @@ -12,23 +12,42 @@ import { TestResultHeader } from '../test_result_header'; interface Props { monitorId: string; + expectPings: number; onDone: () => void; } -export function SimpleTestResults({ monitorId, onDone }: Props) { - const [summaryDocs, setSummaryDocs] = useState([]); - const { summaryDoc, loading } = useSimpleRunOnceMonitors({ configId: monitorId }); +export function SimpleTestResults({ monitorId, expectPings, onDone }: Props) { + const [summaryDocsCache, setSummaryDocsCache] = useState([]); + const { summaryDocs, loading } = useSimpleRunOnceMonitors({ + configId: monitorId, + expectSummaryDocs: expectPings, + }); useEffect(() => { - if (summaryDoc) { - setSummaryDocs((prevState) => [summaryDoc, ...prevState]); - onDone(); + if (summaryDocs) { + setSummaryDocsCache((prevState: Ping[]) => { + const prevById: Record = prevState.reduce( + (acc, cur) => ({ ...acc, [cur.docId]: cur }), + {} + ); + return summaryDocs.map((updatedDoc) => ({ + ...updatedDoc, + ...(prevById[updatedDoc.docId] ?? {}), + })); + }); + + if (summaryDocs.length >= expectPings) { + onDone(); + } } - }, [summaryDoc, onDone]); + }, [expectPings, summaryDocs, onDone]); return ( <> - - {summaryDoc && } + = expectPings)} + /> + {summaryDocs && } ); } diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/use_simple_run_once_monitors.ts b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/use_simple_run_once_monitors.ts index 5d12662d1e113..3ca3691aef22c 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/use_simple_run_once_monitors.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/use_simple_run_once_monitors.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { useMemo } from 'react'; +import { useMemo, useRef } from 'react'; import { createEsParams, useEsSearch } from '@kbn/observability-plugin/public'; import { Ping } from '../../../../../common/runtime_types'; import { useTickTick } from '../use_tick_tick'; @@ -13,9 +13,11 @@ import { SYNTHETICS_INDEX_PATTERN } from '../../../../../common/constants'; export const useSimpleRunOnceMonitors = ({ configId, + expectSummaryDocs, testRunId, }: { configId: string; + expectSummaryDocs: number; testRunId?: string; }) => { const { refreshTimer, lastRefresh } = useTickTick(2 * 1000, false); @@ -61,26 +63,46 @@ export const useSimpleRunOnceMonitors = ({ { name: 'TestRunData' } ); + const lastUpdated = useRef<{ checksum: string; time: number }>({ + checksum: '', + time: Date.now(), + }); + return useMemo(() => { - const doc = data?.hits.hits?.[0]; + const docs = data?.hits.hits ?? []; + + // Whenever a new found document is fetched, update lastUpdated + const docsChecksum = docs + .map(({ _id }: { _id: string }) => _id) + .reduce((acc, cur) => acc + cur, ''); + if (docsChecksum !== lastUpdated.current.checksum) { + // Mutating lastUpdated + lastUpdated.current.checksum = docsChecksum; + lastUpdated.current.time = Date.now(); + } + + if (docs.length > 0) { + if (docs.length >= expectSummaryDocs) { + clearInterval(refreshTimer); + } - if (doc) { - clearInterval(refreshTimer); return { data, loading, - summaryDoc: { + summaryDocs: docs.map((doc) => ({ ...(doc._source as Ping), timestamp: (doc._source as Record)?.['@timestamp'], docId: doc._id, - }, + })), + lastUpdated: lastUpdated.current.time, }; } return { data, loading, - summaryDoc: null, + summaryDocs: null, + lastUpdated: lastUpdated.current.time, }; - }, [data, loading, refreshTimer]); + }, [expectSummaryDocs, data, loading, refreshTimer]); }; diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.test.tsx b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.test.tsx index 4a3f155a18813..da06b41d16530 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.test.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.test.tsx @@ -10,24 +10,42 @@ import { screen } from '@testing-library/react'; import { render } from '../../../lib/helper/rtl_helpers'; import { TestNowMode } from './test_now_mode'; import { kibanaService } from '../../../state/kibana_service'; -import { MonitorFields } from '../../../../common/runtime_types'; +import { Locations, MonitorFields } from '../../../../common/runtime_types'; +import * as runOnceErrorHooks from '../hooks/use_run_once_errors'; describe('TestNowMode', function () { + const locations: Locations = [ + { + id: 'test-location-id', + label: 'Test Location', + geo: { lat: 33.333, lon: 73.333 }, + url: 'test-url', + isServiceManaged: true, + }, + ]; + const testMonitor = { + id: 'test-monitor-id', + type: 'browser', + locations, + } as unknown as MonitorFields; + const testRun = { id: 'test-run-id', monitor: testMonitor }; const onDone = jest.fn(); + beforeEach(() => { + jest.spyOn(runOnceErrorHooks, 'useRunOnceErrors').mockReturnValue({ + expectPings: 1, + hasBlockingError: false, + blockingErrorMessage: '', + errorMessages: [], + }); + }); + afterEach(() => { jest.resetAllMocks(); }); it('should render properly', async function () { - render( - - ); - expect(await screen.findByText('Test result')).toBeInTheDocument(); + render(); expect(await screen.findByText('PENDING')).toBeInTheDocument(); expect(await screen.findByText('0 steps completed')).toBeInTheDocument(); @@ -36,7 +54,7 @@ describe('TestNowMode', function () { expect(kibanaService.core.http.post).toHaveBeenLastCalledWith( expect.stringContaining('/internal/uptime/service/monitors/run_once/'), - { body: '{"type":"browser"}', method: 'POST' } + { body: JSON.stringify(testMonitor), method: 'POST' } ); }); }); diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.tsx b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.tsx index fc5ab8aef94e4..0cc5f0658ff44 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.tsx @@ -16,8 +16,9 @@ import { EuiSpacer, } from '@elastic/eui'; import { useFetcher } from '@kbn/observability-plugin/public'; +import { useRunOnceErrors } from '../hooks/use_run_once_errors'; import { TestRunResult } from './test_run_results'; -import { MonitorFields } from '../../../../common/runtime_types'; +import { Locations, MonitorFields, ServiceLocationErrors } from '../../../../common/runtime_types'; import { runOnceMonitor } from '../../../state/api'; import { kibanaService } from '../../../state/kibana_service'; @@ -43,31 +44,37 @@ export function TestNowMode({ monitor: testRun.monitor, id: testRun.id, }) - .then(() => setServiceError(null)) + .then((d) => { + setServiceError(null); + return d; + }) .catch((error) => setServiceError(error)); } return new Promise((resolve) => resolve(null)); }, [testRun]); - useEffect(() => { - const errors = (data as { errors: Array<{ error: Error }> })?.errors; - - if (errors?.length > 0) { - errors.forEach(({ error }) => { - kibanaService.toasts.addError(error, { title: PushErrorLabel }); - }); - } - }, [data]); + const errors = (data as { errors?: ServiceLocationErrors })?.errors; - const errors = (data as { errors?: Array<{ error: Error }> })?.errors; + const { hasBlockingError, blockingErrorMessage, expectPings, errorMessages } = useRunOnceErrors({ + testRunId: testRun?.id ?? '', + serviceError, + errors: errors ?? [], + locations: (testRun?.monitor.locations ?? []) as Locations, + }); - const hasErrors = serviceError || (errors && errors?.length > 0); + useEffect(() => { + errorMessages.forEach( + ({ name, message, title }: { name: string; message: string; title: string }) => { + kibanaService.toasts.addError({ name, message }, { title }); + } + ); + }, [errorMessages]); useEffect(() => { - if (!isPushing && (!testRun || hasErrors)) { + if (!isPushing && (!testRun || hasBlockingError)) { onDone(); } - }, [testRun, hasErrors, isPushing, onDone]); + }, [testRun, hasBlockingError, isPushing, onDone]); if (!testRun) { return null; @@ -81,15 +88,19 @@ export function TestNowMode({ )} - {hasErrors && !isPushing && } + {(hasBlockingError && !isPushing && ( + + )) || + null} - {testRun && !hasErrors && !isPushing && ( + {testRun && !hasBlockingError && !isPushing && ( @@ -103,11 +114,3 @@ export function TestNowMode({ const PushingLabel = i18n.translate('xpack.uptime.testRun.pushing.description', { defaultMessage: 'Pushing the monitor to service...', }); - -const PushError = i18n.translate('xpack.uptime.testRun.pushError', { - defaultMessage: 'Failed to push the monitor to service.', -}); - -const PushErrorLabel = i18n.translate('xpack.uptime.testRun.pushErrorLabel', { - defaultMessage: 'Push error', -}); diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_result_header.tsx b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_result_header.tsx index 38679ebff3b60..7c53e99a6e9af 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_result_header.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_result_header.tsx @@ -21,14 +21,20 @@ import { JourneyStep, Ping } from '../../../../common/runtime_types'; import { useUptimeSettingsContext } from '../../../contexts/uptime_settings_context'; interface Props { - doc?: JourneyStep; + checkGroupId?: string; summaryDocs?: Ping[] | JourneyStep[] | null; journeyStarted?: boolean; title?: string; isCompleted: boolean; } -export function TestResultHeader({ doc, title, summaryDocs, journeyStarted, isCompleted }: Props) { +export function TestResultHeader({ + checkGroupId, + title, + summaryDocs, + journeyStarted, + isCompleted, +}: Props) { const { basePath } = useUptimeSettingsContext(); let duration = 0; if (summaryDocs && summaryDocs.length > 0) { @@ -76,12 +82,9 @@ export function TestResultHeader({ doc, title, summaryDocs, journeyStarted, isCo )} - {doc && ( + {checkGroupId && ( - + {VIEW_DETAILS} diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_run_results.tsx b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_run_results.tsx index 27c9eb8426a31..b1a6d0aba8cfc 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_run_results.tsx +++ b/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_run_results.tsx @@ -14,12 +14,24 @@ interface Props { monitorId: string; monitor: SyntheticsMonitor; isMonitorSaved: boolean; + expectPings: number; onDone: () => void; } -export const TestRunResult = ({ monitorId, monitor, isMonitorSaved, onDone }: Props) => { +export const TestRunResult = ({ + monitorId, + monitor, + isMonitorSaved, + expectPings, + onDone, +}: Props) => { return monitor.type === 'browser' ? ( - + ) : ( - + ); }; diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_status_column.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_status_column.tsx index 8d8ed5dc684f4..92d7620b55938 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_status_column.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_status_column.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useEffect } from 'react'; import moment, { Moment } from 'moment'; import { i18n } from '@kbn/i18n'; import styled from 'styled-components'; @@ -20,6 +20,8 @@ import { } from '@elastic/eui'; import { useDispatch, useSelector } from 'react-redux'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; +import { kibanaService } from '../../../../state/kibana_service'; +import { useRunOnceErrors } from '../../../monitor_management/hooks/use_run_once_errors'; import { parseTimestamp } from '../parse_timestamp'; import { DataStream, Ping, PingError } from '../../../../../common/runtime_types'; import { @@ -189,6 +191,25 @@ export const MonitorListStatusColumn = ({ const testNowRun = useSelector(testNowRunSelector(configId)); + const { expectPings, errorMessages, hasBlockingError } = useRunOnceErrors({ + testRunId: testNowRun?.monitorId ?? '', + serviceError: (testNowRun?.fetchError as Error) ?? null, + locations: testNowRun?.locations ?? [], + errors: testNowRun?.errors ?? [], + }); + + useEffect(() => { + errorMessages.forEach( + ({ name, message, title }: { name: string; message: string; title: string }) => { + kibanaService.toasts.addError({ name, message }, { title }); + } + ); + + if (hasBlockingError) { + stopProgressTrack(); + } + }, [errorMessages, hasBlockingError, stopProgressTrack]); + return (
@@ -200,6 +221,8 @@ export const MonitorListStatusColumn = ({ testRunId={testNowRun?.testRunId} monitorType={monitorType as DataStream} duration={duration ?? 0} + schedule={testNowRun.schedule} + expectPings={expectPings} stopProgressTrack={stopProgressTrack} /> ) : ( diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/browser_monitor_progress.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/browser_monitor_progress.tsx index c0453573693c4..b92916bd7b72b 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/browser_monitor_progress.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/browser_monitor_progress.tsx @@ -6,7 +6,9 @@ */ import { EuiBadge, EuiProgress } from '@elastic/eui'; -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; +import { scheduleToMilli } from '../../../../../../common/lib/schedule_to_time'; +import { SyntheticsMonitorSchedule } from '../../../../../../common/runtime_types'; import { useBrowserRunOnceMonitors } from '../../../../monitor_management/test_now_mode/browser/use_browser_run_once_monitors'; import { IN_PROGRESS_LABEL, @@ -17,52 +19,54 @@ export const BrowserMonitorProgress = ({ configId, testRunId, duration, + schedule, isUpdating, + expectPings, updateMonitorStatus, + stopProgressTrack, }: { configId: string; testRunId: string; duration: number; + schedule: SyntheticsMonitorSchedule; isUpdating: boolean; + expectPings: number; updateMonitorStatus: () => void; + stopProgressTrack: () => void; }) => { - const { journeyStarted, summaryDoc, data } = useBrowserRunOnceMonitors({ - configId, - testRunId, - refresh: false, - skipDetails: true, - }); + const { data, checkGroupResults, lastUpdated, expectedSummariesLoaded } = + useBrowserRunOnceMonitors({ + configId, + testRunId, + refresh: false, + skipDetails: true, + expectSummaryDocs: expectPings, + }); - const [startTime, setStartTime] = useState(Date.now()); + const journeyStarted = checkGroupResults.some((result) => result.journeyStarted); const [passedTime, setPassedTime] = useState(0); + const startTime = useRef(Date.now()); + useEffect(() => { - if (summaryDoc) { + if (expectedSummariesLoaded) { updateMonitorStatus(); } - }, [updateMonitorStatus, summaryDoc]); + }, [updateMonitorStatus, expectedSummariesLoaded]); useEffect(() => { - const interVal = setInterval(() => { - if (journeyStarted) { - setPassedTime((Date.now() - startTime) * 1000); - } - }, 500); - const startTimeValue = startTime; - return () => { - if ((Date.now() - startTimeValue) * 1000 > duration) { - clearInterval(interVal); - } - }; - }, [data, duration, journeyStarted, startTime]); + setPassedTime((Date.now() - startTime.current) * 1000); - useEffect(() => { - if (journeyStarted) { - setStartTime(Date.now()); + // Stop waiting for docs if time elapsed is more than monitor frequency + const timeSinceLastDoc = Date.now() - lastUpdated; + const usualDurationMilli = duration / 1000; + const maxTimeout = scheduleToMilli(schedule) - usualDurationMilli; + if (timeSinceLastDoc >= maxTimeout) { + stopProgressTrack(); } - }, [journeyStarted]); + }, [data, checkGroupResults, lastUpdated, duration, schedule, stopProgressTrack]); - if (isUpdating || passedTime > duration) { + if (journeyStarted && (isUpdating || passedTime > duration)) { return ( <> {IN_PROGRESS_LABEL} @@ -72,7 +76,7 @@ export const BrowserMonitorProgress = ({ } return ( - + <> {journeyStarted ? ( <> {IN_PROGRESS_LABEL} @@ -84,6 +88,6 @@ export const BrowserMonitorProgress = ({ )} - + ); }; diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/monitor_progress.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/monitor_progress.tsx index e4fc0cf90e87b..b03d278f09d45 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/monitor_progress.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/monitor_progress.tsx @@ -9,7 +9,7 @@ import React, { useEffect } from 'react'; import { useSelector } from 'react-redux'; import { SimpleMonitorProgress } from './simple_monitor_progress'; import { BrowserMonitorProgress } from './browser_monitor_progress'; -import { DataStream } from '../../../../../../common/runtime_types'; +import { DataStream, SyntheticsMonitorSchedule } from '../../../../../../common/runtime_types'; import { useUpdatedMonitor } from './use_updated_monitor'; import { refreshedMonitorSelector } from '../../../../../state/reducers/monitor_list'; @@ -19,6 +19,8 @@ export const MonitorProgress = ({ testRunId, duration, monitorType, + schedule, + expectPings, stopProgressTrack, }: { monitorId: string; @@ -26,6 +28,8 @@ export const MonitorProgress = ({ testRunId: string; duration: number; monitorType: DataStream; + schedule: SyntheticsMonitorSchedule; + expectPings: number; stopProgressTrack: () => void; }) => { const { updateMonitorStatus, isUpdating } = useUpdatedMonitor({ @@ -46,16 +50,22 @@ export const MonitorProgress = ({ configId={configId} testRunId={testRunId} duration={duration} + schedule={schedule} + expectPings={expectPings} isUpdating={isUpdating} updateMonitorStatus={updateMonitorStatus} + stopProgressTrack={stopProgressTrack} /> ) : ( ); }; diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/simple_monitor_progress.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/simple_monitor_progress.tsx index d51ae3f4e9dff..f93bcadd58519 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/simple_monitor_progress.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/simple_monitor_progress.tsx @@ -7,6 +7,8 @@ import { EuiBadge, EuiProgress } from '@elastic/eui'; import React, { useEffect, useRef, useState } from 'react'; +import { scheduleToMilli } from '../../../../../../common/lib/schedule_to_time'; +import { SyntheticsMonitorSchedule } from '../../../../../../common/runtime_types'; import { useSimpleRunOnceMonitors } from '../../../../monitor_management/test_now_mode/simple/use_simple_run_once_monitors'; import { IN_PROGRESS_LABEL } from '../../../../monitor_management/test_now_mode/test_result_header'; @@ -14,18 +16,25 @@ export const SimpleMonitorProgress = ({ monitorId, testRunId, duration, + schedule, + expectPings, isUpdating, updateMonitorStatus, + stopProgressTrack, }: { monitorId: string; testRunId: string; duration: number; + schedule: SyntheticsMonitorSchedule; + expectPings: number; isUpdating: boolean; updateMonitorStatus: () => void; + stopProgressTrack: () => void; }) => { - const { summaryDoc, data } = useSimpleRunOnceMonitors({ + const { summaryDocs, data, lastUpdated } = useSimpleRunOnceMonitors({ configId: monitorId, testRunId, + expectSummaryDocs: expectPings, }); const startTime = useRef(Date.now()); @@ -33,14 +42,22 @@ export const SimpleMonitorProgress = ({ const [passedTime, setPassedTime] = useState(Date.now()); useEffect(() => { - if (summaryDoc) { + if (summaryDocs?.length) { updateMonitorStatus(); } - }, [updateMonitorStatus, summaryDoc]); + }, [updateMonitorStatus, summaryDocs]); useEffect(() => { setPassedTime(Date.now() - startTime.current); - }, [data]); + + // Stop waiting for docs if time elapsed is more than monitor frequency + const timeSinceLastDoc = Date.now() - lastUpdated; + const usualDurationMilli = duration / 1000; + const maxTimeout = scheduleToMilli(schedule) - usualDurationMilli; + if (timeSinceLastDoc >= maxTimeout) { + stopProgressTrack(); + } + }, [data, lastUpdated, duration, schedule, stopProgressTrack]); const passedTimeMicro = passedTime * 1000; @@ -54,9 +71,9 @@ export const SimpleMonitorProgress = ({ } return ( - + <> {IN_PROGRESS_LABEL} - + ); }; diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/test_now_col.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/test_now_col.tsx index 3248f65963d77..b877da1824370 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/test_now_col.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/test_now_col.tsx @@ -5,12 +5,12 @@ * 2.0. */ -import React from 'react'; +import { EuiButtonIcon, EuiLoadingSpinner, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import React from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { EuiButtonIcon, EuiLoadingSpinner, EuiToolTip } from '@elastic/eui'; import { testNowMonitorAction } from '../../../../state/actions'; -import { testNowRunSelector } from '../../../../state/reducers/test_now_runs'; +import { testNowRunSelector, TestRunStats } from '../../../../state/reducers/test_now_runs'; export const TestNowColumn = ({ monitorId, @@ -35,7 +35,10 @@ export const TestNowColumn = ({ dispatch(testNowMonitorAction.get(configId)); }; - if (testNowRun && testNowRun.status === 'loading') { + const isTestNowLoading = testNowRun && testNowRun.status === TestRunStats.LOADING; + const isTestNowCompleted = !testNowRun || testNowRun.status === TestRunStats.COMPLETED; + + if (isTestNowLoading) { return ; } @@ -44,7 +47,7 @@ export const TestNowColumn = ({ testNowClick()} - isDisabled={Boolean(testNowRun)} + isDisabled={!isTestNowCompleted} aria-label={TEST_NOW_ARIA_LABEL} /> diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/uptime_store.mock.ts b/x-pack/plugins/uptime/public/lib/__mocks__/uptime_store.mock.ts index 0286e884a68d7..01a11fd809fe8 100644 --- a/x-pack/plugins/uptime/public/lib/__mocks__/uptime_store.mock.ts +++ b/x-pack/plugins/uptime/public/lib/__mocks__/uptime_store.mock.ts @@ -126,7 +126,5 @@ export const mockState: AppState = { cacheSize: 0, hitCount: [], }, - testNowRuns: { - testNowRuns: [], - }, + testNowRuns: {}, }; diff --git a/x-pack/plugins/uptime/public/state/actions/types.ts b/x-pack/plugins/uptime/public/state/actions/types.ts index 953227adfae93..62f0051f411f7 100644 --- a/x-pack/plugins/uptime/public/state/actions/types.ts +++ b/x-pack/plugins/uptime/public/state/actions/types.ts @@ -15,10 +15,9 @@ export interface AsyncAction { success: (payload: SuccessPayload) => Action; fail: (payload: IHttpFetchError) => Action; } -export interface AsyncAction1 { +export interface AsyncActionOptionalPayload + extends AsyncAction { get: (payload?: Payload) => Action; - success: (payload: SuccessPayload) => Action; - fail: (payload: IHttpFetchError) => Action; } export interface MonitorIdParam { diff --git a/x-pack/plugins/uptime/public/state/actions/utils.ts b/x-pack/plugins/uptime/public/state/actions/utils.ts index 15b03d6b18680..6bac4be8b8173 100644 --- a/x-pack/plugins/uptime/public/state/actions/utils.ts +++ b/x-pack/plugins/uptime/public/state/actions/utils.ts @@ -7,11 +7,11 @@ import { createAction } from 'redux-actions'; import { IHttpFetchError } from '@kbn/core/public'; -import { AsyncAction, AsyncAction1 } from './types'; +import { AsyncAction, AsyncActionOptionalPayload } from './types'; export function createAsyncAction( actionStr: string -): AsyncAction1; +): AsyncActionOptionalPayload; export function createAsyncAction( actionStr: string ): AsyncAction { diff --git a/x-pack/plugins/uptime/public/state/api/monitor_management.ts b/x-pack/plugins/uptime/public/state/api/monitor_management.ts index 58cc0217c298c..a776d33b8147b 100644 --- a/x-pack/plugins/uptime/public/state/api/monitor_management.ts +++ b/x-pack/plugins/uptime/public/state/api/monitor_management.ts @@ -18,6 +18,8 @@ import { ServiceLocationsApiResponseCodec, ServiceLocationErrors, ThrottlingOptions, + Locations, + SyntheticsMonitorSchedule, } from '../../../common/runtime_types'; import { DecryptedSyntheticsMonitorSavedObject, @@ -84,12 +86,16 @@ export const runOnceMonitor = async ({ }; export interface TestNowResponse { - errors?: Array<{ error: Error }>; + schedule: SyntheticsMonitorSchedule; + locations: Locations; + errors?: ServiceLocationErrors; testRunId: string; monitorId: string; } -export const testNowMonitor = async (configId: string): Promise => { +export const triggerTestNowMonitor = async ( + configId: string +): Promise => { return await apiService.get(API_URLS.TRIGGER_MONITOR + `/${configId}`); }; diff --git a/x-pack/plugins/uptime/public/state/effects/index.ts b/x-pack/plugins/uptime/public/state/effects/index.ts index 5c61c2ff26d1f..82d9209e47995 100644 --- a/x-pack/plugins/uptime/public/state/effects/index.ts +++ b/x-pack/plugins/uptime/public/state/effects/index.ts @@ -7,16 +7,13 @@ import { fork } from 'redux-saga/effects'; import { fetchMonitorDetailsEffect } from './monitor'; -import { - fetchMonitorListEffect, - fetchRunNowMonitorEffect, - fetchUpdatedMonitorEffect, -} from './monitor_list'; +import { fetchMonitorListEffect, fetchUpdatedMonitorEffect } from './monitor_list'; import { fetchMonitorManagementEffect, fetchSyntheticsServiceAllowedEffect, } from './monitor_management'; import { fetchMonitorStatusEffect } from './monitor_status'; +import { fetchTestNowMonitorEffect } from './test_now_runs'; import { fetchDynamicSettingsEffect, setDynamicSettingsEffect } from './dynamic_settings'; import { fetchPingsEffect, fetchPingHistogramEffect } from './ping'; import { fetchMonitorDurationEffect } from './monitor_duration'; @@ -37,6 +34,7 @@ export function* rootEffect() { yield fork(fetchUpdatedMonitorEffect); yield fork(fetchMonitorManagementEffect); yield fork(fetchMonitorStatusEffect); + yield fork(fetchTestNowMonitorEffect); yield fork(fetchDynamicSettingsEffect); yield fork(setDynamicSettingsEffect); yield fork(fetchPingsEffect); @@ -50,6 +48,5 @@ export function* rootEffect() { yield fork(fetchScreenshotBlocks); yield fork(generateBlockStatsOnPut); yield fork(pruneBlockCache); - yield fork(fetchRunNowMonitorEffect); yield fork(fetchSyntheticsServiceAllowedEffect); } diff --git a/x-pack/plugins/uptime/public/state/effects/monitor_list.ts b/x-pack/plugins/uptime/public/state/effects/monitor_list.ts index 35322c3768190..3e4d0f67ffa18 100644 --- a/x-pack/plugins/uptime/public/state/effects/monitor_list.ts +++ b/x-pack/plugins/uptime/public/state/effects/monitor_list.ts @@ -5,15 +5,14 @@ * 2.0. */ -import { takeEvery, takeLatest } from 'redux-saga/effects'; +import { takeLatest } from 'redux-saga/effects'; import { getMonitorList, getMonitorListSuccess, getMonitorListFailure, getUpdatedMonitor, - testNowMonitorAction, } from '../actions'; -import { fetchMonitorList, testNowMonitor } from '../api'; +import { fetchMonitorList } from '../api'; import { fetchEffectFactory } from './fetch_effect'; export function* fetchMonitorListEffect() { @@ -29,10 +28,3 @@ export function* fetchUpdatedMonitorEffect() { fetchEffectFactory(fetchMonitorList, getUpdatedMonitor.success, getUpdatedMonitor.fail) ); } - -export function* fetchRunNowMonitorEffect() { - yield takeEvery( - testNowMonitorAction.get, - fetchEffectFactory(testNowMonitor, testNowMonitorAction.success, testNowMonitorAction.fail) - ); -} diff --git a/x-pack/plugins/uptime/public/state/effects/test_now_runs.ts b/x-pack/plugins/uptime/public/state/effects/test_now_runs.ts new file mode 100644 index 0000000000000..9272886ec7376 --- /dev/null +++ b/x-pack/plugins/uptime/public/state/effects/test_now_runs.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 { IHttpFetchError } from '@kbn/core/public'; +import { takeEvery } from 'redux-saga/effects'; +import { testNowMonitorAction } from '../actions'; +import { TestNowResponse, triggerTestNowMonitor } from '../api'; +import { fetchEffectFactory } from './fetch_effect'; + +export function* fetchTestNowMonitorEffect() { + yield takeEvery( + testNowMonitorAction.get, + fetchEffectFactory(triggerTestNowMonitor, testNowMonitorSuccessAction, testNowMonitorFailAction) + ); +} + +function testNowMonitorSuccessAction(payload: TestNowResponse | undefined) { + return testNowMonitorAction.success(payload); +} + +function testNowMonitorFailAction(payload: IHttpFetchError) { + return testNowMonitorAction.fail(payload); +} diff --git a/x-pack/plugins/uptime/public/state/index.ts b/x-pack/plugins/uptime/public/state/index.ts index 506051b95fd5a..9d4fa202b3d1a 100644 --- a/x-pack/plugins/uptime/public/state/index.ts +++ b/x-pack/plugins/uptime/public/state/index.ts @@ -9,6 +9,7 @@ import { createStore, applyMiddleware } from 'redux'; import type { Store } from 'redux'; import { composeWithDevTools } from 'redux-devtools-extension'; import createSagaMiddleware from 'redux-saga'; +import { Storage } from '@kbn/kibana-utils-plugin/public'; import { rootEffect } from './effects'; import { rootReducer } from './reducers'; @@ -19,3 +20,5 @@ const sagaMW = createSagaMiddleware(); export const store: Store = createStore(rootReducer, composeWithDevTools(applyMiddleware(sagaMW))); sagaMW.run(rootEffect); + +export const storage = new Storage(window.localStorage); diff --git a/x-pack/plugins/uptime/public/state/reducers/test_now_runs.ts b/x-pack/plugins/uptime/public/state/reducers/test_now_runs.ts index 83833e531bb9f..d081039e4d901 100644 --- a/x-pack/plugins/uptime/public/state/reducers/test_now_runs.ts +++ b/x-pack/plugins/uptime/public/state/reducers/test_now_runs.ts @@ -7,6 +7,13 @@ import { createReducer, PayloadAction } from '@reduxjs/toolkit'; import { WritableDraft } from 'immer/dist/types/types-external'; +import { IHttpFetchError } from '@kbn/core/public'; +import { + Locations, + ScheduleUnit, + ServiceLocationErrors, + SyntheticsMonitorSchedule, +} from '../../../common/runtime_types'; import { clearTestNowMonitorAction, testNowMonitorAction } from '../actions'; import { TestNowResponse } from '../api'; import { AppState } from '..'; @@ -21,15 +28,17 @@ interface TestNowRun { monitorId: string; testRunId?: string; status: TestRunStats; + schedule: SyntheticsMonitorSchedule; + locations: Locations; + errors?: ServiceLocationErrors; + fetchError?: { name: string; message: string }; } export interface TestNowRunsState { - testNowRuns: TestNowRun[]; + [monitorId: string]: TestNowRun; } -export const initialState: TestNowRunsState = { - testNowRuns: [], -}; +export const initialState: TestNowRunsState = {}; export const testNowRunsReducer = createReducer(initialState, (builder) => { builder @@ -37,40 +46,75 @@ export const testNowRunsReducer = createReducer(initialState, (builder) => { String(testNowMonitorAction.get), (state: WritableDraft, action: PayloadAction) => ({ ...state, - testNowRuns: [ - ...state.testNowRuns, - { monitorId: action.payload, status: TestRunStats.LOADING }, - ], + [action.payload]: { + monitorId: action.payload, + status: TestRunStats.LOADING, + schedule: { unit: ScheduleUnit.MINUTES, number: '3' }, + locations: [], + }, }) ) .addCase( String(testNowMonitorAction.success), (state: WritableDraft, { payload }: PayloadAction) => ({ ...state, - testNowRuns: state.testNowRuns.map((tRun) => - tRun.monitorId === payload.monitorId - ? { - monitorId: payload.monitorId, - testRunId: payload.testRunId, - status: TestRunStats.IN_PROGRESS, - } - : tRun - ), + [payload.monitorId]: { + monitorId: payload.monitorId, + testRunId: payload.testRunId, + status: TestRunStats.IN_PROGRESS, + errors: payload.errors, + schedule: payload.schedule, + locations: payload.locations, + }, }) ) .addCase( String(testNowMonitorAction.fail), - (state: WritableDraft, action: PayloadAction) => ({ - ...state, - testNowRuns: [...(state.testNowRuns ?? [])], - }) + (state: WritableDraft, action: PayloadAction) => { + const fetchError = action.payload as unknown as IHttpFetchError; + if (fetchError?.request.url) { + const { name, message } = fetchError; + + const [, errorMonitor] = + Object.entries(state).find( + ([key]) => fetchError.request.url.indexOf(key) > -1 ?? false + ) ?? []; + + if (errorMonitor) { + return { + ...state, + [errorMonitor.monitorId]: { + ...state[errorMonitor.monitorId], + status: TestRunStats.COMPLETED, + errors: undefined, + fetchError: { name, message }, + }, + }; + } + } + + if (action.payload.monitorId) { + return { + ...state, + [action.payload.monitorId]: { + ...state[action.payload.monitorId], + status: TestRunStats.COMPLETED, + errors: action.payload.errors, + fetchError: undefined, + }, + }; + } + + return state; + } ) .addCase( String(clearTestNowMonitorAction), - (state: WritableDraft, action: PayloadAction) => ({ - ...state, - testNowRuns: state.testNowRuns.filter((tRun) => tRun.monitorId !== action.payload), - }) + (state: WritableDraft, action: PayloadAction) => { + const { [action.payload]: payloadTestRun, ...rest } = state; + + return rest; + } ); }); @@ -79,4 +123,4 @@ export const testNowRunsSelector = ({ testNowRuns }: AppState) => testNowRuns.te export const testNowRunSelector = (monitorId?: string) => ({ testNowRuns }: AppState) => - testNowRuns.testNowRuns.find((tRun) => monitorId && monitorId === tRun.monitorId); + monitorId ? testNowRuns[monitorId] : undefined; diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts b/x-pack/plugins/uptime/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts index 295f6cfc2e6e9..526e40ef2f230 100644 --- a/x-pack/plugins/uptime/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts +++ b/x-pack/plugins/uptime/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts @@ -7,6 +7,7 @@ import { sha256 } from 'js-sha256'; import type { Logger } from '@kbn/core/server'; import { SavedObjectsUpdateResponse, SavedObject } from '@kbn/core/server'; +import { scheduleToMilli } from '../../../../common/lib/schedule_to_time'; import { MonitorFields, EncryptedSyntheticsMonitor, @@ -68,7 +69,7 @@ export function formatTelemetryEvent({ ), // mark self-managed locations as other locationsCount: attributes[ConfigKey.LOCATIONS].length, monitorNameLength: attributes[ConfigKey.NAME].length, - monitorInterval: parseInt(attributes[ConfigKey.SCHEDULE].number, 10) * 60 * 1000, + monitorInterval: scheduleToMilli(attributes[ConfigKey.SCHEDULE]), stackVersion: kibanaVersion, scriptType: getScriptType(attributes as Partial), errors: diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/test_now_monitor.ts b/x-pack/plugins/uptime/server/rest_api/synthetics_service/test_now_monitor.ts index 57a1385e0f1d4..fa06bda0cf66d 100644 --- a/x-pack/plugins/uptime/server/rest_api/synthetics_service/test_now_monitor.ts +++ b/x-pack/plugins/uptime/server/rest_api/synthetics_service/test_now_monitor.ts @@ -6,7 +6,11 @@ */ import { schema } from '@kbn/config-schema'; import { v4 as uuidv4 } from 'uuid'; -import { SyntheticsMonitor, SyntheticsMonitorWithSecrets } from '../../../common/runtime_types'; +import { + ConfigKey, + SyntheticsMonitor, + SyntheticsMonitorWithSecrets, +} from '../../../common/runtime_types'; import { UMRestApiRouteFactory } from '../types'; import { API_URLS } from '../../../common/constants'; import { @@ -23,7 +27,7 @@ export const testNowMonitorRoute: UMRestApiRouteFactory = () => ({ monitorId: schema.string({ minLength: 1, maxLength: 1024 }), }), }, - handler: async ({ request, savedObjectsClient, response, server }): Promise => { + handler: async ({ request, savedObjectsClient, server }): Promise => { const { monitorId } = request.params; const monitor = await savedObjectsClient.get( syntheticsMonitorType, @@ -38,6 +42,8 @@ export const testNowMonitorRoute: UMRestApiRouteFactory = () => ({ monitorId ); + const { [ConfigKey.SCHEDULE]: schedule, [ConfigKey.LOCATIONS]: locations } = monitor.attributes; + const { syntheticsService } = server; const testRunId = uuidv4(); @@ -45,7 +51,6 @@ export const testNowMonitorRoute: UMRestApiRouteFactory = () => ({ const errors = await syntheticsService.triggerConfigs(request, [ { ...normalizeSecrets(monitorWithSecrets).attributes, - ...monitor.attributes, id: monitorId, fields_under_root: true, fields: { config_id: monitorId, test_run_id: testRunId }, @@ -53,9 +58,9 @@ export const testNowMonitorRoute: UMRestApiRouteFactory = () => ({ ]); if (errors && errors?.length > 0) { - return { errors, testRunId, monitorId }; + return { errors, testRunId, monitorId, schedule, locations }; } - return { testRunId, monitorId }; + return { testRunId, monitorId, schedule, locations }; }, }); From a4a082271e1f5f15a8a49206dd4ce72e950de413 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 20 Apr 2022 20:53:28 +0200 Subject: [PATCH 16/22] [Synthetics] Rename uptime plugin to synthetics (#130037) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .buildkite/scripts/steps/functional/uptime.sh | 4 ++-- docs/developer/plugin-list.asciidoc | 10 +++++----- .../kbn-babel-preset/styled_components_files.js | 2 +- packages/kbn-optimizer/limits.yml | 2 +- src/dev/typescript/projects.ts | 2 +- tsconfig.base.json | 4 ++-- x-pack/.i18nrc.json | 2 +- .../.buildkite/pipelines/flaky.js | 0 .../.buildkite/pipelines/flaky.sh | 0 x-pack/plugins/{uptime => synthetics}/README.md | 0 .../plugins/{uptime => synthetics}/common/config.ts | 0 .../common/constants/alerts.ts | 0 .../common/constants/capabilities.ts | 0 .../common/constants/chart_format_limits.ts | 0 .../common/constants/client_defaults.ts | 0 .../common/constants/context_defaults.ts | 0 .../common/constants/index.ts | 0 .../common/constants/monitor_management.ts | 0 .../common/constants/plugin.ts | 6 +++--- .../common/constants/query.ts | 0 .../common/constants/rest_api.ts | 0 .../common/constants/settings_defaults.ts | 0 .../{uptime => synthetics}/common/constants/ui.ts | 0 .../lib/__snapshots__/assert_close_to.test.ts.snap | 0 .../__snapshots__/stringify_kueries.test.ts.snap | 0 .../common/lib/assert_close_to.test.ts | 0 .../common/lib/assert_close_to.ts | 0 .../lib/combine_filters_and_user_search.test.ts | 0 .../common/lib/combine_filters_and_user_search.ts | 0 .../common/lib/get_histogram_interval.test.ts | 0 .../common/lib/get_histogram_interval.ts | 0 .../{uptime => synthetics}/common/lib/index.ts | 0 .../{uptime => synthetics}/common/lib/ml.test.ts | 0 .../plugins/{uptime => synthetics}/common/lib/ml.ts | 0 .../common/lib/schedule_to_time.test.ts | 0 .../common/lib/schedule_to_time.ts | 0 .../common/lib/stringify_kueries.test.ts | 0 .../common/lib/stringify_kueries.ts | 0 .../common/requests/get_certs_request_body.ts | 0 .../common/rules/uptime_rule_field_map.ts | 0 .../common/runtime_types/alerts/common.ts | 0 .../common/runtime_types/alerts/index.ts | 0 .../common/runtime_types/alerts/status_check.ts | 0 .../common/runtime_types/certs.ts | 0 .../common/runtime_types/common.ts | 0 .../common/runtime_types/dynamic_settings.ts | 0 .../common/runtime_types/index.ts | 0 .../common/runtime_types/monitor/index.ts | 0 .../common/runtime_types/monitor/locations.ts | 0 .../common/runtime_types/monitor/state.ts | 0 .../runtime_types/monitor_management/config_key.ts | 0 .../runtime_types/monitor_management/index.ts | 0 .../runtime_types/monitor_management/locations.ts | 0 .../monitor_management/monitor_configs.ts | 0 .../monitor_management/monitor_meta_data.ts | 0 .../monitor_management/monitor_types.ts | 0 .../runtime_types/monitor_management/state.ts | 0 .../common/runtime_types/network_events.ts | 0 .../common/runtime_types/ping/histogram.ts | 0 .../common/runtime_types/ping/index.ts | 0 .../common/runtime_types/ping/ping.ts | 0 .../common/runtime_types/ping/synthetics.test.ts | 0 .../common/runtime_types/ping/synthetics.ts | 0 .../common/runtime_types/snapshot/index.ts | 0 .../common/runtime_types/snapshot/snapshot_count.ts | 0 .../runtime_types/synthetics_service_api_key.ts | 0 .../{uptime => synthetics}/common/translations.ts | 0 .../{uptime => synthetics}/common/types/index.ts | 0 .../common/types/monitor_duration.ts | 0 .../common/types/monitor_validation.ts | 0 .../common/types/saved_objects.ts | 0 .../common/types/synthetics_monitor.ts | 0 .../common/utils/as_mutable_array.ts | 0 .../common/utils/es_search.ts | 0 .../common/utils/get_monitor_url.ts | 0 .../{uptime => synthetics}/common/utils/t_enum.ts | 0 x-pack/plugins/{uptime => synthetics}/e2e/config.ts | 0 .../e2e/fixtures/es_archiver/browser/data.json.gz | Bin .../e2e/fixtures/es_archiver/browser/mappings.json | 0 .../es_archiver/full_heartbeat/data.json.gz | Bin .../es_archiver/full_heartbeat/mappings.json | 0 .../e2e/helpers/make_checks.ts | 0 .../{uptime => synthetics}/e2e/helpers/make_ping.ts | 0 .../{uptime => synthetics}/e2e/helpers/make_tls.ts | 0 .../e2e/journeys/alerts/default_email_settings.ts | 0 .../e2e/journeys/alerts/index.ts | 0 .../alerts/status_alert_flyouts_in_alerting_app.ts | 0 .../alerts/tls_alert_flyouts_in_alerting_app.ts | 0 .../e2e/journeys/data_view_permissions.ts | 0 .../{uptime => synthetics}/e2e/journeys/index.ts | 0 .../e2e/journeys/locations/index.ts | 0 .../e2e/journeys/locations/locations.ts | 0 .../e2e/journeys/monitor_details.journey.ts | 0 .../e2e/journeys/monitor_details/index.ts | 0 .../monitor_details/monitor_alerts.journey.ts | 0 .../monitor_details/monitor_details.journey.ts | 0 .../monitor_details/ping_redirects.journey.ts | 0 .../e2e/journeys/monitor_management.journey.ts | 0 .../monitor_management_enablement.journey.ts | 0 .../e2e/journeys/monitor_name.journey.ts | 0 .../e2e/journeys/read_only_user/index.ts | 0 .../journeys/read_only_user/monitor_management.ts | 0 .../e2e/journeys/step_duration.journey.ts | 0 .../e2e/journeys/uptime.journey.ts | 0 .../{uptime => synthetics}/e2e/journeys/utils.ts | 0 .../e2e/page_objects/login.tsx | 0 .../e2e/page_objects/monitor_details.tsx | 0 .../e2e/page_objects/monitor_management.tsx | 0 .../e2e/page_objects/settings.tsx | 0 .../e2e/page_objects/utils.tsx | 0 .../{uptime => synthetics}/e2e/playwright_run.ts | 0 .../{uptime => synthetics}/e2e/playwright_start.ts | 0 .../{uptime => synthetics}/e2e/tasks/es_archiver.ts | 0 .../e2e/tasks/import_monitors.ts | 0 .../e2e/tasks/read_kibana_config.ts | 0 .../e2e/tasks/uptime_monitor.ndjson | 0 .../{uptime => synthetics}/e2e/tsconfig.json | 0 .../plugins/{uptime => synthetics}/jest.config.js | 6 +++--- x-pack/plugins/{uptime => synthetics}/kibana.json | 2 +- .../uptime_page_template.test.tsx.snap | 0 .../public/apps/locators/overview.test.ts | 0 .../public/apps/locators/overview.ts | 0 .../{uptime => synthetics}/public/apps/plugin.ts | 0 .../public/apps/render_app.tsx | 0 .../public/apps/uptime_app.tsx | 0 .../public/apps/uptime_overview_fetcher.ts | 0 .../public/apps/uptime_page_template.test.tsx | 0 .../public/apps/uptime_page_template.tsx | 0 .../public/apps/use_no_data_config.ts | 0 .../plugins/{uptime => synthetics}/public/badge.ts | 0 .../__snapshots__/cert_monitors.test.tsx.snap | 0 .../__snapshots__/cert_search.test.tsx.snap | 0 .../__snapshots__/cert_status.test.tsx.snap | 0 .../components/certificates/cert_monitors.test.tsx | 0 .../components/certificates/cert_monitors.tsx | 0 .../components/certificates/cert_refresh_btn.tsx | 0 .../components/certificates/cert_search.test.tsx | 0 .../public/components/certificates/cert_search.tsx | 0 .../components/certificates/cert_status.test.tsx | 0 .../public/components/certificates/cert_status.tsx | 0 .../components/certificates/certificate_title.tsx | 0 .../certificates/certificates_list.test.tsx | 0 .../components/certificates/certificates_list.tsx | 0 .../certificates/fingerprint_col.test.tsx | 0 .../components/certificates/fingerprint_col.tsx | 0 .../public/components/certificates/index.ts | 0 .../public/components/certificates/translations.ts | 0 .../components/certificates/use_cert_search.ts | 0 .../__snapshots__/location_link.test.tsx.snap | 0 .../__snapshots__/monitor_page_link.test.tsx.snap | 0 .../common/__snapshots__/monitor_tags.test.tsx.snap | 0 .../common/alerts/uptime_edit_alert_flyout.tsx | 0 .../__snapshots__/chart_empty_state.test.tsx.snap | 0 .../__snapshots__/chart_wrapper.test.tsx.snap | 0 .../charts/__snapshots__/donut_chart.test.tsx.snap | 0 .../donut_chart_legend_row.test.tsx.snap | 0 .../__snapshots__/monitor_bar_series.test.tsx.snap | 0 .../components/common/charts/annotation_tooltip.tsx | 0 .../common/charts/chart_empty_state.test.tsx | 0 .../components/common/charts/chart_empty_state.tsx | 0 .../components/common/charts/chart_wrapper.test.tsx | 0 .../common/charts/chart_wrapper/chart_wrapper.tsx | 0 .../components/common/charts/chart_wrapper/index.ts | 0 .../components/common/charts/donut_chart.test.tsx | 0 .../public/components/common/charts/donut_chart.tsx | 0 .../common/charts/donut_chart_legend.test.tsx | 0 .../components/common/charts/donut_chart_legend.tsx | 0 .../common/charts/donut_chart_legend_row.test.tsx | 0 .../common/charts/donut_chart_legend_row.tsx | 0 .../components/common/charts/duration_chart.tsx | 0 .../common/charts/duration_charts.test.tsx | 0 .../common/charts/duration_line_bar_list.tsx | 0 .../common/charts/duration_line_series_list.tsx | 0 .../common/charts/get_tick_format.test.ts | 0 .../components/common/charts/get_tick_format.ts | 0 .../public/components/common/charts/index.ts | 0 .../common/charts/monitor_bar_series.test.tsx | 0 .../components/common/charts/monitor_bar_series.tsx | 0 .../common/charts/ping_histogram.test.tsx | 0 .../components/common/charts/ping_histogram.tsx | 0 .../public/components/common/charts/utils.test.ts | 0 .../public/components/common/charts/utils.ts | 0 .../public/components/common/header/action_menu.tsx | 0 .../common/header/action_menu_content.test.tsx | 0 .../common/header/action_menu_content.tsx | 0 .../common/header/inspector_header_link.tsx | 0 .../common/header/manage_monitors_btn.tsx | 0 .../components/common/header/page_tabs.test.tsx | 0 .../public/components/common/header/page_tabs.tsx | 0 .../public/components/common/higher_order/index.ts | 0 .../common/higher_order/responsive_wrapper.test.tsx | 0 .../common/higher_order/responsive_wrapper.tsx | 0 .../public/components/common/location_link.test.tsx | 0 .../public/components/common/location_link.tsx | 0 .../components/common/monitor_page_link.test.tsx | 0 .../public/components/common/monitor_page_link.tsx | 0 .../public/components/common/monitor_tags.test.tsx | 0 .../public/components/common/monitor_tags.tsx | 0 .../components/common/react_router_helpers/index.ts | 0 .../common/react_router_helpers/link_events.test.ts | 0 .../common/react_router_helpers/link_events.ts | 0 .../react_router_helpers/link_for_eui.test.tsx | 0 .../common/react_router_helpers/link_for_eui.tsx | 0 .../public/components/common/step_detail_link.tsx | 0 .../public/components/common/translations.ts | 0 .../components/common/uptime_date_picker.test.tsx | 0 .../public/components/common/uptime_date_picker.tsx | 0 .../fleet_package/browser/advanced_fields.test.tsx | 0 .../fleet_package/browser/advanced_fields.tsx | 0 .../components/fleet_package/browser/formatters.ts | 0 .../fleet_package/browser/normalizers.test.ts | 0 .../components/fleet_package/browser/normalizers.ts | 0 .../browser/script_recorder_fields.test.tsx | 0 .../browser/script_recorder_fields.tsx | 0 .../fleet_package/browser/simple_fields.tsx | 0 .../fleet_package/browser/source_field.test.tsx | 0 .../fleet_package/browser/source_field.tsx | 0 .../browser/throttling_fields.test.tsx | 0 .../fleet_package/browser/throttling_fields.tsx | 0 .../components/fleet_package/browser/uploader.tsx | 0 .../browser/zip_url_tls_fields.test.tsx | 0 .../fleet_package/browser/zip_url_tls_fields.tsx | 0 .../public/components/fleet_package/code_editor.tsx | 0 .../components/fleet_package/combo_box.test.tsx | 0 .../public/components/fleet_package/combo_box.tsx | 0 .../fleet_package/common/common_fields.tsx | 0 .../fleet_package/common/default_values.ts | 0 .../common/described_form_group_with_wrap.tsx | 0 .../components/fleet_package/common/enabled.tsx | 0 .../fleet_package/common/formatters.test.ts | 0 .../components/fleet_package/common/formatters.ts | 0 .../fleet_package/common/normalizers.test.ts | 0 .../components/fleet_package/common/normalizers.ts | 0 .../fleet_package/common/simple_fields_wrapper.tsx | 0 .../components/fleet_package/common/tls_options.tsx | 0 .../fleet_package/contexts/browser_context.tsx | 0 .../contexts/browser_context_advanced.tsx | 0 .../fleet_package/contexts/browser_provider.tsx | 0 .../fleet_package/contexts/http_context.tsx | 0 .../contexts/http_context_advanced.tsx | 0 .../fleet_package/contexts/http_provider.tsx | 0 .../fleet_package/contexts/icmp_context.tsx | 0 .../components/fleet_package/contexts/index.ts | 0 .../contexts/policy_config_context.tsx | 0 .../contexts/synthetics_context_providers.tsx | 0 .../fleet_package/contexts/tcp_context.tsx | 0 .../fleet_package/contexts/tcp_context_advanced.tsx | 0 .../fleet_package/contexts/tcp_provider.tsx | 0 .../fleet_package/contexts/tls_fields_context.tsx | 0 .../components/fleet_package/custom_fields.test.tsx | 0 .../components/fleet_package/custom_fields.tsx | 0 .../components/fleet_package/header_field.test.tsx | 0 .../components/fleet_package/header_field.tsx | 0 .../fleet_package/helpers/context_helpers.ts | 0 .../components/fleet_package/helpers/formatters.ts | 0 .../components/fleet_package/helpers/normalizers.ts | 0 .../components/fleet_package/hooks/use_policy.ts | 0 .../fleet_package/hooks/use_update_policy.test.tsx | 0 .../fleet_package/hooks/use_update_policy.ts | 0 .../fleet_package/http/advanced_fields.test.tsx | 0 .../fleet_package/http/advanced_fields.tsx | 0 .../components/fleet_package/http/formatters.ts | 0 .../components/fleet_package/http/normalizers.ts | 0 .../components/fleet_package/http/simple_fields.tsx | 0 .../fleet_package/icmp/advanced_fields.test.tsx | 0 .../fleet_package/icmp/advanced_fields.tsx | 0 .../components/fleet_package/icmp/formatters.ts | 0 .../components/fleet_package/icmp/normalizers.ts | 0 .../components/fleet_package/icmp/simple_fields.tsx | 0 .../public/components/fleet_package/index.tsx | 0 .../index_response_body_field.test.tsx | 0 .../fleet_package/index_response_body_field.tsx | 0 .../fleet_package/key_value_field.test.tsx | 0 .../components/fleet_package/key_value_field.tsx | 0 .../lazy_synthetics_custom_assets_extension.tsx | 0 .../lazy_synthetics_policy_create_extension.tsx | 0 .../lazy_synthetics_policy_edit_extension.tsx | 0 .../components/fleet_package/optional_label.tsx | 0 .../fleet_package/request_body_field.test.tsx | 0 .../components/fleet_package/request_body_field.tsx | 0 .../fleet_package/schedule_field.test.tsx | 0 .../components/fleet_package/schedule_field.tsx | 0 .../synthetics_custom_assets_extension.tsx | 0 .../synthetics_policy_create_extension.tsx | 0 ...thetics_policy_create_extension_wrapper.test.tsx | 0 .../synthetics_policy_create_extension_wrapper.tsx | 0 .../synthetics_policy_edit_extension.tsx | 0 ...ynthetics_policy_edit_extension_wrapper.test.tsx | 0 .../synthetics_policy_edit_extension_wrapper.tsx | 0 .../fleet_package/tcp/advanced_fields.test.tsx | 0 .../fleet_package/tcp/advanced_fields.tsx | 0 .../components/fleet_package/tcp/formatters.ts | 0 .../components/fleet_package/tcp/normalizers.ts | 0 .../components/fleet_package/tcp/simple_fields.tsx | 0 .../components/fleet_package/tls/default_values.ts | 0 .../components/fleet_package/tls/formatters.ts | 0 .../components/fleet_package/tls/normalizers.ts | 0 .../components/fleet_package/tls_fields.test.tsx | 0 .../public/components/fleet_package/tls_fields.tsx | 0 .../public/components/fleet_package/types.tsx | 0 .../components/fleet_package/validation.test.ts | 0 .../public/components/fleet_package/validation.tsx | 0 .../__snapshots__/monitor_charts.test.tsx.snap | 0 .../public/components/monitor/index.ts | 0 .../ml/__snapshots__/confirm_delete.test.tsx.snap | 0 .../ml/__snapshots__/ml_integerations.test.tsx.snap | 0 .../components/monitor/ml/confirm_alert_delete.tsx | 0 .../components/monitor/ml/confirm_delete.test.tsx | 0 .../public/components/monitor/ml/confirm_delete.tsx | 0 .../public/components/monitor/ml/index.ts | 0 .../components/monitor/ml/license_info.test.tsx | 0 .../public/components/monitor/ml/license_info.tsx | 0 .../public/components/monitor/ml/manage_ml_job.tsx | 0 .../public/components/monitor/ml/ml_flyout.test.tsx | 0 .../public/components/monitor/ml/ml_flyout.tsx | 0 .../components/monitor/ml/ml_flyout_container.tsx | 0 .../components/monitor/ml/ml_integeration.tsx | 0 .../components/monitor/ml/ml_integerations.test.tsx | 0 .../components/monitor/ml/ml_job_link.test.tsx | 0 .../public/components/monitor/ml/ml_job_link.tsx | 0 .../components/monitor/ml/ml_manage_job.test.tsx | 0 .../public/components/monitor/ml/translations.tsx | 0 .../components/monitor/ml/use_anomaly_alert.ts | 0 .../components/monitor/monitor_charts.test.tsx | 0 .../public/components/monitor/monitor_charts.tsx | 0 .../components/monitor/monitor_duration/index.ts | 0 .../monitor/monitor_duration/monitor_duration.tsx | 0 .../monitor_duration/monitor_duration_container.tsx | 0 .../components/monitor/monitor_title.test.tsx | 0 .../public/components/monitor/monitor_title.tsx | 0 .../components/monitor/ping_histogram/index.ts | 0 .../ping_histogram/ping_histogram_container.tsx | 0 .../__snapshots__/expanded_row.test.tsx.snap | 0 .../__snapshots__/ping_headers.test.tsx.snap | 0 .../monitor/ping_list/columns/expand_row.test.tsx | 0 .../monitor/ping_list/columns/expand_row.tsx | 0 .../monitor/ping_list/columns/failed_step.tsx | 0 .../monitor/ping_list/columns/ping_error.tsx | 0 .../monitor/ping_list/columns/ping_status.tsx | 0 .../ping_list/columns/ping_timestamp/index.ts | 0 .../ping_timestamp/no_image_available.test.tsx | 0 .../columns/ping_timestamp/no_image_available.tsx | 0 .../ping_timestamp/no_image_display.test.tsx | 0 .../columns/ping_timestamp/no_image_display.tsx | 0 .../columns/ping_timestamp/ping_timestamp.test.tsx | 0 .../columns/ping_timestamp/ping_timestamp.tsx | 0 .../ping_timestamp/step_image_caption.test.tsx | 0 .../columns/ping_timestamp/step_image_caption.tsx | 0 .../ping_timestamp/step_image_popover.test.tsx | 0 .../columns/ping_timestamp/step_image_popover.tsx | 0 .../columns/ping_timestamp/translations.ts | 0 .../monitor/ping_list/columns/response_code.tsx | 0 .../monitor/ping_list/doc_link_body.test.tsx | 0 .../components/monitor/ping_list/doc_link_body.tsx | 0 .../monitor/ping_list/expanded_row.test.tsx | 0 .../components/monitor/ping_list/expanded_row.tsx | 0 .../public/components/monitor/ping_list/headers.tsx | 0 .../public/components/monitor/ping_list/index.tsx | 0 .../components/monitor/ping_list/location_name.tsx | 0 .../monitor/ping_list/ping_headers.test.tsx | 0 .../components/monitor/ping_list/ping_list.test.tsx | 0 .../components/monitor/ping_list/ping_list.tsx | 0 .../monitor/ping_list/ping_list_header.tsx | 0 .../monitor/ping_list/ping_list_table.tsx | 0 .../components/monitor/ping_list/ping_redirects.tsx | 0 .../monitor/ping_list/response_code.test.tsx | 0 .../components/monitor/ping_list/translations.ts | 0 .../components/monitor/ping_list/use_pings.ts | 0 .../__snapshots__/monitor_status.bar.test.tsx.snap | 0 .../__snapshots__/ssl_certificate.test.tsx.snap | 0 .../__snapshots__/status_by_location.test.tsx.snap | 0 .../__snapshots__/tag_label.test.tsx.snap | 0 .../availability_reporting.test.tsx | 0 .../availability_reporting.tsx | 0 .../status_details/availability_reporting/index.ts | 0 .../location_status_tags.test.tsx | 0 .../availability_reporting/location_status_tags.tsx | 0 .../availability_reporting/tag_label.test.tsx | 0 .../availability_reporting/tag_label.tsx | 0 .../components/monitor/status_details/index.ts | 0 .../location_availability.test.tsx | 0 .../location_availability/location_availability.tsx | 0 .../status_details/monitor_status.bar.test.tsx | 0 .../monitor/status_details/ssl_certificate.test.tsx | 0 .../monitor/status_details/status_bar/index.ts | 0 .../status_details/status_bar/monitor_redirects.tsx | 0 .../status_details/status_bar/ssl_certificate.tsx | 0 .../status_details/status_bar/status_bar.test.ts | 0 .../status_details/status_bar/status_bar.tsx | 0 .../status_bar/status_by_location.tsx | 0 .../status_details/status_bar/use_status_bar.ts | 0 .../status_details/status_by_location.test.tsx | 0 .../monitor/status_details/status_details.tsx | 0 .../status_details/status_details_container.tsx | 0 .../monitor/status_details/translations.ts | 0 .../step_detail/step_detail_container.tsx | 0 .../synthetics/step_detail/step_page_nav.tsx | 0 .../synthetics/step_detail/step_page_title.tsx | 0 .../step_detail/use_monitor_breadcrumb.tsx | 0 .../step_detail/use_monitor_breadcrumbs.test.tsx | 0 .../step_detail/use_step_waterfall_metrics.test.tsx | 0 .../step_detail/use_step_waterfall_metrics.ts | 0 .../step_detail/waterfall/data_formatting.test.ts | 0 .../step_detail/waterfall/data_formatting.ts | 0 .../synthetics/step_detail/waterfall/types.ts | 0 .../waterfall/waterfall_chart_container.test.tsx | 0 .../waterfall/waterfall_chart_container.tsx | 0 .../waterfall/waterfall_chart_wrapper.test.tsx | 0 .../waterfall/waterfall_chart_wrapper.tsx | 0 .../step_detail/waterfall/waterfall_filter.test.tsx | 0 .../step_detail/waterfall/waterfall_filter.tsx | 0 .../step_detail/waterfall/waterfall_flyout.test.tsx | 0 .../step_detail/waterfall/waterfall_flyout.tsx | 0 .../waterfall/waterfall_sidebar_item.test.tsx | 0 .../waterfall/waterfall_sidebar_item.tsx | 0 .../components/monitor/synthetics/translations.ts | 0 .../monitor/synthetics/waterfall/README.md | 0 .../synthetics/waterfall/components/constants.ts | 0 .../synthetics/waterfall/components/legend.tsx | 0 .../components/middle_truncated_text.test.tsx | 0 .../waterfall/components/middle_truncated_text.tsx | 0 .../components/network_requests_total.test.tsx | 0 .../waterfall/components/network_requests_total.tsx | 0 .../synthetics/waterfall/components/sidebar.tsx | 0 .../synthetics/waterfall/components/styles.ts | 0 .../synthetics/waterfall/components/translations.ts | 0 .../waterfall/components/use_bar_charts.test.tsx | 0 .../waterfall/components/use_bar_charts.ts | 0 .../waterfall/components/use_flyout.test.tsx | 0 .../synthetics/waterfall/components/use_flyout.ts | 0 .../waterfall/components/waterfall.test.tsx | 0 .../waterfall/components/waterfall_bar_chart.tsx | 0 .../waterfall/components/waterfall_chart.tsx | 0 .../components/waterfall_chart_fixed_axis.tsx | 0 .../waterfall/components/waterfall_flyout_table.tsx | 0 .../components/waterfall_marker_icon.test.tsx | 0 .../waterfall/components/waterfall_marker_icon.tsx | 0 .../components/waterfall_marker_test_helper.tsx | 0 .../components/waterfall_marker_trend.test.tsx | 0 .../waterfall/components/waterfall_marker_trend.tsx | 0 .../waterfall/components/waterfall_markers.tsx | 0 .../components/waterfall_tooltip_content.test.tsx | 0 .../components/waterfall_tooltip_content.tsx | 0 .../waterfall/context/waterfall_chart.tsx | 0 .../monitor/synthetics/waterfall/index.tsx | 0 .../monitor/synthetics/waterfall/types.ts | 0 .../action_bar/action_bar.test.tsx | 0 .../monitor_management/action_bar/action_bar.tsx | 0 .../action_bar/action_bar_errors.test.tsx | 0 .../action_bar/action_bar_portal.tsx | 0 .../monitor_management/add_monitor_btn.tsx | 0 .../components/monitor_management/content/index.ts | 0 .../monitor_management/edit_monitor_config.tsx | 0 .../monitor_management/hooks/use_enablement.ts | 0 .../monitor_management/hooks/use_format_monitor.ts | 0 .../hooks/use_inline_errors.test.tsx | 0 .../monitor_management/hooks/use_inline_errors.ts | 0 .../hooks/use_inline_errors_count.test.tsx | 0 .../hooks/use_inline_errors_count.ts | 0 .../hooks/use_invalid_monitors.tsx | 0 .../monitor_management/hooks/use_locations.test.tsx | 0 .../monitor_management/hooks/use_locations.ts | 0 .../monitor_management/hooks/use_run_once_errors.ts | 0 .../monitor_management/hooks/use_service_allowed.ts | 0 .../monitor_management/loader/loader.test.tsx | 0 .../components/monitor_management/loader/loader.tsx | 0 .../components/monitor_management/mocks/index.ts | 0 .../monitor_management/mocks/locations.ts | 0 .../monitor_config/locations.test.tsx | 0 .../monitor_management/monitor_config/locations.tsx | 0 .../monitor_config/monitor_advanced_fields.tsx | 0 .../monitor_config/monitor_config.test.tsx | 0 .../monitor_config/monitor_config.tsx | 0 .../monitor_config/monitor_fields.test.tsx | 0 .../monitor_config/monitor_fields.tsx | 0 .../monitor_config/monitor_name_location.tsx | 0 .../monitor_config/use_monitor_name.test.tsx | 0 .../monitor_config/use_monitor_name.ts | 0 .../monitor_list/actions.test.tsx | 0 .../monitor_management/monitor_list/actions.tsx | 0 .../monitor_list/all_monitors.tsx | 0 .../monitor_list/delete_monitor.test.tsx | 0 .../monitor_list/delete_monitor.tsx | 0 .../monitor_list/enablement_empty_state.tsx | 0 .../monitor_list/inline_error.test.tsx | 0 .../monitor_list/inline_error.tsx | 0 .../monitor_list/invalid_monitors.tsx | 0 .../monitor_list/list_tabs.test.tsx | 0 .../monitor_management/monitor_list/list_tabs.tsx | 0 .../monitor_list/monitor_async_error.test.tsx | 0 .../monitor_list/monitor_async_error.tsx | 0 .../monitor_list/monitor_enabled.test.tsx | 0 .../monitor_list/monitor_enabled.tsx | 0 .../monitor_list/monitor_list.test.tsx | 0 .../monitor_list/monitor_list.tsx | 0 .../monitor_list/monitor_list_container.tsx | 0 .../monitor_list/monitor_locations.tsx | 0 .../monitor_list/stderr_logs_popover.tsx | 0 .../monitor_management/monitor_list/tags.tsx | 0 .../monitor_management/show_sync_errors.tsx | 0 .../browser/browser_test_results.test.tsx | 0 .../test_now_mode/browser/browser_test_results.tsx | 0 .../browser/use_browser_run_once_monitors.test.tsx | 0 .../browser/use_browser_run_once_monitors.ts | 0 .../simple/simple_test_results.test.tsx | 0 .../test_now_mode/simple/simple_test_results.tsx | 0 .../simple/use_simple_run_once_monitors.ts | 0 .../test_now_mode/test_now_mode.test.tsx | 0 .../test_now_mode/test_now_mode.tsx | 0 .../test_now_mode/test_result_header.test.tsx | 0 .../test_now_mode/test_result_header.tsx | 0 .../test_now_mode/test_run_results.tsx | 0 .../test_now_mode/use_tick_tick.ts | 0 .../monitor_management/validation.test.ts | 0 .../components/monitor_management/validation.ts | 0 .../__snapshots__/snapshot_heading.test.tsx.snap | 0 .../overview/alerts/alert_expression_popover.tsx | 0 .../overview/alerts/alert_field_number.test.tsx | 0 .../overview/alerts/alert_field_number.tsx | 0 .../overview/alerts/alert_query_bar/query_bar.tsx | 0 .../public/components/overview/alerts/alert_tls.tsx | 0 .../alerts_containers/alert_monitor_status.tsx | 0 .../overview/alerts/alerts_containers/alert_tls.tsx | 0 .../overview/alerts/alerts_containers/index.ts | 0 .../toggle_alert_flyout_button.tsx | 0 .../uptime_alerts_flyout_wrapper.tsx | 0 .../alerts/alerts_containers/use_snap_shot.ts | 0 .../overview/alerts/anomaly_alert/anomaly_alert.tsx | 0 .../alerts/anomaly_alert/select_severity.tsx | 0 .../overview/alerts/anomaly_alert/translations.ts | 0 .../public/components/overview/alerts/index.ts | 0 .../__snapshots__/down_number_select.test.tsx.snap | 0 .../time_expression_select.test.tsx.snap | 0 .../availability_expression_select.tsx | 0 .../monitor_expressions/down_number_select.test.tsx | 0 .../monitor_expressions/down_number_select.tsx | 0 .../filters_expression_select.test.tsx | 0 .../filters_expression_select.tsx | 0 .../overview/alerts/monitor_expressions/index.ts | 0 .../status_expression_select.tsx | 0 .../time_expression_select.test.tsx | 0 .../monitor_expressions/time_expression_select.tsx | 0 .../monitor_expressions/time_unit_selectable.tsx | 0 .../alerts/monitor_expressions/translations.ts | 0 .../monitor_status_alert/add_filter_btn.test.tsx | 0 .../alerts/monitor_status_alert/add_filter_btn.tsx | 0 .../alert_monitor_status.test.tsx | 0 .../monitor_status_alert/alert_monitor_status.tsx | 0 .../monitor_status_alert/old_alert_call_out.tsx | 0 .../monitor_status_alert/old_alert_callout.test.tsx | 0 .../alerts/settings_message_expression_popover.tsx | 0 .../alerts/toggle_alert_flyout_button.test.tsx | 0 .../overview/alerts/toggle_alert_flyout_button.tsx | 0 .../components/overview/alerts/translations.ts | 0 .../alerts/uptime_alerts_flyout_wrapper.tsx | 0 .../overview/empty_state/empty_state_error.tsx | 0 .../overview/empty_state/empty_state_loading.tsx | 0 .../overview/empty_state/use_has_data.tsx | 0 .../overview/filter_group/filter_group.test.tsx | 0 .../overview/filter_group/filter_group.tsx | 0 .../overview/filter_group/selected_filters.tsx | 0 .../overview/filter_group/translations.tsx | 0 .../public/components/overview/index.ts | 0 .../filter_status_button.test.tsx.snap | 0 .../__snapshots__/status_filter.test.tsx.snap | 0 .../monitor_list/columns/cert_status_column.tsx | 0 .../monitor_list/columns/define_connectors.test.tsx | 0 .../monitor_list/columns/define_connectors.tsx | 0 .../monitor_list/columns/enable_alert.test.tsx | 0 .../overview/monitor_list/columns/enable_alert.tsx | 0 .../monitor_list/columns/monitor_name_col.tsx | 0 .../columns/monitor_status_column.test.tsx | 0 .../monitor_list/columns/monitor_status_column.tsx | 0 .../columns/progress/browser_monitor_progress.tsx | 0 .../columns/progress/monitor_progress.tsx | 0 .../columns/progress/simple_monitor_progress.tsx | 0 .../columns/progress/use_updated_monitor.ts | 0 .../monitor_list/columns/status_badge.test.tsx | 0 .../overview/monitor_list/columns/status_badge.tsx | 0 .../overview/monitor_list/columns/test_now_col.tsx | 0 .../overview/monitor_list/columns/translations.ts | 0 .../monitor_list/filter_status_button.test.tsx | 0 .../overview/monitor_list/filter_status_button.tsx | 0 .../components/overview/monitor_list/index.ts | 0 .../overview/monitor_list/monitor_list.test.tsx | 0 .../overview/monitor_list/monitor_list.tsx | 0 .../monitor_list/monitor_list_container.tsx | 0 .../__snapshots__/integration_group.test.tsx.snap | 0 .../__snapshots__/integration_link.test.tsx.snap | 0 .../__snapshots__/monitor_list_drawer.test.tsx.snap | 0 .../__snapshots__/most_recent_error.test.tsx.snap | 0 .../actions_popover/actions_popover.tsx | 0 .../actions_popover/actions_popover_container.tsx | 0 .../actions_popover/integration_group.tsx | 0 .../actions_popover/integration_link.tsx | 0 .../monitor_list/monitor_list_drawer/data.json | 0 .../monitor_list_drawer/enabled_alerts.tsx | 0 .../monitor_list/monitor_list_drawer/index.ts | 0 .../monitor_list_drawer/integration_group.test.tsx | 0 .../monitor_list_drawer/integration_link.test.tsx | 0 .../monitor_list_drawer/list_drawer_container.tsx | 0 .../monitor_list_drawer.test.tsx | 0 .../monitor_list_drawer/monitor_list_drawer.tsx | 0 .../monitor_status_list.test.tsx | 0 .../monitor_list_drawer/monitor_status_list.tsx | 0 .../monitor_list_drawer/monitor_status_row.test.tsx | 0 .../monitor_list_drawer/monitor_status_row.tsx | 0 .../monitor_list_drawer/monitor_url.tsx | 0 .../monitor_list_drawer/most_recent_error.test.tsx | 0 .../monitor_list_drawer/most_recent_error.tsx | 0 .../monitor_list_drawer/most_recent_run.tsx | 0 .../overview/monitor_list/monitor_list_header.tsx | 0 .../monitor_list_page_size_select.test.tsx | 0 .../monitor_list/monitor_list_page_size_select.tsx | 0 .../overview/monitor_list/no_items_meesage.test.tsx | 0 .../overview/monitor_list/no_items_message.tsx | 0 .../overview/monitor_list/overview_page_link.tsx | 0 .../overview/monitor_list/parse_timestamp.test.ts | 0 .../overview/monitor_list/parse_timestamp.ts | 0 .../overview/monitor_list/status_filter.test.tsx | 0 .../overview/monitor_list/status_filter.tsx | 0 .../overview/monitor_list/translations.ts | 0 .../overview/monitor_list/troubleshoot_popover.tsx | 0 .../components/overview/monitor_list/types.ts | 0 .../overview/monitor_list/use_monitor_histogram.ts | 0 .../components/overview/query_bar/query_bar.tsx | 0 .../components/overview/query_bar/translations.ts | 0 .../overview/query_bar/use_query_bar.test.tsx | 0 .../components/overview/query_bar/use_query_bar.ts | 0 .../snapshot/__snapshots__/snapshot.test.tsx.snap | 0 .../public/components/overview/snapshot/index.ts | 0 .../components/overview/snapshot/snapshot.test.tsx | 0 .../components/overview/snapshot/snapshot.tsx | 0 .../overview/snapshot/snapshot_heading.tsx | 0 .../components/overview/snapshot/use_snap_shot.ts | 0 .../components/overview/snapshot_heading.test.tsx | 0 .../public/components/overview/status_panel.tsx | 0 .../components/overview/synthetics_callout.test.tsx | 0 .../components/overview/synthetics_callout.tsx | 0 .../__snapshots__/certificate_form.test.tsx.snap | 0 .../__snapshots__/indices_form.test.tsx.snap | 0 .../components/settings/add_connector_flyout.tsx | 0 .../components/settings/alert_defaults_form.tsx | 0 .../components/settings/certificate_form.test.tsx | 0 .../public/components/settings/certificate_form.tsx | 0 .../public/components/settings/default_email.tsx | 0 .../components/settings/indices_form.test.tsx | 0 .../public/components/settings/indices_form.tsx | 0 .../public/components/settings/settings_actions.tsx | 0 .../components/settings/settings_bottom_bar.tsx | 0 .../public/components/settings/translations.ts | 0 .../public/components/settings/types.ts | 0 .../components/settings/use_settings_errors.ts | 0 .../synthetics/check_steps/stderr_logs.tsx | 0 .../synthetics/check_steps/step_duration.tsx | 0 .../step_expanded_row/screenshot_link.tsx | 0 .../step_expanded_row/step_screenshots.tsx | 0 .../check_steps/step_field_trend.test.tsx | 0 .../synthetics/check_steps/step_field_trend.tsx | 0 .../synthetics/check_steps/step_image.tsx | 0 .../synthetics/check_steps/steps_list.test.tsx | 0 .../synthetics/check_steps/steps_list.tsx | 0 .../synthetics/check_steps/use_check_steps.ts | 0 .../check_steps/use_expanded_row.test.tsx | 0 .../synthetics/check_steps/use_expanded_row.tsx | 0 .../synthetics/check_steps/use_std_error_logs.ts | 0 .../components/synthetics/code_block_accordion.tsx | 0 .../components/synthetics/console_event.test.tsx | 0 .../public/components/synthetics/console_event.tsx | 0 .../synthetics/console_output_event_list.test.tsx | 0 .../synthetics/console_output_event_list.tsx | 0 .../components/synthetics/empty_journey.test.tsx | 0 .../public/components/synthetics/empty_journey.tsx | 0 .../components/synthetics/executed_step.test.tsx | 0 .../public/components/synthetics/executed_step.tsx | 0 .../components/synthetics/status_badge.test.tsx | 0 .../public/components/synthetics/status_badge.tsx | 0 .../synthetics/step_screenshot_display.test.tsx | 0 .../synthetics/step_screenshot_display.tsx | 0 .../public/components/synthetics/translations.ts | 0 .../{uptime => synthetics}/public/contexts/index.ts | 0 .../contexts/uptime_index_pattern_context.tsx | 0 .../public/contexts/uptime_refresh_context.tsx | 0 .../public/contexts/uptime_settings_context.tsx | 0 .../contexts/uptime_startup_plugins_context.tsx | 0 .../public/contexts/uptime_theme_context.tsx | 0 .../__snapshots__/use_url_params.test.tsx.snap | 0 .../{uptime => synthetics}/public/hooks/index.ts | 0 .../public/hooks/update_kuery_string.ts | 0 .../public/hooks/use_breadcrumbs.test.tsx | 0 .../public/hooks/use_breadcrumbs.ts | 0 .../public/hooks/use_breakpoints.test.ts | 0 .../public/hooks/use_breakpoints.ts | 0 .../public/hooks/use_cert_status.ts | 0 .../public/hooks/use_chart_theme.ts | 0 .../public/hooks/use_composite_image.test.tsx | 0 .../public/hooks/use_composite_image.ts | 0 .../public/hooks/use_filter_update.test.ts | 0 .../public/hooks/use_filter_update.ts | 0 .../public/hooks/use_init_app.ts | 0 .../public/hooks/use_mapping_check.test.ts | 0 .../public/hooks/use_mapping_check.ts | 0 .../public/hooks/use_monitor.ts | 0 .../public/hooks/use_overview_filter_check.test.tsx | 0 .../public/hooks/use_overview_filter_check.ts | 0 .../public/hooks/use_search_text.ts | 0 .../public/hooks/use_selected_filters.test.tsx | 0 .../public/hooks/use_selected_filters.ts | 0 .../public/hooks/use_telemetry.ts | 0 .../public/hooks/use_url_params.test.tsx | 0 .../public/hooks/use_url_params.ts | 0 .../public/icons/heartbeat_white.svg | 0 .../plugins/{uptime => synthetics}/public/index.ts | 0 .../public/lib/__mocks__/screenshot_ref.mock.ts | 0 .../lib/__mocks__/uptime_plugin_start_mock.ts | 0 .../public/lib/__mocks__/uptime_store.mock.ts | 0 .../lib/__mocks__/use_composite_image.mock.ts | 0 .../public/lib/__mocks__/ut_router_history.mock.ts | 0 .../lib/adapters/framework/capabilities_adapter.ts | 0 .../public/lib/alert_types/alert_messages.tsx | 0 .../public/lib/alert_types/common.ts | 0 .../public/lib/alert_types/duration_anomaly.tsx | 0 .../public/lib/alert_types/index.ts | 0 .../alert_types/lazy_wrapper/duration_anomaly.tsx | 0 .../lib/alert_types/lazy_wrapper/monitor_status.tsx | 0 .../lib/alert_types/lazy_wrapper/tls_alert.tsx | 0 .../lazy_wrapper/validate_monitor_status.ts | 0 .../public/lib/alert_types/monitor_status.test.ts | 0 .../public/lib/alert_types/monitor_status.tsx | 0 .../public/lib/alert_types/tls.tsx | 0 .../public/lib/alert_types/tls_legacy.tsx | 0 .../{uptime => synthetics}/public/lib/formatting.ts | 0 .../lib/helper/charts/get_chart_date_label.ts | 0 .../lib/helper/charts/get_label_format.test.ts | 0 .../public/lib/helper/charts/get_label_format.ts | 0 .../public/lib/helper/charts/index.ts | 0 .../helper/charts/is_within_current_date.test.ts | 0 .../lib/helper/charts/is_within_current_date.ts | 0 .../lib/helper/compose_screenshot_images.test.ts | 0 .../public/lib/helper/compose_screenshot_images.ts | 0 .../public/lib/helper/convert_measurements.test.ts | 0 .../public/lib/helper/convert_measurements.ts | 0 .../public/lib/helper/enzyme_helpers.tsx | 0 .../public/lib/helper/get_title.ts | 0 .../public/lib/helper/helper_with_redux.tsx | 0 .../public/lib/helper/index.ts | 0 .../observability_integration/add_base_path.ts | 0 .../helper/observability_integration/build_href.ts | 0 .../observability_integration/get_apm_href.test.ts | 0 .../observability_integration/get_apm_href.ts | 0 .../get_infra_href.test.ts | 0 .../observability_integration/get_infra_href.ts | 0 .../get_logging_href.test.ts | 0 .../observability_integration/get_logging_href.ts | 0 .../lib/helper/observability_integration/index.ts | 0 .../public/lib/helper/parse_search.test.ts | 0 .../public/lib/helper/parse_search.ts | 0 .../public/lib/helper/rtl_helpers.tsx | 0 .../lib/helper/series_has_down_values.test.ts | 0 .../public/lib/helper/series_has_down_values.ts | 0 .../public/lib/helper/spy_use_fetcher.ts | 0 .../public/lib/helper/stringify_url_params.test.ts | 0 .../public/lib/helper/stringify_url_params.ts | 0 .../public/lib/helper/test_helpers.ts | 0 .../get_supported_url_params.test.ts.snap | 0 .../url_params/get_supported_url_params.test.ts | 0 .../helper/url_params/get_supported_url_params.ts | 0 .../public/lib/helper/url_params/index.ts | 0 .../helper/url_params/parse_absolute_date.test.ts | 0 .../lib/helper/url_params/parse_absolute_date.ts | 0 .../lib/helper/url_params/parse_is_paused.test.ts | 0 .../public/lib/helper/url_params/parse_is_paused.ts | 0 .../lib/helper/url_params/parse_url_int.test.ts | 0 .../public/lib/helper/url_params/parse_url_int.ts | 0 .../{uptime => synthetics}/public/lib/index.ts | 0 .../{uptime => synthetics}/public/lib/lib.ts | 0 .../public/pages/certificates.test.tsx | 0 .../public/pages/certificates.tsx | 0 .../{uptime => synthetics}/public/pages/index.ts | 0 .../public/pages/mapping_error.tsx | 0 .../public/pages/monitor.test.tsx | 0 .../{uptime => synthetics}/public/pages/monitor.tsx | 0 .../monitor_management/action_bar_portal_node.tsx | 0 .../public/pages/monitor_management/add_monitor.tsx | 0 .../public/pages/monitor_management/bottom_bar.tsx | 0 .../public/pages/monitor_management/content.ts | 0 .../pages/monitor_management/edit_monitor.tsx | 0 .../pages/monitor_management/monitor_management.tsx | 0 .../service_allowed_wrapper.test.tsx | 0 .../monitor_management/service_allowed_wrapper.tsx | 0 .../use_monitor_management_breadcrumbs.tsx | 0 .../public/pages/not_found.test.tsx | 0 .../public/pages/not_found.tsx | 0 .../public/pages/overview.test.tsx | 0 .../public/pages/overview.tsx | 0 .../public/pages/settings.test.tsx | 0 .../public/pages/settings.tsx | 0 .../public/pages/synthetics/checks_navigation.tsx | 0 .../public/pages/synthetics/step_detail_page.tsx | 0 .../pages/synthetics/synthetics_checks.test.tsx | 0 .../public/pages/synthetics/synthetics_checks.tsx | 0 .../public/pages/translations.ts | 0 .../{uptime => synthetics}/public/routes.tsx | 0 .../public/state/actions/alerts.ts | 0 .../public/state/actions/dynamic_settings.ts | 0 .../public/state/actions/index.ts | 0 .../public/state/actions/index_status.ts | 0 .../public/state/actions/journey.ts | 0 .../public/state/actions/ml_anomaly.ts | 0 .../public/state/actions/monitor.ts | 0 .../public/state/actions/monitor_duration.ts | 0 .../public/state/actions/monitor_list.ts | 0 .../public/state/actions/monitor_management.ts | 0 .../public/state/actions/monitor_status.ts | 0 .../public/state/actions/network_events.ts | 0 .../public/state/actions/ping.ts | 0 .../public/state/actions/selected_filters.ts | 0 .../public/state/actions/snapshot.ts | 0 .../public/state/actions/types.ts | 0 .../public/state/actions/ui.ts | 0 .../public/state/actions/utils.ts | 0 .../public/state/alerts/alerts.ts | 0 .../state/api/__snapshots__/snapshot.test.ts.snap | 0 .../public/state/api/alert_actions.test.ts | 0 .../public/state/api/alert_actions.ts | 0 .../public/state/api/alerts.ts | 0 .../public/state/api/dynamic_settings.ts | 0 .../public/state/api/index.ts | 0 .../public/state/api/index_status.ts | 0 .../public/state/api/journey.ts | 0 .../public/state/api/ml_anomaly.ts | 0 .../public/state/api/monitor.ts | 0 .../public/state/api/monitor_duration.ts | 0 .../public/state/api/monitor_list.ts | 0 .../public/state/api/monitor_management.ts | 0 .../public/state/api/monitor_status.ts | 0 .../public/state/api/network_events.ts | 0 .../{uptime => synthetics}/public/state/api/ping.ts | 0 .../public/state/api/snapshot.test.ts | 0 .../public/state/api/snapshot.ts | 0 .../public/state/api/types.ts | 0 .../public/state/api/utils.ts | 0 .../public/state/certificates/certificates.ts | 0 .../public/state/effects/alerts.ts | 0 .../public/state/effects/dynamic_settings.ts | 0 .../public/state/effects/fetch_effect.test.ts | 0 .../public/state/effects/fetch_effect.ts | 0 .../public/state/effects/index.ts | 0 .../public/state/effects/index_status.ts | 0 .../public/state/effects/journey.test.ts | 0 .../public/state/effects/journey.ts | 0 .../public/state/effects/ml_anomaly.ts | 0 .../public/state/effects/monitor.ts | 0 .../public/state/effects/monitor_duration.ts | 0 .../public/state/effects/monitor_list.ts | 0 .../public/state/effects/monitor_management.ts | 0 .../public/state/effects/monitor_status.ts | 0 .../public/state/effects/network_events.ts | 0 .../public/state/effects/ping.ts | 0 .../state/effects/synthetic_journey_blocks.ts | 0 .../public/state/effects/test_now_runs.ts | 0 .../{uptime => synthetics}/public/state/index.ts | 0 .../public/state/kibana_service.ts | 0 .../public/state/reducers/dynamic_settings.ts | 0 .../public/state/reducers/index.ts | 0 .../public/state/reducers/index_status.ts | 0 .../public/state/reducers/journey.ts | 0 .../public/state/reducers/ml_anomaly.ts | 0 .../public/state/reducers/monitor.ts | 0 .../public/state/reducers/monitor_duration.ts | 0 .../public/state/reducers/monitor_list.ts | 0 .../public/state/reducers/monitor_management.ts | 0 .../public/state/reducers/monitor_status.test.ts | 0 .../public/state/reducers/monitor_status.ts | 0 .../public/state/reducers/network_events.ts | 0 .../public/state/reducers/ping.ts | 0 .../public/state/reducers/ping_list.ts | 0 .../public/state/reducers/selected_filters.test.ts | 0 .../public/state/reducers/selected_filters.ts | 0 .../public/state/reducers/synthetics.test.ts | 0 .../public/state/reducers/synthetics.ts | 0 .../public/state/reducers/test_now_runs.ts | 0 .../public/state/reducers/types.ts | 0 .../public/state/reducers/ui.test.ts | 0 .../public/state/reducers/ui.ts | 0 .../public/state/reducers/utils.ts | 0 .../public/state/selectors/index.test.ts | 0 .../public/state/selectors/index.ts | 0 .../plugins/{uptime => synthetics}/scripts/e2e.js | 0 .../plugins/{uptime => synthetics}/server/index.ts | 0 .../{uptime => synthetics}/server/kibana.index.ts | 0 .../server/lib/adapters/framework/adapter_types.ts | 0 .../server/lib/adapters/framework/index.ts | 0 .../adapters/framework/kibana_framework_adapter.ts | 0 .../server/lib/adapters/index.ts | 0 .../kibana_telemetry_adapter.test.ts.snap | 0 .../server/lib/adapters/telemetry/index.ts | 0 .../telemetry/kibana_telemetry_adapter.test.ts | 0 .../adapters/telemetry/kibana_telemetry_adapter.ts | 0 .../server/lib/adapters/telemetry/types.ts | 0 .../server/lib/alerts/action_variables.ts | 0 .../server/lib/alerts/common.test.ts | 0 .../server/lib/alerts/common.ts | 0 .../server/lib/alerts/duration_anomaly.test.ts | 0 .../server/lib/alerts/duration_anomaly.ts | 0 .../server/lib/alerts/index.ts | 0 .../server/lib/alerts/status_check.test.ts | 0 .../server/lib/alerts/status_check.ts | 0 .../server/lib/alerts/test_utils/index.ts | 0 .../server/lib/alerts/tls.test.ts | 0 .../{uptime => synthetics}/server/lib/alerts/tls.ts | 0 .../server/lib/alerts/tls_legacy.test.ts | 0 .../server/lib/alerts/tls_legacy.ts | 0 .../server/lib/alerts/translations.ts | 0 .../server/lib/alerts/types.ts | 0 .../server/lib/compose/kibana.ts | 0 .../lib/domains/__snapshots__/license.test.ts.snap | 0 .../server/lib/domains/index.ts | 0 .../server/lib/domains/license.test.ts | 0 .../server/lib/domains/license.ts | 0 .../__snapshots__/get_filter_clause.test.ts.snap | 0 .../server/lib/helper/get_filter_clause.test.ts | 0 .../server/lib/helper/get_filter_clause.ts | 0 .../server/lib/helper/index.ts | 0 .../server/lib/helper/make_date_rate_filter.ts | 0 .../server/lib/helper/object_to_array.ts | 0 .../server/lib/helper/parse_relative_date.test.ts | 0 .../{uptime => synthetics}/server/lib/lib.ts | 0 .../requests/__fixtures__/monitor_charts_mock.json | 0 .../__snapshots__/generate_filter_aggs.test.ts.snap | 0 .../__snapshots__/get_monitor_charts.test.ts.snap | 0 .../__snapshots__/get_monitor_details.test.ts.snap | 0 .../__snapshots__/get_ping_histogram.test.ts.snap | 0 .../lib/requests/generate_filter_aggs.test.ts | 0 .../server/lib/requests/generate_filter_aggs.ts | 0 .../server/lib/requests/get_certs.test.ts | 0 .../server/lib/requests/get_certs.ts | 0 .../server/lib/requests/get_index_pattern.ts | 0 .../server/lib/requests/get_index_status.ts | 0 .../server/lib/requests/get_journey_details.test.ts | 0 .../server/lib/requests/get_journey_details.ts | 0 .../lib/requests/get_journey_failed_steps.test.ts | 0 .../server/lib/requests/get_journey_failed_steps.ts | 0 .../lib/requests/get_journey_screenshot.test.ts | 0 .../server/lib/requests/get_journey_screenshot.ts | 0 .../requests/get_journey_screenshot_blocks.test.ts | 0 .../lib/requests/get_journey_screenshot_blocks.ts | 0 .../server/lib/requests/get_journey_steps.test.ts | 0 .../server/lib/requests/get_journey_steps.ts | 0 .../lib/requests/get_last_successful_check.test.ts | 0 .../lib/requests/get_last_successful_check.ts | 0 .../server/lib/requests/get_latest_monitor.test.ts | 0 .../server/lib/requests/get_latest_monitor.ts | 0 .../server/lib/requests/get_monitor.ts | 0 .../lib/requests/get_monitor_availability.test.ts | 0 .../server/lib/requests/get_monitor_availability.ts | 0 .../server/lib/requests/get_monitor_charts.test.ts | 0 .../server/lib/requests/get_monitor_details.test.ts | 0 .../server/lib/requests/get_monitor_details.ts | 0 .../server/lib/requests/get_monitor_duration.ts | 0 .../server/lib/requests/get_monitor_locations.ts | 0 .../server/lib/requests/get_monitor_states.ts | 0 .../server/lib/requests/get_monitor_status.test.ts | 0 .../server/lib/requests/get_monitor_status.ts | 0 .../server/lib/requests/get_network_events.test.ts | 0 .../server/lib/requests/get_network_events.ts | 0 .../server/lib/requests/get_ping_histogram.test.ts | 0 .../server/lib/requests/get_ping_histogram.ts | 0 .../server/lib/requests/get_pings.test.ts | 0 .../server/lib/requests/get_pings.ts | 0 .../server/lib/requests/get_snapshot_counts.ts | 0 .../server/lib/requests/helper.ts | 0 .../server/lib/requests/index.ts | 0 .../server/lib/requests/search/fetch_chunk.ts | 0 .../lib/requests/search/find_potential_matches.ts | 0 .../server/lib/requests/search/index.ts | 0 .../search/monitor_summary_iterator.test.ts | 0 .../lib/requests/search/monitor_summary_iterator.ts | 0 .../lib/requests/search/query_context.test.ts | 0 .../server/lib/requests/search/query_context.ts | 0 .../lib/requests/search/refine_potential_matches.ts | 0 .../server/lib/requests/search/test_helpers.ts | 0 .../server/lib/requests/search/types.ts | 0 .../server/lib/saved_objects/index.ts | 0 .../server/lib/saved_objects/migrations.test.ts | 0 .../server/lib/saved_objects/migrations.ts | 0 .../server/lib/saved_objects/saved_objects.ts | 0 .../server/lib/saved_objects/service_api_key.ts | 0 .../server/lib/saved_objects/synthetics_monitor.ts | 0 .../server/lib/saved_objects/uptime_settings.ts | 0 .../lib/synthetics_service/formatters/browser.ts | 0 .../lib/synthetics_service/formatters/common.ts | 0 .../formatters/convert_to_data_stream.test.ts | 0 .../formatters/convert_to_data_stream.ts | 0 .../formatters/format_configs.test.ts | 0 .../synthetics_service/formatters/format_configs.ts | 0 .../lib/synthetics_service/formatters/http.ts | 0 .../lib/synthetics_service/formatters/icmp.ts | 0 .../lib/synthetics_service/formatters/index.ts | 0 .../server/lib/synthetics_service/formatters/tcp.ts | 0 .../server/lib/synthetics_service/formatters/tls.ts | 0 .../lib/synthetics_service/get_api_key.test.ts | 0 .../server/lib/synthetics_service/get_api_key.ts | 0 .../lib/synthetics_service/get_es_hosts.test.ts | 0 .../server/lib/synthetics_service/get_es_hosts.ts | 0 .../get_service_locations.test.ts | 0 .../lib/synthetics_service/get_service_locations.ts | 0 .../synthetics_service/hydrate_saved_object.test.ts | 0 .../lib/synthetics_service/hydrate_saved_object.ts | 0 .../lib/synthetics_service/service_api_client.ts | 0 .../synthetics_service/synthetics_service.test.ts | 0 .../lib/synthetics_service/synthetics_service.ts | 0 .../server/lib/synthetics_service/utils/secrets.ts | 0 .../server/lib/telemetry/__mocks__/index.ts | 0 .../server/lib/telemetry/constants.ts | 0 .../server/lib/telemetry/queue.test.ts | 0 .../server/lib/telemetry/queue.ts | 0 .../server/lib/telemetry/sender.test.ts | 0 .../server/lib/telemetry/sender.ts | 0 .../server/lib/telemetry/types.ts | 0 .../plugins/{uptime => synthetics}/server/plugin.ts | 0 .../server/rest_api/create_route_with_auth.ts | 0 .../server/rest_api/dynamic_settings.test.ts | 0 .../server/rest_api/dynamic_settings.ts | 0 .../{uptime => synthetics}/server/rest_api/index.ts | 0 .../server/rest_api/index_state/get_index_status.ts | 0 .../server/rest_api/index_state/index.ts | 0 .../server/rest_api/monitors/index.ts | 0 .../server/rest_api/monitors/monitor_list.ts | 0 .../server/rest_api/monitors/monitor_locations.ts | 0 .../server/rest_api/monitors/monitor_status.ts | 0 .../server/rest_api/monitors/monitors_details.ts | 0 .../server/rest_api/monitors/monitors_durations.ts | 0 .../rest_api/network_events/get_network_events.ts | 0 .../server/rest_api/network_events/index.ts | 0 .../server/rest_api/pings/get_ping_histogram.ts | 0 .../server/rest_api/pings/get_pings.ts | 0 .../server/rest_api/pings/index.ts | 0 .../pings/journey_screenshot_blocks.test.ts | 0 .../rest_api/pings/journey_screenshot_blocks.ts | 0 .../rest_api/pings/journey_screenshots.test.ts | 0 .../server/rest_api/pings/journey_screenshots.ts | 0 .../server/rest_api/pings/journeys.ts | 0 .../server/rest_api/snapshot/get_snapshot_count.ts | 0 .../server/rest_api/snapshot/index.ts | 0 .../rest_api/synthetics/last_successful_check.ts | 0 .../rest_api/synthetics_service/add_monitor.ts | 0 .../rest_api/synthetics_service/delete_monitor.ts | 0 .../rest_api/synthetics_service/edit_monitor.ts | 0 .../rest_api/synthetics_service/enablement.ts | 0 .../rest_api/synthetics_service/get_monitor.ts | 0 .../synthetics_service/get_service_allowed.ts | 0 .../synthetics_service/get_service_locations.ts | 0 .../synthetics_service/install_index_templates.ts | 0 .../synthetics_service/monitor_validation.test.ts | 0 .../synthetics_service/monitor_validation.ts | 0 .../rest_api/synthetics_service/run_once_monitor.ts | 0 .../rest_api/synthetics_service/service_errors.ts | 0 .../telemetry/monitor_upgrade_sender.test.ts | 0 .../telemetry/monitor_upgrade_sender.ts | 0 .../rest_api/synthetics_service/test_now_monitor.ts | 0 .../server/rest_api/telemetry/index.ts | 0 .../server/rest_api/telemetry/log_page_view.ts | 0 .../{uptime => synthetics}/server/rest_api/types.ts | 0 .../server/rest_api/uptime_route_wrapper.ts | 0 .../plugins/{uptime => synthetics}/server/types.ts | 0 .../{uptime => synthetics}/server/uptime_server.ts | 0 x-pack/plugins/{uptime => synthetics}/tsconfig.json | 0 x-pack/plugins/translations/translations/fr-FR.json | 1 - x-pack/plugins/translations/translations/ja-JP.json | 1 - x-pack/plugins/translations/translations/zh-CN.json | 1 - .../api_integration/apis/uptime/feature_controls.ts | 2 +- .../api_integration/apis/uptime/get_all_pings.ts | 2 +- .../api_integration/apis/uptime/rest/add_monitor.ts | 6 +++--- .../test/api_integration/apis/uptime/rest/certs.ts | 4 ++-- .../apis/uptime/rest/delete_monitor.ts | 4 ++-- .../apis/uptime/rest/dynamic_settings.ts | 4 ++-- .../apis/uptime/rest/edit_monitor.ts | 6 +++--- .../api_integration/apis/uptime/rest/get_monitor.ts | 6 +++--- .../test/api_integration/apis/uptime/rest/index.ts | 2 +- .../apis/uptime/rest/index_status.ts | 2 +- .../apis/uptime/rest/monitor_duration.ts | 2 +- .../apis/uptime/rest/monitor_latest_status.ts | 2 +- .../apis/uptime/rest/monitor_states_generated.ts | 4 ++-- .../apis/uptime/rest/monitor_states_real_data.ts | 4 ++-- .../apis/uptime/rest/ping_histogram.ts | 2 +- .../api_integration/apis/uptime/rest/ping_list.ts | 4 ++-- .../api_integration/apis/uptime/rest/snapshot.ts | 2 +- .../apis/uptime/rest/synthetics_enablement.ts | 4 ++-- .../apis/uptime/rest/telemetry_collectors.ts | 2 +- .../apis/uptime/rest/telemetry_collectors_fleet.ts | 2 +- x-pack/test/functional/apps/uptime/index.ts | 2 +- x-pack/test/functional/apps/uptime/settings.ts | 4 ++-- x-pack/test/functional/services/uptime/settings.ts | 2 +- x-pack/test/tsconfig.json | 2 +- 1095 files changed, 58 insertions(+), 61 deletions(-) rename x-pack/plugins/{uptime => synthetics}/.buildkite/pipelines/flaky.js (100%) rename x-pack/plugins/{uptime => synthetics}/.buildkite/pipelines/flaky.sh (100%) rename x-pack/plugins/{uptime => synthetics}/README.md (100%) rename x-pack/plugins/{uptime => synthetics}/common/config.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/alerts.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/capabilities.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/chart_format_limits.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/client_defaults.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/context_defaults.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/monitor_management.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/plugin.ts (79%) rename x-pack/plugins/{uptime => synthetics}/common/constants/query.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/rest_api.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/settings_defaults.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/constants/ui.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/__snapshots__/assert_close_to.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/__snapshots__/stringify_kueries.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/assert_close_to.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/assert_close_to.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/combine_filters_and_user_search.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/combine_filters_and_user_search.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/get_histogram_interval.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/get_histogram_interval.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/ml.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/ml.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/schedule_to_time.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/schedule_to_time.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/stringify_kueries.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/lib/stringify_kueries.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/requests/get_certs_request_body.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/rules/uptime_rule_field_map.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/alerts/common.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/alerts/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/alerts/status_check.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/certs.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/common.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/dynamic_settings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor/locations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor/state.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor_management/config_key.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor_management/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor_management/locations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor_management/monitor_configs.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor_management/monitor_meta_data.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor_management/monitor_types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/monitor_management/state.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/network_events.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/ping/histogram.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/ping/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/ping/ping.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/ping/synthetics.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/ping/synthetics.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/snapshot/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/snapshot/snapshot_count.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/runtime_types/synthetics_service_api_key.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/types/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/types/monitor_duration.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/types/monitor_validation.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/types/saved_objects.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/types/synthetics_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/utils/as_mutable_array.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/utils/es_search.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/utils/get_monitor_url.ts (100%) rename x-pack/plugins/{uptime => synthetics}/common/utils/t_enum.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/config.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/fixtures/es_archiver/browser/data.json.gz (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/fixtures/es_archiver/browser/mappings.json (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/fixtures/es_archiver/full_heartbeat/data.json.gz (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/fixtures/es_archiver/full_heartbeat/mappings.json (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/helpers/make_checks.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/helpers/make_ping.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/helpers/make_tls.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/alerts/default_email_settings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/alerts/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/alerts/status_alert_flyouts_in_alerting_app.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/data_view_permissions.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/locations/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/locations/locations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/monitor_details.journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/monitor_details/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/monitor_details/monitor_alerts.journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/monitor_details/monitor_details.journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/monitor_details/ping_redirects.journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/monitor_management.journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/monitor_management_enablement.journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/monitor_name.journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/read_only_user/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/read_only_user/monitor_management.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/step_duration.journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/uptime.journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/journeys/utils.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/page_objects/login.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/page_objects/monitor_details.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/page_objects/monitor_management.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/page_objects/settings.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/page_objects/utils.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/playwright_run.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/playwright_start.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/tasks/es_archiver.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/tasks/import_monitors.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/tasks/read_kibana_config.ts (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/tasks/uptime_monitor.ndjson (100%) rename x-pack/plugins/{uptime => synthetics}/e2e/tsconfig.json (100%) rename x-pack/plugins/{uptime => synthetics}/jest.config.js (70%) rename x-pack/plugins/{uptime => synthetics}/kibana.json (97%) rename x-pack/plugins/{uptime => synthetics}/public/apps/__snapshots__/uptime_page_template.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/apps/locators/overview.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/apps/locators/overview.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/apps/plugin.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/apps/render_app.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/apps/uptime_app.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/apps/uptime_overview_fetcher.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/apps/uptime_page_template.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/apps/uptime_page_template.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/apps/use_no_data_config.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/badge.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/__snapshots__/cert_monitors.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/__snapshots__/cert_search.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/__snapshots__/cert_status.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/cert_monitors.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/cert_monitors.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/cert_refresh_btn.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/cert_search.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/cert_search.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/cert_status.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/cert_status.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/certificate_title.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/certificates_list.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/certificates_list.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/fingerprint_col.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/fingerprint_col.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/certificates/use_cert_search.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/__snapshots__/location_link.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/__snapshots__/monitor_page_link.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/__snapshots__/monitor_tags.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/alerts/uptime_edit_alert_flyout.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/__snapshots__/chart_empty_state.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/__snapshots__/chart_wrapper.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/__snapshots__/donut_chart.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/__snapshots__/donut_chart_legend_row.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/__snapshots__/monitor_bar_series.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/annotation_tooltip.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/chart_empty_state.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/chart_empty_state.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/chart_wrapper.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/chart_wrapper/chart_wrapper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/chart_wrapper/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/donut_chart.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/donut_chart.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/donut_chart_legend.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/donut_chart_legend.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/donut_chart_legend_row.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/donut_chart_legend_row.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/duration_chart.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/duration_charts.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/duration_line_bar_list.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/duration_line_series_list.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/get_tick_format.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/get_tick_format.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/monitor_bar_series.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/monitor_bar_series.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/ping_histogram.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/ping_histogram.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/utils.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/charts/utils.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/header/action_menu.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/header/action_menu_content.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/header/action_menu_content.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/header/inspector_header_link.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/header/manage_monitors_btn.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/header/page_tabs.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/header/page_tabs.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/higher_order/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/higher_order/responsive_wrapper.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/higher_order/responsive_wrapper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/location_link.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/location_link.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/monitor_page_link.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/monitor_page_link.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/monitor_tags.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/monitor_tags.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/react_router_helpers/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/react_router_helpers/link_events.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/react_router_helpers/link_events.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/react_router_helpers/link_for_eui.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/react_router_helpers/link_for_eui.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/step_detail_link.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/uptime_date_picker.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/common/uptime_date_picker.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/advanced_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/advanced_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/formatters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/normalizers.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/normalizers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/script_recorder_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/script_recorder_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/simple_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/source_field.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/source_field.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/throttling_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/throttling_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/uploader.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/zip_url_tls_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/browser/zip_url_tls_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/code_editor.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/combo_box.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/combo_box.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/common_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/default_values.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/described_form_group_with_wrap.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/enabled.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/formatters.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/formatters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/normalizers.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/normalizers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/simple_fields_wrapper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/common/tls_options.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/browser_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/browser_context_advanced.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/browser_provider.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/http_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/http_context_advanced.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/http_provider.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/icmp_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/policy_config_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/synthetics_context_providers.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/tcp_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/tcp_context_advanced.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/tcp_provider.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/contexts/tls_fields_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/custom_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/custom_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/header_field.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/header_field.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/helpers/context_helpers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/helpers/formatters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/helpers/normalizers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/hooks/use_policy.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/hooks/use_update_policy.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/hooks/use_update_policy.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/http/advanced_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/http/advanced_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/http/formatters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/http/normalizers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/http/simple_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/icmp/advanced_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/icmp/advanced_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/icmp/formatters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/icmp/normalizers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/icmp/simple_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/index.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/index_response_body_field.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/index_response_body_field.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/key_value_field.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/key_value_field.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/lazy_synthetics_custom_assets_extension.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/lazy_synthetics_policy_create_extension.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/lazy_synthetics_policy_edit_extension.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/optional_label.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/request_body_field.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/request_body_field.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/schedule_field.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/schedule_field.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/synthetics_custom_assets_extension.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/synthetics_policy_create_extension.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/synthetics_policy_create_extension_wrapper.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/synthetics_policy_create_extension_wrapper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/synthetics_policy_edit_extension.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tcp/advanced_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tcp/advanced_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tcp/formatters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tcp/normalizers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tcp/simple_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tls/default_values.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tls/formatters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tls/normalizers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tls_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/tls_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/types.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/validation.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/fleet_package/validation.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/__snapshots__/monitor_charts.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/__snapshots__/confirm_delete.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/__snapshots__/ml_integerations.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/confirm_alert_delete.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/confirm_delete.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/confirm_delete.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/license_info.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/license_info.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/manage_ml_job.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/ml_flyout.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/ml_flyout.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/ml_flyout_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/ml_integeration.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/ml_integerations.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/ml_job_link.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/ml_job_link.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/ml_manage_job.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/translations.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ml/use_anomaly_alert.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/monitor_charts.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/monitor_charts.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/monitor_duration/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/monitor_duration/monitor_duration.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/monitor_duration/monitor_duration_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/monitor_title.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/monitor_title.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_histogram/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_histogram/ping_histogram_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/__snapshots__/expanded_row.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/__snapshots__/ping_headers.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/expand_row.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/expand_row.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/failed_step.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_error.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_status.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/ping_timestamp/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/columns/response_code.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/doc_link_body.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/doc_link_body.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/expanded_row.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/expanded_row.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/headers.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/index.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/location_name.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/ping_headers.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/ping_list.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/ping_list.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/ping_list_header.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/ping_list_table.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/ping_redirects.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/response_code.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/ping_list/use_pings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/__snapshots__/monitor_status.bar.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/__snapshots__/ssl_certificate.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/__snapshots__/status_by_location.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/availability_reporting/__snapshots__/tag_label.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/availability_reporting/availability_reporting.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/availability_reporting/availability_reporting.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/availability_reporting/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/availability_reporting/location_status_tags.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/availability_reporting/location_status_tags.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/availability_reporting/tag_label.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/availability_reporting/tag_label.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/location_availability/location_availability.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/location_availability/location_availability.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/monitor_status.bar.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/ssl_certificate.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_bar/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_bar/monitor_redirects.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_bar/ssl_certificate.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_bar/status_bar.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_bar/status_bar.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_bar/status_by_location.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_bar/use_status_bar.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_by_location.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_details.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/status_details_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/status_details/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/step_detail_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/step_page_nav.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/step_page_title.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumb.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumbs.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/README.md (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/constants.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/legend.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/network_requests_total.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/network_requests_total.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/sidebar.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/styles.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/use_bar_charts.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/use_bar_charts.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/use_flyout.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/use_flyout.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_bar_chart.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_chart.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_chart_fixed_axis.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_flyout_table.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_marker_test_helper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_markers.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/context/waterfall_chart.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/index.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor/synthetics/waterfall/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/action_bar/action_bar.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/action_bar/action_bar.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/action_bar/action_bar_errors.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/action_bar/action_bar_portal.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/add_monitor_btn.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/content/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/edit_monitor_config.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_enablement.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_format_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_inline_errors.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_inline_errors.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_inline_errors_count.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_inline_errors_count.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_invalid_monitors.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_locations.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_locations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_run_once_errors.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/hooks/use_service_allowed.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/loader/loader.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/loader/loader.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/mocks/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/mocks/locations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/locations.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/locations.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/monitor_advanced_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/monitor_config.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/monitor_config.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/monitor_fields.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/monitor_fields.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/monitor_name_location.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/use_monitor_name.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_config/use_monitor_name.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/actions.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/actions.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/all_monitors.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/delete_monitor.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/delete_monitor.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/enablement_empty_state.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/inline_error.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/inline_error.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/invalid_monitors.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/list_tabs.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/list_tabs.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/monitor_async_error.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/monitor_async_error.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/monitor_enabled.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/monitor_enabled.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/monitor_list.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/monitor_list.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/monitor_list_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/monitor_locations.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/stderr_logs_popover.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/monitor_list/tags.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/show_sync_errors.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/browser/browser_test_results.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/browser/browser_test_results.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/simple/simple_test_results.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/simple/simple_test_results.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/simple/use_simple_run_once_monitors.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/test_now_mode.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/test_now_mode.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/test_result_header.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/test_result_header.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/test_run_results.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/test_now_mode/use_tick_tick.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/validation.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/monitor_management/validation.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/__snapshots__/snapshot_heading.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alert_expression_popover.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alert_field_number.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alert_field_number.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alert_query_bar/query_bar.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alert_tls.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alerts_containers/alert_tls.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alerts_containers/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/alerts_containers/use_snap_shot.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/anomaly_alert/anomaly_alert.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/anomaly_alert/select_severity.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/anomaly_alert/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/__snapshots__/down_number_select.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/__snapshots__/time_expression_select.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/availability_expression_select.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/down_number_select.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/down_number_select.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/filters_expression_select.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/status_expression_select.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/time_expression_select.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/time_unit_selectable.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_expressions/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_status_alert/add_filter_btn.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_status_alert/add_filter_btn.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_status_alert/old_alert_call_out.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/monitor_status_alert/old_alert_callout.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/settings_message_expression_popover.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/toggle_alert_flyout_button.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/toggle_alert_flyout_button.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/empty_state/empty_state_error.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/empty_state/empty_state_loading.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/empty_state/use_has_data.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/filter_group/filter_group.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/filter_group/filter_group.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/filter_group/selected_filters.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/filter_group/translations.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/__snapshots__/filter_status_button.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/__snapshots__/status_filter.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/cert_status_column.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/define_connectors.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/define_connectors.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/enable_alert.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/enable_alert.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/monitor_name_col.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/monitor_status_column.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/monitor_status_column.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/progress/browser_monitor_progress.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/progress/monitor_progress.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/progress/simple_monitor_progress.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/progress/use_updated_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/status_badge.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/status_badge.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/test_now_col.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/columns/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/filter_status_button.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/filter_status_button.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_group.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_link.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/monitor_list_drawer.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/most_recent_error.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/data.json (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/enabled_alerts.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/integration_group.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/integration_link.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/monitor_url.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_drawer/most_recent_run.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_header.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_page_size_select.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/monitor_list_page_size_select.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/no_items_meesage.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/no_items_message.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/overview_page_link.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/parse_timestamp.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/parse_timestamp.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/status_filter.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/status_filter.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/troubleshoot_popover.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/monitor_list/use_monitor_histogram.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/query_bar/query_bar.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/query_bar/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/query_bar/use_query_bar.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/query_bar/use_query_bar.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/snapshot/__snapshots__/snapshot.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/snapshot/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/snapshot/snapshot.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/snapshot/snapshot.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/snapshot/snapshot_heading.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/snapshot/use_snap_shot.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/snapshot_heading.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/status_panel.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/synthetics_callout.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/overview/synthetics_callout.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/__snapshots__/certificate_form.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/__snapshots__/indices_form.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/add_connector_flyout.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/alert_defaults_form.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/certificate_form.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/certificate_form.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/default_email.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/indices_form.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/indices_form.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/settings_actions.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/settings_bottom_bar.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/settings/use_settings_errors.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/stderr_logs.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/step_duration.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/step_expanded_row/screenshot_link.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/step_field_trend.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/step_field_trend.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/step_image.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/steps_list.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/steps_list.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/use_check_steps.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/use_expanded_row.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/use_expanded_row.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/check_steps/use_std_error_logs.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/code_block_accordion.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/console_event.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/console_event.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/console_output_event_list.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/console_output_event_list.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/empty_journey.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/empty_journey.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/executed_step.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/executed_step.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/status_badge.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/status_badge.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/step_screenshot_display.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/step_screenshot_display.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/components/synthetics/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/contexts/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/contexts/uptime_index_pattern_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/contexts/uptime_refresh_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/contexts/uptime_settings_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/contexts/uptime_startup_plugins_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/contexts/uptime_theme_context.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/__snapshots__/use_url_params.test.tsx.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/update_kuery_string.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_breadcrumbs.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_breadcrumbs.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_breakpoints.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_breakpoints.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_cert_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_chart_theme.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_composite_image.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_composite_image.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_filter_update.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_filter_update.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_init_app.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_mapping_check.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_mapping_check.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_overview_filter_check.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_overview_filter_check.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_search_text.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_selected_filters.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_selected_filters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_telemetry.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_url_params.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/hooks/use_url_params.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/icons/heartbeat_white.svg (100%) rename x-pack/plugins/{uptime => synthetics}/public/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/__mocks__/screenshot_ref.mock.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/__mocks__/uptime_plugin_start_mock.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/__mocks__/uptime_store.mock.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/__mocks__/use_composite_image.mock.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/__mocks__/ut_router_history.mock.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/adapters/framework/capabilities_adapter.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/alert_messages.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/common.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/duration_anomaly.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/lazy_wrapper/duration_anomaly.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/lazy_wrapper/monitor_status.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/lazy_wrapper/tls_alert.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/lazy_wrapper/validate_monitor_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/monitor_status.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/monitor_status.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/tls.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/alert_types/tls_legacy.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/formatting.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/charts/get_chart_date_label.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/charts/get_label_format.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/charts/get_label_format.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/charts/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/charts/is_within_current_date.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/charts/is_within_current_date.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/compose_screenshot_images.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/compose_screenshot_images.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/convert_measurements.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/convert_measurements.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/enzyme_helpers.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/get_title.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/helper_with_redux.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/observability_integration/add_base_path.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/observability_integration/build_href.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/observability_integration/get_apm_href.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/observability_integration/get_apm_href.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/observability_integration/get_infra_href.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/observability_integration/get_infra_href.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/observability_integration/get_logging_href.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/observability_integration/get_logging_href.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/observability_integration/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/parse_search.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/parse_search.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/rtl_helpers.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/series_has_down_values.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/series_has_down_values.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/spy_use_fetcher.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/stringify_url_params.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/stringify_url_params.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/test_helpers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/__snapshots__/get_supported_url_params.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/get_supported_url_params.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/get_supported_url_params.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/parse_absolute_date.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/parse_absolute_date.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/parse_is_paused.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/parse_is_paused.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/parse_url_int.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/helper/url_params/parse_url_int.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/lib/lib.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/certificates.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/certificates.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/mapping_error.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor_management/action_bar_portal_node.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor_management/add_monitor.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor_management/bottom_bar.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor_management/content.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor_management/edit_monitor.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor_management/monitor_management.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor_management/service_allowed_wrapper.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor_management/service_allowed_wrapper.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/monitor_management/use_monitor_management_breadcrumbs.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/not_found.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/not_found.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/overview.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/overview.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/settings.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/settings.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/synthetics/checks_navigation.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/synthetics/step_detail_page.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/synthetics/synthetics_checks.test.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/synthetics/synthetics_checks.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/pages/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/routes.tsx (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/alerts.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/dynamic_settings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/index_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/ml_anomaly.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/monitor_duration.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/monitor_list.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/monitor_management.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/monitor_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/network_events.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/ping.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/selected_filters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/snapshot.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/ui.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/actions/utils.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/alerts/alerts.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/__snapshots__/snapshot.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/alert_actions.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/alert_actions.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/alerts.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/dynamic_settings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/index_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/ml_anomaly.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/monitor_duration.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/monitor_list.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/monitor_management.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/monitor_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/network_events.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/ping.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/snapshot.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/snapshot.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/api/utils.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/certificates/certificates.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/alerts.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/dynamic_settings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/fetch_effect.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/fetch_effect.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/index_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/journey.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/ml_anomaly.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/monitor_duration.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/monitor_list.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/monitor_management.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/monitor_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/network_events.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/ping.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/synthetic_journey_blocks.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/effects/test_now_runs.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/kibana_service.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/dynamic_settings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/index_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/journey.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/ml_anomaly.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/monitor_duration.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/monitor_list.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/monitor_management.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/monitor_status.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/monitor_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/network_events.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/ping.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/ping_list.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/selected_filters.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/selected_filters.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/synthetics.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/synthetics.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/test_now_runs.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/ui.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/ui.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/reducers/utils.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/selectors/index.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/public/state/selectors/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/scripts/e2e.js (100%) rename x-pack/plugins/{uptime => synthetics}/server/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/kibana.index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/adapters/framework/adapter_types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/adapters/framework/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/adapters/framework/kibana_framework_adapter.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/adapters/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/adapters/telemetry/__snapshots__/kibana_telemetry_adapter.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/adapters/telemetry/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/adapters/telemetry/kibana_telemetry_adapter.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/adapters/telemetry/kibana_telemetry_adapter.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/adapters/telemetry/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/action_variables.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/common.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/common.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/duration_anomaly.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/duration_anomaly.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/status_check.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/status_check.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/test_utils/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/tls.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/tls.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/tls_legacy.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/tls_legacy.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/translations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/alerts/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/compose/kibana.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/domains/__snapshots__/license.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/domains/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/domains/license.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/domains/license.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/helper/__snapshots__/get_filter_clause.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/helper/get_filter_clause.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/helper/get_filter_clause.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/helper/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/helper/make_date_rate_filter.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/helper/object_to_array.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/helper/parse_relative_date.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/lib.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/__fixtures__/monitor_charts_mock.json (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/__snapshots__/generate_filter_aggs.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/__snapshots__/get_monitor_charts.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/__snapshots__/get_monitor_details.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/__snapshots__/get_ping_histogram.test.ts.snap (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/generate_filter_aggs.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/generate_filter_aggs.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_certs.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_certs.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_index_pattern.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_index_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_details.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_details.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_failed_steps.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_failed_steps.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_screenshot.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_screenshot.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_screenshot_blocks.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_screenshot_blocks.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_steps.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_journey_steps.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_last_successful_check.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_last_successful_check.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_latest_monitor.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_latest_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_availability.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_availability.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_charts.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_details.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_details.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_duration.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_locations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_states.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_status.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_monitor_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_network_events.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_network_events.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_ping_histogram.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_ping_histogram.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_pings.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_pings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/get_snapshot_counts.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/helper.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/fetch_chunk.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/find_potential_matches.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/monitor_summary_iterator.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/monitor_summary_iterator.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/query_context.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/query_context.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/refine_potential_matches.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/test_helpers.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/requests/search/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/saved_objects/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/saved_objects/migrations.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/saved_objects/migrations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/saved_objects/saved_objects.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/saved_objects/service_api_key.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/saved_objects/synthetics_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/saved_objects/uptime_settings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/browser.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/common.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/convert_to_data_stream.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/convert_to_data_stream.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/format_configs.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/format_configs.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/http.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/icmp.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/tcp.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/formatters/tls.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/get_api_key.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/get_api_key.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/get_es_hosts.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/get_es_hosts.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/get_service_locations.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/get_service_locations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/hydrate_saved_object.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/hydrate_saved_object.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/service_api_client.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/synthetics_service.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/synthetics_service.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/synthetics_service/utils/secrets.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/telemetry/__mocks__/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/telemetry/constants.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/telemetry/queue.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/telemetry/queue.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/telemetry/sender.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/telemetry/sender.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/lib/telemetry/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/plugin.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/create_route_with_auth.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/dynamic_settings.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/dynamic_settings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/index_state/get_index_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/index_state/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/monitors/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/monitors/monitor_list.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/monitors/monitor_locations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/monitors/monitor_status.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/monitors/monitors_details.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/monitors/monitors_durations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/network_events/get_network_events.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/network_events/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/pings/get_ping_histogram.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/pings/get_pings.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/pings/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/pings/journey_screenshot_blocks.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/pings/journey_screenshot_blocks.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/pings/journey_screenshots.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/pings/journey_screenshots.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/pings/journeys.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/snapshot/get_snapshot_count.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/snapshot/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics/last_successful_check.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/add_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/delete_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/edit_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/enablement.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/get_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/get_service_allowed.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/get_service_locations.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/install_index_templates.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/monitor_validation.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/monitor_validation.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/run_once_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/service_errors.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.test.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/synthetics_service/test_now_monitor.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/telemetry/index.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/telemetry/log_page_view.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/rest_api/uptime_route_wrapper.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/types.ts (100%) rename x-pack/plugins/{uptime => synthetics}/server/uptime_server.ts (100%) rename x-pack/plugins/{uptime => synthetics}/tsconfig.json (100%) diff --git a/.buildkite/scripts/steps/functional/uptime.sh b/.buildkite/scripts/steps/functional/uptime.sh index a1c8c2bf6c85b..ce49acadf4deb 100755 --- a/.buildkite/scripts/steps/functional/uptime.sh +++ b/.buildkite/scripts/steps/functional/uptime.sh @@ -13,5 +13,5 @@ echo "--- Uptime @elastic/synthetics Tests" cd "$XPACK_DIR" -checks-reporter-with-killswitch "Uptime @elastic/synthetics Tests" \ - node plugins/uptime/scripts/e2e.js --kibana-install-dir "$KIBANA_BUILD_LOCATION" ${GREP:+--grep \"${GREP}\"} +checks-reporter-with-killswitch "uptime plugin @elastic/synthetics Tests" \ + node plugins/synthetics/scripts/e2e.js --kibana-install-dir "$KIBANA_BUILD_LOCATION" ${GREP:+--grep \"${GREP}\"} diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index e96f1cd819186..90bf3d3c29b41 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -613,6 +613,11 @@ the alertTypes by the Stack in the alerting plugin, register associated HTTP routes, etc. +|{kib-repo}blob/{branch}/x-pack/plugins/synthetics/README.md[synthetics] +|The purpose of this plugin is to provide users of Heartbeat more visibility of what's happening +in their infrastructure. + + |{kib-repo}blob/{branch}/x-pack/plugins/task_manager/README.md[taskManager] |The task manager is a generic system for running background tasks. Documentation: https://www.elastic.co/guide/en/kibana/master/task-manager-production-considerations.html @@ -648,11 +653,6 @@ As a developer you can reuse and extend built-in alerts and actions UI functiona |Upgrade Assistant helps users prepare their Stack for being upgraded to the next major. It will only be enabled on the last minor before the next major release. This is controlled via the config: xpack.upgrade_assistant.readonly (#101296). -|{kib-repo}blob/{branch}/x-pack/plugins/uptime/README.md[uptime] -|The purpose of this plugin is to provide users of Heartbeat more visibility of what's happening -in their infrastructure. - - |{kib-repo}blob/{branch}/x-pack/plugins/drilldowns/url_drilldown/README.md[urlDrilldown] |NOTE: This plugin contains implementation of URL drilldown. For drilldowns infrastructure code refer to ui_actions_enhanced plugin. diff --git a/packages/kbn-babel-preset/styled_components_files.js b/packages/kbn-babel-preset/styled_components_files.js index a1d94136ebfb1..a8b1234a406fd 100644 --- a/packages/kbn-babel-preset/styled_components_files.js +++ b/packages/kbn-babel-preset/styled_components_files.js @@ -14,7 +14,7 @@ module.exports = { USES_STYLED_COMPONENTS: [ /packages[\/\\]kbn-ui-shared-deps-(npm|src)[\/\\]/, /src[\/\\]plugins[\/\\](unified_search|kibana_react)[\/\\]/, - /x-pack[\/\\]plugins[\/\\](apm|beats_management|cases|fleet|infra|lists|observability|osquery|security_solution|timelines|uptime|ux)[\/\\]/, + /x-pack[\/\\]plugins[\/\\](apm|beats_management|cases|fleet|infra|lists|observability|osquery|security_solution|timelines|synthetics|ux)[\/\\]/, /x-pack[\/\\]test[\/\\]plugin_functional[\/\\]plugins[\/\\]resolver_test[\/\\]/, ], }; diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index f2f3fbc07aac8..16a99469de7c5 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -58,7 +58,6 @@ pageLoadAssetSize: transform: 41007 triggersActionsUi: 103400 upgradeAssistant: 81241 - uptime: 40825 urlForwarding: 32579 usageCollection: 39762 visDefaultEditor: 50178 @@ -128,3 +127,4 @@ pageLoadAssetSize: expressionXY: 26500 eventAnnotation: 19334 screenshotting: 22870 + synthetics: 40958 diff --git a/src/dev/typescript/projects.ts b/src/dev/typescript/projects.ts index a2e3d578205e4..6d9b372069b22 100644 --- a/src/dev/typescript/projects.ts +++ b/src/dev/typescript/projects.ts @@ -68,7 +68,7 @@ export const PROJECTS = [ name: 'fleet/cypress', }), - createProject('x-pack/plugins/uptime/e2e/tsconfig.json', { + createProject('x-pack/plugins/synthetics/e2e/tsconfig.json', { name: 'uptime/synthetics-e2e-tests', disableTypeCheck: true, }), diff --git a/tsconfig.base.json b/tsconfig.base.json index b8dfc58796297..ac35847201b7f 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -389,6 +389,8 @@ "@kbn/spaces-plugin/*": ["x-pack/plugins/spaces/*"], "@kbn/stack-alerts-plugin": ["x-pack/plugins/stack_alerts"], "@kbn/stack-alerts-plugin/*": ["x-pack/plugins/stack_alerts/*"], + "@kbn/synthetics-plugin": ["x-pack/plugins/synthetics"], + "@kbn/synthetics-plugin/*": ["x-pack/plugins/synthetics/*"], "@kbn/task-manager-plugin": ["x-pack/plugins/task_manager"], "@kbn/task-manager-plugin/*": ["x-pack/plugins/task_manager/*"], "@kbn/telemetry-collection-xpack-plugin": ["x-pack/plugins/telemetry_collection_xpack"], @@ -405,8 +407,6 @@ "@kbn/ui-actions-enhanced-plugin/*": ["x-pack/plugins/ui_actions_enhanced/*"], "@kbn/upgrade-assistant-plugin": ["x-pack/plugins/upgrade_assistant"], "@kbn/upgrade-assistant-plugin/*": ["x-pack/plugins/upgrade_assistant/*"], - "@kbn/uptime-plugin": ["x-pack/plugins/uptime"], - "@kbn/uptime-plugin/*": ["x-pack/plugins/uptime/*"], "@kbn/ux-plugin": ["x-pack/plugins/ux"], "@kbn/ux-plugin/*": ["x-pack/plugins/ux/*"], "@kbn/watcher-plugin": ["x-pack/plugins/watcher"], diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 3960cdd76a761..f72f8d135ff3d 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -60,7 +60,7 @@ "xpack.transform": "plugins/transform", "xpack.triggersActionsUI": "plugins/triggers_actions_ui", "xpack.upgradeAssistant": "plugins/upgrade_assistant", - "xpack.uptime": ["plugins/uptime"], + "xpack.uptime": ["plugins/synthetics"], "xpack.ux": ["plugins/ux"], "xpack.urlDrilldown": "plugins/drilldowns/url_drilldown", "xpack.watcher": "plugins/watcher", diff --git a/x-pack/plugins/uptime/.buildkite/pipelines/flaky.js b/x-pack/plugins/synthetics/.buildkite/pipelines/flaky.js similarity index 100% rename from x-pack/plugins/uptime/.buildkite/pipelines/flaky.js rename to x-pack/plugins/synthetics/.buildkite/pipelines/flaky.js diff --git a/x-pack/plugins/uptime/.buildkite/pipelines/flaky.sh b/x-pack/plugins/synthetics/.buildkite/pipelines/flaky.sh similarity index 100% rename from x-pack/plugins/uptime/.buildkite/pipelines/flaky.sh rename to x-pack/plugins/synthetics/.buildkite/pipelines/flaky.sh diff --git a/x-pack/plugins/uptime/README.md b/x-pack/plugins/synthetics/README.md similarity index 100% rename from x-pack/plugins/uptime/README.md rename to x-pack/plugins/synthetics/README.md diff --git a/x-pack/plugins/uptime/common/config.ts b/x-pack/plugins/synthetics/common/config.ts similarity index 100% rename from x-pack/plugins/uptime/common/config.ts rename to x-pack/plugins/synthetics/common/config.ts diff --git a/x-pack/plugins/uptime/common/constants/alerts.ts b/x-pack/plugins/synthetics/common/constants/alerts.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/alerts.ts rename to x-pack/plugins/synthetics/common/constants/alerts.ts diff --git a/x-pack/plugins/uptime/common/constants/capabilities.ts b/x-pack/plugins/synthetics/common/constants/capabilities.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/capabilities.ts rename to x-pack/plugins/synthetics/common/constants/capabilities.ts diff --git a/x-pack/plugins/uptime/common/constants/chart_format_limits.ts b/x-pack/plugins/synthetics/common/constants/chart_format_limits.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/chart_format_limits.ts rename to x-pack/plugins/synthetics/common/constants/chart_format_limits.ts diff --git a/x-pack/plugins/uptime/common/constants/client_defaults.ts b/x-pack/plugins/synthetics/common/constants/client_defaults.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/client_defaults.ts rename to x-pack/plugins/synthetics/common/constants/client_defaults.ts diff --git a/x-pack/plugins/uptime/common/constants/context_defaults.ts b/x-pack/plugins/synthetics/common/constants/context_defaults.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/context_defaults.ts rename to x-pack/plugins/synthetics/common/constants/context_defaults.ts diff --git a/x-pack/plugins/uptime/common/constants/index.ts b/x-pack/plugins/synthetics/common/constants/index.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/index.ts rename to x-pack/plugins/synthetics/common/constants/index.ts diff --git a/x-pack/plugins/uptime/common/constants/monitor_management.ts b/x-pack/plugins/synthetics/common/constants/monitor_management.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/monitor_management.ts rename to x-pack/plugins/synthetics/common/constants/monitor_management.ts diff --git a/x-pack/plugins/uptime/common/constants/plugin.ts b/x-pack/plugins/synthetics/common/constants/plugin.ts similarity index 79% rename from x-pack/plugins/uptime/common/constants/plugin.ts rename to x-pack/plugins/synthetics/common/constants/plugin.ts index 6785bbc106aa2..8c1506621ba8c 100644 --- a/x-pack/plugins/uptime/common/constants/plugin.ts +++ b/x-pack/plugins/synthetics/common/constants/plugin.ts @@ -10,13 +10,13 @@ import { i18n } from '@kbn/i18n'; export const PLUGIN = { APP_ROOT_ID: 'react-uptime-root', DESCRIPTION: i18n.translate('xpack.uptime.pluginDescription', { - defaultMessage: 'Uptime monitoring', + defaultMessage: 'Synthetics monitoring', description: 'The description text that will appear in the feature catalogue.', }), ID: 'uptime', LOCAL_STORAGE_KEY: 'xpack.uptime', - NAME: i18n.translate('xpack.uptime.featureRegistry.uptimeFeatureName', { - defaultMessage: 'Uptime', + NAME: i18n.translate('xpack.uptime.featureRegistry.syntheticsFeatureName', { + defaultMessage: 'Synthetics and Uptime', }), TITLE: i18n.translate('xpack.uptime.uptimeFeatureCatalogueTitle', { defaultMessage: 'Uptime', diff --git a/x-pack/plugins/uptime/common/constants/query.ts b/x-pack/plugins/synthetics/common/constants/query.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/query.ts rename to x-pack/plugins/synthetics/common/constants/query.ts diff --git a/x-pack/plugins/uptime/common/constants/rest_api.ts b/x-pack/plugins/synthetics/common/constants/rest_api.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/rest_api.ts rename to x-pack/plugins/synthetics/common/constants/rest_api.ts diff --git a/x-pack/plugins/uptime/common/constants/settings_defaults.ts b/x-pack/plugins/synthetics/common/constants/settings_defaults.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/settings_defaults.ts rename to x-pack/plugins/synthetics/common/constants/settings_defaults.ts diff --git a/x-pack/plugins/uptime/common/constants/ui.ts b/x-pack/plugins/synthetics/common/constants/ui.ts similarity index 100% rename from x-pack/plugins/uptime/common/constants/ui.ts rename to x-pack/plugins/synthetics/common/constants/ui.ts diff --git a/x-pack/plugins/uptime/common/lib/__snapshots__/assert_close_to.test.ts.snap b/x-pack/plugins/synthetics/common/lib/__snapshots__/assert_close_to.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/common/lib/__snapshots__/assert_close_to.test.ts.snap rename to x-pack/plugins/synthetics/common/lib/__snapshots__/assert_close_to.test.ts.snap diff --git a/x-pack/plugins/uptime/common/lib/__snapshots__/stringify_kueries.test.ts.snap b/x-pack/plugins/synthetics/common/lib/__snapshots__/stringify_kueries.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/common/lib/__snapshots__/stringify_kueries.test.ts.snap rename to x-pack/plugins/synthetics/common/lib/__snapshots__/stringify_kueries.test.ts.snap diff --git a/x-pack/plugins/uptime/common/lib/assert_close_to.test.ts b/x-pack/plugins/synthetics/common/lib/assert_close_to.test.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/assert_close_to.test.ts rename to x-pack/plugins/synthetics/common/lib/assert_close_to.test.ts diff --git a/x-pack/plugins/uptime/common/lib/assert_close_to.ts b/x-pack/plugins/synthetics/common/lib/assert_close_to.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/assert_close_to.ts rename to x-pack/plugins/synthetics/common/lib/assert_close_to.ts diff --git a/x-pack/plugins/uptime/common/lib/combine_filters_and_user_search.test.ts b/x-pack/plugins/synthetics/common/lib/combine_filters_and_user_search.test.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/combine_filters_and_user_search.test.ts rename to x-pack/plugins/synthetics/common/lib/combine_filters_and_user_search.test.ts diff --git a/x-pack/plugins/uptime/common/lib/combine_filters_and_user_search.ts b/x-pack/plugins/synthetics/common/lib/combine_filters_and_user_search.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/combine_filters_and_user_search.ts rename to x-pack/plugins/synthetics/common/lib/combine_filters_and_user_search.ts diff --git a/x-pack/plugins/uptime/common/lib/get_histogram_interval.test.ts b/x-pack/plugins/synthetics/common/lib/get_histogram_interval.test.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/get_histogram_interval.test.ts rename to x-pack/plugins/synthetics/common/lib/get_histogram_interval.test.ts diff --git a/x-pack/plugins/uptime/common/lib/get_histogram_interval.ts b/x-pack/plugins/synthetics/common/lib/get_histogram_interval.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/get_histogram_interval.ts rename to x-pack/plugins/synthetics/common/lib/get_histogram_interval.ts diff --git a/x-pack/plugins/uptime/common/lib/index.ts b/x-pack/plugins/synthetics/common/lib/index.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/index.ts rename to x-pack/plugins/synthetics/common/lib/index.ts diff --git a/x-pack/plugins/uptime/common/lib/ml.test.ts b/x-pack/plugins/synthetics/common/lib/ml.test.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/ml.test.ts rename to x-pack/plugins/synthetics/common/lib/ml.test.ts diff --git a/x-pack/plugins/uptime/common/lib/ml.ts b/x-pack/plugins/synthetics/common/lib/ml.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/ml.ts rename to x-pack/plugins/synthetics/common/lib/ml.ts diff --git a/x-pack/plugins/uptime/common/lib/schedule_to_time.test.ts b/x-pack/plugins/synthetics/common/lib/schedule_to_time.test.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/schedule_to_time.test.ts rename to x-pack/plugins/synthetics/common/lib/schedule_to_time.test.ts diff --git a/x-pack/plugins/uptime/common/lib/schedule_to_time.ts b/x-pack/plugins/synthetics/common/lib/schedule_to_time.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/schedule_to_time.ts rename to x-pack/plugins/synthetics/common/lib/schedule_to_time.ts diff --git a/x-pack/plugins/uptime/common/lib/stringify_kueries.test.ts b/x-pack/plugins/synthetics/common/lib/stringify_kueries.test.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/stringify_kueries.test.ts rename to x-pack/plugins/synthetics/common/lib/stringify_kueries.test.ts diff --git a/x-pack/plugins/uptime/common/lib/stringify_kueries.ts b/x-pack/plugins/synthetics/common/lib/stringify_kueries.ts similarity index 100% rename from x-pack/plugins/uptime/common/lib/stringify_kueries.ts rename to x-pack/plugins/synthetics/common/lib/stringify_kueries.ts diff --git a/x-pack/plugins/uptime/common/requests/get_certs_request_body.ts b/x-pack/plugins/synthetics/common/requests/get_certs_request_body.ts similarity index 100% rename from x-pack/plugins/uptime/common/requests/get_certs_request_body.ts rename to x-pack/plugins/synthetics/common/requests/get_certs_request_body.ts diff --git a/x-pack/plugins/uptime/common/rules/uptime_rule_field_map.ts b/x-pack/plugins/synthetics/common/rules/uptime_rule_field_map.ts similarity index 100% rename from x-pack/plugins/uptime/common/rules/uptime_rule_field_map.ts rename to x-pack/plugins/synthetics/common/rules/uptime_rule_field_map.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/alerts/common.ts b/x-pack/plugins/synthetics/common/runtime_types/alerts/common.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/alerts/common.ts rename to x-pack/plugins/synthetics/common/runtime_types/alerts/common.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/alerts/index.ts b/x-pack/plugins/synthetics/common/runtime_types/alerts/index.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/alerts/index.ts rename to x-pack/plugins/synthetics/common/runtime_types/alerts/index.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/alerts/status_check.ts b/x-pack/plugins/synthetics/common/runtime_types/alerts/status_check.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/alerts/status_check.ts rename to x-pack/plugins/synthetics/common/runtime_types/alerts/status_check.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/certs.ts b/x-pack/plugins/synthetics/common/runtime_types/certs.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/certs.ts rename to x-pack/plugins/synthetics/common/runtime_types/certs.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/common.ts b/x-pack/plugins/synthetics/common/runtime_types/common.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/common.ts rename to x-pack/plugins/synthetics/common/runtime_types/common.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/dynamic_settings.ts b/x-pack/plugins/synthetics/common/runtime_types/dynamic_settings.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/dynamic_settings.ts rename to x-pack/plugins/synthetics/common/runtime_types/dynamic_settings.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/index.ts b/x-pack/plugins/synthetics/common/runtime_types/index.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/index.ts rename to x-pack/plugins/synthetics/common/runtime_types/index.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor/index.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor/index.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor/index.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor/index.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor/locations.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor/locations.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor/locations.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor/locations.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor/state.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor/state.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor/state.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/config_key.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/config_key.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor_management/config_key.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor_management/config_key.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/index.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/index.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor_management/index.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor_management/index.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/locations.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/locations.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor_management/locations.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor_management/locations.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_configs.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_configs.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_configs.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_configs.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_meta_data.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_meta_data.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_meta_data.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_meta_data.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/state.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/state.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/monitor_management/state.ts rename to x-pack/plugins/synthetics/common/runtime_types/monitor_management/state.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/network_events.ts b/x-pack/plugins/synthetics/common/runtime_types/network_events.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/network_events.ts rename to x-pack/plugins/synthetics/common/runtime_types/network_events.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts b/x-pack/plugins/synthetics/common/runtime_types/ping/histogram.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts rename to x-pack/plugins/synthetics/common/runtime_types/ping/histogram.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/index.ts b/x-pack/plugins/synthetics/common/runtime_types/ping/index.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/ping/index.ts rename to x-pack/plugins/synthetics/common/runtime_types/ping/index.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts b/x-pack/plugins/synthetics/common/runtime_types/ping/ping.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/ping/ping.ts rename to x-pack/plugins/synthetics/common/runtime_types/ping/ping.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/synthetics.test.ts b/x-pack/plugins/synthetics/common/runtime_types/ping/synthetics.test.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/ping/synthetics.test.ts rename to x-pack/plugins/synthetics/common/runtime_types/ping/synthetics.test.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/synthetics.ts b/x-pack/plugins/synthetics/common/runtime_types/ping/synthetics.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/ping/synthetics.ts rename to x-pack/plugins/synthetics/common/runtime_types/ping/synthetics.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/snapshot/index.ts b/x-pack/plugins/synthetics/common/runtime_types/snapshot/index.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/snapshot/index.ts rename to x-pack/plugins/synthetics/common/runtime_types/snapshot/index.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/snapshot/snapshot_count.ts b/x-pack/plugins/synthetics/common/runtime_types/snapshot/snapshot_count.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/snapshot/snapshot_count.ts rename to x-pack/plugins/synthetics/common/runtime_types/snapshot/snapshot_count.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/synthetics_service_api_key.ts b/x-pack/plugins/synthetics/common/runtime_types/synthetics_service_api_key.ts similarity index 100% rename from x-pack/plugins/uptime/common/runtime_types/synthetics_service_api_key.ts rename to x-pack/plugins/synthetics/common/runtime_types/synthetics_service_api_key.ts diff --git a/x-pack/plugins/uptime/common/translations.ts b/x-pack/plugins/synthetics/common/translations.ts similarity index 100% rename from x-pack/plugins/uptime/common/translations.ts rename to x-pack/plugins/synthetics/common/translations.ts diff --git a/x-pack/plugins/uptime/common/types/index.ts b/x-pack/plugins/synthetics/common/types/index.ts similarity index 100% rename from x-pack/plugins/uptime/common/types/index.ts rename to x-pack/plugins/synthetics/common/types/index.ts diff --git a/x-pack/plugins/uptime/common/types/monitor_duration.ts b/x-pack/plugins/synthetics/common/types/monitor_duration.ts similarity index 100% rename from x-pack/plugins/uptime/common/types/monitor_duration.ts rename to x-pack/plugins/synthetics/common/types/monitor_duration.ts diff --git a/x-pack/plugins/uptime/common/types/monitor_validation.ts b/x-pack/plugins/synthetics/common/types/monitor_validation.ts similarity index 100% rename from x-pack/plugins/uptime/common/types/monitor_validation.ts rename to x-pack/plugins/synthetics/common/types/monitor_validation.ts diff --git a/x-pack/plugins/uptime/common/types/saved_objects.ts b/x-pack/plugins/synthetics/common/types/saved_objects.ts similarity index 100% rename from x-pack/plugins/uptime/common/types/saved_objects.ts rename to x-pack/plugins/synthetics/common/types/saved_objects.ts diff --git a/x-pack/plugins/uptime/common/types/synthetics_monitor.ts b/x-pack/plugins/synthetics/common/types/synthetics_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/common/types/synthetics_monitor.ts rename to x-pack/plugins/synthetics/common/types/synthetics_monitor.ts diff --git a/x-pack/plugins/uptime/common/utils/as_mutable_array.ts b/x-pack/plugins/synthetics/common/utils/as_mutable_array.ts similarity index 100% rename from x-pack/plugins/uptime/common/utils/as_mutable_array.ts rename to x-pack/plugins/synthetics/common/utils/as_mutable_array.ts diff --git a/x-pack/plugins/uptime/common/utils/es_search.ts b/x-pack/plugins/synthetics/common/utils/es_search.ts similarity index 100% rename from x-pack/plugins/uptime/common/utils/es_search.ts rename to x-pack/plugins/synthetics/common/utils/es_search.ts diff --git a/x-pack/plugins/uptime/common/utils/get_monitor_url.ts b/x-pack/plugins/synthetics/common/utils/get_monitor_url.ts similarity index 100% rename from x-pack/plugins/uptime/common/utils/get_monitor_url.ts rename to x-pack/plugins/synthetics/common/utils/get_monitor_url.ts diff --git a/x-pack/plugins/uptime/common/utils/t_enum.ts b/x-pack/plugins/synthetics/common/utils/t_enum.ts similarity index 100% rename from x-pack/plugins/uptime/common/utils/t_enum.ts rename to x-pack/plugins/synthetics/common/utils/t_enum.ts diff --git a/x-pack/plugins/uptime/e2e/config.ts b/x-pack/plugins/synthetics/e2e/config.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/config.ts rename to x-pack/plugins/synthetics/e2e/config.ts diff --git a/x-pack/plugins/uptime/e2e/fixtures/es_archiver/browser/data.json.gz b/x-pack/plugins/synthetics/e2e/fixtures/es_archiver/browser/data.json.gz similarity index 100% rename from x-pack/plugins/uptime/e2e/fixtures/es_archiver/browser/data.json.gz rename to x-pack/plugins/synthetics/e2e/fixtures/es_archiver/browser/data.json.gz diff --git a/x-pack/plugins/uptime/e2e/fixtures/es_archiver/browser/mappings.json b/x-pack/plugins/synthetics/e2e/fixtures/es_archiver/browser/mappings.json similarity index 100% rename from x-pack/plugins/uptime/e2e/fixtures/es_archiver/browser/mappings.json rename to x-pack/plugins/synthetics/e2e/fixtures/es_archiver/browser/mappings.json diff --git a/x-pack/plugins/uptime/e2e/fixtures/es_archiver/full_heartbeat/data.json.gz b/x-pack/plugins/synthetics/e2e/fixtures/es_archiver/full_heartbeat/data.json.gz similarity index 100% rename from x-pack/plugins/uptime/e2e/fixtures/es_archiver/full_heartbeat/data.json.gz rename to x-pack/plugins/synthetics/e2e/fixtures/es_archiver/full_heartbeat/data.json.gz diff --git a/x-pack/plugins/uptime/e2e/fixtures/es_archiver/full_heartbeat/mappings.json b/x-pack/plugins/synthetics/e2e/fixtures/es_archiver/full_heartbeat/mappings.json similarity index 100% rename from x-pack/plugins/uptime/e2e/fixtures/es_archiver/full_heartbeat/mappings.json rename to x-pack/plugins/synthetics/e2e/fixtures/es_archiver/full_heartbeat/mappings.json diff --git a/x-pack/plugins/uptime/e2e/helpers/make_checks.ts b/x-pack/plugins/synthetics/e2e/helpers/make_checks.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/helpers/make_checks.ts rename to x-pack/plugins/synthetics/e2e/helpers/make_checks.ts diff --git a/x-pack/plugins/uptime/e2e/helpers/make_ping.ts b/x-pack/plugins/synthetics/e2e/helpers/make_ping.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/helpers/make_ping.ts rename to x-pack/plugins/synthetics/e2e/helpers/make_ping.ts diff --git a/x-pack/plugins/uptime/e2e/helpers/make_tls.ts b/x-pack/plugins/synthetics/e2e/helpers/make_tls.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/helpers/make_tls.ts rename to x-pack/plugins/synthetics/e2e/helpers/make_tls.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/alerts/default_email_settings.ts b/x-pack/plugins/synthetics/e2e/journeys/alerts/default_email_settings.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/alerts/default_email_settings.ts rename to x-pack/plugins/synthetics/e2e/journeys/alerts/default_email_settings.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/alerts/index.ts b/x-pack/plugins/synthetics/e2e/journeys/alerts/index.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/alerts/index.ts rename to x-pack/plugins/synthetics/e2e/journeys/alerts/index.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/alerts/status_alert_flyouts_in_alerting_app.ts b/x-pack/plugins/synthetics/e2e/journeys/alerts/status_alert_flyouts_in_alerting_app.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/alerts/status_alert_flyouts_in_alerting_app.ts rename to x-pack/plugins/synthetics/e2e/journeys/alerts/status_alert_flyouts_in_alerting_app.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts b/x-pack/plugins/synthetics/e2e/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts rename to x-pack/plugins/synthetics/e2e/journeys/alerts/tls_alert_flyouts_in_alerting_app.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/data_view_permissions.ts b/x-pack/plugins/synthetics/e2e/journeys/data_view_permissions.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/data_view_permissions.ts rename to x-pack/plugins/synthetics/e2e/journeys/data_view_permissions.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/index.ts b/x-pack/plugins/synthetics/e2e/journeys/index.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/index.ts rename to x-pack/plugins/synthetics/e2e/journeys/index.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/locations/index.ts b/x-pack/plugins/synthetics/e2e/journeys/locations/index.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/locations/index.ts rename to x-pack/plugins/synthetics/e2e/journeys/locations/index.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/locations/locations.ts b/x-pack/plugins/synthetics/e2e/journeys/locations/locations.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/locations/locations.ts rename to x-pack/plugins/synthetics/e2e/journeys/locations/locations.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/monitor_details.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/monitor_details.journey.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/monitor_details.journey.ts rename to x-pack/plugins/synthetics/e2e/journeys/monitor_details.journey.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/monitor_details/index.ts b/x-pack/plugins/synthetics/e2e/journeys/monitor_details/index.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/monitor_details/index.ts rename to x-pack/plugins/synthetics/e2e/journeys/monitor_details/index.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/monitor_details/monitor_alerts.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/monitor_details/monitor_alerts.journey.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/monitor_details/monitor_alerts.journey.ts rename to x-pack/plugins/synthetics/e2e/journeys/monitor_details/monitor_alerts.journey.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/monitor_details/monitor_details.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/monitor_details/monitor_details.journey.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/monitor_details/monitor_details.journey.ts rename to x-pack/plugins/synthetics/e2e/journeys/monitor_details/monitor_details.journey.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/monitor_details/ping_redirects.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/monitor_details/ping_redirects.journey.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/monitor_details/ping_redirects.journey.ts rename to x-pack/plugins/synthetics/e2e/journeys/monitor_details/ping_redirects.journey.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/monitor_management.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/monitor_management.journey.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/monitor_management.journey.ts rename to x-pack/plugins/synthetics/e2e/journeys/monitor_management.journey.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/monitor_management_enablement.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/monitor_management_enablement.journey.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/monitor_management_enablement.journey.ts rename to x-pack/plugins/synthetics/e2e/journeys/monitor_management_enablement.journey.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/monitor_name.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/monitor_name.journey.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/monitor_name.journey.ts rename to x-pack/plugins/synthetics/e2e/journeys/monitor_name.journey.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/read_only_user/index.ts b/x-pack/plugins/synthetics/e2e/journeys/read_only_user/index.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/read_only_user/index.ts rename to x-pack/plugins/synthetics/e2e/journeys/read_only_user/index.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/read_only_user/monitor_management.ts b/x-pack/plugins/synthetics/e2e/journeys/read_only_user/monitor_management.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/read_only_user/monitor_management.ts rename to x-pack/plugins/synthetics/e2e/journeys/read_only_user/monitor_management.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/step_duration.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/step_duration.journey.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/step_duration.journey.ts rename to x-pack/plugins/synthetics/e2e/journeys/step_duration.journey.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/uptime.journey.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts rename to x-pack/plugins/synthetics/e2e/journeys/uptime.journey.ts diff --git a/x-pack/plugins/uptime/e2e/journeys/utils.ts b/x-pack/plugins/synthetics/e2e/journeys/utils.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/journeys/utils.ts rename to x-pack/plugins/synthetics/e2e/journeys/utils.ts diff --git a/x-pack/plugins/uptime/e2e/page_objects/login.tsx b/x-pack/plugins/synthetics/e2e/page_objects/login.tsx similarity index 100% rename from x-pack/plugins/uptime/e2e/page_objects/login.tsx rename to x-pack/plugins/synthetics/e2e/page_objects/login.tsx diff --git a/x-pack/plugins/uptime/e2e/page_objects/monitor_details.tsx b/x-pack/plugins/synthetics/e2e/page_objects/monitor_details.tsx similarity index 100% rename from x-pack/plugins/uptime/e2e/page_objects/monitor_details.tsx rename to x-pack/plugins/synthetics/e2e/page_objects/monitor_details.tsx diff --git a/x-pack/plugins/uptime/e2e/page_objects/monitor_management.tsx b/x-pack/plugins/synthetics/e2e/page_objects/monitor_management.tsx similarity index 100% rename from x-pack/plugins/uptime/e2e/page_objects/monitor_management.tsx rename to x-pack/plugins/synthetics/e2e/page_objects/monitor_management.tsx diff --git a/x-pack/plugins/uptime/e2e/page_objects/settings.tsx b/x-pack/plugins/synthetics/e2e/page_objects/settings.tsx similarity index 100% rename from x-pack/plugins/uptime/e2e/page_objects/settings.tsx rename to x-pack/plugins/synthetics/e2e/page_objects/settings.tsx diff --git a/x-pack/plugins/uptime/e2e/page_objects/utils.tsx b/x-pack/plugins/synthetics/e2e/page_objects/utils.tsx similarity index 100% rename from x-pack/plugins/uptime/e2e/page_objects/utils.tsx rename to x-pack/plugins/synthetics/e2e/page_objects/utils.tsx diff --git a/x-pack/plugins/uptime/e2e/playwright_run.ts b/x-pack/plugins/synthetics/e2e/playwright_run.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/playwright_run.ts rename to x-pack/plugins/synthetics/e2e/playwright_run.ts diff --git a/x-pack/plugins/uptime/e2e/playwright_start.ts b/x-pack/plugins/synthetics/e2e/playwright_start.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/playwright_start.ts rename to x-pack/plugins/synthetics/e2e/playwright_start.ts diff --git a/x-pack/plugins/uptime/e2e/tasks/es_archiver.ts b/x-pack/plugins/synthetics/e2e/tasks/es_archiver.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/tasks/es_archiver.ts rename to x-pack/plugins/synthetics/e2e/tasks/es_archiver.ts diff --git a/x-pack/plugins/uptime/e2e/tasks/import_monitors.ts b/x-pack/plugins/synthetics/e2e/tasks/import_monitors.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/tasks/import_monitors.ts rename to x-pack/plugins/synthetics/e2e/tasks/import_monitors.ts diff --git a/x-pack/plugins/uptime/e2e/tasks/read_kibana_config.ts b/x-pack/plugins/synthetics/e2e/tasks/read_kibana_config.ts similarity index 100% rename from x-pack/plugins/uptime/e2e/tasks/read_kibana_config.ts rename to x-pack/plugins/synthetics/e2e/tasks/read_kibana_config.ts diff --git a/x-pack/plugins/uptime/e2e/tasks/uptime_monitor.ndjson b/x-pack/plugins/synthetics/e2e/tasks/uptime_monitor.ndjson similarity index 100% rename from x-pack/plugins/uptime/e2e/tasks/uptime_monitor.ndjson rename to x-pack/plugins/synthetics/e2e/tasks/uptime_monitor.ndjson diff --git a/x-pack/plugins/uptime/e2e/tsconfig.json b/x-pack/plugins/synthetics/e2e/tsconfig.json similarity index 100% rename from x-pack/plugins/uptime/e2e/tsconfig.json rename to x-pack/plugins/synthetics/e2e/tsconfig.json diff --git a/x-pack/plugins/uptime/jest.config.js b/x-pack/plugins/synthetics/jest.config.js similarity index 70% rename from x-pack/plugins/uptime/jest.config.js rename to x-pack/plugins/synthetics/jest.config.js index baafb5ce133e6..de4161347ae40 100644 --- a/x-pack/plugins/uptime/jest.config.js +++ b/x-pack/plugins/synthetics/jest.config.js @@ -8,8 +8,8 @@ module.exports = { preset: '@kbn/test', rootDir: '../../..', - roots: ['/x-pack/plugins/uptime'], - coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/uptime', + roots: ['/x-pack/plugins/synthetics'], + coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/synthetics', coverageReporters: ['text', 'html'], - collectCoverageFrom: ['/x-pack/plugins/uptime/{common,public,server}/**/*.{ts,tsx}'], + collectCoverageFrom: ['/x-pack/plugins/synthetics/{common,public,server}/**/*.{ts,tsx}'], }; diff --git a/x-pack/plugins/uptime/kibana.json b/x-pack/plugins/synthetics/kibana.json similarity index 97% rename from x-pack/plugins/uptime/kibana.json rename to x-pack/plugins/synthetics/kibana.json index bb9e48102dcfc..7eaccbbb0817f 100644 --- a/x-pack/plugins/uptime/kibana.json +++ b/x-pack/plugins/synthetics/kibana.json @@ -1,6 +1,6 @@ { "configPath": ["xpack", "uptime"], - "id": "uptime", + "id": "synthetics", "kibanaVersion": "kibana", "optionalPlugins": ["cloud", "data", "fleet", "home", "ml", "telemetry"], "requiredPlugins": [ diff --git a/x-pack/plugins/uptime/public/apps/__snapshots__/uptime_page_template.test.tsx.snap b/x-pack/plugins/synthetics/public/apps/__snapshots__/uptime_page_template.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/apps/__snapshots__/uptime_page_template.test.tsx.snap rename to x-pack/plugins/synthetics/public/apps/__snapshots__/uptime_page_template.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/apps/locators/overview.test.ts b/x-pack/plugins/synthetics/public/apps/locators/overview.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/apps/locators/overview.test.ts rename to x-pack/plugins/synthetics/public/apps/locators/overview.test.ts diff --git a/x-pack/plugins/uptime/public/apps/locators/overview.ts b/x-pack/plugins/synthetics/public/apps/locators/overview.ts similarity index 100% rename from x-pack/plugins/uptime/public/apps/locators/overview.ts rename to x-pack/plugins/synthetics/public/apps/locators/overview.ts diff --git a/x-pack/plugins/uptime/public/apps/plugin.ts b/x-pack/plugins/synthetics/public/apps/plugin.ts similarity index 100% rename from x-pack/plugins/uptime/public/apps/plugin.ts rename to x-pack/plugins/synthetics/public/apps/plugin.ts diff --git a/x-pack/plugins/uptime/public/apps/render_app.tsx b/x-pack/plugins/synthetics/public/apps/render_app.tsx similarity index 100% rename from x-pack/plugins/uptime/public/apps/render_app.tsx rename to x-pack/plugins/synthetics/public/apps/render_app.tsx diff --git a/x-pack/plugins/uptime/public/apps/uptime_app.tsx b/x-pack/plugins/synthetics/public/apps/uptime_app.tsx similarity index 100% rename from x-pack/plugins/uptime/public/apps/uptime_app.tsx rename to x-pack/plugins/synthetics/public/apps/uptime_app.tsx diff --git a/x-pack/plugins/uptime/public/apps/uptime_overview_fetcher.ts b/x-pack/plugins/synthetics/public/apps/uptime_overview_fetcher.ts similarity index 100% rename from x-pack/plugins/uptime/public/apps/uptime_overview_fetcher.ts rename to x-pack/plugins/synthetics/public/apps/uptime_overview_fetcher.ts diff --git a/x-pack/plugins/uptime/public/apps/uptime_page_template.test.tsx b/x-pack/plugins/synthetics/public/apps/uptime_page_template.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/apps/uptime_page_template.test.tsx rename to x-pack/plugins/synthetics/public/apps/uptime_page_template.test.tsx diff --git a/x-pack/plugins/uptime/public/apps/uptime_page_template.tsx b/x-pack/plugins/synthetics/public/apps/uptime_page_template.tsx similarity index 100% rename from x-pack/plugins/uptime/public/apps/uptime_page_template.tsx rename to x-pack/plugins/synthetics/public/apps/uptime_page_template.tsx diff --git a/x-pack/plugins/uptime/public/apps/use_no_data_config.ts b/x-pack/plugins/synthetics/public/apps/use_no_data_config.ts similarity index 100% rename from x-pack/plugins/uptime/public/apps/use_no_data_config.ts rename to x-pack/plugins/synthetics/public/apps/use_no_data_config.ts diff --git a/x-pack/plugins/uptime/public/badge.ts b/x-pack/plugins/synthetics/public/badge.ts similarity index 100% rename from x-pack/plugins/uptime/public/badge.ts rename to x-pack/plugins/synthetics/public/badge.ts diff --git a/x-pack/plugins/uptime/public/components/certificates/__snapshots__/cert_monitors.test.tsx.snap b/x-pack/plugins/synthetics/public/components/certificates/__snapshots__/cert_monitors.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/__snapshots__/cert_monitors.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/certificates/__snapshots__/cert_monitors.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/certificates/__snapshots__/cert_search.test.tsx.snap b/x-pack/plugins/synthetics/public/components/certificates/__snapshots__/cert_search.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/__snapshots__/cert_search.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/certificates/__snapshots__/cert_search.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/certificates/__snapshots__/cert_status.test.tsx.snap b/x-pack/plugins/synthetics/public/components/certificates/__snapshots__/cert_status.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/__snapshots__/cert_status.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/certificates/__snapshots__/cert_status.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_monitors.test.tsx b/x-pack/plugins/synthetics/public/components/certificates/cert_monitors.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/cert_monitors.test.tsx rename to x-pack/plugins/synthetics/public/components/certificates/cert_monitors.test.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_monitors.tsx b/x-pack/plugins/synthetics/public/components/certificates/cert_monitors.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/cert_monitors.tsx rename to x-pack/plugins/synthetics/public/components/certificates/cert_monitors.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_refresh_btn.tsx b/x-pack/plugins/synthetics/public/components/certificates/cert_refresh_btn.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/cert_refresh_btn.tsx rename to x-pack/plugins/synthetics/public/components/certificates/cert_refresh_btn.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_search.test.tsx b/x-pack/plugins/synthetics/public/components/certificates/cert_search.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/cert_search.test.tsx rename to x-pack/plugins/synthetics/public/components/certificates/cert_search.test.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_search.tsx b/x-pack/plugins/synthetics/public/components/certificates/cert_search.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/cert_search.tsx rename to x-pack/plugins/synthetics/public/components/certificates/cert_search.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_status.test.tsx b/x-pack/plugins/synthetics/public/components/certificates/cert_status.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/cert_status.test.tsx rename to x-pack/plugins/synthetics/public/components/certificates/cert_status.test.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx b/x-pack/plugins/synthetics/public/components/certificates/cert_status.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/cert_status.tsx rename to x-pack/plugins/synthetics/public/components/certificates/cert_status.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/certificate_title.tsx b/x-pack/plugins/synthetics/public/components/certificates/certificate_title.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/certificate_title.tsx rename to x-pack/plugins/synthetics/public/components/certificates/certificate_title.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/certificates_list.test.tsx b/x-pack/plugins/synthetics/public/components/certificates/certificates_list.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/certificates_list.test.tsx rename to x-pack/plugins/synthetics/public/components/certificates/certificates_list.test.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/certificates_list.tsx b/x-pack/plugins/synthetics/public/components/certificates/certificates_list.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/certificates_list.tsx rename to x-pack/plugins/synthetics/public/components/certificates/certificates_list.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/fingerprint_col.test.tsx b/x-pack/plugins/synthetics/public/components/certificates/fingerprint_col.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/fingerprint_col.test.tsx rename to x-pack/plugins/synthetics/public/components/certificates/fingerprint_col.test.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/fingerprint_col.tsx b/x-pack/plugins/synthetics/public/components/certificates/fingerprint_col.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/fingerprint_col.tsx rename to x-pack/plugins/synthetics/public/components/certificates/fingerprint_col.tsx diff --git a/x-pack/plugins/uptime/public/components/certificates/index.ts b/x-pack/plugins/synthetics/public/components/certificates/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/index.ts rename to x-pack/plugins/synthetics/public/components/certificates/index.ts diff --git a/x-pack/plugins/uptime/public/components/certificates/translations.ts b/x-pack/plugins/synthetics/public/components/certificates/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/translations.ts rename to x-pack/plugins/synthetics/public/components/certificates/translations.ts diff --git a/x-pack/plugins/uptime/public/components/certificates/use_cert_search.ts b/x-pack/plugins/synthetics/public/components/certificates/use_cert_search.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/certificates/use_cert_search.ts rename to x-pack/plugins/synthetics/public/components/certificates/use_cert_search.ts diff --git a/x-pack/plugins/uptime/public/components/common/__snapshots__/location_link.test.tsx.snap b/x-pack/plugins/synthetics/public/components/common/__snapshots__/location_link.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/common/__snapshots__/location_link.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/common/__snapshots__/location_link.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/common/__snapshots__/monitor_page_link.test.tsx.snap b/x-pack/plugins/synthetics/public/components/common/__snapshots__/monitor_page_link.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/common/__snapshots__/monitor_page_link.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/common/__snapshots__/monitor_page_link.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/common/__snapshots__/monitor_tags.test.tsx.snap b/x-pack/plugins/synthetics/public/components/common/__snapshots__/monitor_tags.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/common/__snapshots__/monitor_tags.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/common/__snapshots__/monitor_tags.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/common/alerts/uptime_edit_alert_flyout.tsx b/x-pack/plugins/synthetics/public/components/common/alerts/uptime_edit_alert_flyout.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/alerts/uptime_edit_alert_flyout.tsx rename to x-pack/plugins/synthetics/public/components/common/alerts/uptime_edit_alert_flyout.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/__snapshots__/chart_empty_state.test.tsx.snap b/x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/chart_empty_state.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/__snapshots__/chart_empty_state.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/chart_empty_state.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/common/charts/__snapshots__/chart_wrapper.test.tsx.snap b/x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/chart_wrapper.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/__snapshots__/chart_wrapper.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/chart_wrapper.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/common/charts/__snapshots__/donut_chart.test.tsx.snap b/x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/donut_chart.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/__snapshots__/donut_chart.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/donut_chart.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/common/charts/__snapshots__/donut_chart_legend_row.test.tsx.snap b/x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/donut_chart_legend_row.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/__snapshots__/donut_chart_legend_row.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/donut_chart_legend_row.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/common/charts/__snapshots__/monitor_bar_series.test.tsx.snap b/x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/monitor_bar_series.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/__snapshots__/monitor_bar_series.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/common/charts/__snapshots__/monitor_bar_series.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/common/charts/annotation_tooltip.tsx b/x-pack/plugins/synthetics/public/components/common/charts/annotation_tooltip.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/annotation_tooltip.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/annotation_tooltip.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/chart_empty_state.test.tsx b/x-pack/plugins/synthetics/public/components/common/charts/chart_empty_state.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/chart_empty_state.test.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/chart_empty_state.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/chart_empty_state.tsx b/x-pack/plugins/synthetics/public/components/common/charts/chart_empty_state.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/chart_empty_state.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/chart_empty_state.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/chart_wrapper.test.tsx b/x-pack/plugins/synthetics/public/components/common/charts/chart_wrapper.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/chart_wrapper.test.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/chart_wrapper.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/chart_wrapper/chart_wrapper.tsx b/x-pack/plugins/synthetics/public/components/common/charts/chart_wrapper/chart_wrapper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/chart_wrapper/chart_wrapper.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/chart_wrapper/chart_wrapper.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/chart_wrapper/index.ts b/x-pack/plugins/synthetics/public/components/common/charts/chart_wrapper/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/chart_wrapper/index.ts rename to x-pack/plugins/synthetics/public/components/common/charts/chart_wrapper/index.ts diff --git a/x-pack/plugins/uptime/public/components/common/charts/donut_chart.test.tsx b/x-pack/plugins/synthetics/public/components/common/charts/donut_chart.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/donut_chart.test.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/donut_chart.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/donut_chart.tsx b/x-pack/plugins/synthetics/public/components/common/charts/donut_chart.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/donut_chart.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/donut_chart.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend.test.tsx b/x-pack/plugins/synthetics/public/components/common/charts/donut_chart_legend.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend.test.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/donut_chart_legend.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend.tsx b/x-pack/plugins/synthetics/public/components/common/charts/donut_chart_legend.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/donut_chart_legend.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend_row.test.tsx b/x-pack/plugins/synthetics/public/components/common/charts/donut_chart_legend_row.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend_row.test.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/donut_chart_legend_row.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend_row.tsx b/x-pack/plugins/synthetics/public/components/common/charts/donut_chart_legend_row.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend_row.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/donut_chart_legend_row.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/duration_chart.tsx b/x-pack/plugins/synthetics/public/components/common/charts/duration_chart.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/duration_chart.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/duration_chart.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/duration_charts.test.tsx b/x-pack/plugins/synthetics/public/components/common/charts/duration_charts.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/duration_charts.test.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/duration_charts.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx b/x-pack/plugins/synthetics/public/components/common/charts/duration_line_bar_list.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/duration_line_bar_list.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/duration_line_series_list.tsx b/x-pack/plugins/synthetics/public/components/common/charts/duration_line_series_list.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/duration_line_series_list.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/duration_line_series_list.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/get_tick_format.test.ts b/x-pack/plugins/synthetics/public/components/common/charts/get_tick_format.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/get_tick_format.test.ts rename to x-pack/plugins/synthetics/public/components/common/charts/get_tick_format.test.ts diff --git a/x-pack/plugins/uptime/public/components/common/charts/get_tick_format.ts b/x-pack/plugins/synthetics/public/components/common/charts/get_tick_format.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/get_tick_format.ts rename to x-pack/plugins/synthetics/public/components/common/charts/get_tick_format.ts diff --git a/x-pack/plugins/uptime/public/components/common/charts/index.ts b/x-pack/plugins/synthetics/public/components/common/charts/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/index.ts rename to x-pack/plugins/synthetics/public/components/common/charts/index.ts diff --git a/x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.test.tsx b/x-pack/plugins/synthetics/public/components/common/charts/monitor_bar_series.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.test.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/monitor_bar_series.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx b/x-pack/plugins/synthetics/public/components/common/charts/monitor_bar_series.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/monitor_bar_series.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/ping_histogram.test.tsx b/x-pack/plugins/synthetics/public/components/common/charts/ping_histogram.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/ping_histogram.test.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/ping_histogram.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/ping_histogram.tsx b/x-pack/plugins/synthetics/public/components/common/charts/ping_histogram.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/ping_histogram.tsx rename to x-pack/plugins/synthetics/public/components/common/charts/ping_histogram.tsx diff --git a/x-pack/plugins/uptime/public/components/common/charts/utils.test.ts b/x-pack/plugins/synthetics/public/components/common/charts/utils.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/utils.test.ts rename to x-pack/plugins/synthetics/public/components/common/charts/utils.test.ts diff --git a/x-pack/plugins/uptime/public/components/common/charts/utils.ts b/x-pack/plugins/synthetics/public/components/common/charts/utils.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/charts/utils.ts rename to x-pack/plugins/synthetics/public/components/common/charts/utils.ts diff --git a/x-pack/plugins/uptime/public/components/common/header/action_menu.tsx b/x-pack/plugins/synthetics/public/components/common/header/action_menu.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/header/action_menu.tsx rename to x-pack/plugins/synthetics/public/components/common/header/action_menu.tsx diff --git a/x-pack/plugins/uptime/public/components/common/header/action_menu_content.test.tsx b/x-pack/plugins/synthetics/public/components/common/header/action_menu_content.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/header/action_menu_content.test.tsx rename to x-pack/plugins/synthetics/public/components/common/header/action_menu_content.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/header/action_menu_content.tsx b/x-pack/plugins/synthetics/public/components/common/header/action_menu_content.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/header/action_menu_content.tsx rename to x-pack/plugins/synthetics/public/components/common/header/action_menu_content.tsx diff --git a/x-pack/plugins/uptime/public/components/common/header/inspector_header_link.tsx b/x-pack/plugins/synthetics/public/components/common/header/inspector_header_link.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/header/inspector_header_link.tsx rename to x-pack/plugins/synthetics/public/components/common/header/inspector_header_link.tsx diff --git a/x-pack/plugins/uptime/public/components/common/header/manage_monitors_btn.tsx b/x-pack/plugins/synthetics/public/components/common/header/manage_monitors_btn.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/header/manage_monitors_btn.tsx rename to x-pack/plugins/synthetics/public/components/common/header/manage_monitors_btn.tsx diff --git a/x-pack/plugins/uptime/public/components/common/header/page_tabs.test.tsx b/x-pack/plugins/synthetics/public/components/common/header/page_tabs.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/header/page_tabs.test.tsx rename to x-pack/plugins/synthetics/public/components/common/header/page_tabs.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/header/page_tabs.tsx b/x-pack/plugins/synthetics/public/components/common/header/page_tabs.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/header/page_tabs.tsx rename to x-pack/plugins/synthetics/public/components/common/header/page_tabs.tsx diff --git a/x-pack/plugins/uptime/public/components/common/higher_order/index.ts b/x-pack/plugins/synthetics/public/components/common/higher_order/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/higher_order/index.ts rename to x-pack/plugins/synthetics/public/components/common/higher_order/index.ts diff --git a/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.test.tsx b/x-pack/plugins/synthetics/public/components/common/higher_order/responsive_wrapper.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.test.tsx rename to x-pack/plugins/synthetics/public/components/common/higher_order/responsive_wrapper.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx b/x-pack/plugins/synthetics/public/components/common/higher_order/responsive_wrapper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx rename to x-pack/plugins/synthetics/public/components/common/higher_order/responsive_wrapper.tsx diff --git a/x-pack/plugins/uptime/public/components/common/location_link.test.tsx b/x-pack/plugins/synthetics/public/components/common/location_link.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/location_link.test.tsx rename to x-pack/plugins/synthetics/public/components/common/location_link.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/location_link.tsx b/x-pack/plugins/synthetics/public/components/common/location_link.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/location_link.tsx rename to x-pack/plugins/synthetics/public/components/common/location_link.tsx diff --git a/x-pack/plugins/uptime/public/components/common/monitor_page_link.test.tsx b/x-pack/plugins/synthetics/public/components/common/monitor_page_link.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/monitor_page_link.test.tsx rename to x-pack/plugins/synthetics/public/components/common/monitor_page_link.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/monitor_page_link.tsx b/x-pack/plugins/synthetics/public/components/common/monitor_page_link.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/monitor_page_link.tsx rename to x-pack/plugins/synthetics/public/components/common/monitor_page_link.tsx diff --git a/x-pack/plugins/uptime/public/components/common/monitor_tags.test.tsx b/x-pack/plugins/synthetics/public/components/common/monitor_tags.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/monitor_tags.test.tsx rename to x-pack/plugins/synthetics/public/components/common/monitor_tags.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/monitor_tags.tsx b/x-pack/plugins/synthetics/public/components/common/monitor_tags.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/monitor_tags.tsx rename to x-pack/plugins/synthetics/public/components/common/monitor_tags.tsx diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/index.ts b/x-pack/plugins/synthetics/public/components/common/react_router_helpers/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/react_router_helpers/index.ts rename to x-pack/plugins/synthetics/public/components/common/react_router_helpers/index.ts diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_events.test.ts b/x-pack/plugins/synthetics/public/components/common/react_router_helpers/link_events.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/react_router_helpers/link_events.test.ts rename to x-pack/plugins/synthetics/public/components/common/react_router_helpers/link_events.test.ts diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_events.ts b/x-pack/plugins/synthetics/public/components/common/react_router_helpers/link_events.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/react_router_helpers/link_events.ts rename to x-pack/plugins/synthetics/public/components/common/react_router_helpers/link_events.ts diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_for_eui.test.tsx b/x-pack/plugins/synthetics/public/components/common/react_router_helpers/link_for_eui.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/react_router_helpers/link_for_eui.test.tsx rename to x-pack/plugins/synthetics/public/components/common/react_router_helpers/link_for_eui.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_for_eui.tsx b/x-pack/plugins/synthetics/public/components/common/react_router_helpers/link_for_eui.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/react_router_helpers/link_for_eui.tsx rename to x-pack/plugins/synthetics/public/components/common/react_router_helpers/link_for_eui.tsx diff --git a/x-pack/plugins/uptime/public/components/common/step_detail_link.tsx b/x-pack/plugins/synthetics/public/components/common/step_detail_link.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/step_detail_link.tsx rename to x-pack/plugins/synthetics/public/components/common/step_detail_link.tsx diff --git a/x-pack/plugins/uptime/public/components/common/translations.ts b/x-pack/plugins/synthetics/public/components/common/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/common/translations.ts rename to x-pack/plugins/synthetics/public/components/common/translations.ts diff --git a/x-pack/plugins/uptime/public/components/common/uptime_date_picker.test.tsx b/x-pack/plugins/synthetics/public/components/common/uptime_date_picker.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/uptime_date_picker.test.tsx rename to x-pack/plugins/synthetics/public/components/common/uptime_date_picker.test.tsx diff --git a/x-pack/plugins/uptime/public/components/common/uptime_date_picker.tsx b/x-pack/plugins/synthetics/public/components/common/uptime_date_picker.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/common/uptime_date_picker.tsx rename to x-pack/plugins/synthetics/public/components/common/uptime_date_picker.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/advanced_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/advanced_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/advanced_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/advanced_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts b/x-pack/plugins/synthetics/public/components/fleet_package/browser/formatters.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/formatters.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts b/x-pack/plugins/synthetics/public/components/fleet_package/browser/normalizers.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/normalizers.test.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts b/x-pack/plugins/synthetics/public/components/fleet_package/browser/normalizers.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/normalizers.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/script_recorder_fields.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/script_recorder_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/script_recorder_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/script_recorder_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/script_recorder_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/script_recorder_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/script_recorder_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/script_recorder_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/simple_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/simple_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/simple_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/simple_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/source_field.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/source_field.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/source_field.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/source_field.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/source_field.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/source_field.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/source_field.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/source_field.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/throttling_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/throttling_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/throttling_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/throttling_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/uploader.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/uploader.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/uploader.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/uploader.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/zip_url_tls_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/zip_url_tls_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/browser/zip_url_tls_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/browser/zip_url_tls_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/code_editor.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/code_editor.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/code_editor.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/code_editor.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/combo_box.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/combo_box.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/combo_box.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/combo_box.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/combo_box.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/combo_box.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/combo_box.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/combo_box.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/common_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/common/common_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/common_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/common/common_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/default_values.ts b/x-pack/plugins/synthetics/public/components/fleet_package/common/default_values.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/default_values.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/common/default_values.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/described_form_group_with_wrap.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/common/described_form_group_with_wrap.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/described_form_group_with_wrap.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/common/described_form_group_with_wrap.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/enabled.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/common/enabled.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/enabled.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/common/enabled.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/formatters.test.ts b/x-pack/plugins/synthetics/public/components/fleet_package/common/formatters.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/formatters.test.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/common/formatters.test.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/formatters.ts b/x-pack/plugins/synthetics/public/components/fleet_package/common/formatters.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/formatters.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/common/formatters.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/normalizers.test.ts b/x-pack/plugins/synthetics/public/components/fleet_package/common/normalizers.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/normalizers.test.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/common/normalizers.test.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/normalizers.ts b/x-pack/plugins/synthetics/public/components/fleet_package/common/normalizers.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/normalizers.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/common/normalizers.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/simple_fields_wrapper.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/common/simple_fields_wrapper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/simple_fields_wrapper.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/common/simple_fields_wrapper.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/tls_options.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/common/tls_options.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/common/tls_options.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/common/tls_options.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/browser_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/browser_context.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/browser_context_advanced.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/browser_context_advanced.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_provider.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/browser_provider.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_provider.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/browser_provider.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/http_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/http_context.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context_advanced.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/http_context_advanced.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context_advanced.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/http_context_advanced.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_provider.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/http_provider.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/http_provider.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/http_provider.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/icmp_context.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/icmp_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/icmp_context.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/icmp_context.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/index.ts b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/index.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/index.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/policy_config_context.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/policy_config_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/policy_config_context.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/policy_config_context.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/synthetics_context_providers.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/synthetics_context_providers.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/synthetics_context_providers.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/synthetics_context_providers.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/tcp_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/tcp_context.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context_advanced.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/tcp_context_advanced.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context_advanced.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/tcp_context_advanced.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_provider.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/tcp_provider.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_provider.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/tcp_provider.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tls_fields_context.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/contexts/tls_fields_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/contexts/tls_fields_context.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/contexts/tls_fields_context.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/custom_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/custom_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/custom_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/custom_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/header_field.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/header_field.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/header_field.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/header_field.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/header_field.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/header_field.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/header_field.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/header_field.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/helpers/context_helpers.ts b/x-pack/plugins/synthetics/public/components/fleet_package/helpers/context_helpers.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/helpers/context_helpers.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/helpers/context_helpers.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/helpers/formatters.ts b/x-pack/plugins/synthetics/public/components/fleet_package/helpers/formatters.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/helpers/formatters.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/helpers/formatters.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/helpers/normalizers.ts b/x-pack/plugins/synthetics/public/components/fleet_package/helpers/normalizers.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/helpers/normalizers.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/helpers/normalizers.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_policy.ts b/x-pack/plugins/synthetics/public/components/fleet_package/hooks/use_policy.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/hooks/use_policy.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/hooks/use_policy.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/hooks/use_update_policy.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/hooks/use_update_policy.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.ts b/x-pack/plugins/synthetics/public/components/fleet_package/hooks/use_update_policy.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/hooks/use_update_policy.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/http/advanced_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/http/advanced_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/http/advanced_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/http/advanced_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/formatters.ts b/x-pack/plugins/synthetics/public/components/fleet_package/http/formatters.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/http/formatters.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/http/formatters.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/normalizers.ts b/x-pack/plugins/synthetics/public/components/fleet_package/http/normalizers.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/http/normalizers.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/http/normalizers.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/simple_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/http/simple_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/http/simple_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/http/simple_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/icmp/advanced_fields.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/icmp/advanced_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/icmp/advanced_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/icmp/advanced_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/icmp/advanced_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/icmp/advanced_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/icmp/advanced_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/icmp/advanced_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/icmp/formatters.ts b/x-pack/plugins/synthetics/public/components/fleet_package/icmp/formatters.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/icmp/formatters.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/icmp/formatters.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/icmp/normalizers.ts b/x-pack/plugins/synthetics/public/components/fleet_package/icmp/normalizers.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/icmp/normalizers.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/icmp/normalizers.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/icmp/simple_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/icmp/simple_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/icmp/simple_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/icmp/simple_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/index.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/index.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/index.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/index.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/index_response_body_field.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/index_response_body_field.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/index_response_body_field.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/index_response_body_field.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/index_response_body_field.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/index_response_body_field.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/index_response_body_field.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/index_response_body_field.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/key_value_field.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/key_value_field.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/key_value_field.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/key_value_field.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/key_value_field.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/key_value_field.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/key_value_field.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/key_value_field.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/lazy_synthetics_custom_assets_extension.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/lazy_synthetics_custom_assets_extension.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/lazy_synthetics_custom_assets_extension.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/lazy_synthetics_custom_assets_extension.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/lazy_synthetics_policy_create_extension.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/lazy_synthetics_policy_create_extension.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/lazy_synthetics_policy_create_extension.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/lazy_synthetics_policy_create_extension.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/lazy_synthetics_policy_edit_extension.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/lazy_synthetics_policy_edit_extension.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/lazy_synthetics_policy_edit_extension.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/lazy_synthetics_policy_edit_extension.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/optional_label.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/optional_label.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/optional_label.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/optional_label.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/request_body_field.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/request_body_field.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/request_body_field.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/request_body_field.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/request_body_field.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/request_body_field.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/request_body_field.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/request_body_field.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/schedule_field.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/schedule_field.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/schedule_field.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/schedule_field.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/schedule_field.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/schedule_field.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/schedule_field.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/schedule_field.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_custom_assets_extension.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/synthetics_custom_assets_extension.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/synthetics_custom_assets_extension.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/synthetics_custom_assets_extension.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_create_extension.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_create_extension.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension_wrapper.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_create_extension_wrapper.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension_wrapper.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_create_extension_wrapper.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension_wrapper.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_create_extension_wrapper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension_wrapper.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_create_extension_wrapper.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_edit_extension.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_edit_extension.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/tcp/advanced_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/tcp/advanced_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/tcp/advanced_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/tcp/advanced_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/formatters.ts b/x-pack/plugins/synthetics/public/components/fleet_package/tcp/formatters.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tcp/formatters.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/tcp/formatters.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/normalizers.ts b/x-pack/plugins/synthetics/public/components/fleet_package/tcp/normalizers.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tcp/normalizers.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/tcp/normalizers.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/simple_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/tcp/simple_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tcp/simple_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/tcp/simple_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls/default_values.ts b/x-pack/plugins/synthetics/public/components/fleet_package/tls/default_values.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tls/default_values.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/tls/default_values.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls/formatters.ts b/x-pack/plugins/synthetics/public/components/fleet_package/tls/formatters.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tls/formatters.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/tls/formatters.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls/normalizers.ts b/x-pack/plugins/synthetics/public/components/fleet_package/tls/normalizers.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tls/normalizers.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/tls/normalizers.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.test.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/tls_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tls_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/tls_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/tls_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/tls_fields.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/tls_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/types.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/types.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/types.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/types.tsx diff --git a/x-pack/plugins/uptime/public/components/fleet_package/validation.test.ts b/x-pack/plugins/synthetics/public/components/fleet_package/validation.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/validation.test.ts rename to x-pack/plugins/synthetics/public/components/fleet_package/validation.test.ts diff --git a/x-pack/plugins/uptime/public/components/fleet_package/validation.tsx b/x-pack/plugins/synthetics/public/components/fleet_package/validation.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/fleet_package/validation.tsx rename to x-pack/plugins/synthetics/public/components/fleet_package/validation.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/__snapshots__/monitor_charts.test.tsx.snap b/x-pack/plugins/synthetics/public/components/monitor/__snapshots__/monitor_charts.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/__snapshots__/monitor_charts.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/monitor/__snapshots__/monitor_charts.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/monitor/index.ts b/x-pack/plugins/synthetics/public/components/monitor/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/index.ts rename to x-pack/plugins/synthetics/public/components/monitor/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/__snapshots__/confirm_delete.test.tsx.snap b/x-pack/plugins/synthetics/public/components/monitor/ml/__snapshots__/confirm_delete.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/__snapshots__/confirm_delete.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/monitor/ml/__snapshots__/confirm_delete.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/__snapshots__/ml_integerations.test.tsx.snap b/x-pack/plugins/synthetics/public/components/monitor/ml/__snapshots__/ml_integerations.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/__snapshots__/ml_integerations.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/monitor/ml/__snapshots__/ml_integerations.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/confirm_alert_delete.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/confirm_alert_delete.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/confirm_alert_delete.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/confirm_alert_delete.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/confirm_delete.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/confirm_delete.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/confirm_delete.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/confirm_delete.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/confirm_delete.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/confirm_delete.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/confirm_delete.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/confirm_delete.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/index.ts b/x-pack/plugins/synthetics/public/components/monitor/ml/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/index.ts rename to x-pack/plugins/synthetics/public/components/monitor/ml/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/license_info.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/license_info.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/license_info.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/license_info.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/license_info.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/license_info.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/license_info.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/license_info.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/manage_ml_job.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/manage_ml_job.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/ml_flyout.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/ml_flyout.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/ml_flyout.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/ml_flyout.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/ml_flyout_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/ml_flyout_container.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/ml_integeration.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/ml_integeration.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/ml_integerations.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/ml_integerations.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/ml_integerations.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/ml_integerations.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/ml_job_link.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/ml_job_link.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/ml_job_link.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/ml_job_link.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/ml_job_link.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/ml_job_link.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/ml_job_link.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/ml_job_link.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/ml_manage_job.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/ml_manage_job.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/ml_manage_job.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/ml_manage_job.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/translations.tsx b/x-pack/plugins/synthetics/public/components/monitor/ml/translations.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/translations.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ml/translations.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/use_anomaly_alert.ts b/x-pack/plugins/synthetics/public/components/monitor/ml/use_anomaly_alert.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ml/use_anomaly_alert.ts rename to x-pack/plugins/synthetics/public/components/monitor/ml/use_anomaly_alert.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_charts.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/monitor_charts.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/monitor_charts.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/monitor_charts.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_charts.tsx b/x-pack/plugins/synthetics/public/components/monitor/monitor_charts.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/monitor_charts.tsx rename to x-pack/plugins/synthetics/public/components/monitor/monitor_charts.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_duration/index.ts b/x-pack/plugins/synthetics/public/components/monitor/monitor_duration/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/monitor_duration/index.ts rename to x-pack/plugins/synthetics/public/components/monitor/monitor_duration/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx b/x-pack/plugins/synthetics/public/components/monitor/monitor_duration/monitor_duration.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx rename to x-pack/plugins/synthetics/public/components/monitor/monitor_duration/monitor_duration.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx b/x-pack/plugins/synthetics/public/components/monitor/monitor_duration/monitor_duration_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx rename to x-pack/plugins/synthetics/public/components/monitor/monitor_duration/monitor_duration_container.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_title.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/monitor_title.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/monitor_title.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/monitor_title.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_title.tsx b/x-pack/plugins/synthetics/public/components/monitor/monitor_title.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/monitor_title.tsx rename to x-pack/plugins/synthetics/public/components/monitor/monitor_title.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_histogram/index.ts b/x-pack/plugins/synthetics/public/components/monitor/ping_histogram/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_histogram/index.ts rename to x-pack/plugins/synthetics/public/components/monitor/ping_histogram/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_histogram/ping_histogram_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_histogram/ping_histogram_container.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/__snapshots__/expanded_row.test.tsx.snap b/x-pack/plugins/synthetics/public/components/monitor/ping_list/__snapshots__/expanded_row.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/__snapshots__/expanded_row.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/__snapshots__/expanded_row.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/__snapshots__/ping_headers.test.tsx.snap b/x-pack/plugins/synthetics/public/components/monitor/ping_list/__snapshots__/ping_headers.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/__snapshots__/ping_headers.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/__snapshots__/ping_headers.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/expand_row.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/expand_row.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/expand_row.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/expand_row.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/expand_row.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/expand_row.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/expand_row.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/expand_row.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/failed_step.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/failed_step.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/failed_step.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/failed_step.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_error.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_error.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_error.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_error.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_status.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_status.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_status.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_status.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/index.ts b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/index.ts rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/no_image_available.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/step_image_popover.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/translations.ts b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/translations.ts rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/ping_timestamp/translations.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/response_code.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/response_code.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/columns/response_code.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/columns/response_code.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/doc_link_body.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/doc_link_body.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/doc_link_body.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/doc_link_body.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/doc_link_body.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/doc_link_body.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/doc_link_body.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/doc_link_body.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/expanded_row.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/expanded_row.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/expanded_row.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/expanded_row.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/expanded_row.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/expanded_row.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/expanded_row.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/expanded_row.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/headers.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/headers.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/headers.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/headers.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/index.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/index.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/index.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/index.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/location_name.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/location_name.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/location_name.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/location_name.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_headers.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_headers.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/ping_headers.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_headers.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_list.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_list.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_list.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_list.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list_header.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_list_header.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list_header.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_list_header.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list_table.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_list_table.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list_table.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_list_table.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_redirects.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_redirects.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/ping_redirects.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/ping_redirects.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/response_code.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/ping_list/response_code.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/response_code.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/response_code.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/translations.ts b/x-pack/plugins/synthetics/public/components/monitor/ping_list/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/translations.ts rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/translations.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/use_pings.ts b/x-pack/plugins/synthetics/public/components/monitor/ping_list/use_pings.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/ping_list/use_pings.ts rename to x-pack/plugins/synthetics/public/components/monitor/ping_list/use_pings.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/__snapshots__/monitor_status.bar.test.tsx.snap b/x-pack/plugins/synthetics/public/components/monitor/status_details/__snapshots__/monitor_status.bar.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/__snapshots__/monitor_status.bar.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/monitor/status_details/__snapshots__/monitor_status.bar.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/__snapshots__/ssl_certificate.test.tsx.snap b/x-pack/plugins/synthetics/public/components/monitor/status_details/__snapshots__/ssl_certificate.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/__snapshots__/ssl_certificate.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/monitor/status_details/__snapshots__/ssl_certificate.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/__snapshots__/status_by_location.test.tsx.snap b/x-pack/plugins/synthetics/public/components/monitor/status_details/__snapshots__/status_by_location.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/__snapshots__/status_by_location.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/monitor/status_details/__snapshots__/status_by_location.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/__snapshots__/tag_label.test.tsx.snap b/x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/__snapshots__/tag_label.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/__snapshots__/tag_label.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/__snapshots__/tag_label.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/availability_reporting.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/availability_reporting.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/availability_reporting.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/availability_reporting.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/availability_reporting.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/availability_reporting.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/availability_reporting.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/availability_reporting.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/index.ts b/x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/index.ts rename to x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/location_status_tags.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/location_status_tags.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/location_status_tags.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/location_status_tags.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/location_status_tags.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/location_status_tags.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/location_status_tags.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/location_status_tags.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/tag_label.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/tag_label.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/tag_label.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/tag_label.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/tag_label.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/tag_label.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/availability_reporting/tag_label.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/availability_reporting/tag_label.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/index.ts b/x-pack/plugins/synthetics/public/components/monitor/status_details/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/index.ts rename to x-pack/plugins/synthetics/public/components/monitor/status_details/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/location_availability/location_availability.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/location_availability/location_availability.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/location_availability/location_availability.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/location_availability/location_availability.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/location_availability/location_availability.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/location_availability/location_availability.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/location_availability/location_availability.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/location_availability/location_availability.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/monitor_status.bar.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/monitor_status.bar.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/monitor_status.bar.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/monitor_status.bar.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/ssl_certificate.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/ssl_certificate.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/ssl_certificate.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/ssl_certificate.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/index.ts b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/index.ts rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/monitor_redirects.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/monitor_redirects.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/monitor_redirects.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/monitor_redirects.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/ssl_certificate.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/ssl_certificate.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/ssl_certificate.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/ssl_certificate.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.test.ts b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/status_bar.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.test.ts rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/status_bar.test.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/status_bar.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/status_bar.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_by_location.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/status_by_location.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_by_location.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/status_by_location.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/use_status_bar.ts b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/use_status_bar.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/use_status_bar.ts rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_bar/use_status_bar.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_by_location.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_by_location.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_by_location.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_by_location.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_details.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_details.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_details.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_details.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_details_container.tsx b/x-pack/plugins/synthetics/public/components/monitor/status_details/status_details_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/status_details_container.tsx rename to x-pack/plugins/synthetics/public/components/monitor/status_details/status_details_container.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/translations.ts b/x-pack/plugins/synthetics/public/components/monitor/status_details/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/status_details/translations.ts rename to x-pack/plugins/synthetics/public/components/monitor/status_details/translations.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_detail_container.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/step_detail_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_detail_container.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/step_detail_container.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_page_nav.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/step_page_nav.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_page_nav.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/step_page_nav.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_page_title.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/step_page_title.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_page_title.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/step_page_title.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumb.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumb.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumb.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumb.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumbs.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumbs.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumbs.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumbs.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/use_step_waterfall_metrics.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.test.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.test.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.test.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/data_formatting.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/types.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/types.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/types.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/types.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_container.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_chart_wrapper.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_filter.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_flyout.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/step_detail/waterfall/waterfall_sidebar_item.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/translations.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/translations.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/translations.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/README.md b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/README.md similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/README.md rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/README.md diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/constants.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/constants.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/constants.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/constants.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/legend.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/legend.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/legend.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/legend.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/middle_truncated_text.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/network_requests_total.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/network_requests_total.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/network_requests_total.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/network_requests_total.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/network_requests_total.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/network_requests_total.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/network_requests_total.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/network_requests_total.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/sidebar.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/sidebar.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/sidebar.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/sidebar.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/styles.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/styles.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/styles.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/styles.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/translations.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/translations.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/translations.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/use_bar_charts.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/use_bar_charts.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/use_bar_charts.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/use_bar_charts.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/use_bar_charts.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/use_bar_charts.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/use_bar_charts.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/use_bar_charts.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/use_flyout.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/use_flyout.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/use_flyout.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/use_flyout.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/use_flyout.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/use_flyout.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/use_flyout.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/use_flyout.ts diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_bar_chart.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_bar_chart.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_bar_chart.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_bar_chart.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_chart.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_chart.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_chart.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_chart.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_chart_fixed_axis.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_chart_fixed_axis.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_chart_fixed_axis.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_chart_fixed_axis.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_flyout_table.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_flyout_table.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_flyout_table.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_flyout_table.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_test_helper.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_test_helper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_test_helper.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_test_helper.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_markers.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_markers.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_markers.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_markers.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.test.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/components/waterfall_tooltip_content.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/context/waterfall_chart.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/context/waterfall_chart.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/context/waterfall_chart.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/context/waterfall_chart.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/index.tsx b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/index.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/index.tsx rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/index.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/types.ts b/x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/types.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/types.ts rename to x-pack/plugins/synthetics/public/components/monitor/synthetics/waterfall/types.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/action_bar/action_bar.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/action_bar/action_bar.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/action_bar/action_bar.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/action_bar/action_bar.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/action_bar/action_bar.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/action_bar/action_bar.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/action_bar/action_bar.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/action_bar/action_bar.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/action_bar/action_bar_errors.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/action_bar/action_bar_errors.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/action_bar/action_bar_errors.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/action_bar/action_bar_errors.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/action_bar/action_bar_portal.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/action_bar/action_bar_portal.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/action_bar/action_bar_portal.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/action_bar/action_bar_portal.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/add_monitor_btn.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/add_monitor_btn.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/add_monitor_btn.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/add_monitor_btn.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/content/index.ts b/x-pack/plugins/synthetics/public/components/monitor_management/content/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/content/index.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/content/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/edit_monitor_config.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/edit_monitor_config.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/edit_monitor_config.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/edit_monitor_config.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_enablement.ts b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_enablement.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_enablement.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_enablement.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_format_monitor.ts b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_format_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_format_monitor.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_format_monitor.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_inline_errors.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_inline_errors.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_inline_errors.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_inline_errors.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_inline_errors.ts b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_inline_errors.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_inline_errors.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_inline_errors.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_inline_errors_count.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_inline_errors_count.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_inline_errors_count.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_inline_errors_count.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_inline_errors_count.ts b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_inline_errors_count.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_inline_errors_count.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_inline_errors_count.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_invalid_monitors.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_invalid_monitors.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_invalid_monitors.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_invalid_monitors.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_locations.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_locations.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_locations.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_locations.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_locations.ts b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_locations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_locations.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_locations.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_run_once_errors.ts b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_run_once_errors.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_run_once_errors.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_run_once_errors.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_service_allowed.ts b/x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_service_allowed.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/hooks/use_service_allowed.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/hooks/use_service_allowed.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/loader/loader.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/loader/loader.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/loader/loader.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/loader/loader.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/loader/loader.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/loader/loader.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/loader/loader.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/loader/loader.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/mocks/index.ts b/x-pack/plugins/synthetics/public/components/monitor_management/mocks/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/mocks/index.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/mocks/index.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/mocks/locations.ts b/x-pack/plugins/synthetics/public/components/monitor_management/mocks/locations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/mocks/locations.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/mocks/locations.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/locations.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/locations.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/locations.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/locations.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/locations.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/locations.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/locations.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/locations.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_advanced_fields.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_advanced_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_advanced_fields.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_advanced_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_config.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_config.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_config.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_config.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_config.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_config.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_config.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_config.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_fields.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_fields.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_fields.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_fields.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_fields.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_fields.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_fields.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_fields.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_name_location.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_name_location.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/monitor_name_location.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/monitor_name_location.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/use_monitor_name.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/use_monitor_name.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/use_monitor_name.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/use_monitor_name.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_config/use_monitor_name.ts b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/use_monitor_name.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_config/use_monitor_name.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_config/use_monitor_name.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/actions.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/actions.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/actions.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/actions.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/actions.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/all_monitors.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/all_monitors.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/all_monitors.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/all_monitors.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/delete_monitor.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/delete_monitor.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/delete_monitor.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/delete_monitor.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/delete_monitor.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/enablement_empty_state.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/enablement_empty_state.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/enablement_empty_state.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/enablement_empty_state.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/inline_error.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/inline_error.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/inline_error.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/inline_error.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/inline_error.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/inline_error.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/inline_error.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/inline_error.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/invalid_monitors.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/invalid_monitors.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/invalid_monitors.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/invalid_monitors.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/list_tabs.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/list_tabs.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/list_tabs.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/list_tabs.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/list_tabs.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/list_tabs.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/list_tabs.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/list_tabs.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_async_error.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_async_error.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_async_error.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_async_error.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_async_error.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_async_error.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_async_error.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_async_error.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_enabled.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_enabled.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_enabled.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_enabled.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_enabled.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_enabled.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_enabled.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_enabled.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_list.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_list.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_list.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_list.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list_container.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_list_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_list_container.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_list_container.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_locations.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_locations.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/monitor_locations.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/monitor_locations.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/stderr_logs_popover.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/stderr_logs_popover.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/stderr_logs_popover.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/stderr_logs_popover.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/monitor_list/tags.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/tags.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/monitor_list/tags.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/monitor_list/tags.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/show_sync_errors.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/show_sync_errors.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/show_sync_errors.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/show_sync_errors.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/browser/browser_test_results.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/browser/browser_test_results.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/browser/browser_test_results.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/browser_test_results.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/browser/browser_test_results.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.ts b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/browser/use_browser_run_once_monitors.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/simple/simple_test_results.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/simple/simple_test_results.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/simple/simple_test_results.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/simple_test_results.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/simple/simple_test_results.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/use_simple_run_once_monitors.ts b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/simple/use_simple_run_once_monitors.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/simple/use_simple_run_once_monitors.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/simple/use_simple_run_once_monitors.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_now_mode.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_now_mode.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_now_mode.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_now_mode.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_now_mode.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_result_header.test.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_result_header.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_result_header.test.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_result_header.test.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_result_header.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_result_header.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_result_header.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_result_header.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_run_results.tsx b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_run_results.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/test_run_results.tsx rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/test_run_results.tsx diff --git a/x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/use_tick_tick.ts b/x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/use_tick_tick.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/test_now_mode/use_tick_tick.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/test_now_mode/use_tick_tick.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/validation.test.ts b/x-pack/plugins/synthetics/public/components/monitor_management/validation.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/validation.test.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/validation.test.ts diff --git a/x-pack/plugins/uptime/public/components/monitor_management/validation.ts b/x-pack/plugins/synthetics/public/components/monitor_management/validation.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/monitor_management/validation.ts rename to x-pack/plugins/synthetics/public/components/monitor_management/validation.ts diff --git a/x-pack/plugins/uptime/public/components/overview/__snapshots__/snapshot_heading.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/__snapshots__/snapshot_heading.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/__snapshots__/snapshot_heading.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/__snapshots__/snapshot_heading.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alert_expression_popover.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/alert_expression_popover.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alert_expression_popover.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/alert_expression_popover.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alert_field_number.test.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/alert_field_number.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alert_field_number.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/alert_field_number.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alert_field_number.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/alert_field_number.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alert_field_number.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/alert_field_number.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alert_query_bar/query_bar.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/alert_query_bar/query_bar.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alert_query_bar/query_bar.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/alert_query_bar/query_bar.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alert_tls.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/alert_tls.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alert_tls.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/alert_tls.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_tls.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/alert_tls.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_tls.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/alert_tls.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/index.ts b/x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/index.ts rename to x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/index.ts diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/use_snap_shot.ts b/x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/use_snap_shot.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/use_snap_shot.ts rename to x-pack/plugins/synthetics/public/components/overview/alerts/alerts_containers/use_snap_shot.ts diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/anomaly_alert.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/anomaly_alert/anomaly_alert.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/anomaly_alert.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/anomaly_alert/anomaly_alert.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/select_severity.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/anomaly_alert/select_severity.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/select_severity.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/anomaly_alert/select_severity.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/translations.ts b/x-pack/plugins/synthetics/public/components/overview/alerts/anomaly_alert/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/translations.ts rename to x-pack/plugins/synthetics/public/components/overview/alerts/anomaly_alert/translations.ts diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/index.ts b/x-pack/plugins/synthetics/public/components/overview/alerts/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/index.ts rename to x-pack/plugins/synthetics/public/components/overview/alerts/index.ts diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__snapshots__/down_number_select.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/__snapshots__/down_number_select.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__snapshots__/down_number_select.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/__snapshots__/down_number_select.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__snapshots__/time_expression_select.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/__snapshots__/time_expression_select.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__snapshots__/time_expression_select.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/__snapshots__/time_expression_select.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/availability_expression_select.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/availability_expression_select.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/availability_expression_select.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/availability_expression_select.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.test.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/down_number_select.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/down_number_select.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/down_number_select.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/down_number_select.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.test.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/filters_expression_select.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/filters_expression_select.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/index.ts diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/status_expression_select.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/status_expression_select.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/status_expression_select.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/status_expression_select.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.test.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/time_expression_select.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/time_expression_select.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_unit_selectable.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/time_unit_selectable.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_unit_selectable.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/time_unit_selectable.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/translations.ts b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/translations.ts rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_expressions/translations.ts diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/add_filter_btn.test.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/add_filter_btn.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/add_filter_btn.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/add_filter_btn.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/add_filter_btn.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/add_filter_btn.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/add_filter_btn.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/add_filter_btn.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.test.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/alert_monitor_status.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/old_alert_call_out.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/old_alert_call_out.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/old_alert_call_out.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/old_alert_call_out.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/old_alert_callout.test.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/old_alert_callout.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/monitor_status_alert/old_alert_callout.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/monitor_status_alert/old_alert_callout.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/settings_message_expression_popover.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/settings_message_expression_popover.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.test.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/toggle_alert_flyout_button.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/toggle_alert_flyout_button.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/toggle_alert_flyout_button.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/toggle_alert_flyout_button.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/translations.ts b/x-pack/plugins/synthetics/public/components/overview/alerts/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/translations.ts rename to x-pack/plugins/synthetics/public/components/overview/alerts/translations.ts diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx b/x-pack/plugins/synthetics/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx rename to x-pack/plugins/synthetics/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx b/x-pack/plugins/synthetics/public/components/overview/empty_state/empty_state_error.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx rename to x-pack/plugins/synthetics/public/components/overview/empty_state/empty_state_error.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_loading.tsx b/x-pack/plugins/synthetics/public/components/overview/empty_state/empty_state_loading.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_loading.tsx rename to x-pack/plugins/synthetics/public/components/overview/empty_state/empty_state_loading.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/empty_state/use_has_data.tsx b/x-pack/plugins/synthetics/public/components/overview/empty_state/use_has_data.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/empty_state/use_has_data.tsx rename to x-pack/plugins/synthetics/public/components/overview/empty_state/use_has_data.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.test.tsx b/x-pack/plugins/synthetics/public/components/overview/filter_group/filter_group.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/filter_group/filter_group.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.tsx b/x-pack/plugins/synthetics/public/components/overview/filter_group/filter_group.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.tsx rename to x-pack/plugins/synthetics/public/components/overview/filter_group/filter_group.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/filter_group/selected_filters.tsx b/x-pack/plugins/synthetics/public/components/overview/filter_group/selected_filters.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/filter_group/selected_filters.tsx rename to x-pack/plugins/synthetics/public/components/overview/filter_group/selected_filters.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/filter_group/translations.tsx b/x-pack/plugins/synthetics/public/components/overview/filter_group/translations.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/filter_group/translations.tsx rename to x-pack/plugins/synthetics/public/components/overview/filter_group/translations.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/index.ts b/x-pack/plugins/synthetics/public/components/overview/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/index.ts rename to x-pack/plugins/synthetics/public/components/overview/index.ts diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/__snapshots__/filter_status_button.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/monitor_list/__snapshots__/filter_status_button.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/__snapshots__/filter_status_button.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/__snapshots__/filter_status_button.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/__snapshots__/status_filter.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/monitor_list/__snapshots__/status_filter.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/__snapshots__/status_filter.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/__snapshots__/status_filter.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/cert_status_column.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/cert_status_column.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/cert_status_column.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/cert_status_column.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/define_connectors.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/define_connectors.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/define_connectors.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/define_connectors.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/enable_alert.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/enable_alert.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/enable_alert.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/enable_alert.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_name_col.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/monitor_name_col.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_name_col.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/monitor_name_col.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_status_column.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/monitor_status_column.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_status_column.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/monitor_status_column.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_status_column.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/monitor_status_column.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/monitor_status_column.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/monitor_status_column.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/browser_monitor_progress.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/progress/browser_monitor_progress.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/browser_monitor_progress.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/progress/browser_monitor_progress.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/monitor_progress.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/progress/monitor_progress.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/monitor_progress.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/progress/monitor_progress.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/simple_monitor_progress.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/progress/simple_monitor_progress.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/simple_monitor_progress.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/progress/simple_monitor_progress.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/use_updated_monitor.ts b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/progress/use_updated_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/progress/use_updated_monitor.ts rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/progress/use_updated_monitor.ts diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/status_badge.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/status_badge.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/status_badge.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/status_badge.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/status_badge.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/status_badge.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/status_badge.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/status_badge.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/test_now_col.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/test_now_col.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/test_now_col.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/test_now_col.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/translations.ts b/x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/columns/translations.ts rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/columns/translations.ts diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/filter_status_button.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/filter_status_button.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/filter_status_button.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/filter_status_button.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/filter_status_button.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/filter_status_button.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/filter_status_button.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/filter_status_button.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/index.ts b/x-pack/plugins/synthetics/public/components/overview/monitor_list/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/index.ts rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/index.ts diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_container.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_group.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_group.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_group.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_group.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_link.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_link.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_link.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/integration_link.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/monitor_list_drawer.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/monitor_list_drawer.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/monitor_list_drawer.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/monitor_list_drawer.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/most_recent_error.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/most_recent_error.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/most_recent_error.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/__snapshots__/most_recent_error.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/data.json b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/data.json similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/data.json rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/data.json diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/enabled_alerts.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/enabled_alerts.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/enabled_alerts.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/enabled_alerts.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/index.ts b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/index.ts rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/index.ts diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/integration_group.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/integration_group.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/integration_group.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/integration_group.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/integration_link.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/integration_link.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/integration_link.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/integration_link.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_url.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_url.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_url.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/monitor_url.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_run.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/most_recent_run.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_run.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_drawer/most_recent_run.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_header.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_header.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_header.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_header.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_page_size_select.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_page_size_select.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_page_size_select.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/monitor_list_page_size_select.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/no_items_meesage.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/no_items_meesage.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/no_items_meesage.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/no_items_meesage.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/no_items_message.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/no_items_message.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/no_items_message.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/no_items_message.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/overview_page_link.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/overview_page_link.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/overview_page_link.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/overview_page_link.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.test.ts b/x-pack/plugins/synthetics/public/components/overview/monitor_list/parse_timestamp.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.test.ts rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/parse_timestamp.test.ts diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.ts b/x-pack/plugins/synthetics/public/components/overview/monitor_list/parse_timestamp.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.ts rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/parse_timestamp.ts diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/status_filter.test.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/status_filter.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/status_filter.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/status_filter.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/status_filter.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/status_filter.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/status_filter.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/status_filter.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/translations.ts b/x-pack/plugins/synthetics/public/components/overview/monitor_list/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/translations.ts rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/translations.ts diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/troubleshoot_popover.tsx b/x-pack/plugins/synthetics/public/components/overview/monitor_list/troubleshoot_popover.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/troubleshoot_popover.tsx rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/troubleshoot_popover.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/types.ts b/x-pack/plugins/synthetics/public/components/overview/monitor_list/types.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/types.ts rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/types.ts diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/use_monitor_histogram.ts b/x-pack/plugins/synthetics/public/components/overview/monitor_list/use_monitor_histogram.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/monitor_list/use_monitor_histogram.ts rename to x-pack/plugins/synthetics/public/components/overview/monitor_list/use_monitor_histogram.ts diff --git a/x-pack/plugins/uptime/public/components/overview/query_bar/query_bar.tsx b/x-pack/plugins/synthetics/public/components/overview/query_bar/query_bar.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/query_bar/query_bar.tsx rename to x-pack/plugins/synthetics/public/components/overview/query_bar/query_bar.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/query_bar/translations.ts b/x-pack/plugins/synthetics/public/components/overview/query_bar/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/query_bar/translations.ts rename to x-pack/plugins/synthetics/public/components/overview/query_bar/translations.ts diff --git a/x-pack/plugins/uptime/public/components/overview/query_bar/use_query_bar.test.tsx b/x-pack/plugins/synthetics/public/components/overview/query_bar/use_query_bar.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/query_bar/use_query_bar.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/query_bar/use_query_bar.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/query_bar/use_query_bar.ts b/x-pack/plugins/synthetics/public/components/overview/query_bar/use_query_bar.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/query_bar/use_query_bar.ts rename to x-pack/plugins/synthetics/public/components/overview/query_bar/use_query_bar.ts diff --git a/x-pack/plugins/uptime/public/components/overview/snapshot/__snapshots__/snapshot.test.tsx.snap b/x-pack/plugins/synthetics/public/components/overview/snapshot/__snapshots__/snapshot.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/snapshot/__snapshots__/snapshot.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/overview/snapshot/__snapshots__/snapshot.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/overview/snapshot/index.ts b/x-pack/plugins/synthetics/public/components/overview/snapshot/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/snapshot/index.ts rename to x-pack/plugins/synthetics/public/components/overview/snapshot/index.ts diff --git a/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot.test.tsx b/x-pack/plugins/synthetics/public/components/overview/snapshot/snapshot.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/snapshot/snapshot.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/snapshot/snapshot.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot.tsx b/x-pack/plugins/synthetics/public/components/overview/snapshot/snapshot.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/snapshot/snapshot.tsx rename to x-pack/plugins/synthetics/public/components/overview/snapshot/snapshot.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_heading.tsx b/x-pack/plugins/synthetics/public/components/overview/snapshot/snapshot_heading.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_heading.tsx rename to x-pack/plugins/synthetics/public/components/overview/snapshot/snapshot_heading.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/snapshot/use_snap_shot.ts b/x-pack/plugins/synthetics/public/components/overview/snapshot/use_snap_shot.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/snapshot/use_snap_shot.ts rename to x-pack/plugins/synthetics/public/components/overview/snapshot/use_snap_shot.ts diff --git a/x-pack/plugins/uptime/public/components/overview/snapshot_heading.test.tsx b/x-pack/plugins/synthetics/public/components/overview/snapshot_heading.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/snapshot_heading.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/snapshot_heading.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/status_panel.tsx b/x-pack/plugins/synthetics/public/components/overview/status_panel.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/status_panel.tsx rename to x-pack/plugins/synthetics/public/components/overview/status_panel.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/synthetics_callout.test.tsx b/x-pack/plugins/synthetics/public/components/overview/synthetics_callout.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/synthetics_callout.test.tsx rename to x-pack/plugins/synthetics/public/components/overview/synthetics_callout.test.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/synthetics_callout.tsx b/x-pack/plugins/synthetics/public/components/overview/synthetics_callout.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/overview/synthetics_callout.tsx rename to x-pack/plugins/synthetics/public/components/overview/synthetics_callout.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/__snapshots__/certificate_form.test.tsx.snap b/x-pack/plugins/synthetics/public/components/settings/__snapshots__/certificate_form.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/__snapshots__/certificate_form.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/settings/__snapshots__/certificate_form.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/settings/__snapshots__/indices_form.test.tsx.snap b/x-pack/plugins/synthetics/public/components/settings/__snapshots__/indices_form.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/__snapshots__/indices_form.test.tsx.snap rename to x-pack/plugins/synthetics/public/components/settings/__snapshots__/indices_form.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/settings/add_connector_flyout.tsx b/x-pack/plugins/synthetics/public/components/settings/add_connector_flyout.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/add_connector_flyout.tsx rename to x-pack/plugins/synthetics/public/components/settings/add_connector_flyout.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/alert_defaults_form.tsx b/x-pack/plugins/synthetics/public/components/settings/alert_defaults_form.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/alert_defaults_form.tsx rename to x-pack/plugins/synthetics/public/components/settings/alert_defaults_form.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/certificate_form.test.tsx b/x-pack/plugins/synthetics/public/components/settings/certificate_form.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/certificate_form.test.tsx rename to x-pack/plugins/synthetics/public/components/settings/certificate_form.test.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/certificate_form.tsx b/x-pack/plugins/synthetics/public/components/settings/certificate_form.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/certificate_form.tsx rename to x-pack/plugins/synthetics/public/components/settings/certificate_form.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/default_email.tsx b/x-pack/plugins/synthetics/public/components/settings/default_email.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/default_email.tsx rename to x-pack/plugins/synthetics/public/components/settings/default_email.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/indices_form.test.tsx b/x-pack/plugins/synthetics/public/components/settings/indices_form.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/indices_form.test.tsx rename to x-pack/plugins/synthetics/public/components/settings/indices_form.test.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/indices_form.tsx b/x-pack/plugins/synthetics/public/components/settings/indices_form.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/indices_form.tsx rename to x-pack/plugins/synthetics/public/components/settings/indices_form.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/settings_actions.tsx b/x-pack/plugins/synthetics/public/components/settings/settings_actions.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/settings_actions.tsx rename to x-pack/plugins/synthetics/public/components/settings/settings_actions.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/settings_bottom_bar.tsx b/x-pack/plugins/synthetics/public/components/settings/settings_bottom_bar.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/settings_bottom_bar.tsx rename to x-pack/plugins/synthetics/public/components/settings/settings_bottom_bar.tsx diff --git a/x-pack/plugins/uptime/public/components/settings/translations.ts b/x-pack/plugins/synthetics/public/components/settings/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/translations.ts rename to x-pack/plugins/synthetics/public/components/settings/translations.ts diff --git a/x-pack/plugins/uptime/public/components/settings/types.ts b/x-pack/plugins/synthetics/public/components/settings/types.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/types.ts rename to x-pack/plugins/synthetics/public/components/settings/types.ts diff --git a/x-pack/plugins/uptime/public/components/settings/use_settings_errors.ts b/x-pack/plugins/synthetics/public/components/settings/use_settings_errors.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/settings/use_settings_errors.ts rename to x-pack/plugins/synthetics/public/components/settings/use_settings_errors.ts diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/stderr_logs.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/stderr_logs.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/stderr_logs.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/stderr_logs.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_duration.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_duration.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/step_duration.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_duration.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/screenshot_link.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_expanded_row/screenshot_link.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/screenshot_link.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_expanded_row/screenshot_link.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_field_trend.test.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_field_trend.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/step_field_trend.test.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_field_trend.test.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_field_trend.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_field_trend.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/step_field_trend.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_field_trend.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_image.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_image.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/step_image.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/step_image.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.test.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/steps_list.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.test.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/steps_list.test.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/steps_list.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/steps_list.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_check_steps.ts b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/use_check_steps.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/use_check_steps.ts rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/use_check_steps.ts diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/use_expanded_row.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/use_expanded_row.test.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/use_expanded_row.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/use_expanded_row.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_std_error_logs.ts b/x-pack/plugins/synthetics/public/components/synthetics/check_steps/use_std_error_logs.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/use_std_error_logs.ts rename to x-pack/plugins/synthetics/public/components/synthetics/check_steps/use_std_error_logs.ts diff --git a/x-pack/plugins/uptime/public/components/synthetics/code_block_accordion.tsx b/x-pack/plugins/synthetics/public/components/synthetics/code_block_accordion.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/code_block_accordion.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/code_block_accordion.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/console_event.test.tsx b/x-pack/plugins/synthetics/public/components/synthetics/console_event.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/console_event.test.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/console_event.test.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/console_event.tsx b/x-pack/plugins/synthetics/public/components/synthetics/console_event.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/console_event.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/console_event.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.test.tsx b/x-pack/plugins/synthetics/public/components/synthetics/console_output_event_list.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.test.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/console_output_event_list.test.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.tsx b/x-pack/plugins/synthetics/public/components/synthetics/console_output_event_list.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/console_output_event_list.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/empty_journey.test.tsx b/x-pack/plugins/synthetics/public/components/synthetics/empty_journey.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/empty_journey.test.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/empty_journey.test.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/empty_journey.tsx b/x-pack/plugins/synthetics/public/components/synthetics/empty_journey.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/empty_journey.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/empty_journey.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx b/x-pack/plugins/synthetics/public/components/synthetics/executed_step.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/executed_step.test.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx b/x-pack/plugins/synthetics/public/components/synthetics/executed_step.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/executed_step.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/status_badge.test.tsx b/x-pack/plugins/synthetics/public/components/synthetics/status_badge.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/status_badge.test.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/status_badge.test.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/status_badge.tsx b/x-pack/plugins/synthetics/public/components/synthetics/status_badge.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/status_badge.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/status_badge.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.test.tsx b/x-pack/plugins/synthetics/public/components/synthetics/step_screenshot_display.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.test.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/step_screenshot_display.test.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.tsx b/x-pack/plugins/synthetics/public/components/synthetics/step_screenshot_display.tsx similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.tsx rename to x-pack/plugins/synthetics/public/components/synthetics/step_screenshot_display.tsx diff --git a/x-pack/plugins/uptime/public/components/synthetics/translations.ts b/x-pack/plugins/synthetics/public/components/synthetics/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/components/synthetics/translations.ts rename to x-pack/plugins/synthetics/public/components/synthetics/translations.ts diff --git a/x-pack/plugins/uptime/public/contexts/index.ts b/x-pack/plugins/synthetics/public/contexts/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/contexts/index.ts rename to x-pack/plugins/synthetics/public/contexts/index.ts diff --git a/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx b/x-pack/plugins/synthetics/public/contexts/uptime_index_pattern_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx rename to x-pack/plugins/synthetics/public/contexts/uptime_index_pattern_context.tsx diff --git a/x-pack/plugins/uptime/public/contexts/uptime_refresh_context.tsx b/x-pack/plugins/synthetics/public/contexts/uptime_refresh_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/contexts/uptime_refresh_context.tsx rename to x-pack/plugins/synthetics/public/contexts/uptime_refresh_context.tsx diff --git a/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx b/x-pack/plugins/synthetics/public/contexts/uptime_settings_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx rename to x-pack/plugins/synthetics/public/contexts/uptime_settings_context.tsx diff --git a/x-pack/plugins/uptime/public/contexts/uptime_startup_plugins_context.tsx b/x-pack/plugins/synthetics/public/contexts/uptime_startup_plugins_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/contexts/uptime_startup_plugins_context.tsx rename to x-pack/plugins/synthetics/public/contexts/uptime_startup_plugins_context.tsx diff --git a/x-pack/plugins/uptime/public/contexts/uptime_theme_context.tsx b/x-pack/plugins/synthetics/public/contexts/uptime_theme_context.tsx similarity index 100% rename from x-pack/plugins/uptime/public/contexts/uptime_theme_context.tsx rename to x-pack/plugins/synthetics/public/contexts/uptime_theme_context.tsx diff --git a/x-pack/plugins/uptime/public/hooks/__snapshots__/use_url_params.test.tsx.snap b/x-pack/plugins/synthetics/public/hooks/__snapshots__/use_url_params.test.tsx.snap similarity index 100% rename from x-pack/plugins/uptime/public/hooks/__snapshots__/use_url_params.test.tsx.snap rename to x-pack/plugins/synthetics/public/hooks/__snapshots__/use_url_params.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/hooks/index.ts b/x-pack/plugins/synthetics/public/hooks/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/index.ts rename to x-pack/plugins/synthetics/public/hooks/index.ts diff --git a/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts b/x-pack/plugins/synthetics/public/hooks/update_kuery_string.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/update_kuery_string.ts rename to x-pack/plugins/synthetics/public/hooks/update_kuery_string.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_breadcrumbs.test.tsx b/x-pack/plugins/synthetics/public/hooks/use_breadcrumbs.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_breadcrumbs.test.tsx rename to x-pack/plugins/synthetics/public/hooks/use_breadcrumbs.test.tsx diff --git a/x-pack/plugins/uptime/public/hooks/use_breadcrumbs.ts b/x-pack/plugins/synthetics/public/hooks/use_breadcrumbs.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_breadcrumbs.ts rename to x-pack/plugins/synthetics/public/hooks/use_breadcrumbs.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_breakpoints.test.ts b/x-pack/plugins/synthetics/public/hooks/use_breakpoints.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_breakpoints.test.ts rename to x-pack/plugins/synthetics/public/hooks/use_breakpoints.test.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_breakpoints.ts b/x-pack/plugins/synthetics/public/hooks/use_breakpoints.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_breakpoints.ts rename to x-pack/plugins/synthetics/public/hooks/use_breakpoints.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_cert_status.ts b/x-pack/plugins/synthetics/public/hooks/use_cert_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_cert_status.ts rename to x-pack/plugins/synthetics/public/hooks/use_cert_status.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_chart_theme.ts b/x-pack/plugins/synthetics/public/hooks/use_chart_theme.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_chart_theme.ts rename to x-pack/plugins/synthetics/public/hooks/use_chart_theme.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_composite_image.test.tsx b/x-pack/plugins/synthetics/public/hooks/use_composite_image.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_composite_image.test.tsx rename to x-pack/plugins/synthetics/public/hooks/use_composite_image.test.tsx diff --git a/x-pack/plugins/uptime/public/hooks/use_composite_image.ts b/x-pack/plugins/synthetics/public/hooks/use_composite_image.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_composite_image.ts rename to x-pack/plugins/synthetics/public/hooks/use_composite_image.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_filter_update.test.ts b/x-pack/plugins/synthetics/public/hooks/use_filter_update.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_filter_update.test.ts rename to x-pack/plugins/synthetics/public/hooks/use_filter_update.test.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_filter_update.ts b/x-pack/plugins/synthetics/public/hooks/use_filter_update.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_filter_update.ts rename to x-pack/plugins/synthetics/public/hooks/use_filter_update.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_init_app.ts b/x-pack/plugins/synthetics/public/hooks/use_init_app.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_init_app.ts rename to x-pack/plugins/synthetics/public/hooks/use_init_app.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_mapping_check.test.ts b/x-pack/plugins/synthetics/public/hooks/use_mapping_check.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_mapping_check.test.ts rename to x-pack/plugins/synthetics/public/hooks/use_mapping_check.test.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_mapping_check.ts b/x-pack/plugins/synthetics/public/hooks/use_mapping_check.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_mapping_check.ts rename to x-pack/plugins/synthetics/public/hooks/use_mapping_check.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_monitor.ts b/x-pack/plugins/synthetics/public/hooks/use_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_monitor.ts rename to x-pack/plugins/synthetics/public/hooks/use_monitor.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_overview_filter_check.test.tsx b/x-pack/plugins/synthetics/public/hooks/use_overview_filter_check.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_overview_filter_check.test.tsx rename to x-pack/plugins/synthetics/public/hooks/use_overview_filter_check.test.tsx diff --git a/x-pack/plugins/uptime/public/hooks/use_overview_filter_check.ts b/x-pack/plugins/synthetics/public/hooks/use_overview_filter_check.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_overview_filter_check.ts rename to x-pack/plugins/synthetics/public/hooks/use_overview_filter_check.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_search_text.ts b/x-pack/plugins/synthetics/public/hooks/use_search_text.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_search_text.ts rename to x-pack/plugins/synthetics/public/hooks/use_search_text.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_selected_filters.test.tsx b/x-pack/plugins/synthetics/public/hooks/use_selected_filters.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_selected_filters.test.tsx rename to x-pack/plugins/synthetics/public/hooks/use_selected_filters.test.tsx diff --git a/x-pack/plugins/uptime/public/hooks/use_selected_filters.ts b/x-pack/plugins/synthetics/public/hooks/use_selected_filters.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_selected_filters.ts rename to x-pack/plugins/synthetics/public/hooks/use_selected_filters.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_telemetry.ts b/x-pack/plugins/synthetics/public/hooks/use_telemetry.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_telemetry.ts rename to x-pack/plugins/synthetics/public/hooks/use_telemetry.ts diff --git a/x-pack/plugins/uptime/public/hooks/use_url_params.test.tsx b/x-pack/plugins/synthetics/public/hooks/use_url_params.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_url_params.test.tsx rename to x-pack/plugins/synthetics/public/hooks/use_url_params.test.tsx diff --git a/x-pack/plugins/uptime/public/hooks/use_url_params.ts b/x-pack/plugins/synthetics/public/hooks/use_url_params.ts similarity index 100% rename from x-pack/plugins/uptime/public/hooks/use_url_params.ts rename to x-pack/plugins/synthetics/public/hooks/use_url_params.ts diff --git a/x-pack/plugins/uptime/public/icons/heartbeat_white.svg b/x-pack/plugins/synthetics/public/icons/heartbeat_white.svg similarity index 100% rename from x-pack/plugins/uptime/public/icons/heartbeat_white.svg rename to x-pack/plugins/synthetics/public/icons/heartbeat_white.svg diff --git a/x-pack/plugins/uptime/public/index.ts b/x-pack/plugins/synthetics/public/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/index.ts rename to x-pack/plugins/synthetics/public/index.ts diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/screenshot_ref.mock.ts b/x-pack/plugins/synthetics/public/lib/__mocks__/screenshot_ref.mock.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/__mocks__/screenshot_ref.mock.ts rename to x-pack/plugins/synthetics/public/lib/__mocks__/screenshot_ref.mock.ts diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/uptime_plugin_start_mock.ts b/x-pack/plugins/synthetics/public/lib/__mocks__/uptime_plugin_start_mock.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/__mocks__/uptime_plugin_start_mock.ts rename to x-pack/plugins/synthetics/public/lib/__mocks__/uptime_plugin_start_mock.ts diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/uptime_store.mock.ts b/x-pack/plugins/synthetics/public/lib/__mocks__/uptime_store.mock.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/__mocks__/uptime_store.mock.ts rename to x-pack/plugins/synthetics/public/lib/__mocks__/uptime_store.mock.ts diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/use_composite_image.mock.ts b/x-pack/plugins/synthetics/public/lib/__mocks__/use_composite_image.mock.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/__mocks__/use_composite_image.mock.ts rename to x-pack/plugins/synthetics/public/lib/__mocks__/use_composite_image.mock.ts diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/ut_router_history.mock.ts b/x-pack/plugins/synthetics/public/lib/__mocks__/ut_router_history.mock.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/__mocks__/ut_router_history.mock.ts rename to x-pack/plugins/synthetics/public/lib/__mocks__/ut_router_history.mock.ts diff --git a/x-pack/plugins/uptime/public/lib/adapters/framework/capabilities_adapter.ts b/x-pack/plugins/synthetics/public/lib/adapters/framework/capabilities_adapter.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/adapters/framework/capabilities_adapter.ts rename to x-pack/plugins/synthetics/public/lib/adapters/framework/capabilities_adapter.ts diff --git a/x-pack/plugins/uptime/public/lib/alert_types/alert_messages.tsx b/x-pack/plugins/synthetics/public/lib/alert_types/alert_messages.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/alert_messages.tsx rename to x-pack/plugins/synthetics/public/lib/alert_types/alert_messages.tsx diff --git a/x-pack/plugins/uptime/public/lib/alert_types/common.ts b/x-pack/plugins/synthetics/public/lib/alert_types/common.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/common.ts rename to x-pack/plugins/synthetics/public/lib/alert_types/common.ts diff --git a/x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx b/x-pack/plugins/synthetics/public/lib/alert_types/duration_anomaly.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx rename to x-pack/plugins/synthetics/public/lib/alert_types/duration_anomaly.tsx diff --git a/x-pack/plugins/uptime/public/lib/alert_types/index.ts b/x-pack/plugins/synthetics/public/lib/alert_types/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/index.ts rename to x-pack/plugins/synthetics/public/lib/alert_types/index.ts diff --git a/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/duration_anomaly.tsx b/x-pack/plugins/synthetics/public/lib/alert_types/lazy_wrapper/duration_anomaly.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/duration_anomaly.tsx rename to x-pack/plugins/synthetics/public/lib/alert_types/lazy_wrapper/duration_anomaly.tsx diff --git a/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/monitor_status.tsx b/x-pack/plugins/synthetics/public/lib/alert_types/lazy_wrapper/monitor_status.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/monitor_status.tsx rename to x-pack/plugins/synthetics/public/lib/alert_types/lazy_wrapper/monitor_status.tsx diff --git a/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/tls_alert.tsx b/x-pack/plugins/synthetics/public/lib/alert_types/lazy_wrapper/tls_alert.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/tls_alert.tsx rename to x-pack/plugins/synthetics/public/lib/alert_types/lazy_wrapper/tls_alert.tsx diff --git a/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/validate_monitor_status.ts b/x-pack/plugins/synthetics/public/lib/alert_types/lazy_wrapper/validate_monitor_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/validate_monitor_status.ts rename to x-pack/plugins/synthetics/public/lib/alert_types/lazy_wrapper/validate_monitor_status.ts diff --git a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.test.ts b/x-pack/plugins/synthetics/public/lib/alert_types/monitor_status.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/monitor_status.test.ts rename to x-pack/plugins/synthetics/public/lib/alert_types/monitor_status.test.ts diff --git a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx b/x-pack/plugins/synthetics/public/lib/alert_types/monitor_status.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx rename to x-pack/plugins/synthetics/public/lib/alert_types/monitor_status.tsx diff --git a/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx b/x-pack/plugins/synthetics/public/lib/alert_types/tls.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/tls.tsx rename to x-pack/plugins/synthetics/public/lib/alert_types/tls.tsx diff --git a/x-pack/plugins/uptime/public/lib/alert_types/tls_legacy.tsx b/x-pack/plugins/synthetics/public/lib/alert_types/tls_legacy.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/alert_types/tls_legacy.tsx rename to x-pack/plugins/synthetics/public/lib/alert_types/tls_legacy.tsx diff --git a/x-pack/plugins/uptime/public/lib/formatting.ts b/x-pack/plugins/synthetics/public/lib/formatting.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/formatting.ts rename to x-pack/plugins/synthetics/public/lib/formatting.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts b/x-pack/plugins/synthetics/public/lib/helper/charts/get_chart_date_label.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts rename to x-pack/plugins/synthetics/public/lib/helper/charts/get_chart_date_label.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/charts/get_label_format.test.ts b/x-pack/plugins/synthetics/public/lib/helper/charts/get_label_format.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/charts/get_label_format.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/charts/get_label_format.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/charts/get_label_format.ts b/x-pack/plugins/synthetics/public/lib/helper/charts/get_label_format.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/charts/get_label_format.ts rename to x-pack/plugins/synthetics/public/lib/helper/charts/get_label_format.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/charts/index.ts b/x-pack/plugins/synthetics/public/lib/helper/charts/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/charts/index.ts rename to x-pack/plugins/synthetics/public/lib/helper/charts/index.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/charts/is_within_current_date.test.ts b/x-pack/plugins/synthetics/public/lib/helper/charts/is_within_current_date.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/charts/is_within_current_date.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/charts/is_within_current_date.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/charts/is_within_current_date.ts b/x-pack/plugins/synthetics/public/lib/helper/charts/is_within_current_date.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/charts/is_within_current_date.ts rename to x-pack/plugins/synthetics/public/lib/helper/charts/is_within_current_date.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/compose_screenshot_images.test.ts b/x-pack/plugins/synthetics/public/lib/helper/compose_screenshot_images.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/compose_screenshot_images.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/compose_screenshot_images.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/compose_screenshot_images.ts b/x-pack/plugins/synthetics/public/lib/helper/compose_screenshot_images.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/compose_screenshot_images.ts rename to x-pack/plugins/synthetics/public/lib/helper/compose_screenshot_images.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/convert_measurements.test.ts b/x-pack/plugins/synthetics/public/lib/helper/convert_measurements.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/convert_measurements.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/convert_measurements.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/convert_measurements.ts b/x-pack/plugins/synthetics/public/lib/helper/convert_measurements.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/convert_measurements.ts rename to x-pack/plugins/synthetics/public/lib/helper/convert_measurements.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/enzyme_helpers.tsx b/x-pack/plugins/synthetics/public/lib/helper/enzyme_helpers.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/enzyme_helpers.tsx rename to x-pack/plugins/synthetics/public/lib/helper/enzyme_helpers.tsx diff --git a/x-pack/plugins/uptime/public/lib/helper/get_title.ts b/x-pack/plugins/synthetics/public/lib/helper/get_title.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/get_title.ts rename to x-pack/plugins/synthetics/public/lib/helper/get_title.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx b/x-pack/plugins/synthetics/public/lib/helper/helper_with_redux.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx rename to x-pack/plugins/synthetics/public/lib/helper/helper_with_redux.tsx diff --git a/x-pack/plugins/uptime/public/lib/helper/index.ts b/x-pack/plugins/synthetics/public/lib/helper/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/index.ts rename to x-pack/plugins/synthetics/public/lib/helper/index.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/add_base_path.ts b/x-pack/plugins/synthetics/public/lib/helper/observability_integration/add_base_path.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/observability_integration/add_base_path.ts rename to x-pack/plugins/synthetics/public/lib/helper/observability_integration/add_base_path.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/build_href.ts b/x-pack/plugins/synthetics/public/lib/helper/observability_integration/build_href.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/observability_integration/build_href.ts rename to x-pack/plugins/synthetics/public/lib/helper/observability_integration/build_href.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.test.ts b/x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_apm_href.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_apm_href.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts b/x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_apm_href.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts rename to x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_apm_href.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.test.ts b/x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_infra_href.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_infra_href.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts b/x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_infra_href.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts rename to x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_infra_href.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.test.ts b/x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_logging_href.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_logging_href.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts b/x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_logging_href.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts rename to x-pack/plugins/synthetics/public/lib/helper/observability_integration/get_logging_href.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/index.ts b/x-pack/plugins/synthetics/public/lib/helper/observability_integration/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/observability_integration/index.ts rename to x-pack/plugins/synthetics/public/lib/helper/observability_integration/index.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/parse_search.test.ts b/x-pack/plugins/synthetics/public/lib/helper/parse_search.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/parse_search.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/parse_search.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/parse_search.ts b/x-pack/plugins/synthetics/public/lib/helper/parse_search.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/parse_search.ts rename to x-pack/plugins/synthetics/public/lib/helper/parse_search.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/rtl_helpers.tsx b/x-pack/plugins/synthetics/public/lib/helper/rtl_helpers.tsx similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/rtl_helpers.tsx rename to x-pack/plugins/synthetics/public/lib/helper/rtl_helpers.tsx diff --git a/x-pack/plugins/uptime/public/lib/helper/series_has_down_values.test.ts b/x-pack/plugins/synthetics/public/lib/helper/series_has_down_values.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/series_has_down_values.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/series_has_down_values.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/series_has_down_values.ts b/x-pack/plugins/synthetics/public/lib/helper/series_has_down_values.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/series_has_down_values.ts rename to x-pack/plugins/synthetics/public/lib/helper/series_has_down_values.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/spy_use_fetcher.ts b/x-pack/plugins/synthetics/public/lib/helper/spy_use_fetcher.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/spy_use_fetcher.ts rename to x-pack/plugins/synthetics/public/lib/helper/spy_use_fetcher.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/stringify_url_params.test.ts b/x-pack/plugins/synthetics/public/lib/helper/stringify_url_params.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/stringify_url_params.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/stringify_url_params.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/stringify_url_params.ts b/x-pack/plugins/synthetics/public/lib/helper/stringify_url_params.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/stringify_url_params.ts rename to x-pack/plugins/synthetics/public/lib/helper/stringify_url_params.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/test_helpers.ts b/x-pack/plugins/synthetics/public/lib/helper/test_helpers.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/test_helpers.ts rename to x-pack/plugins/synthetics/public/lib/helper/test_helpers.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/__snapshots__/get_supported_url_params.test.ts.snap b/x-pack/plugins/synthetics/public/lib/helper/url_params/__snapshots__/get_supported_url_params.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/__snapshots__/get_supported_url_params.test.ts.snap rename to x-pack/plugins/synthetics/public/lib/helper/url_params/__snapshots__/get_supported_url_params.test.ts.snap diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.test.ts b/x-pack/plugins/synthetics/public/lib/helper/url_params/get_supported_url_params.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/url_params/get_supported_url_params.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts b/x-pack/plugins/synthetics/public/lib/helper/url_params/get_supported_url_params.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts rename to x-pack/plugins/synthetics/public/lib/helper/url_params/get_supported_url_params.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/index.ts b/x-pack/plugins/synthetics/public/lib/helper/url_params/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/index.ts rename to x-pack/plugins/synthetics/public/lib/helper/url_params/index.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/parse_absolute_date.test.ts b/x-pack/plugins/synthetics/public/lib/helper/url_params/parse_absolute_date.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/parse_absolute_date.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/url_params/parse_absolute_date.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/parse_absolute_date.ts b/x-pack/plugins/synthetics/public/lib/helper/url_params/parse_absolute_date.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/parse_absolute_date.ts rename to x-pack/plugins/synthetics/public/lib/helper/url_params/parse_absolute_date.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/parse_is_paused.test.ts b/x-pack/plugins/synthetics/public/lib/helper/url_params/parse_is_paused.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/parse_is_paused.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/url_params/parse_is_paused.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/parse_is_paused.ts b/x-pack/plugins/synthetics/public/lib/helper/url_params/parse_is_paused.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/parse_is_paused.ts rename to x-pack/plugins/synthetics/public/lib/helper/url_params/parse_is_paused.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/parse_url_int.test.ts b/x-pack/plugins/synthetics/public/lib/helper/url_params/parse_url_int.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/parse_url_int.test.ts rename to x-pack/plugins/synthetics/public/lib/helper/url_params/parse_url_int.test.ts diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/parse_url_int.ts b/x-pack/plugins/synthetics/public/lib/helper/url_params/parse_url_int.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/helper/url_params/parse_url_int.ts rename to x-pack/plugins/synthetics/public/lib/helper/url_params/parse_url_int.ts diff --git a/x-pack/plugins/uptime/public/lib/index.ts b/x-pack/plugins/synthetics/public/lib/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/index.ts rename to x-pack/plugins/synthetics/public/lib/index.ts diff --git a/x-pack/plugins/uptime/public/lib/lib.ts b/x-pack/plugins/synthetics/public/lib/lib.ts similarity index 100% rename from x-pack/plugins/uptime/public/lib/lib.ts rename to x-pack/plugins/synthetics/public/lib/lib.ts diff --git a/x-pack/plugins/uptime/public/pages/certificates.test.tsx b/x-pack/plugins/synthetics/public/pages/certificates.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/certificates.test.tsx rename to x-pack/plugins/synthetics/public/pages/certificates.test.tsx diff --git a/x-pack/plugins/uptime/public/pages/certificates.tsx b/x-pack/plugins/synthetics/public/pages/certificates.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/certificates.tsx rename to x-pack/plugins/synthetics/public/pages/certificates.tsx diff --git a/x-pack/plugins/uptime/public/pages/index.ts b/x-pack/plugins/synthetics/public/pages/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/pages/index.ts rename to x-pack/plugins/synthetics/public/pages/index.ts diff --git a/x-pack/plugins/uptime/public/pages/mapping_error.tsx b/x-pack/plugins/synthetics/public/pages/mapping_error.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/mapping_error.tsx rename to x-pack/plugins/synthetics/public/pages/mapping_error.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor.test.tsx b/x-pack/plugins/synthetics/public/pages/monitor.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor.test.tsx rename to x-pack/plugins/synthetics/public/pages/monitor.test.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor.tsx b/x-pack/plugins/synthetics/public/pages/monitor.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor.tsx rename to x-pack/plugins/synthetics/public/pages/monitor.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor_management/action_bar_portal_node.tsx b/x-pack/plugins/synthetics/public/pages/monitor_management/action_bar_portal_node.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor_management/action_bar_portal_node.tsx rename to x-pack/plugins/synthetics/public/pages/monitor_management/action_bar_portal_node.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor_management/add_monitor.tsx b/x-pack/plugins/synthetics/public/pages/monitor_management/add_monitor.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor_management/add_monitor.tsx rename to x-pack/plugins/synthetics/public/pages/monitor_management/add_monitor.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor_management/bottom_bar.tsx b/x-pack/plugins/synthetics/public/pages/monitor_management/bottom_bar.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor_management/bottom_bar.tsx rename to x-pack/plugins/synthetics/public/pages/monitor_management/bottom_bar.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor_management/content.ts b/x-pack/plugins/synthetics/public/pages/monitor_management/content.ts similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor_management/content.ts rename to x-pack/plugins/synthetics/public/pages/monitor_management/content.ts diff --git a/x-pack/plugins/uptime/public/pages/monitor_management/edit_monitor.tsx b/x-pack/plugins/synthetics/public/pages/monitor_management/edit_monitor.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor_management/edit_monitor.tsx rename to x-pack/plugins/synthetics/public/pages/monitor_management/edit_monitor.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor_management/monitor_management.tsx b/x-pack/plugins/synthetics/public/pages/monitor_management/monitor_management.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor_management/monitor_management.tsx rename to x-pack/plugins/synthetics/public/pages/monitor_management/monitor_management.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor_management/service_allowed_wrapper.test.tsx b/x-pack/plugins/synthetics/public/pages/monitor_management/service_allowed_wrapper.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor_management/service_allowed_wrapper.test.tsx rename to x-pack/plugins/synthetics/public/pages/monitor_management/service_allowed_wrapper.test.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor_management/service_allowed_wrapper.tsx b/x-pack/plugins/synthetics/public/pages/monitor_management/service_allowed_wrapper.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor_management/service_allowed_wrapper.tsx rename to x-pack/plugins/synthetics/public/pages/monitor_management/service_allowed_wrapper.tsx diff --git a/x-pack/plugins/uptime/public/pages/monitor_management/use_monitor_management_breadcrumbs.tsx b/x-pack/plugins/synthetics/public/pages/monitor_management/use_monitor_management_breadcrumbs.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/monitor_management/use_monitor_management_breadcrumbs.tsx rename to x-pack/plugins/synthetics/public/pages/monitor_management/use_monitor_management_breadcrumbs.tsx diff --git a/x-pack/plugins/uptime/public/pages/not_found.test.tsx b/x-pack/plugins/synthetics/public/pages/not_found.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/not_found.test.tsx rename to x-pack/plugins/synthetics/public/pages/not_found.test.tsx diff --git a/x-pack/plugins/uptime/public/pages/not_found.tsx b/x-pack/plugins/synthetics/public/pages/not_found.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/not_found.tsx rename to x-pack/plugins/synthetics/public/pages/not_found.tsx diff --git a/x-pack/plugins/uptime/public/pages/overview.test.tsx b/x-pack/plugins/synthetics/public/pages/overview.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/overview.test.tsx rename to x-pack/plugins/synthetics/public/pages/overview.test.tsx diff --git a/x-pack/plugins/uptime/public/pages/overview.tsx b/x-pack/plugins/synthetics/public/pages/overview.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/overview.tsx rename to x-pack/plugins/synthetics/public/pages/overview.tsx diff --git a/x-pack/plugins/uptime/public/pages/settings.test.tsx b/x-pack/plugins/synthetics/public/pages/settings.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/settings.test.tsx rename to x-pack/plugins/synthetics/public/pages/settings.test.tsx diff --git a/x-pack/plugins/uptime/public/pages/settings.tsx b/x-pack/plugins/synthetics/public/pages/settings.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/settings.tsx rename to x-pack/plugins/synthetics/public/pages/settings.tsx diff --git a/x-pack/plugins/uptime/public/pages/synthetics/checks_navigation.tsx b/x-pack/plugins/synthetics/public/pages/synthetics/checks_navigation.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/synthetics/checks_navigation.tsx rename to x-pack/plugins/synthetics/public/pages/synthetics/checks_navigation.tsx diff --git a/x-pack/plugins/uptime/public/pages/synthetics/step_detail_page.tsx b/x-pack/plugins/synthetics/public/pages/synthetics/step_detail_page.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/synthetics/step_detail_page.tsx rename to x-pack/plugins/synthetics/public/pages/synthetics/step_detail_page.tsx diff --git a/x-pack/plugins/uptime/public/pages/synthetics/synthetics_checks.test.tsx b/x-pack/plugins/synthetics/public/pages/synthetics/synthetics_checks.test.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/synthetics/synthetics_checks.test.tsx rename to x-pack/plugins/synthetics/public/pages/synthetics/synthetics_checks.test.tsx diff --git a/x-pack/plugins/uptime/public/pages/synthetics/synthetics_checks.tsx b/x-pack/plugins/synthetics/public/pages/synthetics/synthetics_checks.tsx similarity index 100% rename from x-pack/plugins/uptime/public/pages/synthetics/synthetics_checks.tsx rename to x-pack/plugins/synthetics/public/pages/synthetics/synthetics_checks.tsx diff --git a/x-pack/plugins/uptime/public/pages/translations.ts b/x-pack/plugins/synthetics/public/pages/translations.ts similarity index 100% rename from x-pack/plugins/uptime/public/pages/translations.ts rename to x-pack/plugins/synthetics/public/pages/translations.ts diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/synthetics/public/routes.tsx similarity index 100% rename from x-pack/plugins/uptime/public/routes.tsx rename to x-pack/plugins/synthetics/public/routes.tsx diff --git a/x-pack/plugins/uptime/public/state/actions/alerts.ts b/x-pack/plugins/synthetics/public/state/actions/alerts.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/alerts.ts rename to x-pack/plugins/synthetics/public/state/actions/alerts.ts diff --git a/x-pack/plugins/uptime/public/state/actions/dynamic_settings.ts b/x-pack/plugins/synthetics/public/state/actions/dynamic_settings.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/dynamic_settings.ts rename to x-pack/plugins/synthetics/public/state/actions/dynamic_settings.ts diff --git a/x-pack/plugins/uptime/public/state/actions/index.ts b/x-pack/plugins/synthetics/public/state/actions/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/index.ts rename to x-pack/plugins/synthetics/public/state/actions/index.ts diff --git a/x-pack/plugins/uptime/public/state/actions/index_status.ts b/x-pack/plugins/synthetics/public/state/actions/index_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/index_status.ts rename to x-pack/plugins/synthetics/public/state/actions/index_status.ts diff --git a/x-pack/plugins/uptime/public/state/actions/journey.ts b/x-pack/plugins/synthetics/public/state/actions/journey.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/journey.ts rename to x-pack/plugins/synthetics/public/state/actions/journey.ts diff --git a/x-pack/plugins/uptime/public/state/actions/ml_anomaly.ts b/x-pack/plugins/synthetics/public/state/actions/ml_anomaly.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/ml_anomaly.ts rename to x-pack/plugins/synthetics/public/state/actions/ml_anomaly.ts diff --git a/x-pack/plugins/uptime/public/state/actions/monitor.ts b/x-pack/plugins/synthetics/public/state/actions/monitor.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/monitor.ts rename to x-pack/plugins/synthetics/public/state/actions/monitor.ts diff --git a/x-pack/plugins/uptime/public/state/actions/monitor_duration.ts b/x-pack/plugins/synthetics/public/state/actions/monitor_duration.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/monitor_duration.ts rename to x-pack/plugins/synthetics/public/state/actions/monitor_duration.ts diff --git a/x-pack/plugins/uptime/public/state/actions/monitor_list.ts b/x-pack/plugins/synthetics/public/state/actions/monitor_list.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/monitor_list.ts rename to x-pack/plugins/synthetics/public/state/actions/monitor_list.ts diff --git a/x-pack/plugins/uptime/public/state/actions/monitor_management.ts b/x-pack/plugins/synthetics/public/state/actions/monitor_management.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/monitor_management.ts rename to x-pack/plugins/synthetics/public/state/actions/monitor_management.ts diff --git a/x-pack/plugins/uptime/public/state/actions/monitor_status.ts b/x-pack/plugins/synthetics/public/state/actions/monitor_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/monitor_status.ts rename to x-pack/plugins/synthetics/public/state/actions/monitor_status.ts diff --git a/x-pack/plugins/uptime/public/state/actions/network_events.ts b/x-pack/plugins/synthetics/public/state/actions/network_events.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/network_events.ts rename to x-pack/plugins/synthetics/public/state/actions/network_events.ts diff --git a/x-pack/plugins/uptime/public/state/actions/ping.ts b/x-pack/plugins/synthetics/public/state/actions/ping.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/ping.ts rename to x-pack/plugins/synthetics/public/state/actions/ping.ts diff --git a/x-pack/plugins/uptime/public/state/actions/selected_filters.ts b/x-pack/plugins/synthetics/public/state/actions/selected_filters.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/selected_filters.ts rename to x-pack/plugins/synthetics/public/state/actions/selected_filters.ts diff --git a/x-pack/plugins/uptime/public/state/actions/snapshot.ts b/x-pack/plugins/synthetics/public/state/actions/snapshot.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/snapshot.ts rename to x-pack/plugins/synthetics/public/state/actions/snapshot.ts diff --git a/x-pack/plugins/uptime/public/state/actions/types.ts b/x-pack/plugins/synthetics/public/state/actions/types.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/types.ts rename to x-pack/plugins/synthetics/public/state/actions/types.ts diff --git a/x-pack/plugins/uptime/public/state/actions/ui.ts b/x-pack/plugins/synthetics/public/state/actions/ui.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/ui.ts rename to x-pack/plugins/synthetics/public/state/actions/ui.ts diff --git a/x-pack/plugins/uptime/public/state/actions/utils.ts b/x-pack/plugins/synthetics/public/state/actions/utils.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/actions/utils.ts rename to x-pack/plugins/synthetics/public/state/actions/utils.ts diff --git a/x-pack/plugins/uptime/public/state/alerts/alerts.ts b/x-pack/plugins/synthetics/public/state/alerts/alerts.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/alerts/alerts.ts rename to x-pack/plugins/synthetics/public/state/alerts/alerts.ts diff --git a/x-pack/plugins/uptime/public/state/api/__snapshots__/snapshot.test.ts.snap b/x-pack/plugins/synthetics/public/state/api/__snapshots__/snapshot.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/public/state/api/__snapshots__/snapshot.test.ts.snap rename to x-pack/plugins/synthetics/public/state/api/__snapshots__/snapshot.test.ts.snap diff --git a/x-pack/plugins/uptime/public/state/api/alert_actions.test.ts b/x-pack/plugins/synthetics/public/state/api/alert_actions.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/alert_actions.test.ts rename to x-pack/plugins/synthetics/public/state/api/alert_actions.test.ts diff --git a/x-pack/plugins/uptime/public/state/api/alert_actions.ts b/x-pack/plugins/synthetics/public/state/api/alert_actions.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/alert_actions.ts rename to x-pack/plugins/synthetics/public/state/api/alert_actions.ts diff --git a/x-pack/plugins/uptime/public/state/api/alerts.ts b/x-pack/plugins/synthetics/public/state/api/alerts.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/alerts.ts rename to x-pack/plugins/synthetics/public/state/api/alerts.ts diff --git a/x-pack/plugins/uptime/public/state/api/dynamic_settings.ts b/x-pack/plugins/synthetics/public/state/api/dynamic_settings.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/dynamic_settings.ts rename to x-pack/plugins/synthetics/public/state/api/dynamic_settings.ts diff --git a/x-pack/plugins/uptime/public/state/api/index.ts b/x-pack/plugins/synthetics/public/state/api/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/index.ts rename to x-pack/plugins/synthetics/public/state/api/index.ts diff --git a/x-pack/plugins/uptime/public/state/api/index_status.ts b/x-pack/plugins/synthetics/public/state/api/index_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/index_status.ts rename to x-pack/plugins/synthetics/public/state/api/index_status.ts diff --git a/x-pack/plugins/uptime/public/state/api/journey.ts b/x-pack/plugins/synthetics/public/state/api/journey.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/journey.ts rename to x-pack/plugins/synthetics/public/state/api/journey.ts diff --git a/x-pack/plugins/uptime/public/state/api/ml_anomaly.ts b/x-pack/plugins/synthetics/public/state/api/ml_anomaly.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/ml_anomaly.ts rename to x-pack/plugins/synthetics/public/state/api/ml_anomaly.ts diff --git a/x-pack/plugins/uptime/public/state/api/monitor.ts b/x-pack/plugins/synthetics/public/state/api/monitor.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/monitor.ts rename to x-pack/plugins/synthetics/public/state/api/monitor.ts diff --git a/x-pack/plugins/uptime/public/state/api/monitor_duration.ts b/x-pack/plugins/synthetics/public/state/api/monitor_duration.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/monitor_duration.ts rename to x-pack/plugins/synthetics/public/state/api/monitor_duration.ts diff --git a/x-pack/plugins/uptime/public/state/api/monitor_list.ts b/x-pack/plugins/synthetics/public/state/api/monitor_list.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/monitor_list.ts rename to x-pack/plugins/synthetics/public/state/api/monitor_list.ts diff --git a/x-pack/plugins/uptime/public/state/api/monitor_management.ts b/x-pack/plugins/synthetics/public/state/api/monitor_management.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/monitor_management.ts rename to x-pack/plugins/synthetics/public/state/api/monitor_management.ts diff --git a/x-pack/plugins/uptime/public/state/api/monitor_status.ts b/x-pack/plugins/synthetics/public/state/api/monitor_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/monitor_status.ts rename to x-pack/plugins/synthetics/public/state/api/monitor_status.ts diff --git a/x-pack/plugins/uptime/public/state/api/network_events.ts b/x-pack/plugins/synthetics/public/state/api/network_events.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/network_events.ts rename to x-pack/plugins/synthetics/public/state/api/network_events.ts diff --git a/x-pack/plugins/uptime/public/state/api/ping.ts b/x-pack/plugins/synthetics/public/state/api/ping.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/ping.ts rename to x-pack/plugins/synthetics/public/state/api/ping.ts diff --git a/x-pack/plugins/uptime/public/state/api/snapshot.test.ts b/x-pack/plugins/synthetics/public/state/api/snapshot.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/snapshot.test.ts rename to x-pack/plugins/synthetics/public/state/api/snapshot.test.ts diff --git a/x-pack/plugins/uptime/public/state/api/snapshot.ts b/x-pack/plugins/synthetics/public/state/api/snapshot.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/snapshot.ts rename to x-pack/plugins/synthetics/public/state/api/snapshot.ts diff --git a/x-pack/plugins/uptime/public/state/api/types.ts b/x-pack/plugins/synthetics/public/state/api/types.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/types.ts rename to x-pack/plugins/synthetics/public/state/api/types.ts diff --git a/x-pack/plugins/uptime/public/state/api/utils.ts b/x-pack/plugins/synthetics/public/state/api/utils.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/api/utils.ts rename to x-pack/plugins/synthetics/public/state/api/utils.ts diff --git a/x-pack/plugins/uptime/public/state/certificates/certificates.ts b/x-pack/plugins/synthetics/public/state/certificates/certificates.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/certificates/certificates.ts rename to x-pack/plugins/synthetics/public/state/certificates/certificates.ts diff --git a/x-pack/plugins/uptime/public/state/effects/alerts.ts b/x-pack/plugins/synthetics/public/state/effects/alerts.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/alerts.ts rename to x-pack/plugins/synthetics/public/state/effects/alerts.ts diff --git a/x-pack/plugins/uptime/public/state/effects/dynamic_settings.ts b/x-pack/plugins/synthetics/public/state/effects/dynamic_settings.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/dynamic_settings.ts rename to x-pack/plugins/synthetics/public/state/effects/dynamic_settings.ts diff --git a/x-pack/plugins/uptime/public/state/effects/fetch_effect.test.ts b/x-pack/plugins/synthetics/public/state/effects/fetch_effect.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/fetch_effect.test.ts rename to x-pack/plugins/synthetics/public/state/effects/fetch_effect.test.ts diff --git a/x-pack/plugins/uptime/public/state/effects/fetch_effect.ts b/x-pack/plugins/synthetics/public/state/effects/fetch_effect.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/fetch_effect.ts rename to x-pack/plugins/synthetics/public/state/effects/fetch_effect.ts diff --git a/x-pack/plugins/uptime/public/state/effects/index.ts b/x-pack/plugins/synthetics/public/state/effects/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/index.ts rename to x-pack/plugins/synthetics/public/state/effects/index.ts diff --git a/x-pack/plugins/uptime/public/state/effects/index_status.ts b/x-pack/plugins/synthetics/public/state/effects/index_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/index_status.ts rename to x-pack/plugins/synthetics/public/state/effects/index_status.ts diff --git a/x-pack/plugins/uptime/public/state/effects/journey.test.ts b/x-pack/plugins/synthetics/public/state/effects/journey.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/journey.test.ts rename to x-pack/plugins/synthetics/public/state/effects/journey.test.ts diff --git a/x-pack/plugins/uptime/public/state/effects/journey.ts b/x-pack/plugins/synthetics/public/state/effects/journey.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/journey.ts rename to x-pack/plugins/synthetics/public/state/effects/journey.ts diff --git a/x-pack/plugins/uptime/public/state/effects/ml_anomaly.ts b/x-pack/plugins/synthetics/public/state/effects/ml_anomaly.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/ml_anomaly.ts rename to x-pack/plugins/synthetics/public/state/effects/ml_anomaly.ts diff --git a/x-pack/plugins/uptime/public/state/effects/monitor.ts b/x-pack/plugins/synthetics/public/state/effects/monitor.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/monitor.ts rename to x-pack/plugins/synthetics/public/state/effects/monitor.ts diff --git a/x-pack/plugins/uptime/public/state/effects/monitor_duration.ts b/x-pack/plugins/synthetics/public/state/effects/monitor_duration.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/monitor_duration.ts rename to x-pack/plugins/synthetics/public/state/effects/monitor_duration.ts diff --git a/x-pack/plugins/uptime/public/state/effects/monitor_list.ts b/x-pack/plugins/synthetics/public/state/effects/monitor_list.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/monitor_list.ts rename to x-pack/plugins/synthetics/public/state/effects/monitor_list.ts diff --git a/x-pack/plugins/uptime/public/state/effects/monitor_management.ts b/x-pack/plugins/synthetics/public/state/effects/monitor_management.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/monitor_management.ts rename to x-pack/plugins/synthetics/public/state/effects/monitor_management.ts diff --git a/x-pack/plugins/uptime/public/state/effects/monitor_status.ts b/x-pack/plugins/synthetics/public/state/effects/monitor_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/monitor_status.ts rename to x-pack/plugins/synthetics/public/state/effects/monitor_status.ts diff --git a/x-pack/plugins/uptime/public/state/effects/network_events.ts b/x-pack/plugins/synthetics/public/state/effects/network_events.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/network_events.ts rename to x-pack/plugins/synthetics/public/state/effects/network_events.ts diff --git a/x-pack/plugins/uptime/public/state/effects/ping.ts b/x-pack/plugins/synthetics/public/state/effects/ping.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/ping.ts rename to x-pack/plugins/synthetics/public/state/effects/ping.ts diff --git a/x-pack/plugins/uptime/public/state/effects/synthetic_journey_blocks.ts b/x-pack/plugins/synthetics/public/state/effects/synthetic_journey_blocks.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/synthetic_journey_blocks.ts rename to x-pack/plugins/synthetics/public/state/effects/synthetic_journey_blocks.ts diff --git a/x-pack/plugins/uptime/public/state/effects/test_now_runs.ts b/x-pack/plugins/synthetics/public/state/effects/test_now_runs.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/effects/test_now_runs.ts rename to x-pack/plugins/synthetics/public/state/effects/test_now_runs.ts diff --git a/x-pack/plugins/uptime/public/state/index.ts b/x-pack/plugins/synthetics/public/state/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/index.ts rename to x-pack/plugins/synthetics/public/state/index.ts diff --git a/x-pack/plugins/uptime/public/state/kibana_service.ts b/x-pack/plugins/synthetics/public/state/kibana_service.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/kibana_service.ts rename to x-pack/plugins/synthetics/public/state/kibana_service.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/dynamic_settings.ts b/x-pack/plugins/synthetics/public/state/reducers/dynamic_settings.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/dynamic_settings.ts rename to x-pack/plugins/synthetics/public/state/reducers/dynamic_settings.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/index.ts b/x-pack/plugins/synthetics/public/state/reducers/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/index.ts rename to x-pack/plugins/synthetics/public/state/reducers/index.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/index_status.ts b/x-pack/plugins/synthetics/public/state/reducers/index_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/index_status.ts rename to x-pack/plugins/synthetics/public/state/reducers/index_status.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/journey.ts b/x-pack/plugins/synthetics/public/state/reducers/journey.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/journey.ts rename to x-pack/plugins/synthetics/public/state/reducers/journey.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/ml_anomaly.ts b/x-pack/plugins/synthetics/public/state/reducers/ml_anomaly.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/ml_anomaly.ts rename to x-pack/plugins/synthetics/public/state/reducers/ml_anomaly.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/monitor.ts b/x-pack/plugins/synthetics/public/state/reducers/monitor.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/monitor.ts rename to x-pack/plugins/synthetics/public/state/reducers/monitor.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/monitor_duration.ts b/x-pack/plugins/synthetics/public/state/reducers/monitor_duration.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/monitor_duration.ts rename to x-pack/plugins/synthetics/public/state/reducers/monitor_duration.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/monitor_list.ts b/x-pack/plugins/synthetics/public/state/reducers/monitor_list.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/monitor_list.ts rename to x-pack/plugins/synthetics/public/state/reducers/monitor_list.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/monitor_management.ts b/x-pack/plugins/synthetics/public/state/reducers/monitor_management.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/monitor_management.ts rename to x-pack/plugins/synthetics/public/state/reducers/monitor_management.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/monitor_status.test.ts b/x-pack/plugins/synthetics/public/state/reducers/monitor_status.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/monitor_status.test.ts rename to x-pack/plugins/synthetics/public/state/reducers/monitor_status.test.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/monitor_status.ts b/x-pack/plugins/synthetics/public/state/reducers/monitor_status.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/monitor_status.ts rename to x-pack/plugins/synthetics/public/state/reducers/monitor_status.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/network_events.ts b/x-pack/plugins/synthetics/public/state/reducers/network_events.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/network_events.ts rename to x-pack/plugins/synthetics/public/state/reducers/network_events.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/ping.ts b/x-pack/plugins/synthetics/public/state/reducers/ping.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/ping.ts rename to x-pack/plugins/synthetics/public/state/reducers/ping.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/ping_list.ts b/x-pack/plugins/synthetics/public/state/reducers/ping_list.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/ping_list.ts rename to x-pack/plugins/synthetics/public/state/reducers/ping_list.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/selected_filters.test.ts b/x-pack/plugins/synthetics/public/state/reducers/selected_filters.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/selected_filters.test.ts rename to x-pack/plugins/synthetics/public/state/reducers/selected_filters.test.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/selected_filters.ts b/x-pack/plugins/synthetics/public/state/reducers/selected_filters.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/selected_filters.ts rename to x-pack/plugins/synthetics/public/state/reducers/selected_filters.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/synthetics.test.ts b/x-pack/plugins/synthetics/public/state/reducers/synthetics.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/synthetics.test.ts rename to x-pack/plugins/synthetics/public/state/reducers/synthetics.test.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/synthetics.ts b/x-pack/plugins/synthetics/public/state/reducers/synthetics.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/synthetics.ts rename to x-pack/plugins/synthetics/public/state/reducers/synthetics.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/test_now_runs.ts b/x-pack/plugins/synthetics/public/state/reducers/test_now_runs.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/test_now_runs.ts rename to x-pack/plugins/synthetics/public/state/reducers/test_now_runs.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/types.ts b/x-pack/plugins/synthetics/public/state/reducers/types.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/types.ts rename to x-pack/plugins/synthetics/public/state/reducers/types.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/ui.test.ts b/x-pack/plugins/synthetics/public/state/reducers/ui.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/ui.test.ts rename to x-pack/plugins/synthetics/public/state/reducers/ui.test.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/ui.ts b/x-pack/plugins/synthetics/public/state/reducers/ui.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/ui.ts rename to x-pack/plugins/synthetics/public/state/reducers/ui.ts diff --git a/x-pack/plugins/uptime/public/state/reducers/utils.ts b/x-pack/plugins/synthetics/public/state/reducers/utils.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/reducers/utils.ts rename to x-pack/plugins/synthetics/public/state/reducers/utils.ts diff --git a/x-pack/plugins/uptime/public/state/selectors/index.test.ts b/x-pack/plugins/synthetics/public/state/selectors/index.test.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/selectors/index.test.ts rename to x-pack/plugins/synthetics/public/state/selectors/index.test.ts diff --git a/x-pack/plugins/uptime/public/state/selectors/index.ts b/x-pack/plugins/synthetics/public/state/selectors/index.ts similarity index 100% rename from x-pack/plugins/uptime/public/state/selectors/index.ts rename to x-pack/plugins/synthetics/public/state/selectors/index.ts diff --git a/x-pack/plugins/uptime/scripts/e2e.js b/x-pack/plugins/synthetics/scripts/e2e.js similarity index 100% rename from x-pack/plugins/uptime/scripts/e2e.js rename to x-pack/plugins/synthetics/scripts/e2e.js diff --git a/x-pack/plugins/uptime/server/index.ts b/x-pack/plugins/synthetics/server/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/index.ts rename to x-pack/plugins/synthetics/server/index.ts diff --git a/x-pack/plugins/uptime/server/kibana.index.ts b/x-pack/plugins/synthetics/server/kibana.index.ts similarity index 100% rename from x-pack/plugins/uptime/server/kibana.index.ts rename to x-pack/plugins/synthetics/server/kibana.index.ts diff --git a/x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts b/x-pack/plugins/synthetics/server/lib/adapters/framework/adapter_types.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts rename to x-pack/plugins/synthetics/server/lib/adapters/framework/adapter_types.ts diff --git a/x-pack/plugins/uptime/server/lib/adapters/framework/index.ts b/x-pack/plugins/synthetics/server/lib/adapters/framework/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/adapters/framework/index.ts rename to x-pack/plugins/synthetics/server/lib/adapters/framework/index.ts diff --git a/x-pack/plugins/uptime/server/lib/adapters/framework/kibana_framework_adapter.ts b/x-pack/plugins/synthetics/server/lib/adapters/framework/kibana_framework_adapter.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/adapters/framework/kibana_framework_adapter.ts rename to x-pack/plugins/synthetics/server/lib/adapters/framework/kibana_framework_adapter.ts diff --git a/x-pack/plugins/uptime/server/lib/adapters/index.ts b/x-pack/plugins/synthetics/server/lib/adapters/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/adapters/index.ts rename to x-pack/plugins/synthetics/server/lib/adapters/index.ts diff --git a/x-pack/plugins/uptime/server/lib/adapters/telemetry/__snapshots__/kibana_telemetry_adapter.test.ts.snap b/x-pack/plugins/synthetics/server/lib/adapters/telemetry/__snapshots__/kibana_telemetry_adapter.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/server/lib/adapters/telemetry/__snapshots__/kibana_telemetry_adapter.test.ts.snap rename to x-pack/plugins/synthetics/server/lib/adapters/telemetry/__snapshots__/kibana_telemetry_adapter.test.ts.snap diff --git a/x-pack/plugins/uptime/server/lib/adapters/telemetry/index.ts b/x-pack/plugins/synthetics/server/lib/adapters/telemetry/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/adapters/telemetry/index.ts rename to x-pack/plugins/synthetics/server/lib/adapters/telemetry/index.ts diff --git a/x-pack/plugins/uptime/server/lib/adapters/telemetry/kibana_telemetry_adapter.test.ts b/x-pack/plugins/synthetics/server/lib/adapters/telemetry/kibana_telemetry_adapter.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/adapters/telemetry/kibana_telemetry_adapter.test.ts rename to x-pack/plugins/synthetics/server/lib/adapters/telemetry/kibana_telemetry_adapter.test.ts diff --git a/x-pack/plugins/uptime/server/lib/adapters/telemetry/kibana_telemetry_adapter.ts b/x-pack/plugins/synthetics/server/lib/adapters/telemetry/kibana_telemetry_adapter.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/adapters/telemetry/kibana_telemetry_adapter.ts rename to x-pack/plugins/synthetics/server/lib/adapters/telemetry/kibana_telemetry_adapter.ts diff --git a/x-pack/plugins/uptime/server/lib/adapters/telemetry/types.ts b/x-pack/plugins/synthetics/server/lib/adapters/telemetry/types.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/adapters/telemetry/types.ts rename to x-pack/plugins/synthetics/server/lib/adapters/telemetry/types.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/action_variables.ts b/x-pack/plugins/synthetics/server/lib/alerts/action_variables.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/action_variables.ts rename to x-pack/plugins/synthetics/server/lib/alerts/action_variables.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/common.test.ts b/x-pack/plugins/synthetics/server/lib/alerts/common.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/common.test.ts rename to x-pack/plugins/synthetics/server/lib/alerts/common.test.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/common.ts b/x-pack/plugins/synthetics/server/lib/alerts/common.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/common.ts rename to x-pack/plugins/synthetics/server/lib/alerts/common.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.test.ts b/x-pack/plugins/synthetics/server/lib/alerts/duration_anomaly.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.test.ts rename to x-pack/plugins/synthetics/server/lib/alerts/duration_anomaly.test.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts b/x-pack/plugins/synthetics/server/lib/alerts/duration_anomaly.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts rename to x-pack/plugins/synthetics/server/lib/alerts/duration_anomaly.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/index.ts b/x-pack/plugins/synthetics/server/lib/alerts/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/index.ts rename to x-pack/plugins/synthetics/server/lib/alerts/index.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/status_check.test.ts b/x-pack/plugins/synthetics/server/lib/alerts/status_check.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/status_check.test.ts rename to x-pack/plugins/synthetics/server/lib/alerts/status_check.test.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts b/x-pack/plugins/synthetics/server/lib/alerts/status_check.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/status_check.ts rename to x-pack/plugins/synthetics/server/lib/alerts/status_check.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/test_utils/index.ts b/x-pack/plugins/synthetics/server/lib/alerts/test_utils/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/test_utils/index.ts rename to x-pack/plugins/synthetics/server/lib/alerts/test_utils/index.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/tls.test.ts b/x-pack/plugins/synthetics/server/lib/alerts/tls.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/tls.test.ts rename to x-pack/plugins/synthetics/server/lib/alerts/tls.test.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/tls.ts b/x-pack/plugins/synthetics/server/lib/alerts/tls.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/tls.ts rename to x-pack/plugins/synthetics/server/lib/alerts/tls.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/tls_legacy.test.ts b/x-pack/plugins/synthetics/server/lib/alerts/tls_legacy.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/tls_legacy.test.ts rename to x-pack/plugins/synthetics/server/lib/alerts/tls_legacy.test.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/tls_legacy.ts b/x-pack/plugins/synthetics/server/lib/alerts/tls_legacy.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/tls_legacy.ts rename to x-pack/plugins/synthetics/server/lib/alerts/tls_legacy.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/translations.ts b/x-pack/plugins/synthetics/server/lib/alerts/translations.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/translations.ts rename to x-pack/plugins/synthetics/server/lib/alerts/translations.ts diff --git a/x-pack/plugins/uptime/server/lib/alerts/types.ts b/x-pack/plugins/synthetics/server/lib/alerts/types.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/alerts/types.ts rename to x-pack/plugins/synthetics/server/lib/alerts/types.ts diff --git a/x-pack/plugins/uptime/server/lib/compose/kibana.ts b/x-pack/plugins/synthetics/server/lib/compose/kibana.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/compose/kibana.ts rename to x-pack/plugins/synthetics/server/lib/compose/kibana.ts diff --git a/x-pack/plugins/uptime/server/lib/domains/__snapshots__/license.test.ts.snap b/x-pack/plugins/synthetics/server/lib/domains/__snapshots__/license.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/server/lib/domains/__snapshots__/license.test.ts.snap rename to x-pack/plugins/synthetics/server/lib/domains/__snapshots__/license.test.ts.snap diff --git a/x-pack/plugins/uptime/server/lib/domains/index.ts b/x-pack/plugins/synthetics/server/lib/domains/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/domains/index.ts rename to x-pack/plugins/synthetics/server/lib/domains/index.ts diff --git a/x-pack/plugins/uptime/server/lib/domains/license.test.ts b/x-pack/plugins/synthetics/server/lib/domains/license.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/domains/license.test.ts rename to x-pack/plugins/synthetics/server/lib/domains/license.test.ts diff --git a/x-pack/plugins/uptime/server/lib/domains/license.ts b/x-pack/plugins/synthetics/server/lib/domains/license.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/domains/license.ts rename to x-pack/plugins/synthetics/server/lib/domains/license.ts diff --git a/x-pack/plugins/uptime/server/lib/helper/__snapshots__/get_filter_clause.test.ts.snap b/x-pack/plugins/synthetics/server/lib/helper/__snapshots__/get_filter_clause.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/server/lib/helper/__snapshots__/get_filter_clause.test.ts.snap rename to x-pack/plugins/synthetics/server/lib/helper/__snapshots__/get_filter_clause.test.ts.snap diff --git a/x-pack/plugins/uptime/server/lib/helper/get_filter_clause.test.ts b/x-pack/plugins/synthetics/server/lib/helper/get_filter_clause.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/helper/get_filter_clause.test.ts rename to x-pack/plugins/synthetics/server/lib/helper/get_filter_clause.test.ts diff --git a/x-pack/plugins/uptime/server/lib/helper/get_filter_clause.ts b/x-pack/plugins/synthetics/server/lib/helper/get_filter_clause.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/helper/get_filter_clause.ts rename to x-pack/plugins/synthetics/server/lib/helper/get_filter_clause.ts diff --git a/x-pack/plugins/uptime/server/lib/helper/index.ts b/x-pack/plugins/synthetics/server/lib/helper/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/helper/index.ts rename to x-pack/plugins/synthetics/server/lib/helper/index.ts diff --git a/x-pack/plugins/uptime/server/lib/helper/make_date_rate_filter.ts b/x-pack/plugins/synthetics/server/lib/helper/make_date_rate_filter.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/helper/make_date_rate_filter.ts rename to x-pack/plugins/synthetics/server/lib/helper/make_date_rate_filter.ts diff --git a/x-pack/plugins/uptime/server/lib/helper/object_to_array.ts b/x-pack/plugins/synthetics/server/lib/helper/object_to_array.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/helper/object_to_array.ts rename to x-pack/plugins/synthetics/server/lib/helper/object_to_array.ts diff --git a/x-pack/plugins/uptime/server/lib/helper/parse_relative_date.test.ts b/x-pack/plugins/synthetics/server/lib/helper/parse_relative_date.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/helper/parse_relative_date.test.ts rename to x-pack/plugins/synthetics/server/lib/helper/parse_relative_date.test.ts diff --git a/x-pack/plugins/uptime/server/lib/lib.ts b/x-pack/plugins/synthetics/server/lib/lib.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/lib.ts rename to x-pack/plugins/synthetics/server/lib/lib.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/__fixtures__/monitor_charts_mock.json b/x-pack/plugins/synthetics/server/lib/requests/__fixtures__/monitor_charts_mock.json similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/__fixtures__/monitor_charts_mock.json rename to x-pack/plugins/synthetics/server/lib/requests/__fixtures__/monitor_charts_mock.json diff --git a/x-pack/plugins/uptime/server/lib/requests/__snapshots__/generate_filter_aggs.test.ts.snap b/x-pack/plugins/synthetics/server/lib/requests/__snapshots__/generate_filter_aggs.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/__snapshots__/generate_filter_aggs.test.ts.snap rename to x-pack/plugins/synthetics/server/lib/requests/__snapshots__/generate_filter_aggs.test.ts.snap diff --git a/x-pack/plugins/uptime/server/lib/requests/__snapshots__/get_monitor_charts.test.ts.snap b/x-pack/plugins/synthetics/server/lib/requests/__snapshots__/get_monitor_charts.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/__snapshots__/get_monitor_charts.test.ts.snap rename to x-pack/plugins/synthetics/server/lib/requests/__snapshots__/get_monitor_charts.test.ts.snap diff --git a/x-pack/plugins/uptime/server/lib/requests/__snapshots__/get_monitor_details.test.ts.snap b/x-pack/plugins/synthetics/server/lib/requests/__snapshots__/get_monitor_details.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/__snapshots__/get_monitor_details.test.ts.snap rename to x-pack/plugins/synthetics/server/lib/requests/__snapshots__/get_monitor_details.test.ts.snap diff --git a/x-pack/plugins/uptime/server/lib/requests/__snapshots__/get_ping_histogram.test.ts.snap b/x-pack/plugins/synthetics/server/lib/requests/__snapshots__/get_ping_histogram.test.ts.snap similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/__snapshots__/get_ping_histogram.test.ts.snap rename to x-pack/plugins/synthetics/server/lib/requests/__snapshots__/get_ping_histogram.test.ts.snap diff --git a/x-pack/plugins/uptime/server/lib/requests/generate_filter_aggs.test.ts b/x-pack/plugins/synthetics/server/lib/requests/generate_filter_aggs.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/generate_filter_aggs.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/generate_filter_aggs.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/generate_filter_aggs.ts b/x-pack/plugins/synthetics/server/lib/requests/generate_filter_aggs.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/generate_filter_aggs.ts rename to x-pack/plugins/synthetics/server/lib/requests/generate_filter_aggs.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_certs.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_certs.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_certs.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_certs.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_certs.ts b/x-pack/plugins/synthetics/server/lib/requests/get_certs.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_certs.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_certs.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_index_pattern.ts b/x-pack/plugins/synthetics/server/lib/requests/get_index_pattern.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_index_pattern.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_index_pattern.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_index_status.ts b/x-pack/plugins/synthetics/server/lib/requests/get_index_status.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_index_status.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_index_status.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_details.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_details.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_details.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_details.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_details.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_details.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_details.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_details.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_failed_steps.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_failed_steps.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_failed_steps.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_failed_steps.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_screenshot.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_screenshot.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_screenshot.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_screenshot.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_screenshot_blocks.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_screenshot_blocks.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_screenshot_blocks.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_screenshot_blocks.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_steps.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_steps.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_steps.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.ts b/x-pack/plugins/synthetics/server/lib/requests/get_journey_steps.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_journey_steps.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_journey_steps.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_last_successful_check.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_last_successful_check.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_last_successful_check.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_last_successful_check.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_last_successful_check.ts b/x-pack/plugins/synthetics/server/lib/requests/get_last_successful_check.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_last_successful_check.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_last_successful_check.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_latest_monitor.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_latest_monitor.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts b/x-pack/plugins/synthetics/server/lib/requests/get_latest_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_latest_monitor.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_availability.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_availability.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_availability.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_availability.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_availability.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_availability.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_availability.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_availability.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_charts.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_charts.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_charts.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_charts.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_details.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_details.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_details.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_details.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_details.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_details.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_details.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_details.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_duration.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_duration.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_locations.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_locations.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_states.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_states.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_status.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_status.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_status.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts b/x-pack/plugins/synthetics/server/lib/requests/get_monitor_status.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_monitor_status.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_network_events.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_network_events.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_network_events.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_network_events.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_network_events.ts b/x-pack/plugins/synthetics/server/lib/requests/get_network_events.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_network_events.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_network_events.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_ping_histogram.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_ping_histogram.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts b/x-pack/plugins/synthetics/server/lib/requests/get_ping_histogram.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_ping_histogram.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_pings.test.ts b/x-pack/plugins/synthetics/server/lib/requests/get_pings.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_pings.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_pings.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_pings.ts b/x-pack/plugins/synthetics/server/lib/requests/get_pings.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_pings.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_pings.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts b/x-pack/plugins/synthetics/server/lib/requests/get_snapshot_counts.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts rename to x-pack/plugins/synthetics/server/lib/requests/get_snapshot_counts.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/helper.ts b/x-pack/plugins/synthetics/server/lib/requests/helper.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/helper.ts rename to x-pack/plugins/synthetics/server/lib/requests/helper.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/index.ts b/x-pack/plugins/synthetics/server/lib/requests/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/index.ts rename to x-pack/plugins/synthetics/server/lib/requests/index.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts b/x-pack/plugins/synthetics/server/lib/requests/search/fetch_chunk.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/fetch_chunk.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts b/x-pack/plugins/synthetics/server/lib/requests/search/find_potential_matches.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/find_potential_matches.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/index.ts b/x-pack/plugins/synthetics/server/lib/requests/search/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/index.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/index.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/monitor_summary_iterator.test.ts b/x-pack/plugins/synthetics/server/lib/requests/search/monitor_summary_iterator.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/monitor_summary_iterator.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/monitor_summary_iterator.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/monitor_summary_iterator.ts b/x-pack/plugins/synthetics/server/lib/requests/search/monitor_summary_iterator.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/monitor_summary_iterator.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/monitor_summary_iterator.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/query_context.test.ts b/x-pack/plugins/synthetics/server/lib/requests/search/query_context.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/query_context.test.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/query_context.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/query_context.ts b/x-pack/plugins/synthetics/server/lib/requests/search/query_context.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/query_context.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/query_context.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts b/x-pack/plugins/synthetics/server/lib/requests/search/refine_potential_matches.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/refine_potential_matches.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/test_helpers.ts b/x-pack/plugins/synthetics/server/lib/requests/search/test_helpers.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/test_helpers.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/test_helpers.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/types.ts b/x-pack/plugins/synthetics/server/lib/requests/search/types.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/requests/search/types.ts rename to x-pack/plugins/synthetics/server/lib/requests/search/types.ts diff --git a/x-pack/plugins/uptime/server/lib/saved_objects/index.ts b/x-pack/plugins/synthetics/server/lib/saved_objects/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/saved_objects/index.ts rename to x-pack/plugins/synthetics/server/lib/saved_objects/index.ts diff --git a/x-pack/plugins/uptime/server/lib/saved_objects/migrations.test.ts b/x-pack/plugins/synthetics/server/lib/saved_objects/migrations.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/saved_objects/migrations.test.ts rename to x-pack/plugins/synthetics/server/lib/saved_objects/migrations.test.ts diff --git a/x-pack/plugins/uptime/server/lib/saved_objects/migrations.ts b/x-pack/plugins/synthetics/server/lib/saved_objects/migrations.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/saved_objects/migrations.ts rename to x-pack/plugins/synthetics/server/lib/saved_objects/migrations.ts diff --git a/x-pack/plugins/uptime/server/lib/saved_objects/saved_objects.ts b/x-pack/plugins/synthetics/server/lib/saved_objects/saved_objects.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/saved_objects/saved_objects.ts rename to x-pack/plugins/synthetics/server/lib/saved_objects/saved_objects.ts diff --git a/x-pack/plugins/uptime/server/lib/saved_objects/service_api_key.ts b/x-pack/plugins/synthetics/server/lib/saved_objects/service_api_key.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/saved_objects/service_api_key.ts rename to x-pack/plugins/synthetics/server/lib/saved_objects/service_api_key.ts diff --git a/x-pack/plugins/uptime/server/lib/saved_objects/synthetics_monitor.ts b/x-pack/plugins/synthetics/server/lib/saved_objects/synthetics_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/saved_objects/synthetics_monitor.ts rename to x-pack/plugins/synthetics/server/lib/saved_objects/synthetics_monitor.ts diff --git a/x-pack/plugins/uptime/server/lib/saved_objects/uptime_settings.ts b/x-pack/plugins/synthetics/server/lib/saved_objects/uptime_settings.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/saved_objects/uptime_settings.ts rename to x-pack/plugins/synthetics/server/lib/saved_objects/uptime_settings.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/browser.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/browser.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/browser.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/browser.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/common.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/common.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/common.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/common.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/convert_to_data_stream.test.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/convert_to_data_stream.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/convert_to_data_stream.test.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/convert_to_data_stream.test.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/convert_to_data_stream.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/convert_to_data_stream.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/convert_to_data_stream.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/convert_to_data_stream.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.test.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/format_configs.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.test.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/format_configs.test.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/format_configs.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/format_configs.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/format_configs.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/http.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/http.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/http.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/http.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/icmp.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/icmp.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/icmp.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/icmp.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/index.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/index.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/index.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/tcp.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/tcp.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/tcp.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/tcp.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/formatters/tls.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/tls.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/formatters/tls.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/formatters/tls.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.test.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/get_api_key.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.test.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/get_api_key.test.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/get_api_key.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/get_api_key.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_es_hosts.test.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/get_es_hosts.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/get_es_hosts.test.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/get_es_hosts.test.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_es_hosts.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/get_es_hosts.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/get_es_hosts.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/get_es_hosts.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.test.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/get_service_locations.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.test.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/get_service_locations.test.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/get_service_locations.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/get_service_locations.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/hydrate_saved_object.test.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/hydrate_saved_object.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/hydrate_saved_object.test.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/hydrate_saved_object.test.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/hydrate_saved_object.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/hydrate_saved_object.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/hydrate_saved_object.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/hydrate_saved_object.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/service_api_client.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/service_api_client.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/service_api_client.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/service_api_client.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/synthetics_service.test.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/synthetics_service.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/synthetics_service.test.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/synthetics_service.test.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/synthetics_service.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/synthetics_service.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/synthetics_service.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/synthetics_service.ts diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/utils/secrets.ts b/x-pack/plugins/synthetics/server/lib/synthetics_service/utils/secrets.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/synthetics_service/utils/secrets.ts rename to x-pack/plugins/synthetics/server/lib/synthetics_service/utils/secrets.ts diff --git a/x-pack/plugins/uptime/server/lib/telemetry/__mocks__/index.ts b/x-pack/plugins/synthetics/server/lib/telemetry/__mocks__/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/telemetry/__mocks__/index.ts rename to x-pack/plugins/synthetics/server/lib/telemetry/__mocks__/index.ts diff --git a/x-pack/plugins/uptime/server/lib/telemetry/constants.ts b/x-pack/plugins/synthetics/server/lib/telemetry/constants.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/telemetry/constants.ts rename to x-pack/plugins/synthetics/server/lib/telemetry/constants.ts diff --git a/x-pack/plugins/uptime/server/lib/telemetry/queue.test.ts b/x-pack/plugins/synthetics/server/lib/telemetry/queue.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/telemetry/queue.test.ts rename to x-pack/plugins/synthetics/server/lib/telemetry/queue.test.ts diff --git a/x-pack/plugins/uptime/server/lib/telemetry/queue.ts b/x-pack/plugins/synthetics/server/lib/telemetry/queue.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/telemetry/queue.ts rename to x-pack/plugins/synthetics/server/lib/telemetry/queue.ts diff --git a/x-pack/plugins/uptime/server/lib/telemetry/sender.test.ts b/x-pack/plugins/synthetics/server/lib/telemetry/sender.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/telemetry/sender.test.ts rename to x-pack/plugins/synthetics/server/lib/telemetry/sender.test.ts diff --git a/x-pack/plugins/uptime/server/lib/telemetry/sender.ts b/x-pack/plugins/synthetics/server/lib/telemetry/sender.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/telemetry/sender.ts rename to x-pack/plugins/synthetics/server/lib/telemetry/sender.ts diff --git a/x-pack/plugins/uptime/server/lib/telemetry/types.ts b/x-pack/plugins/synthetics/server/lib/telemetry/types.ts similarity index 100% rename from x-pack/plugins/uptime/server/lib/telemetry/types.ts rename to x-pack/plugins/synthetics/server/lib/telemetry/types.ts diff --git a/x-pack/plugins/uptime/server/plugin.ts b/x-pack/plugins/synthetics/server/plugin.ts similarity index 100% rename from x-pack/plugins/uptime/server/plugin.ts rename to x-pack/plugins/synthetics/server/plugin.ts diff --git a/x-pack/plugins/uptime/server/rest_api/create_route_with_auth.ts b/x-pack/plugins/synthetics/server/rest_api/create_route_with_auth.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/create_route_with_auth.ts rename to x-pack/plugins/synthetics/server/rest_api/create_route_with_auth.ts diff --git a/x-pack/plugins/uptime/server/rest_api/dynamic_settings.test.ts b/x-pack/plugins/synthetics/server/rest_api/dynamic_settings.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/dynamic_settings.test.ts rename to x-pack/plugins/synthetics/server/rest_api/dynamic_settings.test.ts diff --git a/x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts b/x-pack/plugins/synthetics/server/rest_api/dynamic_settings.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts rename to x-pack/plugins/synthetics/server/rest_api/dynamic_settings.ts diff --git a/x-pack/plugins/uptime/server/rest_api/index.ts b/x-pack/plugins/synthetics/server/rest_api/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/index.ts rename to x-pack/plugins/synthetics/server/rest_api/index.ts diff --git a/x-pack/plugins/uptime/server/rest_api/index_state/get_index_status.ts b/x-pack/plugins/synthetics/server/rest_api/index_state/get_index_status.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/index_state/get_index_status.ts rename to x-pack/plugins/synthetics/server/rest_api/index_state/get_index_status.ts diff --git a/x-pack/plugins/uptime/server/rest_api/index_state/index.ts b/x-pack/plugins/synthetics/server/rest_api/index_state/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/index_state/index.ts rename to x-pack/plugins/synthetics/server/rest_api/index_state/index.ts diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/index.ts b/x-pack/plugins/synthetics/server/rest_api/monitors/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/monitors/index.ts rename to x-pack/plugins/synthetics/server/rest_api/monitors/index.ts diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts b/x-pack/plugins/synthetics/server/rest_api/monitors/monitor_list.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts rename to x-pack/plugins/synthetics/server/rest_api/monitors/monitor_list.ts diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_locations.ts b/x-pack/plugins/synthetics/server/rest_api/monitors/monitor_locations.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/monitors/monitor_locations.ts rename to x-pack/plugins/synthetics/server/rest_api/monitors/monitor_locations.ts diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_status.ts b/x-pack/plugins/synthetics/server/rest_api/monitors/monitor_status.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/monitors/monitor_status.ts rename to x-pack/plugins/synthetics/server/rest_api/monitors/monitor_status.ts diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitors_details.ts b/x-pack/plugins/synthetics/server/rest_api/monitors/monitors_details.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/monitors/monitors_details.ts rename to x-pack/plugins/synthetics/server/rest_api/monitors/monitors_details.ts diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitors_durations.ts b/x-pack/plugins/synthetics/server/rest_api/monitors/monitors_durations.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/monitors/monitors_durations.ts rename to x-pack/plugins/synthetics/server/rest_api/monitors/monitors_durations.ts diff --git a/x-pack/plugins/uptime/server/rest_api/network_events/get_network_events.ts b/x-pack/plugins/synthetics/server/rest_api/network_events/get_network_events.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/network_events/get_network_events.ts rename to x-pack/plugins/synthetics/server/rest_api/network_events/get_network_events.ts diff --git a/x-pack/plugins/uptime/server/rest_api/network_events/index.ts b/x-pack/plugins/synthetics/server/rest_api/network_events/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/network_events/index.ts rename to x-pack/plugins/synthetics/server/rest_api/network_events/index.ts diff --git a/x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts b/x-pack/plugins/synthetics/server/rest_api/pings/get_ping_histogram.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts rename to x-pack/plugins/synthetics/server/rest_api/pings/get_ping_histogram.ts diff --git a/x-pack/plugins/uptime/server/rest_api/pings/get_pings.ts b/x-pack/plugins/synthetics/server/rest_api/pings/get_pings.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/pings/get_pings.ts rename to x-pack/plugins/synthetics/server/rest_api/pings/get_pings.ts diff --git a/x-pack/plugins/uptime/server/rest_api/pings/index.ts b/x-pack/plugins/synthetics/server/rest_api/pings/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/pings/index.ts rename to x-pack/plugins/synthetics/server/rest_api/pings/index.ts diff --git a/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshot_blocks.test.ts b/x-pack/plugins/synthetics/server/rest_api/pings/journey_screenshot_blocks.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/pings/journey_screenshot_blocks.test.ts rename to x-pack/plugins/synthetics/server/rest_api/pings/journey_screenshot_blocks.test.ts diff --git a/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshot_blocks.ts b/x-pack/plugins/synthetics/server/rest_api/pings/journey_screenshot_blocks.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/pings/journey_screenshot_blocks.ts rename to x-pack/plugins/synthetics/server/rest_api/pings/journey_screenshot_blocks.ts diff --git a/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshots.test.ts b/x-pack/plugins/synthetics/server/rest_api/pings/journey_screenshots.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/pings/journey_screenshots.test.ts rename to x-pack/plugins/synthetics/server/rest_api/pings/journey_screenshots.test.ts diff --git a/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshots.ts b/x-pack/plugins/synthetics/server/rest_api/pings/journey_screenshots.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/pings/journey_screenshots.ts rename to x-pack/plugins/synthetics/server/rest_api/pings/journey_screenshots.ts diff --git a/x-pack/plugins/uptime/server/rest_api/pings/journeys.ts b/x-pack/plugins/synthetics/server/rest_api/pings/journeys.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/pings/journeys.ts rename to x-pack/plugins/synthetics/server/rest_api/pings/journeys.ts diff --git a/x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts b/x-pack/plugins/synthetics/server/rest_api/snapshot/get_snapshot_count.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts rename to x-pack/plugins/synthetics/server/rest_api/snapshot/get_snapshot_count.ts diff --git a/x-pack/plugins/uptime/server/rest_api/snapshot/index.ts b/x-pack/plugins/synthetics/server/rest_api/snapshot/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/snapshot/index.ts rename to x-pack/plugins/synthetics/server/rest_api/snapshot/index.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics/last_successful_check.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics/last_successful_check.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics/last_successful_check.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics/last_successful_check.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/add_monitor.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/add_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/add_monitor.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/add_monitor.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/delete_monitor.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/delete_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/delete_monitor.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/delete_monitor.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/edit_monitor.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/edit_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/edit_monitor.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/edit_monitor.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/enablement.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/enablement.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/enablement.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/enablement.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/get_monitor.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/get_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/get_monitor.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/get_monitor.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/get_service_allowed.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/get_service_allowed.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/get_service_allowed.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/get_service_allowed.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/get_service_locations.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/get_service_locations.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/get_service_locations.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/get_service_locations.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/install_index_templates.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/install_index_templates.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/install_index_templates.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/install_index_templates.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/monitor_validation.test.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/monitor_validation.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/monitor_validation.test.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/monitor_validation.test.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/monitor_validation.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/monitor_validation.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/monitor_validation.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/monitor_validation.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/run_once_monitor.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/run_once_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/run_once_monitor.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/run_once_monitor.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/service_errors.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/service_errors.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/service_errors.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/service_errors.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.test.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.test.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.test.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.test.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/test_now_monitor.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/test_now_monitor.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/synthetics_service/test_now_monitor.ts rename to x-pack/plugins/synthetics/server/rest_api/synthetics_service/test_now_monitor.ts diff --git a/x-pack/plugins/uptime/server/rest_api/telemetry/index.ts b/x-pack/plugins/synthetics/server/rest_api/telemetry/index.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/telemetry/index.ts rename to x-pack/plugins/synthetics/server/rest_api/telemetry/index.ts diff --git a/x-pack/plugins/uptime/server/rest_api/telemetry/log_page_view.ts b/x-pack/plugins/synthetics/server/rest_api/telemetry/log_page_view.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/telemetry/log_page_view.ts rename to x-pack/plugins/synthetics/server/rest_api/telemetry/log_page_view.ts diff --git a/x-pack/plugins/uptime/server/rest_api/types.ts b/x-pack/plugins/synthetics/server/rest_api/types.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/types.ts rename to x-pack/plugins/synthetics/server/rest_api/types.ts diff --git a/x-pack/plugins/uptime/server/rest_api/uptime_route_wrapper.ts b/x-pack/plugins/synthetics/server/rest_api/uptime_route_wrapper.ts similarity index 100% rename from x-pack/plugins/uptime/server/rest_api/uptime_route_wrapper.ts rename to x-pack/plugins/synthetics/server/rest_api/uptime_route_wrapper.ts diff --git a/x-pack/plugins/uptime/server/types.ts b/x-pack/plugins/synthetics/server/types.ts similarity index 100% rename from x-pack/plugins/uptime/server/types.ts rename to x-pack/plugins/synthetics/server/types.ts diff --git a/x-pack/plugins/uptime/server/uptime_server.ts b/x-pack/plugins/synthetics/server/uptime_server.ts similarity index 100% rename from x-pack/plugins/uptime/server/uptime_server.ts rename to x-pack/plugins/synthetics/server/uptime_server.ts diff --git a/x-pack/plugins/uptime/tsconfig.json b/x-pack/plugins/synthetics/tsconfig.json similarity index 100% rename from x-pack/plugins/uptime/tsconfig.json rename to x-pack/plugins/synthetics/tsconfig.json diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 78881eab1f93b..73780164049a5 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -30141,7 +30141,6 @@ "xpack.uptime.emptyStateError.notFoundPage": "Page introuvable", "xpack.uptime.emptyStateError.title": "Erreur", "xpack.uptime.enableAlert.editAlert": "Modifier l'alerte", - "xpack.uptime.featureRegistry.uptimeFeatureName": "Uptime", "xpack.uptime.filterBar.ariaLabel": "Saisissez des critères de filtre pour la page d'aperçu", "xpack.uptime.filterBar.filterAllLabel": "Tous", "xpack.uptime.filterBar.options.location.name": "Emplacement", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c1936e8ef5bf8..e79baef772910 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -30326,7 +30326,6 @@ "xpack.uptime.emptyStateError.notFoundPage": "ページが見つかりません", "xpack.uptime.emptyStateError.title": "エラー", "xpack.uptime.enableAlert.editAlert": "アラートを編集", - "xpack.uptime.featureRegistry.uptimeFeatureName": "アップタイム", "xpack.uptime.filterBar.ariaLabel": "概要ページのインプットフィルター基準", "xpack.uptime.filterBar.filterAllLabel": "すべて", "xpack.uptime.filterBar.options.location.name": "場所", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 0199af8d8f9da..19e216f111a62 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -30362,7 +30362,6 @@ "xpack.uptime.emptyStateError.notFoundPage": "未找到页面", "xpack.uptime.emptyStateError.title": "错误", "xpack.uptime.enableAlert.editAlert": "编辑告警", - "xpack.uptime.featureRegistry.uptimeFeatureName": "运行时间", "xpack.uptime.filterBar.ariaLabel": "概览页面的输入筛选条件", "xpack.uptime.filterBar.filterAllLabel": "全部", "xpack.uptime.filterBar.options.location.name": "位置", diff --git a/x-pack/test/api_integration/apis/uptime/feature_controls.ts b/x-pack/test/api_integration/apis/uptime/feature_controls.ts index c9c545cbad242..39d7406636353 100644 --- a/x-pack/test/api_integration/apis/uptime/feature_controls.ts +++ b/x-pack/test/api_integration/apis/uptime/feature_controls.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PINGS_DATE_RANGE_END, PINGS_DATE_RANGE_START } from './constants'; diff --git a/x-pack/test/api_integration/apis/uptime/get_all_pings.ts b/x-pack/test/api_integration/apis/uptime/get_all_pings.ts index a7547d61992f2..19b78854a8df3 100644 --- a/x-pack/test/api_integration/apis/uptime/get_all_pings.ts +++ b/x-pack/test/api_integration/apis/uptime/get_all_pings.ts @@ -7,7 +7,7 @@ import moment from 'moment'; import expect from '@kbn/expect'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { PINGS_DATE_RANGE_START, PINGS_DATE_RANGE_END } from './constants'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/add_monitor.ts b/x-pack/test/api_integration/apis/uptime/rest/add_monitor.ts index 379b740c22427..14fce8f974e92 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/add_monitor.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/add_monitor.ts @@ -6,9 +6,9 @@ */ import { omit } from 'lodash'; import expect from '@kbn/expect'; -import { secretKeys } from '@kbn/uptime-plugin/common/constants/monitor_management'; -import { HTTPFields } from '@kbn/uptime-plugin/common/runtime_types'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { secretKeys } from '@kbn/synthetics-plugin/common/constants/monitor_management'; +import { HTTPFields } from '@kbn/synthetics-plugin/common/runtime_types'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { getFixtureJson } from './helper/get_fixture_json'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/certs.ts b/x-pack/test/api_integration/apis/uptime/rest/certs.ts index 8e76567bb13fb..ac9cc0e2be15f 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/certs.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/certs.ts @@ -8,11 +8,11 @@ import expect from '@kbn/expect'; import moment from 'moment'; import { isRight } from 'fp-ts/lib/Either'; -import { CertType } from '@kbn/uptime-plugin/common/runtime_types'; +import { CertType } from '@kbn/synthetics-plugin/common/runtime_types'; import { processCertsResult, getCertsRequestBody, -} from '@kbn/uptime-plugin/common/requests/get_certs_request_body'; +} from '@kbn/synthetics-plugin/common/requests/get_certs_request_body'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { makeChecksWithStatus } from './helper/make_checks'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/delete_monitor.ts b/x-pack/test/api_integration/apis/uptime/rest/delete_monitor.ts index e82759d581191..faff22f750670 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/delete_monitor.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/delete_monitor.ts @@ -6,8 +6,8 @@ */ import expect from '@kbn/expect'; -import { HTTPFields, MonitorFields } from '@kbn/uptime-plugin/common/runtime_types'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { HTTPFields, MonitorFields } from '@kbn/synthetics-plugin/common/runtime_types'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { getFixtureJson } from './helper/get_fixture_json'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/dynamic_settings.ts b/x-pack/test/api_integration/apis/uptime/rest/dynamic_settings.ts index 19b50a0d1a260..ab5315b92300c 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/dynamic_settings.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/dynamic_settings.ts @@ -7,8 +7,8 @@ import expect from '@kbn/expect'; import { isRight } from 'fp-ts/lib/Either'; -import { DynamicSettingsType, DynamicSettings } from '@kbn/uptime-plugin/common/runtime_types'; -import { DYNAMIC_SETTINGS_DEFAULTS, API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { DynamicSettingsType, DynamicSettings } from '@kbn/synthetics-plugin/common/runtime_types'; +import { DYNAMIC_SETTINGS_DEFAULTS, API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { diff --git a/x-pack/test/api_integration/apis/uptime/rest/edit_monitor.ts b/x-pack/test/api_integration/apis/uptime/rest/edit_monitor.ts index 81bcc58c9da85..be94aedc293b3 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/edit_monitor.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/edit_monitor.ts @@ -7,9 +7,9 @@ import expect from '@kbn/expect'; import { omit } from 'lodash'; import { SimpleSavedObject } from '@kbn/core/public'; -import { secretKeys } from '@kbn/uptime-plugin/common/constants/monitor_management'; -import { ConfigKey, HTTPFields, MonitorFields } from '@kbn/uptime-plugin/common/runtime_types'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { secretKeys } from '@kbn/synthetics-plugin/common/constants/monitor_management'; +import { ConfigKey, HTTPFields, MonitorFields } from '@kbn/synthetics-plugin/common/runtime_types'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { getFixtureJson } from './helper/get_fixture_json'; export default function ({ getService }: FtrProviderContext) { diff --git a/x-pack/test/api_integration/apis/uptime/rest/get_monitor.ts b/x-pack/test/api_integration/apis/uptime/rest/get_monitor.ts index 311c52eecb98d..0fa5ed26b791e 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/get_monitor.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/get_monitor.ts @@ -7,9 +7,9 @@ import expect from '@kbn/expect'; import { SimpleSavedObject } from '@kbn/core/public'; -import { MonitorFields } from '@kbn/uptime-plugin/common/runtime_types'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; -import { formatSecrets } from '@kbn/uptime-plugin/server/lib/synthetics_service/utils/secrets'; +import { MonitorFields } from '@kbn/synthetics-plugin/common/runtime_types'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; +import { formatSecrets } from '@kbn/synthetics-plugin/server/lib/synthetics_service/utils/secrets'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { getFixtureJson } from './helper/get_fixture_json'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/index.ts b/x-pack/test/api_integration/apis/uptime/rest/index.ts index 1ab5b6f2af082..3bfe81534c330 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/index.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/index.ts @@ -8,7 +8,7 @@ import { settingsObjectId, settingsObjectType, -} from '@kbn/uptime-plugin/server/lib/saved_objects/uptime_settings'; +} from '@kbn/synthetics-plugin/server/lib/saved_objects/uptime_settings'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, loadTestFile }: FtrProviderContext) { diff --git a/x-pack/test/api_integration/apis/uptime/rest/index_status.ts b/x-pack/test/api_integration/apis/uptime/rest/index_status.ts index 826569041a7bd..620621274a078 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/index_status.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/index_status.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { expectFixtureEql } from './helper/expect_fixture_eql'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/monitor_duration.ts b/x-pack/test/api_integration/apis/uptime/rest/monitor_duration.ts index 8606c81e94641..abd1ac69732b1 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/monitor_duration.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/monitor_duration.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { expectFixtureEql } from './helper/expect_fixture_eql'; import { FtrProviderContext } from '../../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/monitor_latest_status.ts b/x-pack/test/api_integration/apis/uptime/rest/monitor_latest_status.ts index 9e4632f552a90..e5cf59be67233 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/monitor_latest_status.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/monitor_latest_status.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { expectFixtureEql } from './helper/expect_fixture_eql'; import { FtrProviderContext } from '../../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/monitor_states_generated.ts b/x-pack/test/api_integration/apis/uptime/rest/monitor_states_generated.ts index 54112045db13f..5bbe7f7312102 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/monitor_states_generated.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/monitor_states_generated.ts @@ -6,8 +6,8 @@ */ import expect from '@kbn/expect'; -import { MonitorSummary } from '@kbn/uptime-plugin/common/runtime_types'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { MonitorSummary } from '@kbn/synthetics-plugin/common/runtime_types'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { makeChecksWithStatus } from './helper/make_checks'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/monitor_states_real_data.ts b/x-pack/test/api_integration/apis/uptime/rest/monitor_states_real_data.ts index 0ca3d4d75b9bd..438211665674a 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/monitor_states_real_data.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/monitor_states_real_data.ts @@ -10,8 +10,8 @@ import { isRight } from 'fp-ts/lib/Either'; import { MonitorSummariesResult, MonitorSummariesResultType, -} from '@kbn/uptime-plugin/common/runtime_types'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +} from '@kbn/synthetics-plugin/common/runtime_types'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; interface ExpectedMonitorStatesPage { diff --git a/x-pack/test/api_integration/apis/uptime/rest/ping_histogram.ts b/x-pack/test/api_integration/apis/uptime/rest/ping_histogram.ts index bc30a932e77b2..235ae17b7c9e7 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/ping_histogram.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/ping_histogram.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { expectFixtureEql } from './helper/expect_fixture_eql'; import { FtrProviderContext } from '../../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/ping_list.ts b/x-pack/test/api_integration/apis/uptime/rest/ping_list.ts index 84d4af6f650be..5c179a15b7525 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/ping_list.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/ping_list.ts @@ -8,8 +8,8 @@ import expect from '@kbn/expect'; import { isLeft } from 'fp-ts/lib/Either'; import { PathReporter } from 'io-ts/lib/PathReporter'; -import { PingsResponseType } from '@kbn/uptime-plugin/common/runtime_types'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { PingsResponseType } from '@kbn/synthetics-plugin/common/runtime_types'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; function decodePingsResponseData(response: any) { diff --git a/x-pack/test/api_integration/apis/uptime/rest/snapshot.ts b/x-pack/test/api_integration/apis/uptime/rest/snapshot.ts index 98954776cf2cf..d5722fce17b0f 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/snapshot.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/snapshot.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { expectFixtureEql } from './helper/expect_fixture_eql'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { makeChecksWithStatus, getChecksDateRange } from './helper/make_checks'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/synthetics_enablement.ts b/x-pack/test/api_integration/apis/uptime/rest/synthetics_enablement.ts index 72a5422338ef6..04a718e5c7c8f 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/synthetics_enablement.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/synthetics_enablement.ts @@ -6,8 +6,8 @@ */ import expect from '@kbn/expect'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; -import { serviceApiKeyPrivileges } from '@kbn/uptime-plugin/server/lib/synthetics_service/get_api_key'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; +import { serviceApiKeyPrivileges } from '@kbn/synthetics-plugin/server/lib/synthetics_service/get_api_key'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { diff --git a/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors.ts b/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors.ts index cc493b31115a9..9c9088e015373 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { makeChecksWithStatus } from './helper/make_checks'; diff --git a/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors_fleet.ts b/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors_fleet.ts index 41716323ffd9e..7760ef5c13da9 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors_fleet.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors_fleet.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; -import { API_URLS } from '@kbn/uptime-plugin/common/constants'; +import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { makeChecksWithStatus } from './helper/make_checks'; diff --git a/x-pack/test/functional/apps/uptime/index.ts b/x-pack/test/functional/apps/uptime/index.ts index 68065129a28af..cc0578602951a 100644 --- a/x-pack/test/functional/apps/uptime/index.ts +++ b/x-pack/test/functional/apps/uptime/index.ts @@ -8,7 +8,7 @@ import { settingsObjectId, settingsObjectType, -} from '@kbn/uptime-plugin/server/lib/saved_objects/uptime_settings'; +} from '@kbn/synthetics-plugin/server/lib/saved_objects/uptime_settings'; import { FtrProviderContext } from '../../ftr_provider_context'; const ARCHIVE = 'x-pack/test/functional/es_archives/uptime/full_heartbeat'; diff --git a/x-pack/test/functional/apps/uptime/settings.ts b/x-pack/test/functional/apps/uptime/settings.ts index 5beace54c1b06..585de566f2aba 100644 --- a/x-pack/test/functional/apps/uptime/settings.ts +++ b/x-pack/test/functional/apps/uptime/settings.ts @@ -6,8 +6,8 @@ */ import expect from '@kbn/expect'; -import { DynamicSettings } from '@kbn/uptime-plugin/common/runtime_types'; -import { DYNAMIC_SETTINGS_DEFAULTS } from '@kbn/uptime-plugin/common/constants'; +import { DynamicSettings } from '@kbn/synthetics-plugin/common/runtime_types'; +import { DYNAMIC_SETTINGS_DEFAULTS } from '@kbn/synthetics-plugin/common/constants'; import { FtrProviderContext } from '../../ftr_provider_context'; import { makeChecks } from '../../../api_integration/apis/uptime/rest/helper/make_checks'; diff --git a/x-pack/test/functional/services/uptime/settings.ts b/x-pack/test/functional/services/uptime/settings.ts index e6493efd9b264..846fdc7216f63 100644 --- a/x-pack/test/functional/services/uptime/settings.ts +++ b/x-pack/test/functional/services/uptime/settings.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { DynamicSettings } from '@kbn/uptime-plugin/common/runtime_types'; +import { DynamicSettings } from '@kbn/synthetics-plugin/common/runtime_types'; import { FtrProviderContext } from '../../ftr_provider_context'; export function UptimeSettingsProvider({ getService }: FtrProviderContext) { diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index 91b82bc785ae9..d6bdf8cfaa6fd 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -101,6 +101,6 @@ { "path": "../plugins/remote_clusters/tsconfig.json" }, { "path": "../plugins/cross_cluster_replication/tsconfig.json" }, { "path": "../plugins/index_lifecycle_management/tsconfig.json"}, - { "path": "../plugins/uptime/tsconfig.json" } + { "path": "../plugins/synthetics/tsconfig.json"} ] } From decb95b97a2cbc9c04e324c1224730476c73d00c Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 20 Apr 2022 15:22:54 -0400 Subject: [PATCH 17/22] [CI] Move some test suites out of ciGroup4 (#130708) --- x-pack/test/functional/apps/spaces/index.ts | 2 +- x-pack/test/functional/apps/visualize/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/test/functional/apps/spaces/index.ts b/x-pack/test/functional/apps/spaces/index.ts index 3f0b35ff9236a..780d355e1f5c6 100644 --- a/x-pack/test/functional/apps/spaces/index.ts +++ b/x-pack/test/functional/apps/spaces/index.ts @@ -9,7 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function spacesApp({ loadTestFile }: FtrProviderContext) { describe('Spaces app', function spacesAppTestSuite() { - this.tags('ciGroup4'); + this.tags('ciGroup9'); loadTestFile(require.resolve('./copy_saved_objects')); loadTestFile(require.resolve('./feature_controls/spaces_security')); diff --git a/x-pack/test/functional/apps/visualize/index.ts b/x-pack/test/functional/apps/visualize/index.ts index e821c1d93edf1..105303aa1b537 100644 --- a/x-pack/test/functional/apps/visualize/index.ts +++ b/x-pack/test/functional/apps/visualize/index.ts @@ -9,7 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function visualize({ loadTestFile }: FtrProviderContext) { describe('Visualize', function visualizeTestSuite() { - this.tags(['ciGroup4', 'skipFirefox']); + this.tags(['ciGroup30', 'skipFirefox']); loadTestFile(require.resolve('./feature_controls/visualize_security')); loadTestFile(require.resolve('./feature_controls/visualize_spaces')); From d0643e0eaaa3e6bb66783cd0229f0c317995da86 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 20 Apr 2022 15:23:31 -0400 Subject: [PATCH 18/22] [CI] Move most tests from oss ciGroup2 to ciGroup11 (#130712) --- test/examples/bfetch_explorer/index.ts | 2 +- test/examples/data_view_field_editor_example/index.ts | 2 +- test/examples/embeddables/index.ts | 2 +- test/examples/expressions_explorer/index.ts | 2 +- test/examples/field_formats/index.ts | 2 +- test/examples/hello_world/index.ts | 2 +- test/examples/partial_results/index.ts | 2 +- test/examples/routing/index.ts | 2 +- test/examples/state_sync/index.ts | 2 +- test/examples/ui_actions/index.ts | 2 +- test/interactive_setup_api_integration/tests/enrollment_flow.ts | 2 +- .../tests/manual_configuration_flow.ts | 2 +- .../tests/manual_configuration_flow_without_tls.ts | 2 +- test/interactive_setup_functional/tests/enrollment_token.ts | 2 +- test/interactive_setup_functional/tests/manual_configuration.ts | 2 +- .../tests/manual_configuration_without_security.ts | 2 +- .../tests/manual_configuration_without_tls.ts | 2 +- test/new_visualize_flow/index.ts | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/test/examples/bfetch_explorer/index.ts b/test/examples/bfetch_explorer/index.ts index e5b4789bf9178..247cef07a487e 100644 --- a/test/examples/bfetch_explorer/index.ts +++ b/test/examples/bfetch_explorer/index.ts @@ -14,7 +14,7 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid const PageObjects = getPageObjects(['common', 'header']); describe('bfetch explorer', function () { - this.tags('ciGroup2'); + this.tags('ciGroup11'); before(async () => { await browser.setWindowSize(1300, 900); await PageObjects.common.navigateToApp('bfetch-explorer', { insertTimestamp: false }); diff --git a/test/examples/data_view_field_editor_example/index.ts b/test/examples/data_view_field_editor_example/index.ts index f24eb0feddbc8..0f8517cb3ed29 100644 --- a/test/examples/data_view_field_editor_example/index.ts +++ b/test/examples/data_view_field_editor_example/index.ts @@ -20,7 +20,7 @@ export default function ({ const PageObjects = getPageObjects(['common', 'header', 'settings']); describe('data view field editor example', function () { - this.tags('ciGroup2'); + this.tags('ciGroup11'); before(async () => { await esArchiver.emptyKibanaIndex(); await browser.setWindowSize(1300, 900); diff --git a/test/examples/embeddables/index.ts b/test/examples/embeddables/index.ts index 9a3b07aab51dc..364c4001383a7 100644 --- a/test/examples/embeddables/index.ts +++ b/test/examples/embeddables/index.ts @@ -18,7 +18,7 @@ export default function ({ const PageObjects = getPageObjects(['common', 'header']); describe('embeddable explorer', function () { - this.tags('ciGroup2'); + this.tags('ciGroup11'); before(async () => { await browser.setWindowSize(1300, 900); await PageObjects.common.navigateToApp('embeddableExplorer'); diff --git a/test/examples/expressions_explorer/index.ts b/test/examples/expressions_explorer/index.ts index ec826f66d8e27..34f3c77cb0d3e 100644 --- a/test/examples/expressions_explorer/index.ts +++ b/test/examples/expressions_explorer/index.ts @@ -18,7 +18,7 @@ export default function ({ const PageObjects = getPageObjects(['common', 'header']); describe('expressions explorer', function () { - this.tags('ciGroup2'); + this.tags('ciGroup11'); before(async () => { await browser.setWindowSize(1300, 900); await PageObjects.common.navigateToApp('expressionsExplorer'); diff --git a/test/examples/field_formats/index.ts b/test/examples/field_formats/index.ts index cafa84f862eaa..f9692c910fda0 100644 --- a/test/examples/field_formats/index.ts +++ b/test/examples/field_formats/index.ts @@ -16,7 +16,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Field formats example', function () { before(async () => { - this.tags('ciGroup2'); + this.tags('ciGroup11'); await PageObjects.common.navigateToApp('fieldFormatsExample'); }); diff --git a/test/examples/hello_world/index.ts b/test/examples/hello_world/index.ts index 3215c92666b27..1ffb7ff6d69af 100644 --- a/test/examples/hello_world/index.ts +++ b/test/examples/hello_world/index.ts @@ -17,7 +17,7 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid describe('Hello world', function () { before(async () => { - this.tags('ciGroup2'); + this.tags('ciGroup11'); await PageObjects.common.navigateToApp('helloWorld'); }); diff --git a/test/examples/partial_results/index.ts b/test/examples/partial_results/index.ts index 62d40652b4db5..84ccff4cd35b7 100644 --- a/test/examples/partial_results/index.ts +++ b/test/examples/partial_results/index.ts @@ -16,7 +16,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Partial Results Example', function () { before(async () => { - this.tags('ciGroup2'); + this.tags('ciGroup11'); await PageObjects.common.navigateToApp('partialResultsExample'); const element = await testSubjects.find('example-help'); diff --git a/test/examples/routing/index.ts b/test/examples/routing/index.ts index 4c42931e267f1..949d8cfc7547a 100644 --- a/test/examples/routing/index.ts +++ b/test/examples/routing/index.ts @@ -17,7 +17,7 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid describe('routing examples', function () { before(async () => { - this.tags('ciGroup2'); + this.tags('ciGroup11'); await PageObjects.common.navigateToApp('routingExample'); }); diff --git a/test/examples/state_sync/index.ts b/test/examples/state_sync/index.ts index d48f4d4d8ae64..a33c014f4dd9d 100644 --- a/test/examples/state_sync/index.ts +++ b/test/examples/state_sync/index.ts @@ -17,7 +17,7 @@ export default function ({ const browser = getService('browser'); describe('state sync examples', function () { - this.tags('ciGroup2'); + this.tags('ciGroup11'); before(async () => { await browser.setWindowSize(1300, 900); }); diff --git a/test/examples/ui_actions/index.ts b/test/examples/ui_actions/index.ts index 9c4dbaee9b860..b04d361cc86ec 100644 --- a/test/examples/ui_actions/index.ts +++ b/test/examples/ui_actions/index.ts @@ -18,7 +18,7 @@ export default function ({ const PageObjects = getPageObjects(['common', 'header']); describe('ui actions explorer', function () { - this.tags('ciGroup2'); + this.tags('ciGroup11'); before(async () => { await browser.setWindowSize(1300, 900); await PageObjects.common.navigateToApp('uiActionsExplorer'); diff --git a/test/interactive_setup_api_integration/tests/enrollment_flow.ts b/test/interactive_setup_api_integration/tests/enrollment_flow.ts index 53454207b73ed..f35509f49480a 100644 --- a/test/interactive_setup_api_integration/tests/enrollment_flow.ts +++ b/test/interactive_setup_api_integration/tests/enrollment_flow.ts @@ -20,7 +20,7 @@ export default function (context: FtrProviderContext) { const config = context.getService('config'); describe('Interactive setup APIs - Enrollment flow', function () { - this.tags(['skipCloud', 'ciGroup2']); + this.tags(['skipCloud', 'ciGroup11']); let kibanaVerificationCode: string; let elasticsearchCaFingerprint: string; diff --git a/test/interactive_setup_api_integration/tests/manual_configuration_flow.ts b/test/interactive_setup_api_integration/tests/manual_configuration_flow.ts index 2db59dd446fc4..94a06363367ad 100644 --- a/test/interactive_setup_api_integration/tests/manual_configuration_flow.ts +++ b/test/interactive_setup_api_integration/tests/manual_configuration_flow.ts @@ -19,7 +19,7 @@ export default function (context: FtrProviderContext) { const config = context.getService('config'); describe('Interactive setup APIs - Manual configuration flow', function () { - this.tags(['skipCloud', 'ciGroup2']); + this.tags(['skipCloud', 'ciGroup11']); let kibanaVerificationCode: string; let elasticsearchCaCertificate: string; diff --git a/test/interactive_setup_api_integration/tests/manual_configuration_flow_without_tls.ts b/test/interactive_setup_api_integration/tests/manual_configuration_flow_without_tls.ts index 97a3e490e9650..a3964c5fd5aa6 100644 --- a/test/interactive_setup_api_integration/tests/manual_configuration_flow_without_tls.ts +++ b/test/interactive_setup_api_integration/tests/manual_configuration_flow_without_tls.ts @@ -18,7 +18,7 @@ export default function (context: FtrProviderContext) { const config = context.getService('config'); describe('Interactive setup APIs - Manual configuration flow without TLS', function () { - this.tags(['skipCloud', 'ciGroup2']); + this.tags(['skipCloud', 'ciGroup11']); let kibanaVerificationCode: string; before(async () => { diff --git a/test/interactive_setup_functional/tests/enrollment_token.ts b/test/interactive_setup_functional/tests/enrollment_token.ts index 56311c9458cef..20d9da6539692 100644 --- a/test/interactive_setup_functional/tests/enrollment_token.ts +++ b/test/interactive_setup_functional/tests/enrollment_token.ts @@ -22,7 +22,7 @@ export default function ({ getService }: FtrProviderContext) { const log = getService('log'); describe('Interactive Setup Functional Tests (Enrollment token)', function () { - this.tags(['skipCloud', 'ciGroup2']); + this.tags(['skipCloud', 'ciGroup11']); const elasticsearchConfig = config.get('servers.elasticsearch'); let verificationCode: string; diff --git a/test/interactive_setup_functional/tests/manual_configuration.ts b/test/interactive_setup_functional/tests/manual_configuration.ts index 3c7c5d9c08d76..68c5068acd267 100644 --- a/test/interactive_setup_functional/tests/manual_configuration.ts +++ b/test/interactive_setup_functional/tests/manual_configuration.ts @@ -19,7 +19,7 @@ export default function ({ getService }: FtrProviderContext) { const log = getService('log'); describe('Interactive Setup Functional Tests (Manual configuration)', function () { - this.tags(['skipCloud', 'ciGroup2']); + this.tags(['skipCloud', 'ciGroup11']); let verificationCode: string; before(async function () { diff --git a/test/interactive_setup_functional/tests/manual_configuration_without_security.ts b/test/interactive_setup_functional/tests/manual_configuration_without_security.ts index 2111dc3cce7e7..20f7bac890da4 100644 --- a/test/interactive_setup_functional/tests/manual_configuration_without_security.ts +++ b/test/interactive_setup_functional/tests/manual_configuration_without_security.ts @@ -19,7 +19,7 @@ export default function ({ getService, getPageObject }: FtrProviderContext) { const log = getService('log'); describe('Interactive Setup Functional Tests (Manual configuration without Security)', function () { - this.tags(['skipCloud', 'ciGroup2']); + this.tags(['skipCloud', 'ciGroup11']); let verificationCode: string; before(async function () { diff --git a/test/interactive_setup_functional/tests/manual_configuration_without_tls.ts b/test/interactive_setup_functional/tests/manual_configuration_without_tls.ts index b8e391dc6f93f..04e31b4ae8454 100644 --- a/test/interactive_setup_functional/tests/manual_configuration_without_tls.ts +++ b/test/interactive_setup_functional/tests/manual_configuration_without_tls.ts @@ -19,7 +19,7 @@ export default function ({ getService }: FtrProviderContext) { const log = getService('log'); describe('Interactive Setup Functional Tests (Manual configuration without TLS)', function () { - this.tags(['skipCloud', 'ciGroup2']); + this.tags(['skipCloud', 'ciGroup11']); let verificationCode: string; before(async function () { diff --git a/test/new_visualize_flow/index.ts b/test/new_visualize_flow/index.ts index 02245002e8336..7cb55069d7d9b 100644 --- a/test/new_visualize_flow/index.ts +++ b/test/new_visualize_flow/index.ts @@ -11,7 +11,7 @@ import { FtrProviderContext } from '../functional/ftr_provider_context'; // eslint-disable-next-line import/no-default-export export default function ({ loadTestFile, getService }: FtrProviderContext) { describe('New Visualize Flow', function () { - this.tags('ciGroup2'); + this.tags('ciGroup11'); const esArchiver = getService('esArchiver'); before(async () => { await esArchiver.loadIfNeeded( From 5beae64ea9909a3813ed67c45cc0f2a19245abe2 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 20 Apr 2022 16:09:37 -0400 Subject: [PATCH 19/22] [CI] Move most tests from oss ciGroup6 to ciGroup5 (#130709) --- test/functional/apps/dashboard/index.ts | 2 +- test/functional/apps/getting_started/index.ts | 2 +- test/functional/apps/home/index.js | 2 +- test/ui_capabilities/newsfeed_err/test.ts | 2 +- test/visual_regression/tests/discover/index.ts | 2 +- test/visual_regression/tests/vega/index.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/functional/apps/dashboard/index.ts b/test/functional/apps/dashboard/index.ts index c9a62447f223a..4f69504ef7d5c 100644 --- a/test/functional/apps/dashboard/index.ts +++ b/test/functional/apps/dashboard/index.ts @@ -115,7 +115,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { // TODO: Remove when vislib is removed // https://github.com/elastic/kibana/issues/56143 describe('new charts library', function () { - this.tags('ciGroup6'); + this.tags('ciGroup5'); before(async () => { await loadLogstash(); diff --git a/test/functional/apps/getting_started/index.ts b/test/functional/apps/getting_started/index.ts index ae7fdc3c1d4fa..c88999e23be3d 100644 --- a/test/functional/apps/getting_started/index.ts +++ b/test/functional/apps/getting_started/index.ts @@ -13,7 +13,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); describe('Getting Started ', function () { - this.tags(['ciGroup6']); + this.tags(['ciGroup5']); before(async function () { await browser.setWindowSize(1200, 800); diff --git a/test/functional/apps/home/index.js b/test/functional/apps/home/index.js index 257ee724f6c8b..992c5b1f2f474 100644 --- a/test/functional/apps/home/index.js +++ b/test/functional/apps/home/index.js @@ -10,7 +10,7 @@ export default function ({ getService, loadTestFile }) { const browser = getService('browser'); describe('homepage app', function () { - this.tags('ciGroup6'); + this.tags('ciGroup5'); before(function () { return browser.setWindowSize(1200, 800); diff --git a/test/ui_capabilities/newsfeed_err/test.ts b/test/ui_capabilities/newsfeed_err/test.ts index 2c0c9e60c6995..52c1c0644299a 100644 --- a/test/ui_capabilities/newsfeed_err/test.ts +++ b/test/ui_capabilities/newsfeed_err/test.ts @@ -15,7 +15,7 @@ export default function uiCapabilitiesTests({ getService, getPageObjects }: FtrP const PageObjects = getPageObjects(['common', 'newsfeed']); describe('Newsfeed icon button handle errors', function () { - this.tags('ciGroup6'); + this.tags('ciGroup5'); before(async () => { await PageObjects.newsfeed.resetPage(); diff --git a/test/visual_regression/tests/discover/index.ts b/test/visual_regression/tests/discover/index.ts index 3f82f5405972e..fe634c02400a4 100644 --- a/test/visual_regression/tests/discover/index.ts +++ b/test/visual_regression/tests/discover/index.ts @@ -16,7 +16,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { const browser = getService('browser'); describe('discover app', function () { - this.tags('ciGroup6'); + this.tags('ciGroup5'); before(function () { return browser.setWindowSize(SCREEN_WIDTH, 1000); diff --git a/test/visual_regression/tests/vega/index.ts b/test/visual_regression/tests/vega/index.ts index c6b4cbd2d01b5..71f22a3058d91 100644 --- a/test/visual_regression/tests/vega/index.ts +++ b/test/visual_regression/tests/vega/index.ts @@ -16,7 +16,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { const browser = getService('browser'); describe('vega app', function () { - this.tags('ciGroup6'); + this.tags('ciGroup5'); before(function () { return browser.setWindowSize(SCREEN_WIDTH, 1000); From 0082e0cb06b4838ff8e82a87707b7d9512b8a03d Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 20 Apr 2022 16:13:59 -0500 Subject: [PATCH 20/22] [artifact testing] Bump VM boot timeout (#130735) We saw a flaky `vagrant ssh` timeout in a CI run, possibly caused by a busy host. This doubles the VM setup timeout from 5 minutes to 10 minutes. --- test/package/Vagrantfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/package/Vagrantfile b/test/package/Vagrantfile index 6a094e013c341..2a7e465531333 100644 --- a/test/package/Vagrantfile +++ b/test/package/Vagrantfile @@ -1,6 +1,6 @@ Vagrant.configure("2") do |config| config.vm.synced_folder '../../target/', '/packages' - + config.vm.boot_timeout = 600 config.vm.define "deb" do |deb| deb.vm.provider :virtualbox do |vb| vb.memory = 2048 From 3b37b27826fb76e12cef5b6091ef4d738a51bbe5 Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Wed, 20 Apr 2022 17:29:07 -0400 Subject: [PATCH 21/22] [Controls] Collect Telemetry (#130498) * collect telemetry for controls --- packages/kbn-optimizer/limits.yml | 2 +- .../control_group/control_group_constants.ts | 14 -- .../control_group_persistence.ts} | 64 ++++++-- .../controls/common/control_group/types.ts | 33 ++++ src/plugins/controls/common/index.ts | 39 ++++- .../editor/control_group_editor.tsx | 5 +- .../control_group_container_factory.ts | 2 +- .../control_group_container_factory.ts | 2 + .../control_group_telemetry.test.ts | 142 ++++++++++++++++++ .../control_group/control_group_telemetry.ts | 122 +++++++++++++++ src/plugins/controls/server/index.ts | 2 + .../dashboard_container_persistable_state.ts | 12 +- src/plugins/dashboard/common/index.ts | 8 - .../common/saved_dashboard_references.ts | 9 +- src/plugins/dashboard/common/types.ts | 19 +-- .../dashboard_container_factory.tsx | 5 +- .../lib/dashboard_control_group.ts | 48 +++--- .../application/lib/diff_dashboard_state.ts | 4 +- .../state/dashboard_state_slice.ts | 4 +- .../saved_dashboards/saved_dashboard.ts | 2 +- src/plugins/dashboard/public/types.ts | 11 +- .../saved_objects/dashboard_migrations.ts | 20 +-- .../server/usage/dashboard_telemetry.ts | 23 +++ .../server/usage/register_collector.ts | 49 ++++++ src/plugins/telemetry/schema/oss_plugins.json | 61 ++++++++ 25 files changed, 566 insertions(+), 136 deletions(-) rename src/plugins/{dashboard/common/embeddable/dashboard_control_group.ts => controls/common/control_group/control_group_persistence.ts} (65%) create mode 100644 src/plugins/controls/server/control_group/control_group_telemetry.test.ts create mode 100644 src/plugins/controls/server/control_group/control_group_telemetry.ts diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 16a99469de7c5..2540976c106f5 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -115,7 +115,7 @@ pageLoadAssetSize: reporting: 57003 visTypeHeatmap: 25340 expressionGauge: 25000 - controls: 34788 + controls: 40000 expressionPartitionVis: 26338 sharedUX: 16225 ux: 20784 diff --git a/src/plugins/controls/common/control_group/control_group_constants.ts b/src/plugins/controls/common/control_group/control_group_constants.ts index 467394614e12c..604e411279bad 100644 --- a/src/plugins/controls/common/control_group/control_group_constants.ts +++ b/src/plugins/controls/common/control_group/control_group_constants.ts @@ -6,21 +6,7 @@ * Side Public License, v 1. */ -import { ControlGroupInput } from '..'; import { ControlStyle, ControlWidth } from '../types'; export const DEFAULT_CONTROL_WIDTH: ControlWidth = 'auto'; export const DEFAULT_CONTROL_STYLE: ControlStyle = 'oneLine'; - -export const getDefaultControlGroupInput = (): Omit => ({ - panels: {}, - defaultControlWidth: DEFAULT_CONTROL_WIDTH, - controlStyle: DEFAULT_CONTROL_STYLE, - chainingSystem: 'HIERARCHICAL', - ignoreParentSettings: { - ignoreFilters: false, - ignoreQuery: false, - ignoreTimerange: false, - ignoreValidations: false, - }, -}); diff --git a/src/plugins/dashboard/common/embeddable/dashboard_control_group.ts b/src/plugins/controls/common/control_group/control_group_persistence.ts similarity index 65% rename from src/plugins/dashboard/common/embeddable/dashboard_control_group.ts rename to src/plugins/controls/common/control_group/control_group_persistence.ts index 908f50bbadd72..55a7ad4b5a854 100644 --- a/src/plugins/dashboard/common/embeddable/dashboard_control_group.ts +++ b/src/plugins/controls/common/control_group/control_group_persistence.ts @@ -7,12 +7,53 @@ */ import { SerializableRecord } from '@kbn/utility-types'; -import { ControlGroupInput, getDefaultControlGroupInput } from '@kbn/controls-plugin/common'; -import { RawControlGroupAttributes } from '../types'; +import deepEqual from 'fast-deep-equal'; -export const getDefaultDashboardControlGroupInput = getDefaultControlGroupInput; +import { pick } from 'lodash'; +import { ControlGroupInput } from '..'; +import { DEFAULT_CONTROL_STYLE, DEFAULT_CONTROL_WIDTH } from './control_group_constants'; +import { PersistableControlGroupInput, RawControlGroupAttributes } from './types'; -export const controlGroupInputToRawAttributes = ( +const safeJSONParse = (jsonString?: string): OutType | undefined => { + if (!jsonString && typeof jsonString !== 'string') return; + try { + return JSON.parse(jsonString) as OutType; + } catch { + return; + } +}; + +export const getDefaultControlGroupInput = (): Omit => ({ + panels: {}, + defaultControlWidth: DEFAULT_CONTROL_WIDTH, + controlStyle: DEFAULT_CONTROL_STYLE, + chainingSystem: 'HIERARCHICAL', + ignoreParentSettings: { + ignoreFilters: false, + ignoreQuery: false, + ignoreTimerange: false, + ignoreValidations: false, + }, +}); + +export const persistableControlGroupInputIsEqual = ( + a: PersistableControlGroupInput | undefined, + b: PersistableControlGroupInput | undefined +) => { + const defaultInput = getDefaultControlGroupInput(); + const inputA = { + ...defaultInput, + ...pick(a, ['panels', 'chainingSystem', 'controlStyle', 'ignoreParentSettings']), + }; + const inputB = { + ...defaultInput, + ...pick(b, ['panels', 'chainingSystem', 'controlStyle', 'ignoreParentSettings']), + }; + if (deepEqual(inputA, inputB)) return true; + return false; +}; + +export const controlGroupInputToRawControlGroupAttributes = ( controlGroupInput: Omit ): RawControlGroupAttributes => { return { @@ -23,16 +64,7 @@ export const controlGroupInputToRawAttributes = ( }; }; -const safeJSONParse = (jsonString?: string): OutType | undefined => { - if (!jsonString && typeof jsonString !== 'string') return; - try { - return JSON.parse(jsonString) as OutType; - } catch { - return; - } -}; - -export const rawAttributesToControlGroupInput = ( +export const rawControlGroupAttributesToControlGroupInput = ( rawControlGroupAttributes: RawControlGroupAttributes ): Omit | undefined => { const defaultControlGroupInput = getDefaultControlGroupInput(); @@ -50,7 +82,7 @@ export const rawAttributesToControlGroupInput = ( }; }; -export const rawAttributesToSerializable = ( +export const rawControlGroupAttributesToSerializable = ( rawControlGroupAttributes: Omit ): SerializableRecord => { const defaultControlGroupInput = getDefaultControlGroupInput(); @@ -62,7 +94,7 @@ export const rawAttributesToSerializable = ( }; }; -export const serializableToRawAttributes = ( +export const serializableToRawControlGroupAttributes = ( serializable: SerializableRecord ): Omit => { return { diff --git a/src/plugins/controls/common/control_group/types.ts b/src/plugins/controls/common/control_group/types.ts index 4bc5831649d08..9fbfc54b09a17 100644 --- a/src/plugins/controls/common/control_group/types.ts +++ b/src/plugins/controls/common/control_group/types.ts @@ -29,3 +29,36 @@ export interface ControlGroupInput extends EmbeddableInput, ControlInput { controlStyle: ControlStyle; panels: ControlsPanels; } + +// only parts of the Control Group Input should be persisted +export type PersistableControlGroupInput = Pick< + ControlGroupInput, + 'panels' | 'chainingSystem' | 'controlStyle' | 'ignoreParentSettings' +>; + +// panels are json stringified for storage in a saved object. +export type RawControlGroupAttributes = Omit< + PersistableControlGroupInput, + 'panels' | 'ignoreParentSettings' +> & { + ignoreParentSettingsJSON: string; + panelsJSON: string; +}; +export interface ControlGroupTelemetry { + total: number; + chaining_system: { + [key: string]: number; + }; + label_position: { + [key: string]: number; + }; + ignore_settings: { + [key: string]: number; + }; + by_type: { + [key: string]: { + total: number; + details: { [key: string]: number }; + }; + }; +} diff --git a/src/plugins/controls/common/index.ts b/src/plugins/controls/common/index.ts index ff2c39346f075..2956570f79189 100644 --- a/src/plugins/controls/common/index.ts +++ b/src/plugins/controls/common/index.ts @@ -7,14 +7,37 @@ */ export type { ControlWidth } from './types'; -export type { ControlPanelState, ControlsPanels, ControlGroupInput } from './control_group/types'; -export type { OptionsListEmbeddableInput } from './control_types/options_list/types'; -export type { RangeSliderEmbeddableInput } from './control_types/range_slider/types'; -export { CONTROL_GROUP_TYPE } from './control_group/types'; -export { OPTIONS_LIST_CONTROL } from './control_types/options_list/types'; -export { RANGE_SLIDER_CONTROL } from './control_types/range_slider/types'; - -export { getDefaultControlGroupInput } from './control_group/control_group_constants'; +// Control Group exports +export { + CONTROL_GROUP_TYPE, + type ControlPanelState, + type ControlsPanels, + type ControlGroupInput, + type ControlGroupTelemetry, + type RawControlGroupAttributes, + type PersistableControlGroupInput, +} from './control_group/types'; +export { + controlGroupInputToRawControlGroupAttributes, + rawControlGroupAttributesToControlGroupInput, + rawControlGroupAttributesToSerializable, + serializableToRawControlGroupAttributes, + persistableControlGroupInputIsEqual, + getDefaultControlGroupInput, +} from './control_group/control_group_persistence'; +export { + DEFAULT_CONTROL_WIDTH, + DEFAULT_CONTROL_STYLE, +} from './control_group/control_group_constants'; +// Control Type exports +export { + OPTIONS_LIST_CONTROL, + type OptionsListEmbeddableInput, +} from './control_types/options_list/types'; +export { + type RangeSliderEmbeddableInput, + RANGE_SLIDER_CONTROL, +} from './control_types/range_slider/types'; export { TIME_SLIDER_CONTROL } from './control_types/time_slider/types'; diff --git a/src/plugins/controls/public/control_group/editor/control_group_editor.tsx b/src/plugins/controls/public/control_group/editor/control_group_editor.tsx index 95e2066541b5f..8917769f6b151 100644 --- a/src/plugins/controls/public/control_group/editor/control_group_editor.tsx +++ b/src/plugins/controls/public/control_group/editor/control_group_editor.tsx @@ -44,10 +44,7 @@ import { ControlStyle, ControlWidth } from '../../types'; import { ParentIgnoreSettings } from '../..'; import { ControlsPanels } from '../types'; import { ControlGroupInput } from '..'; -import { - DEFAULT_CONTROL_WIDTH, - getDefaultControlGroupInput, -} from '../../../common/control_group/control_group_constants'; +import { DEFAULT_CONTROL_WIDTH, getDefaultControlGroupInput } from '../../../common'; interface EditControlGroupProps { initialInput: ControlGroupInput; diff --git a/src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts b/src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts index a8e31e6e2dbec..f55c49101dc40 100644 --- a/src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts +++ b/src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts @@ -23,7 +23,7 @@ import { createControlGroupExtract, createControlGroupInject, } from '../../../common/control_group/control_group_persistable_state'; -import { getDefaultControlGroupInput } from '../../../common/control_group/control_group_constants'; +import { getDefaultControlGroupInput } from '../../../common'; export class ControlGroupContainerFactory implements EmbeddableFactoryDefinition { public readonly isContainerType = true; diff --git a/src/plugins/controls/server/control_group/control_group_container_factory.ts b/src/plugins/controls/server/control_group/control_group_container_factory.ts index 806efd652db57..ba50652d3507a 100644 --- a/src/plugins/controls/server/control_group/control_group_container_factory.ts +++ b/src/plugins/controls/server/control_group/control_group_container_factory.ts @@ -14,6 +14,7 @@ import { createControlGroupInject, migrations, } from '../../common/control_group/control_group_persistable_state'; +import { controlGroupTelemetry } from './control_group_telemetry'; export const controlGroupContainerPersistableStateServiceFactory = ( persistableStateService: EmbeddablePersistableStateService @@ -22,6 +23,7 @@ export const controlGroupContainerPersistableStateServiceFactory = ( id: CONTROL_GROUP_TYPE, extract: createControlGroupExtract(persistableStateService), inject: createControlGroupInject(persistableStateService), + telemetry: controlGroupTelemetry, migrations, }; }; diff --git a/src/plugins/controls/server/control_group/control_group_telemetry.test.ts b/src/plugins/controls/server/control_group/control_group_telemetry.test.ts new file mode 100644 index 0000000000000..140b58fd790fc --- /dev/null +++ b/src/plugins/controls/server/control_group/control_group_telemetry.test.ts @@ -0,0 +1,142 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ControlGroupTelemetry, RawControlGroupAttributes } from '../../common'; +import { controlGroupTelemetry, initializeControlGroupTelemetry } from './control_group_telemetry'; + +// controls attributes with all settings ignored + 3 options lists + hierarchical chaining + label above +const rawControlAttributes1: RawControlGroupAttributes = { + controlStyle: 'twoLine', + chainingSystem: 'NONE', + panelsJSON: + '{"6fc71ac6-62f9-4ff4-bf5a-d1e066065376":{"order":0,"width":"auto","type":"optionsListControl","explicitInput":{"title":"Carrier","fieldName":"Carrier","id":"6fc71ac6-62f9-4ff4-bf5a-d1e066065376","enhancements":{}}},"1ca90451-908b-4eae-ac4d-535f2e30c4ad":{"order":2,"width":"auto","type":"optionsListControl","explicitInput":{"title":"DestAirportID","fieldName":"DestAirportID","id":"1ca90451-908b-4eae-ac4d-535f2e30c4ad","enhancements":{}}},"71086bac-316d-415f-8aa8-b9a921bc7f58":{"order":1,"width":"auto","type":"optionsListControl","explicitInput":{"title":"DestRegion","fieldName":"DestRegion","id":"71086bac-316d-415f-8aa8-b9a921bc7f58","enhancements":{}}}}', + ignoreParentSettingsJSON: + '{"ignoreFilters":true,"ignoreQuery":true,"ignoreTimerange":true,"ignoreValidations":true}', +}; + +// controls attributes with some settings ignored + 2 range sliders, 1 time slider + No chaining + label inline +const rawControlAttributes2: RawControlGroupAttributes = { + controlStyle: 'oneLine', + chainingSystem: 'NONE', + panelsJSON: + '{"9cf90205-e94d-43c9-a3aa-45f359a7522f":{"order":0,"width":"auto","type":"rangeSliderControl","explicitInput":{"title":"DistanceKilometers","fieldName":"DistanceKilometers","id":"9cf90205-e94d-43c9-a3aa-45f359a7522f","enhancements":{}}},"b47916fd-fc03-4dcd-bef1-5c3b7a315723":{"order":1,"width":"auto","type":"timeSlider","explicitInput":{"title":"timestamp","fieldName":"timestamp","id":"b47916fd-fc03-4dcd-bef1-5c3b7a315723","enhancements":{}}},"f6b076c6-9ef5-483e-b08d-d313d60d4b8c":{"order":2,"width":"auto","type":"rangeSliderControl","explicitInput":{"title":"DistanceMiles","fieldName":"DistanceMiles","id":"f6b076c6-9ef5-483e-b08d-d313d60d4b8c","enhancements":{}}}}', + ignoreParentSettingsJSON: + '{"ignoreFilters":true,"ignoreQuery":false,"ignoreTimerange":false,"ignoreValidations":false}', +}; + +// controls attributes with no settings ignored + 2 options lists, 1 range slider, 1 time slider + hierarchical chaining + label inline +const rawControlAttributes3: RawControlGroupAttributes = { + controlStyle: 'oneLine', + chainingSystem: 'HIERARCHICAL', + panelsJSON: + '{"9cf90205-e94d-43c9-a3aa-45f359a7522f":{"order":0,"width":"auto","type":"rangeSliderControl","explicitInput":{"title":"DistanceKilometers","fieldName":"DistanceKilometers","id":"9cf90205-e94d-43c9-a3aa-45f359a7522f","enhancements":{}}},"b47916fd-fc03-4dcd-bef1-5c3b7a315723":{"order":1,"width":"auto","type":"timeSlider","explicitInput":{"title":"timestamp","fieldName":"timestamp","id":"b47916fd-fc03-4dcd-bef1-5c3b7a315723","enhancements":{}}},"ee325e9e-6ec1-41f9-953f-423d59850d44":{"order":2,"width":"auto","type":"optionsListControl","explicitInput":{"title":"Carrier","fieldName":"Carrier","id":"ee325e9e-6ec1-41f9-953f-423d59850d44","enhancements":{}}},"cb0f5fcd-9ad9-4d4a-b489-b75bd060399b":{"order":3,"width":"auto","type":"optionsListControl","explicitInput":{"title":"DestCityName","fieldName":"DestCityName","id":"cb0f5fcd-9ad9-4d4a-b489-b75bd060399b","enhancements":{}}}}', + ignoreParentSettingsJSON: + '{"ignoreFilters":false,"ignoreQuery":false,"ignoreTimerange":false,"ignoreValidations":false}', +}; + +describe('Initialize telemetry', () => { + test('initializes telemetry when given blank object', () => { + const initializedTelemetry = initializeControlGroupTelemetry({}); + expect(initializedTelemetry.total).toBe(0); + expect(initializedTelemetry.chaining_system).toEqual({}); + expect(initializedTelemetry.ignore_settings).toEqual({}); + expect(initializedTelemetry.by_type).toEqual({}); + }); + + test('initializes telemetry without overwriting any keys when given a partial telemetry object', () => { + const partialTelemetry: Partial = { + total: 77, + chaining_system: { TESTCHAIN: 10, OTHERCHAIN: 1 }, + by_type: { test1: { total: 10, details: {} } }, + }; + const initializedTelemetry = initializeControlGroupTelemetry(partialTelemetry); + expect(initializedTelemetry.total).toBe(77); + expect(initializedTelemetry.chaining_system).toEqual({ TESTCHAIN: 10, OTHERCHAIN: 1 }); + expect(initializedTelemetry.ignore_settings).toEqual({}); + expect(initializedTelemetry.by_type).toEqual({ test1: { total: 10, details: {} } }); + expect(initializedTelemetry.label_position).toEqual({}); + }); + + test('initiailizes telemetry without overwriting any keys when given a completed telemetry object', () => { + const partialTelemetry: Partial = { + total: 5, + chaining_system: { TESTCHAIN: 10, OTHERCHAIN: 1 }, + by_type: { test1: { total: 10, details: {} } }, + ignore_settings: { ignoreValidations: 12 }, + label_position: { inline: 10, above: 12 }, + }; + const initializedTelemetry = initializeControlGroupTelemetry(partialTelemetry); + expect(initializedTelemetry.total).toBe(5); + expect(initializedTelemetry.chaining_system).toEqual({ TESTCHAIN: 10, OTHERCHAIN: 1 }); + expect(initializedTelemetry.ignore_settings).toEqual({ ignoreValidations: 12 }); + expect(initializedTelemetry.by_type).toEqual({ test1: { total: 10, details: {} } }); + expect(initializedTelemetry.label_position).toEqual({ inline: 10, above: 12 }); + }); +}); + +describe('Control group telemetry function', () => { + let finalTelemetry: ControlGroupTelemetry; + + beforeAll(() => { + const allControlGroups = [rawControlAttributes1, rawControlAttributes2, rawControlAttributes3]; + + finalTelemetry = allControlGroups.reduce( + (telemetrySoFar, rawControlGroupAttributes) => { + return controlGroupTelemetry( + rawControlGroupAttributes, + telemetrySoFar + ) as ControlGroupTelemetry; + }, + {} as ControlGroupTelemetry + ); + }); + + test('counts all telemetry over multiple runs', () => { + expect(finalTelemetry.total).toBe(10); + }); + + test('counts control types over multiple runs.', () => { + expect(finalTelemetry.by_type).toEqual({ + optionsListControl: { + details: {}, + total: 5, + }, + rangeSliderControl: { + details: {}, + total: 3, + }, + timeSlider: { + details: {}, + total: 2, + }, + }); + }); + + test('collects ignore settings over multiple runs.', () => { + expect(finalTelemetry.ignore_settings).toEqual({ + ignoreFilters: 2, + ignoreQuery: 1, + ignoreTimerange: 1, + ignoreValidations: 1, + }); + }); + + test('counts various chaining systems over multiple runs.', () => { + expect(finalTelemetry.chaining_system).toEqual({ + HIERARCHICAL: 1, + NONE: 2, + }); + }); + + test('counts label positions over multiple runs.', () => { + expect(finalTelemetry.label_position).toEqual({ + oneLine: 2, + twoLine: 1, + }); + }); +}); diff --git a/src/plugins/controls/server/control_group/control_group_telemetry.ts b/src/plugins/controls/server/control_group/control_group_telemetry.ts new file mode 100644 index 0000000000000..83e363e081241 --- /dev/null +++ b/src/plugins/controls/server/control_group/control_group_telemetry.ts @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { set } from 'lodash'; +import { PersistableStateService } from '@kbn/kibana-utils-plugin/common'; +import { + ControlGroupTelemetry, + RawControlGroupAttributes, + rawControlGroupAttributesToControlGroupInput, +} from '../../common'; +import { ControlGroupInput } from '../../common/control_group/types'; + +export const initializeControlGroupTelemetry = ( + statsSoFar: Record +): ControlGroupTelemetry => { + return { + total: (statsSoFar?.total as number) ?? 0, + chaining_system: + (statsSoFar?.chaining_system as ControlGroupTelemetry['chaining_system']) ?? {}, + ignore_settings: + (statsSoFar?.ignore_settings as ControlGroupTelemetry['ignore_settings']) ?? {}, + label_position: (statsSoFar?.label_position as ControlGroupTelemetry['label_position']) ?? {}, + by_type: (statsSoFar?.by_type as ControlGroupTelemetry['by_type']) ?? {}, + }; +}; + +const reportChainingSystemInUse = ( + chainingSystemsStats: ControlGroupTelemetry['chaining_system'], + chainingSystem: ControlGroupInput['chainingSystem'] +): ControlGroupTelemetry['chaining_system'] => { + if (!chainingSystem) return chainingSystemsStats; + if (Boolean(chainingSystemsStats[chainingSystem])) { + chainingSystemsStats[chainingSystem]++; + } else { + chainingSystemsStats[chainingSystem] = 1; + } + return chainingSystemsStats; +}; + +const reportLabelPositionsInUse = ( + labelPositionStats: ControlGroupTelemetry['label_position'], + labelPosition: ControlGroupInput['controlStyle'] // controlStyle was renamed labelPosition +): ControlGroupTelemetry['label_position'] => { + if (!labelPosition) return labelPositionStats; + if (Boolean(labelPositionStats[labelPosition])) { + labelPositionStats[labelPosition]++; + } else { + labelPositionStats[labelPosition] = 1; + } + return labelPositionStats; +}; + +const reportIgnoreSettingsInUse = ( + settingsStats: ControlGroupTelemetry['ignore_settings'], + settings: ControlGroupInput['ignoreParentSettings'] +): ControlGroupTelemetry['ignore_settings'] => { + if (!settings) return settingsStats; + for (const [settingKey, settingValue] of Object.entries(settings)) { + if (settingValue) { + // only report ignore settings which are turned ON + const currentValueForSetting = settingsStats[settingKey] ?? 0; + set(settingsStats, settingKey, currentValueForSetting + 1); + } + } + return settingsStats; +}; + +const reportControlTypes = ( + controlTypeStats: ControlGroupTelemetry['by_type'], + panels: ControlGroupInput['panels'] +): ControlGroupTelemetry['by_type'] => { + for (const { type } of Object.values(panels)) { + const currentTypeCount = controlTypeStats[type]?.total ?? 0; + const currentTypeDetails = controlTypeStats[type]?.details ?? {}; + + // here if we need to start tracking details on specific control types, we can call embeddableService.telemetry + + set(controlTypeStats, `${type}.total`, currentTypeCount + 1); + set(controlTypeStats, `${type}.details`, currentTypeDetails); + } + return controlTypeStats; +}; + +export const controlGroupTelemetry: PersistableStateService['telemetry'] = ( + state, + stats +): ControlGroupTelemetry => { + const controlGroupStats = initializeControlGroupTelemetry(stats); + const controlGroupInput = rawControlGroupAttributesToControlGroupInput( + state as unknown as RawControlGroupAttributes + ); + if (!controlGroupInput) return controlGroupStats; + + controlGroupStats.total += Object.keys(controlGroupInput?.panels ?? {}).length; + + controlGroupStats.chaining_system = reportChainingSystemInUse( + controlGroupStats.chaining_system, + controlGroupInput.chainingSystem + ); + + controlGroupStats.label_position = reportLabelPositionsInUse( + controlGroupStats.label_position, + controlGroupInput.controlStyle + ); + + controlGroupStats.ignore_settings = reportIgnoreSettingsInUse( + controlGroupStats.ignore_settings, + controlGroupInput.ignoreParentSettings + ); + + controlGroupStats.by_type = reportControlTypes( + controlGroupStats.by_type, + controlGroupInput.panels + ); + + return controlGroupStats; +}; diff --git a/src/plugins/controls/server/index.ts b/src/plugins/controls/server/index.ts index 5928186715210..cec761ae80e20 100644 --- a/src/plugins/controls/server/index.ts +++ b/src/plugins/controls/server/index.ts @@ -9,3 +9,5 @@ import { ControlsPlugin } from './plugin'; export const plugin = () => new ControlsPlugin(); + +export { initializeControlGroupTelemetry } from './control_group/control_group_telemetry'; diff --git a/src/plugins/dashboard/common/embeddable/dashboard_container_persistable_state.ts b/src/plugins/dashboard/common/embeddable/dashboard_container_persistable_state.ts index cffe5c9b47042..5346932f7034c 100644 --- a/src/plugins/dashboard/common/embeddable/dashboard_container_persistable_state.ts +++ b/src/plugins/dashboard/common/embeddable/dashboard_container_persistable_state.ts @@ -12,12 +12,8 @@ import { EmbeddableStateWithType, } from '@kbn/embeddable-plugin/common'; import { SavedObjectReference } from '@kbn/core/types'; -import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; -import { - DashboardContainerControlGroupInput, - DashboardContainerStateWithType, - DashboardPanelState, -} from '../types'; +import { CONTROL_GROUP_TYPE, PersistableControlGroupInput } from '@kbn/controls-plugin/common'; +import { DashboardContainerStateWithType, DashboardPanelState } from '../types'; const getPanelStatePrefix = (state: DashboardPanelState) => `${state.explicitInput.id}:`; @@ -95,7 +91,7 @@ export const createInject = ( controlGroupReferences ); workingState.controlGroupInput = - injectedControlGroupState as unknown as DashboardContainerControlGroupInput; + injectedControlGroupState as unknown as PersistableControlGroupInput; } return workingState as EmbeddableStateWithType; @@ -160,7 +156,7 @@ export const createExtract = ( id: controlGroupId, }); workingState.controlGroupInput = - extractedControlGroupState as unknown as DashboardContainerControlGroupInput; + extractedControlGroupState as unknown as PersistableControlGroupInput; const prefixedControlGroupReferences = controlGroupReferences.map((reference) => ({ ...reference, name: `${controlGroupReferencePrefix}${reference.name}`, diff --git a/src/plugins/dashboard/common/index.ts b/src/plugins/dashboard/common/index.ts index e99fe82ffabda..73e01693977d9 100644 --- a/src/plugins/dashboard/common/index.ts +++ b/src/plugins/dashboard/common/index.ts @@ -28,11 +28,3 @@ export { migratePanelsTo730 } from './migrate_to_730_panels'; export const UI_SETTINGS = { ENABLE_LABS_UI: 'labs:dashboard:enable_ui', }; - -export { - controlGroupInputToRawAttributes, - getDefaultDashboardControlGroupInput, - rawAttributesToControlGroupInput, - rawAttributesToSerializable, - serializableToRawAttributes, -} from './embeddable/dashboard_control_group'; diff --git a/src/plugins/dashboard/common/saved_dashboard_references.ts b/src/plugins/dashboard/common/saved_dashboard_references.ts index 79339257d7c01..e3a3193dd85a1 100644 --- a/src/plugins/dashboard/common/saved_dashboard_references.ts +++ b/src/plugins/dashboard/common/saved_dashboard_references.ts @@ -9,11 +9,10 @@ import semverGt from 'semver/functions/gt'; import { SavedObjectAttributes, SavedObjectReference } from '@kbn/core/types'; import { EmbeddablePersistableStateService } from '@kbn/embeddable-plugin/common/types'; import { - DashboardContainerControlGroupInput, - DashboardContainerStateWithType, - DashboardPanelState, + PersistableControlGroupInput, RawControlGroupAttributes, -} from './types'; +} from '@kbn/controls-plugin/common'; +import { DashboardContainerStateWithType, DashboardPanelState } from './types'; import { convertPanelStateToSavedDashboardPanel, convertSavedDashboardPanelToPanelState, @@ -41,7 +40,7 @@ function dashboardAttributesToState(attributes: SavedObjectAttributes): { inputPanels = JSON.parse(attributes.panelsJSON) as SavedDashboardPanel[]; } - let controlGroupInput: DashboardContainerControlGroupInput | undefined; + let controlGroupInput: PersistableControlGroupInput | undefined; if (attributes.controlGroupInput) { const rawControlGroupInput = attributes.controlGroupInput as unknown as RawControlGroupAttributes; diff --git a/src/plugins/dashboard/common/types.ts b/src/plugins/dashboard/common/types.ts index 719df2fbe0be0..941f9437e54e6 100644 --- a/src/plugins/dashboard/common/types.ts +++ b/src/plugins/dashboard/common/types.ts @@ -12,7 +12,7 @@ import { PanelState, } from '@kbn/embeddable-plugin/common/types'; import { SavedObjectEmbeddableInput } from '@kbn/embeddable-plugin/common/lib/saved_object_embeddable'; -import { ControlGroupInput } from '@kbn/controls-plugin/common'; +import { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { RawSavedDashboardPanelTo60, RawSavedDashboardPanel610, @@ -23,6 +23,7 @@ import { } from './bwc/types'; import { GridData } from './embeddable/types'; + export type PanelId = string; export type SavedObjectId = string; @@ -98,23 +99,9 @@ export type SavedDashboardPanel730ToLatest = Pick< // Making this interface because so much of the Container type from embeddable is tied up in public // Once that is all available from common, we should be able to move the dashboard_container type to our common as well -// dashboard only persists part of the Control Group Input -export type DashboardContainerControlGroupInput = Pick< - ControlGroupInput, - 'panels' | 'chainingSystem' | 'controlStyle' | 'ignoreParentSettings' ->; - -export type RawControlGroupAttributes = Omit< - DashboardContainerControlGroupInput, - 'panels' | 'ignoreParentSettings' -> & { - ignoreParentSettingsJSON: string; - panelsJSON: string; -}; - export interface DashboardContainerStateWithType extends EmbeddableStateWithType { panels: { [panelId: string]: DashboardPanelState; }; - controlGroupInput?: DashboardContainerControlGroupInput; + controlGroupInput?: PersistableControlGroupInput; } diff --git a/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx b/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx index 7009ea72f06a4..1077cf71454f9 100644 --- a/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx +++ b/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx @@ -16,6 +16,7 @@ import { ControlGroupOutput, CONTROL_GROUP_TYPE, } from '@kbn/controls-plugin/public'; +import { getDefaultControlGroupInput } from '@kbn/controls-plugin/common'; import { DashboardContainerInput } from '../..'; import { DASHBOARD_CONTAINER_TYPE } from './dashboard_constants'; import type { DashboardContainer, DashboardContainerServices } from './dashboard_container'; @@ -31,8 +32,6 @@ import { createInject, } from '../../../common/embeddable/dashboard_container_persistable_state'; -import { getDefaultDashboardControlGroupInput } from '../../../common/embeddable/dashboard_control_group'; - export type DashboardContainerFactory = EmbeddableFactory< DashboardContainerInput, ContainerOutput, @@ -90,7 +89,7 @@ export class DashboardContainerFactoryDefinition const { filters, query, timeRange, viewMode, controlGroupInput, id } = initialInput; const controlGroup = await controlsGroupFactory?.create({ id: `control_group_${id ?? 'new_dashboard'}`, - ...getDefaultDashboardControlGroupInput(), + ...getDefaultControlGroupInput(), ...pickBy(controlGroupInput, identity), // undefined keys in initialInput should not overwrite defaults timeRange, viewMode, diff --git a/src/plugins/dashboard/public/application/lib/dashboard_control_group.ts b/src/plugins/dashboard/public/application/lib/dashboard_control_group.ts index 38b1b8eeb9fa1..83497babc2654 100644 --- a/src/plugins/dashboard/public/application/lib/dashboard_control_group.ts +++ b/src/plugins/dashboard/public/application/lib/dashboard_control_group.ts @@ -11,16 +11,19 @@ import deepEqual from 'fast-deep-equal'; import { compareFilters, COMPARE_ALL_OPTIONS, type Filter } from '@kbn/es-query'; import { debounceTime, distinctUntilChanged, distinctUntilKeyChanged } from 'rxjs/operators'; -import { pick } from 'lodash'; -import { ControlGroupContainer, ControlGroupInput } from '@kbn/controls-plugin/public'; -import { DashboardContainer, DashboardContainerControlGroupInput } from '..'; +import { + ControlGroupInput, + controlGroupInputToRawControlGroupAttributes, + getDefaultControlGroupInput, + persistableControlGroupInputIsEqual, + rawControlGroupAttributesToControlGroupInput, +} from '@kbn/controls-plugin/common'; +import { ControlGroupContainer } from '@kbn/controls-plugin/public'; + +import { DashboardContainer } from '..'; import { DashboardState } from '../../types'; import { DashboardContainerInput, DashboardSavedObject } from '../..'; -import { - controlGroupInputToRawAttributes, - getDefaultDashboardControlGroupInput, - rawAttributesToControlGroupInput, -} from '../../../common'; + interface DiffChecks { [key: string]: (a?: unknown, b?: unknown) => boolean; } @@ -45,7 +48,7 @@ export const syncDashboardControlGroup = async ({ const subscriptions = new Subscription(); const isControlGroupInputEqual = () => - controlGroupInputIsEqual( + persistableControlGroupInputIsEqual( controlGroup.getInput(), dashboardContainer.getInput().controlGroupInput ); @@ -122,7 +125,7 @@ export const syncDashboardControlGroup = async ({ .subscribe(() => { if (!isControlGroupInputEqual()) { if (!dashboardContainer.getInput().controlGroupInput) { - controlGroup.updateInput(getDefaultDashboardControlGroupInput()); + controlGroup.updateInput(getDefaultControlGroupInput()); return; } controlGroup.updateInput({ ...dashboardContainer.getInput().controlGroupInput }); @@ -152,39 +155,22 @@ export const syncDashboardControlGroup = async ({ }; }; -export const controlGroupInputIsEqual = ( - a: DashboardContainerControlGroupInput | undefined, - b: DashboardContainerControlGroupInput | undefined -) => { - const defaultInput = getDefaultDashboardControlGroupInput(); - const inputA = { - ...defaultInput, - ...pick(a, ['panels', 'chainingSystem', 'controlStyle', 'ignoreParentSettings']), - }; - const inputB = { - ...defaultInput, - ...pick(b, ['panels', 'chainingSystem', 'controlStyle', 'ignoreParentSettings']), - }; - if (deepEqual(inputA, inputB)) return true; - return false; -}; - export const serializeControlGroupToDashboardSavedObject = ( dashboardSavedObject: DashboardSavedObject, dashboardState: DashboardState ) => { // only save to saved object if control group is not default if ( - controlGroupInputIsEqual( + persistableControlGroupInputIsEqual( dashboardState.controlGroupInput, - getDefaultDashboardControlGroupInput() + getDefaultControlGroupInput() ) ) { dashboardSavedObject.controlGroupInput = undefined; return; } if (dashboardState.controlGroupInput) { - dashboardSavedObject.controlGroupInput = controlGroupInputToRawAttributes( + dashboardSavedObject.controlGroupInput = controlGroupInputToRawControlGroupAttributes( dashboardState.controlGroupInput ); } @@ -194,7 +180,7 @@ export const deserializeControlGroupFromDashboardSavedObject = ( dashboardSavedObject: DashboardSavedObject ): Omit | undefined => { if (!dashboardSavedObject.controlGroupInput) return; - return rawAttributesToControlGroupInput(dashboardSavedObject.controlGroupInput); + return rawControlGroupAttributesToControlGroupInput(dashboardSavedObject.controlGroupInput); }; export const combineDashboardFiltersWithControlGroupFilters = ( diff --git a/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts b/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts index 85a8bf54c9266..ec42e18bad858 100644 --- a/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts +++ b/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts @@ -10,8 +10,8 @@ import { xor, omit, isEmpty } from 'lodash'; import fastIsEqual from 'fast-deep-equal'; import { compareFilters, COMPARE_ALL_OPTIONS, type Filter, isFilterPinned } from '@kbn/es-query'; +import { persistableControlGroupInputIsEqual } from '@kbn/controls-plugin/common'; import { DashboardContainerInput } from '../..'; -import { controlGroupInputIsEqual } from './dashboard_control_group'; import { DashboardOptions, DashboardPanelMap, DashboardState } from '../../types'; import { IEmbeddable } from '../../services/embeddable'; @@ -84,7 +84,7 @@ export const diffDashboardState = async ({ ); const optionsAreEqual = getOptionsAreEqual(originalState.options, newState.options); const filtersAreEqual = getFiltersAreEqual(originalState.filters, newState.filters, true); - const controlGroupIsEqual = controlGroupInputIsEqual( + const controlGroupIsEqual = persistableControlGroupInputIsEqual( originalState.controlGroupInput, newState.controlGroupInput ); diff --git a/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts b/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts index ee403939a9e8c..35f9789023ec5 100644 --- a/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts +++ b/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts @@ -7,11 +7,11 @@ */ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { Filter, Query, TimeRange } from '../../services/data'; import { ViewMode } from '../../services/embeddable'; import { DashboardOptions, DashboardPanelMap, DashboardState } from '../../types'; -import { DashboardContainerControlGroupInput } from '../embeddable'; export const dashboardStateSlice = createSlice({ name: 'dashboardState', @@ -44,7 +44,7 @@ export const dashboardStateSlice = createSlice({ }, setControlGroupState: ( state, - action: PayloadAction + action: PayloadAction ) => { state.controlGroupInput = action.payload; }, diff --git a/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts b/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts index 23aa9c493e5f4..cf79354719dbc 100644 --- a/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts +++ b/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts @@ -10,6 +10,7 @@ import { assign, cloneDeep } from 'lodash'; import { SavedObjectsClientContract } from '@kbn/core/public'; import type { ResolvedSimpleSavedObject } from '@kbn/core/public'; import { SavedObjectAttributes, SavedObjectReference } from '@kbn/core/types'; +import { RawControlGroupAttributes } from '@kbn/controls-plugin/common'; import { EmbeddableStart } from '../services/embeddable'; import { SavedObject, SavedObjectsStart } from '../services/saved_objects'; import { Filter, ISearchSource, Query, RefreshInterval } from '../services/data'; @@ -18,7 +19,6 @@ import { createDashboardEditUrl } from '../dashboard_constants'; import { extractReferences, injectReferences } from '../../common/saved_dashboard_references'; import { DashboardOptions } from '../types'; -import { RawControlGroupAttributes } from '../application'; export interface DashboardSavedObject extends SavedObject { id?: string; diff --git a/src/plugins/dashboard/public/types.ts b/src/plugins/dashboard/public/types.ts index 249f134239663..e250e44d5abce 100644 --- a/src/plugins/dashboard/public/types.ts +++ b/src/plugins/dashboard/public/types.ts @@ -23,6 +23,7 @@ import { BehaviorSubject, Subject } from 'rxjs'; import { UrlForwardingStart } from '@kbn/url-forwarding-plugin/public'; import { VisualizationsStart } from '@kbn/visualizations-plugin/public'; +import { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { DataView } from './services/data_views'; import { SharePluginStart } from './services/share'; import { EmbeddableStart } from './services/embeddable'; @@ -30,11 +31,7 @@ import { DashboardSessionStorage } from './application/lib'; import { UsageCollectionSetup } from './services/usage_collection'; import { NavigationPublicPluginStart } from './services/navigation'; import { Query, RefreshInterval, TimeRange } from './services/data'; -import { - DashboardContainerControlGroupInput, - DashboardPanelState, - SavedDashboardPanel, -} from '../common/types'; +import { DashboardPanelState, SavedDashboardPanel } from '../common/types'; import { SavedObjectsTaggingApi } from './services/saved_objects_tagging_oss'; import { DataPublicPluginStart, DataViewsContract } from './services/data'; import { ContainerInput, EmbeddableInput, ViewMode } from './services/embeddable'; @@ -74,7 +71,7 @@ export interface DashboardState { panels: DashboardPanelMap; timeRange?: TimeRange; - controlGroupInput?: DashboardContainerControlGroupInput; + controlGroupInput?: PersistableControlGroupInput; } /** @@ -84,7 +81,7 @@ export type RawDashboardState = Omit & { panels: Saved export interface DashboardContainerInput extends ContainerInput { dashboardCapabilities?: DashboardAppCapabilities; - controlGroupInput?: DashboardContainerControlGroupInput; + controlGroupInput?: PersistableControlGroupInput; refreshConfig?: RefreshInterval; isEmbeddedExternally?: boolean; isFullScreenMode: boolean; diff --git a/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts index 603fa4af71db4..b3625bec3e8a9 100644 --- a/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts +++ b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts @@ -22,16 +22,15 @@ import { MigrateFunction, MigrateFunctionsObject, } from '@kbn/kibana-utils-plugin/common'; -import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; +import { + CONTROL_GROUP_TYPE, + rawControlGroupAttributesToSerializable, + serializableToRawControlGroupAttributes, +} from '@kbn/controls-plugin/common'; import { migrations730 } from './migrations_730'; import { SavedDashboardPanel } from '../../common/types'; import { migrateMatchAllQuery } from './migrate_match_all_query'; -import { - serializableToRawAttributes, - DashboardDoc700To720, - DashboardDoc730ToLatest, - rawAttributesToSerializable, -} from '../../common'; +import { DashboardDoc700To720, DashboardDoc730ToLatest } from '../../common'; import { injectReferences, extractReferences } from '../../common/saved_dashboard_references'; import { convertPanelStateToSavedDashboardPanel, @@ -221,12 +220,15 @@ const migrateByValuePanels = const { attributes } = doc; if (attributes?.controlGroupInput) { - const controlGroupInput = rawAttributesToSerializable(attributes.controlGroupInput); + const controlGroupInput = rawControlGroupAttributesToSerializable( + attributes.controlGroupInput + ); const migratedControlGroupInput = migrate({ ...controlGroupInput, type: CONTROL_GROUP_TYPE, }); - attributes.controlGroupInput = serializableToRawAttributes(migratedControlGroupInput); + attributes.controlGroupInput = + serializableToRawControlGroupAttributes(migratedControlGroupInput); } // Skip if panelsJSON is missing otherwise this will cause saved object import to fail when diff --git a/src/plugins/dashboard/server/usage/dashboard_telemetry.ts b/src/plugins/dashboard/server/usage/dashboard_telemetry.ts index 9f0c5e19fcd0e..dcb2ad9ba37eb 100644 --- a/src/plugins/dashboard/server/usage/dashboard_telemetry.ts +++ b/src/plugins/dashboard/server/usage/dashboard_telemetry.ts @@ -6,8 +6,16 @@ * Side Public License, v 1. */ +import { isEmpty } from 'lodash'; import { ISavedObjectsRepository, SavedObjectAttributes } from '@kbn/core/server'; import { EmbeddablePersistableStateService } from '@kbn/embeddable-plugin/common'; +import { + type ControlGroupTelemetry, + CONTROL_GROUP_TYPE, + RawControlGroupAttributes, +} from '@kbn/controls-plugin/common'; +import { initializeControlGroupTelemetry } from '@kbn/controls-plugin/server'; + import { SavedDashboardPanel730ToLatest } from '../../common'; import { injectReferences } from '../../common/saved_dashboard_references'; export interface DashboardCollectorData { @@ -26,6 +34,7 @@ export interface DashboardCollectorData { }; }; }; + controls: ControlGroupTelemetry; } export const getEmptyDashboardData = (): DashboardCollectorData => ({ @@ -35,6 +44,7 @@ export const getEmptyDashboardData = (): DashboardCollectorData => ({ by_value: 0, by_type: {}, }, + controls: initializeControlGroupTelemetry({}), }); export const getEmptyPanelTypeData = () => ({ @@ -92,6 +102,19 @@ export async function collectDashboardTelemetry( embeddablePersistableStateService: embeddableService, }); + const controlGroupAttributes: RawControlGroupAttributes | undefined = + attributes.controlGroupInput as unknown as RawControlGroupAttributes; + if (!isEmpty(controlGroupAttributes)) { + collectorData.controls = embeddableService.telemetry( + { + ...controlGroupAttributes, + type: CONTROL_GROUP_TYPE, + id: `DASHBOARD_${CONTROL_GROUP_TYPE}`, + }, + collectorData.controls + ) as ControlGroupTelemetry; + } + const panels = JSON.parse( attributes.panelsJSON as string ) as unknown as SavedDashboardPanel730ToLatest[]; diff --git a/src/plugins/dashboard/server/usage/register_collector.ts b/src/plugins/dashboard/server/usage/register_collector.ts index 7c77dd1473d85..9a7bcd31f8a84 100644 --- a/src/plugins/dashboard/server/usage/register_collector.ts +++ b/src/plugins/dashboard/server/usage/register_collector.ts @@ -60,6 +60,55 @@ export function registerDashboardUsageCollector( }, }, }, + controls: { + total: { type: 'long' }, + by_type: { + DYNAMIC_KEY: { + total: { + type: 'long', + _meta: { + description: 'The number of this type of control in all Control Groups', + }, + }, + details: { + DYNAMIC_KEY: { + type: 'long', + _meta: { + description: + 'Collection of telemetry metrics that embeddable service reports. Will be used for details which are specific to the current control type', + }, + }, + }, + }, + }, + ignore_settings: { + DYNAMIC_KEY: { + type: 'long', + _meta: { + description: + 'Collection of telemetry metrics that count the number of control groups which have this ignore setting turned on', + }, + }, + }, + chaining_system: { + DYNAMIC_KEY: { + type: 'long', + _meta: { + description: + 'Collection of telemetry metrics that count the number of control groups which are using this chaining system', + }, + }, + }, + label_position: { + DYNAMIC_KEY: { + type: 'long', + _meta: { + description: + 'Collection of telemetry metrics that count the number of control groups which have their labels in this position', + }, + }, + }, + }, }, }); diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 7e8e570993102..ca9a57bb4462a 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -50,6 +50,67 @@ } } } + }, + "controls": { + "properties": { + "total": { + "type": "long" + }, + "by_type": { + "properties": { + "DYNAMIC_KEY": { + "properties": { + "total": { + "type": "long", + "_meta": { + "description": "The number of this type of control in all Control Groups" + } + }, + "details": { + "properties": { + "DYNAMIC_KEY": { + "type": "long", + "_meta": { + "description": "Collection of telemetry metrics that embeddable service reports. Will be used for details which are specific to the current control type" + } + } + } + } + } + } + } + }, + "ignore_settings": { + "properties": { + "DYNAMIC_KEY": { + "type": "long", + "_meta": { + "description": "Collection of telemetry metrics that count the number of control groups which have this ignore setting turned on" + } + } + } + }, + "chaining_system": { + "properties": { + "DYNAMIC_KEY": { + "type": "long", + "_meta": { + "description": "Collection of telemetry metrics that count the number of control groups which are using this chaining system" + } + } + } + }, + "label_position": { + "properties": { + "DYNAMIC_KEY": { + "type": "long", + "_meta": { + "description": "Collection of telemetry metrics that count the number of control groups which have their labels in this position" + } + } + } + } + } } } }, From 1303044ae7d3452116ee1f8c4826b48b3dddfb45 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Wed, 20 Apr 2022 18:07:16 -0500 Subject: [PATCH 22/22] [RAM] Add docs for Snooze UX (#130297) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../alerting/create-and-manage-rules.asciidoc | 14 +++++++++----- .../user/alerting/images/bulk-mute-disable.png | Bin 183262 -> 0 bytes .../images/individual-snooze-disable.png | Bin 0 -> 263261 bytes docs/user/alerting/images/snooze-panel.png | Bin 0 -> 101143 bytes 4 files changed, 9 insertions(+), 5 deletions(-) delete mode 100644 docs/user/alerting/images/bulk-mute-disable.png create mode 100644 docs/user/alerting/images/individual-snooze-disable.png create mode 100644 docs/user/alerting/images/snooze-panel.png diff --git a/docs/user/alerting/create-and-manage-rules.asciidoc b/docs/user/alerting/create-and-manage-rules.asciidoc index 23e79911fd5ee..ba1629abd9c86 100644 --- a/docs/user/alerting/create-and-manage-rules.asciidoc +++ b/docs/user/alerting/create-and-manage-rules.asciidoc @@ -140,17 +140,21 @@ Actions are not required on rules. You can run a rule without actions to underst [float] [[controlling-rules]] -=== Mute and disable rules +=== Snooze and disable rules -The rule listing allows you to quickly mute/unmute, disable/enable, and delete individual rules by clicking menu button to open the actions menu. Muting means that the rule checks continue to run on a schedule, but that alert will not trigger any action. +The rule listing enables you to quickly snooze, disable or enable, and delete individual rules using the colored dropdown. [role="screenshot"] -image:images/individual-mute-disable.png[The actions button allows an individual rule to be muted, disabled, or deleted] +image:images/individual-snooze-disable.png[The rule status dropdown enables you to snooze or disable an individual rule] -You can perform these operations in bulk by multi-selecting rules, and then clicking the *Manage rules* button: +When you snooze a rule, the rule checks continue to run on a schedule but the alert will not trigger any actions. You can snooze for a specified period of time or indefinitely. [role="screenshot"] -image:images/bulk-mute-disable.png[The Manage rules button lets you mute/unmute, enable/disable, and delete in bulk,width=75%] +image:images/snooze-panel.png[The snooze panel allows you to set the length of a rule's snooze period] + +When a rule is in a `snoozed` state, you can cancel or change the duration of this state. You can perform these operations in bulk by multi-selecting rules, and then clicking the *Manage rules* button. + +TIP: In this context, "Mute" refers to an indefinite snooze. preview:[] [float] === Rule status diff --git a/docs/user/alerting/images/bulk-mute-disable.png b/docs/user/alerting/images/bulk-mute-disable.png deleted file mode 100644 index b2f9c230ffeb22df0aca1a64fd5f7a24c2d7eefc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183262 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 diff --git a/docs/user/alerting/images/individual-snooze-disable.png b/docs/user/alerting/images/individual-snooze-disable.png new file mode 100644 index 0000000000000000000000000000000000000000..354d996ee74a137930ffdc31dca8590627154881 GIT binary patch literal 263261 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 aSfwzhH4etOzVE{4}1su^CkxB^$i>hug?~ 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

r<4M*sh*D1pN z=3tM7X0MGS-d{&|t;+2cu$=WY?|o?8?>-R0*x<$?_Qi5>MCjO3lF0M9Rv0O={q&X3 zI_Trj^DRB=0b67mO?P9ti0Q2Ye$!@ygT*m!!Z)3&{HyC21O4i(%Ey$=6Fs$}o`QcX zf>T9K-5A=X)7C0wZaf`QJ+1DYPb;(;*2p)e3BDHpHTvgkpe-AY!*0JKx37!JVrKby zJ*|;OqWjm+wbAcvm3FsndCk=e+4wa+k;>V4(vrI6^wXi*PQI~I?dr~k3*y)}`kxV6UJB)Ui6-dEd38I7@RBhX{ z_Wr)∓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 S&lD{JK6bnI@65L$UivS?7f(z8 literal 0 HcmV?d00001 diff --git a/docs/user/alerting/images/snooze-panel.png b/docs/user/alerting/images/snooze-panel.png new file mode 100644 index 0000000000000000000000000000000000000000..b09a509c57ca9e4c39d2a13a1b754013da96528b GIT binary patch literal 101143 zcmeFZg1M!yDGg(z zhcMzD_x;@U{_f`w_<2Vyggnxx!U94JdJ&CL}aYjcPGy*B`In2N&4*| z$|6d6HDdnoL$(=WRhExE85H{4_RqQ+X_;byNWiuI)9>J)mnj5FYfpdQN<#-!s1ipVN# z^RC7B;5d>+KT6_S*=IHEk!|~6U4UmK?@Es3py&?3d5Dl2&gs~5Al>t6kx($sgoc;B zinB`zMonJUi(Hyr-(QWAb^ZC_dU0}W+}U$dk5$b#hSt123rm$VkCdudFIblN5M(%N zxBA)j-l5A#w7lFv*3qPy2|>-rn+4j2uFtYc>eBXU_L~ z=qSM7_frZC#Mt9sZO=TWFPDCHt3$LW7SBsDCWV==KkYTwr)~8cc2Orb*{|5NDz7th zQ*o;BBBDeOKI89oo7W8B3Gvw{sj$#9KFqjbML}0G$OsgmD7{x6Ap7*X!tM7iUUB#2 zEbSAq^Jb?CQjd|bS5p1d7~sr0pQ9EkZKg|;U-^boaClYuE8lWgdIU`;;m2^?6;Hc} zSeCmnbFB#QPr+4$Ve5?zKxus18Q6J2H#r zy|U~^@<$0r)tl_EZ?nh#R3w_GA@4cgqX{5=-OcE*)E*TWT+b!V(Ll*`tC~`hxS1&rx_ z4*T7O37y$wi$3nza0ZR0ORwVBg|DF$@deXxs0yviv<_re;i25ALzq#BY@5oZV=R9U znGOF8&$hH5RRz(_ZG!3WMw?!$07rir+8K+e#oI(neNoZ{VZZ2u>*Cb<&0WmF=5l=N z*RSbarzT32c_wVY+kfkhu<s&=*Rr?Jaf~c$)9mIa4*yyzofn(7!0Sbi9Y#^ z@9~2?@-a;eo)-&kQPkdpAlCVH-3PQ9L_YE)-1q~X&NXDNcxGK%HADdq})gGM=*Be%-?o`&2R|c7?@8@vVl+ z8ms;H>voKF*UFXA?9s`3-vf&nTN0!dTa(1Ub5SXjmkBt>%@wfgaP~hb9J2#3WJPH` zi61-JxZQwP^~Ar>cZ27UEr<~*Z&d)H>6{b_8N~DXmO(=w-z{9@su4HTqgLx(dA;H* z-A|wPIA8098I_!v2`@s_O@GgOd65UZs=qXXh1$vBvCyAGzYNY;7o);BMu|BIxFVS& z6lgTRvubd@qv$7rkwg)kbPhs5V`Z zjW#*wDQ?lD+v)mGd0DGCkes%$QAu~;x zP2yb@(Cod*CoAPE#Vc+r%KIGNTrG(Onze-lIw?FY?>FnQnN*ro2kIQ8ylB2-GGG{A^>r$%+@Rdo z7*S#f60?A5N@;=RfwgD>);6xhIllzFG+B5?cVDWcG03NTEkz{zw0< z+rCJEL~Bc{eJcVT8t?e1dUJ z?u~dQU?$?ZzlIK_N~&V26Q`M`sb-MokOsR3M~RE3cD7&kX7;u0)vPLEDfel6Epc*@ zyO|(ix#t&=AA7BZ_Gzi#yiiVj6{}SAYThPZDO)MOIM+UI)qDVwc3j16s8QisVPL3f zC^Nk_U07La1~rD)vcev?y%ckCHFaHt&CQm~3e;3Jhqya9_SW(>Rn&qVwCl<1^6jkb z!-gU@IsxB(W`20i-ts;4rjj(2wDf+G+m@@SMV~VlP5Bx_c9$GP7dnx-HRvtiUF{XR zQLuA+Sr}TpxH?6QxJApJmgq>kH#IdN3ir)MSco$=b2qoRC%AjeGcE+8-lL$>j!Zw9 z>ZR$VErF7O*QLdS7WWH)3Hzo$rdE!=!g|fNED#H;w#d}Y`o(oly>!|U^Fir#^LlKOR?>wIW z@acm}mtoi04`kPfF?Fx!$ph>j-Wn3pTB4;~{ant<`aU9}k~~2chlMn~G)@}J+yMQ_ zviF6kuX8+ay8u>OXa+WR0~RHNNE!} zagPg$lP=~lc=Yl~z*vbO>EsOqw9W~_)i9ThP-H2}ajlM_-!skXi(o*K45&bUsx3pxw> z3&>OTxR`SaWR#?feLpQvD(U4@N8h~^Ce8nrJuR|ebDFbB?oji>H8XZ_Fl$z1z>FoyT}@*IsrX&Z zR%#uQ1)$=y@f-Hl_N(^!cMtAZ{hCFt$K_+v?F607wjh9I;U(d{I{JaAv>o%0kb;1( z%kK*fr>kr#c`c5hTO<`D>A*A(Qw0-ttBGf~^u}tYgOGKN`A`z51?Xn^Jb2OWyx?d@ zd{^9jmZq)NFLkq|PBULDUJO2WySBKxzv)vjpO?$nbSX@?x$*4FS#c0}4_$|}@{92Y zY-`NVnj`frAOm*Lak>U&%ZWzdHfjL)E-Tf>&o9>*RoY707Zn^C1SifyhZyHl6Lw;D> zrQ%-fVrok2LaDcwjC!C3=d0 zTtr@kk{ItKqcYN9^oW zZ0%guQ4`((_NLm{lYgRM+ol!k4eR6mj(4g2?tIf<;v#@3j##=Y@i+{3>3-5;IiH#n z*8YgIH&%V2sfojjO%vk~;L_n-!=`Ytmn<&*pJ`=WZXEpIp5x)*L_6US{HKf-_I~wA z!d_Q(e!t_Vyv8BI{<@950zTmVQTm$e2mC+M_;J`goX2_!s;bz#o~^gNy}OU22jJLP z*aiE5#Pg|%4-U>9j;jk-RrlU5wtc9RzA?a9Q$y0$!%g71orjIRK!BU)RXaG+0g~9H zn?2w;OMsiJyN_gm4BKxdB(dqM$AWAuzZC(v$gmk}>aZwyc-ymx2|N&Zz$Sa0g@r}h z+wO&=uA=gPs$+l2usH$%o|1xs{{H>~{tpE_yd4CEBqSsR9|#Ky3-e=3@cRV11D*%) zyZf;J-pC*ADBAnjdOLXnoIKoFuG)QWC^3v>yJNv?DAqA??| z&%kVR?{ul1;d^J_672@Iw^9D79BqT`s<-UpbSUI;a0&kH>%u33ioo^qz@-zHB^(Ej z_+P%#aB$5QiT^DJ`%FHDn4*R>`9|0Cf2sLf9Rk-t^8c2{$|m0_rYJxV9r5p7W7}Sp z`7gsFei?&<3!`YEU?BY0VH2~+ccvZxmv&hw*zgEk6;_^j()^c+T}>MQzvTUI(*L^R z|9jK_7rp$Cy#HbWSZnOQB_iYTzX^gL&J--x^xuq3@EhXOK`GrTZ`HRZ zp(YU~q?68LomGV1VdqEUeO_=2-9l$-zHp3HzPrf;SWHJ}nsIQ!F=$rz-$V<==Q#r6 znb(`tP;2A{$pi;4ubQ)d1>4tnszV?r%pdjs>wuwZ92HNI5BSBU)2QDO*Lu_x zoII|H)CZ|D6WQ`JYvqphp8qV&5+8+@c45!)d|Be(*?KYuR*2jLl`>Xp<_lCc1XZ`& zJXHV_U4>hHzL#1u^!~~(Uh<#MrM-!S@#rLV{(vb0n{Jr*+_$nQY-n<$Nt$NTw9 zMD2smbBVumLvu#FTeLMYKy>Bd#!&&BF93O2{a!lITRkFre;|r{EfwYtp7Ma4c<{fQ za+yB0ShvjJP`^Vf>=+JAei(AHZy)H=#Wvf#V>{d8lHS<%^yio9cEn^kkN5&0RZm=& zvanY>)kA|EwzvS3dOVv*&X6*DkZ#a%pbt&ouM5OtJt{1wo`ZuWw*A!N8ZWdp=+ z$o#&=B~c3LTs^08x$au>0 zsx@tf-N4t}70U&_lRWN&Sz_GVn<6X8iA$b?^^~g#qtr+MRt9+4YTr!WR<0i z=|5=~-a9&(kp266dkN|^V6K@`KMrml9xwJ$0aX}RXoZ~Yb|WnZ&W3*7n8}m$HSISj zyC-*kSl^+UV=ulK5LFo#mS8uKHf3@L+Or*~Zr8D?Ddp|ST>7cx$taH7>^R50u=e@s z{r4`@1D_hRZ3rAhYcNUW6E&8;4w#;d(Y#uNXk-l`l@F19$H|4!$=qSm`CdP>cl4$c zM!xAs5H+)Oph>$BY$1oUc;2ZA%&y>!c!0F7M$cO;78<{4xDo3m(12B)Nbb&n{qtQH zS~X=QJazn#i~Kx#CGVcRx~>*_pr|k_T+HE*GAHrK;qTV{FQd0!86u@zkWWM#<937 zX!-6OBbWB9us7(MJ`~d2&zGdLlq~GMgaB2!Jha=D=g}>yfg=F*sxC^jv)fClwGv+cXVQlQmKzi(tkFZ#R-E4QB=!o}_)(AqaKPqp$dROcgp8jD+V z;1S4b+}@-K6>u_{C-#Q0hjTGDeiI#0(mlJRw`|M>DMUfAOTZ~X&es)~Peh?3dw zWV>ELw|1NoUD-C-+@|MJnIZMC*-Y!0S~~29ZXu2nIhN40Eb{!jn3BVt(RD z>B;LFiKP)LNBGD3`(_tfI%ZrdodRX}A9V|eg9CrXyyHL4n3!Hm*ck{pUO)^Y6!Y89 z?Y<3~?0;wfYQOZ-D}_}d2y_%HLwU7r(1EX=fj@88K;-;o*L#8IURGhQAO0rgDX!xg zxpf-uF@yFS7#<`doy!f6oM`3T8${2S6Xn!UZR92sr@g%xzrL#G7oKaj*%=T0+YbSx z0Zsc0tNS_^L=dsDkgay)68-(AbPOTf@d#qQ?vx4Hq?fP{>UZvQ4q6kt?-M;Kkizjp3`O18i%b?AVtFBh zSWA;sih_NE$V?EkBn9As{dbZbK1~7WCL4(Ov&2(xe~r&vbm{1ehBXa*=u*h-jFEj` zgD50VioGyqw^rpGa_n1(NGvSSd;AHA*tL^&c$ zG&UAw_H@~1HYp2OAhf)b0J}3PI_XnO zzK2Id<%XaZAQr;*{VRirp2%16#V*YonEAOWzRKRjBd74j9f)Aq#a^jFhv&~HLQPY_ zpRMwDi^}@4MB_z0-y1EzP{!}hk~&6sv?u3>T`29Z^>GC5uO(~HK0Gx%%F^EOTOSGI zf;D;E9Wn`BCKZ3$6?yGmI*Gm&rsFcOaVPKO0MxNk0cua_wqitO)-N(a}Ebq;I7cG=~;yzn9Wm8u&}Oe|7_JjALR>SLzDU!qKRX7(_kLQ zT2d?9+-b3&F9gm6^OR#(J=xt2YzSOM`KQ`Ln6pP_cuw+9%$Q%MC}1Q}ZoKnx=ei-2$iV6SMVjwFnoFeeU zP>p-mav0ReXZPckRD(+9@96CXzN{2QBoogww&7u-)67K(5Yz%?NIO^`$@Y0Fc)S2i zq!Qh{KOfpk&hJjN5WPrrM7O;FwnAqf+BRncJEPXjebzpY)JNpY9a$cJO<%isQ9Vm8 zXW8^tG_fW9+xs19)?;fqu*0oC7#~I56$3y=GlwRzeN~f`X`jbWbc63DPnMZLTO1`H zWpv>7WQjT5!$0lVrf%?+yJJ3oC}7s+nK$tkSl|v(u3N<)k^7Jzv_%rQeB_0i!Yw@# z8c8G%6<{ZX(9~$T@})SB3Q2)nKN7jWFCRJ}l77jhd0|32?d;jC(wMU^Kb>9GN~C?x z-JKTVL~2^{80K%=7X=I6>aAP<;lHLHGQK`Q8o*YG#Y0p&&lTPaoY`HXXcF68aNN&d zCm8N(AvRKp=qArs)2;6Ho{x2Xk*Ietj!Jc61dDi#DI0=JT!x%=ln#Eh#uJiC0k)Tp zWi4u-1k#GTzncdvC!jPdH($Do2lsH(%6z+&0nUs**6py&rNKxBuf#Ms!Jd&Zo=Sg{ zJeOKqO+W1kU@*JP+d6r|Y*K4u|HcgvaltqVvVt2&^_Y4bq>&d{o_~{cdT+0OSFO>( zWwyQ`aE@NA%wb5-0^Q`uDK{Dg4wZbF=l*$jZ`t+JJWJ>;E z0Ws$S37ZKCTL>E4vA$>rZ36u#zdxT2Ae^(Da&YOdwg3ia`>l0Ic=aH9NgTe)QFg!X z;I#erwt0mt|qiRsjGQMXKR(@@ z*^*Pt-&s^Y9DrCXW{I1ry$|Zi3c=)3k2hIx0SziaZm@=wyF=+ZU`I>yp~Q;S%+mZ6 zDA$`>qd*8&p&dG$vv|Qj(fO)Gi@1bzqC& z5`&|CWgXr!)O|k-SkrP#9Yr3J#L43l0^w0sNWlb+q%naxL~}swING%ns!G{whGjdE zXut%Q%-J>Vc~Zv*K1s7yu3yD73T1qdT+#q3DQmFjn9b(6XzN|T2QetfjJ*XllIe&G zt6jEC^r>lmp-FG{7$)Dl0+y!ASKgEP_B2o1vC|OfAdCK$>ear3m@c!fDo$(m3a`kHfNT8cFrnovB5GWm&1)@tp^WT^F!bxp9#zG z7o_^r1^FgQHT}?~y?*FzlfeB=2MFp$dvE1>%hp2ks^!G;v;Zo+YSE$5!Tp0U;CsdR zhfsh+%%WiXJ&)lm%Cgo*bKq>XFg#JOSZ#Gu{kzP}YzE06;+W+PL3LbsRp?LkY_Td| zllF5ojK<35=-H^f`kkj)B2JZ(QvS#^rwIqs#N^Gpi|JND&+-D-cvSNRa<>QbWj9eLJhpaTB41GuT<(AHiR(BnOXcNjXhT-w(+;jsE@9j5yFFz;YI zLCjsOoIVXCww^4hOm40j^&p^!pf7FJZ_|~KT|I7ztVGMr>M7HAzf`FE_F`jH)@o`$ z`HMqShmp#Qm7K%8(9V7*1Z)8PqiWiOL8(X;iKFLPm_A0M_+!&u8KK^Qd zS}l|9G){iUz6V~@oJ*s|Y;VpB(GR;zH)N`M1B@!oIp}(7;}?6)ns(L&Gir9(;S7}6S}STgsblMt){rZb^8 zGF)7Zo0vc^EfX8!liTb%rg6AKMe3-TzgGgq@xY)%sa!ng#WQS~pAKbBX>LVIRWj9| z9IU5DlHc_W!gcN})r zFHPSB3F(Yhmh==Kj{xk!{t9$4GMNFLEiA~##T?FUQ`(B!{{)$&RFKa5)z zW2!D(MJv`l>Pr$<_O;~#7xE7w3ytb32ZxUd`IP#8u#U-iOZhqS$pEE2MBgWkw0Der zmR&7AE|a_X)qVZV+%fHf>hU`G>ADtU<@u&eaX+O2B(loQw3$ltyjUx>RKxe|kU_jU zY((|=$H-&gUK+27u3@z)avlayX{~xo@=gs;iot1W zLaszJq`Sy%Z+@LJh}@6P7Vi(kotO*vKs~hQy=`xMTz?7@_2B}v-}CTUx`4%XM{7dW z*jf|<)UoG`sk#=QBdM9)2$&Xioar$^NsWD0^(oEM>MafS*$3!DE%6HoNtv0C7LM=c zYWkj3bbnKUfP-@DHMknyPEWZtXz8X6`;aNiOgdRi`sks1XA%UUmxAZ}DsOzzk)RH+ z&D2;>yAo`2wUzuj9`Vbx@XcDf_Ya}?!y!Y*Os;qp&#?247w(b*;a{Gt=R=xiYrImS zLAim|fi9(5>jDe8N1Xf-_2$P8k&45Txercwa*y8g%B@zaZ}?#W72mlDAjCrm@+S8v zXwc7T=5uEK{Gm<#T{F-X_%MY$$$Q4hAwM}E=%JL!Qr0+6P@Us;I6v7Zz)AgBA9VLr z5hCg6IQb^CzF;_4$^*2IagNNhblcp^$Vs>K)vPwH;HNZxJKm8R%x~7&+NXB_t zRIinIwEL6Y(yiAoVWH&J^}C6!!6#e}W|WR`=^BFe4i@H=Rt&OtrkZ^6%iNfe zvCodyt*R9>aUT^nyzMA}Z8SwpV_>iC7x8-E28NMOU=$vFT`_$d*umQj}r>q`6BtsI2Z zOFT)GyF8qm56K@p&*&_J1|1YaCSF%VkHKj#gV7;!%cl$IV|bW9x-_5fJa|^Cby1+? zZcV*8G}{t{=0*4p%^kN*XH)SH2U$h)=#@$#00s64KTB9vaN~4PDty|d#nRuOR_?it zeuojEB1FhZ?Oh-BcBMC5aLETte%61HAA3YaL3EV|jz!oiG>?e!{Z)>I2^n=i*yq^cN_Btejnjz@q_)2VuBys!f*7@Q>yt&G(NSq|NNlP0Ci zqyDuL|bp$&~JQ{B8mXc+gO{ zS^$&;=Sz+qMO4?W)c~^J(o3o3RiWRwFHtc*t@c~kIJ}Lre6LlEL;3MkL@m5Kq3kOO z@;QS1G0-+o7(a&JxMrr0zT)WH8#-1|XK5F=C8qBNazIASon5X^`f1yK{z z>^IUKlPDjKmHHhF?aov^7~ly1=48fo3K7=Pke@Q~TdEMO!X%Q!Nk%DeSx1=3%}}t1 zfuzidosDerhdzDyr)01^&`v`Iak$HL1xBDCgt zNC6_2Lo#JwkGZFU^>+p9D1{UkTrCG{{*nBW6qy$RcZ^gw{3MMt zO4?$zCHz*BjvPDIM4@ME7jYK>#+$X*4d-&-G%u{_kI9#>)f|ccN+*=&HRN_^3Y_cb zK)6y_e-Y0(IB{SmI{UbPFw&9aKgi+$KHg4F99kZ|AoNtL#P%n|L(M1ilcAAu(CbbH z3A{sa;bd*$=u8tP=en51n%m%N2v=n-8gLjg<2^Z8P2plnym+poN2Hl2Yc#0G)3=Xb z+F|?lo&6=Jbw$LW{Qx|faqZ&cPPZ+m==+W(vYFPXx2RS+jj7%PKBMY;+Op4PPo-O- zT*{q>VJ}VVw;28Fmw@?urnJ^C#v)sE3lzOnzdOK>AGR+cISP1a=9P#{L?F7kN(i_W ze~b5mAPQ4~!BpyD6^)QhYCh_CfeF9H5Pqy0*r9cuODiYoHiwK8XG1%tm(5?^3_7cH z8Om){U8!Hb|2frA8G4=#tXU8P{o$9Be?($VjSJ(5ho{&m#S?^B0CpLMDoT|)Vi4g( zP;;MzdI%wVgLv|JA~EBx642l2WTo?QxognKTrpfdr07*&{F*>km`=yp-0A}LKvAc{ z334`|V@uwSIWw;To+IfJ^f9NgX~fxkYBBl9FEzWyx`6z_+71paU@-ss0EN8#H8Q3% zeM@@L={}+IfyEGqaw_g!ozBH{(_XA*8+oo6rD|{M%@PzEGZBQ6jz;@kSW>p;den4V z!P*DNg4=rgj>=&EJA09EoJ#l7h+>KQ7ivGhjLD!H)}7M@M$7{5g}|EDLx>*Lr(;=1 zl*HVD(eb+3DLIYZ`Njr#-e0yBuSs&Z6sQ;oUkq%uf?N8szb3!M=*c@{L*%A_bb4o< zC})n~5V5W}juS&lO2R=lQepm`hHx%Whb+%@7XlD&1ks)k#UQonV{c*U&$BY{(26PG z!D;>W_Jg$8%?Zv-W)EId(cdjR4CdK4@gGj>vwn#Xij7!Mtu5E1K>MS`=W;SX$YxG` z9_<}Lb+L%?un8Eyi7sP$9!i%(u76m6vDIl*DUa!Z5E0E04cz)q>_UVNHH$T3z5f?k zWC6P)!q$6k!tnCh1IJMvP}t-g`wN)nR2B4TQ*g~x-fu>8@)vTmgFo=S>CGQEZ@{w< zgVBhWG9NNJ^odbEb->vYP5<1(V6oDbA@BOe(}@YW{?THqeyqnVwqvmoCAK|DY*IhZ z-HxByf)Gl;!BZ9dpv}I46E|0=5l^PS%%n6giwA%FB5!Bfq!oaoVYimD-&ZWR3F>Yc zpwu?>jZE|FG=#1T>dcUYw}w6P@j!S;vceeULZ2}4P%r3dBp#H|dmKXB>MMW_#9bQCh##fMXIBgATzmnPRw!GeP-A5Q3(eic&fxd zpA1D^_KVQx?3!!H1f8Q`^VW!=XqZ2BQ}y~c&Fo@rc<8jiZ9Z!R{oo#yZ?ri&k8y(> zP<@f+GAi~iPkGP(O>)!ykGQZVq+}m#r_%EgmYaAGGFEUOuMe_Hc+YcXopz#*kYqD+ z^k-)Wg44%>$fX-m<)>0#pTiIkRGb8Og z4#BYL1WrapKhT1c=^f1xoAg|%Cbj8Glb)5)I}h(fHGbCERIx|pWcpFBH>yLKhCjq% zjhVFB`WMEC3(d}HcXJ~A#fB4np+L7PT(S=7;2BGM2pTvG2!6oBaeJ9*d+GsJX#XA| zA|G>uqUOja;?U?)nmj;Gt>jXE$Ro&sK_XcHkU7(DEZOa7pbAV>{no}D>)8Rv9XTIo z?VtBXEp&HPcxMc~F%HpRtCkUaOMw(VK7y4= zx<*saS6OWe1Y%F4gu-lCu@-w`xYUEO232<2M<1--FkYfz9^NA%ExD_wQSBb8)kNx;jDi0*ApyOVJxEkUz|Qd)+= zGvk1&33fvmmLM}7alQ&%>>JD>4yVL3mIbXbr#-4RghKUV6PGSO_Mt?oB_)1-19=)_5TdYIb5I%qB z54W)A_dZS$jjB>j%!A~vg8khOTBFM=Xhp_PP_Xk8f$ zB2P9%vO?xu0l(Q-W6@da0SI1?g*@$xc`@S0)(%7(fBGzbvRSuNDVt09-G5$431$Tl zz=)WGW?ZPufB*}Ofyx}3@d)Z}i_QtGb+2&S*jP-~S=)I;eWX+B`>e4SMRp1RWb-Qc z8^bo6B&!A@`CA1S1Y}_ZFtH;Fd6rN-$pUbQ)g%;)D=6olqs=OArBX`wuka=anSLf= zcqGMRSmSx2_m#DcowmPb=E{n!8TsL{fv^0#wQ{(MJ!-~N=y^D zClqF9QHPrkEnyiVQp1vAl-Xh)d!In;-!N%;f`?vP89y}MZ3-dvg`DoS4L`ng2c)yB zyp@D)wPY|sQB%+4F3;+rr=;}a5{P`4#W|N;+8=`^r8}&YmHyaaHTm-j-AcilE?+N! z89SJusjWuKb+N#Gk#)$2oqDDCG-E`w8~o>y?AS3FeCQ2nK03DxHTE(DcdT!Q+@BE! z%sgE;#)AlkBpS(ap$g!*$dUF%{E-|9+bXT!w1evP)rX=cjxBnWPEKz14o!*f_btEVa^ejoH0!OEcKE?q;xW zjA&KZ23+b2L>g9Qrj_%%AH>3m8GBJ$H}cYBM=DIl6`mui64dc4rM{TSRw#Ax2@sk< zf7zNNvD}wfO&yHgak=1~p;gxkO392Yvi->-ukLUe*Ty`OAK#a&+jd$tn9a1`^A^+A zxF-xt+IO8v=+@bhION5SQtu+4SEzi-cM4lA$#%buoN{WH2Oil#8yM!)_2C{;{-`Eh z(C6l6;7k_t@ao4%rJNBkN@a&KD@#eP9-TqZT7~{FmDk`mR{HS}oMj4;BR)O#d4J#}M5cP9q&qMlLy*HfIsD^&J-aV$oBRSc|gnmQ%@yS`LhF&fo z(`*`Dg(cVzoh!zd)NhVAg6~__4Q4^*4lVWD0-h~5!x0ysHYrN9v$unf69!my$g%9N z{KDed)Xjo2?I#)GHBeD6I5?#F2AXL*hlcV`u|z|nXxAymbLRUY%V)hK6HMHz08&Qyh9lV>D*n zU&nEy3i#3D_{vP#8uQlb{AyVZqLc5-d{~+)H^x{qb(D3v8(aD*@EVnG3)pdV-99z+ zr)g^Rya369*2MkEa_Ff0x19>Y1YewwB2MGR2+a{mpEm~QdHLW7+6k@!TWUVz_`_#E zu^SyI(~qon(MA;ZoyK@yA;nnv0qiPr;WoRdr8)6J`uVJV|4HB;jNfFseu9G75KL~f zyxS?<_IWXqRA;XS(~RF_t6@>x6A)DYUd510&43n0eEQGD}TDQ%Z{Q8i7)iBCv| zHZy?xXLY~DSq z3v3WpnbpS!60%5pgdk{J9Dd0QH*aH;vpi9#D^_PGw*&K(J(LXCugeknJznGaZ}A!~ zQc@2XG}`As_$hJ_P&^gECDm~D(D2vh2YZoDHaTA8oOG1Wdk^rVZPpEl(zlMDSaE&- z@c2zHpUjI@HIc*-$w12x;CCl{Nt&Ug=j=Jb$$o_=gYxD_gWSsrbfPtP10kFMDN>p@ z45E_C4-67pLSSO!HP0b5frdwCoEguyMXid!W$Jr2Un_&#{W`x{f+XBaHM3dgmWRo7 zXAvR+QDE!R8Ta;JkLi){%|YH2y4Agdu<1K5A?KSLhXz#k>RK z0430|&-pA0Wcgq=OY<9oAh3aX&?zm`$sA3lj6-!gWO^*GO9lw2-$%AK#}0IfTO*i? zjDY%rrfofExk6(Vck7x!auib_tKO~WNGA3#i~dhgUFaq(=KddO;pbJzvU#;W4a54D z_OR;CCXtQIxOLFixyQ3JbZT!WZ`305eTi8pjO8y`LodKPm6rD9x+M+DY#k?S+1N9Z zriJ*UIpW$6H#SzW;W3_7u|Qq?sJTK-qRa6gr3>An)%;kCPd3mCz1{4cu-TG5e3Rkb zRR9Jq_c_uiQM363h1nS@9LrqsI|u-nuYx)*>bAl#NC_8~8mXPO?wg8t7R(-1BbUJ! z1+>JfdMq2F18Mv&ZDP>JW5XFP6!sSrDjj-R2m5)gcSI8I&j)vi9ceS9jv{ z4_mt3w}~Ac2Qe<0A%ar~&*KIEufMwZM$u@$y%r)O=lIn>8E6>^HpIM<@Ag{nGQI0m zUJdO8km<(7{zmbmgW=YLpKER6RmEPYFVro7J#iJzj1M5a%)i_|k=L-Boc-533DG}2 zK}*+&XOz!4v@R$oA9slyb@4k@AI$|Ky?}~QO>UnSx%dYHyc+`z9z0AH&rOOQNQ@zL zxeMT4X*7*$$>L=#ClWoFPT z98TEZUN^O+`Daw4uW`&DU=_=cTP)TCQn-I0^)b@8*jN&OO@-4p+u^Q%gl_hpPOFsK zZ=5OIHj{_C;J^4I^@&#B&=f4gCI{^aMRE5ltf6c`X@bT5@D!f?U zf3F@c?~Tp>-va!P0{*uJ{>KCU#{~Zim;QfL3SfQUO(PxY3h*=T_0V4i7pGFZ8gH|@ zZ{Cf#v`Bp-yqIF@4fm>l_x(MqIa&6yB34&VF~Fi6b>8(4|Dm6=h+Gr6I0WBc2vr+4 zZ@ZmE^!=Gqj{F+HX=QfFgkvG0oDDVqh!tDq2OKMn&c%aV|0%E)V>%m-JJ^irS)sx? zS_)B3BL;0!Ib@l(N>^Q)W4lbDtjGUnmkrlMNWZ++ZYM=Xt!%IvewdHSe40p6Ym`o@ zfD`fZO6bMV!Tu>UZ{3sMnImq^cpkueSV!6&|BaPBTt4MGwy3TpoytEfktbHxyGsf; zAKW=j=dnrDAz}l5R7SRyJA)urtS8xBiSRdRum5mU{#Gqw_v%0$6O<<33KMZl3Jj|>;~pv{p%80(|T#7^v9Ve#{SF10klZ7FLh4?C_C z%!pj12Wsqxt%{2wVj5vlg zH*aHhZ5obIheoU8CweJtO4rNbwol$1{cOWd>yeerTSi=h+h*9bP5e01Khz+K7kIIZ zHApilk5N2+%*cBwR2cWhX{?DC=95I-)=-yWsxSC$nzRxh;lkOHm(0p?6<^hkZsu z^W0nFkT^U^$Kp1RThMbZ>?@Uz5_E1q{S=P$b#hOVedzysygZ2U2CkXl+e^S}Y^Zhr z$nY(BmY%E7Q#XD6ca zLQK#oj4?LQhz*F|PF?QpNE^)bNRMU~U`c$(%~{MGa&N=WrXnMw7aY>7HM=+FK8p?Q zXOQwUuX{1%n(Ked2W798-r&vr)$e}gRXp?(pXZNG2Vo#8SR!CI$uXSO;FEp|pOF@i zE9!j$-BhYRj~?OFN{8F}PDi2L^mbsK(}Cg1Qhaxc42Dq`3xGRK6_gigh2+9*Kc7u# z@7v_#ULAi@Z714S!}#%^P1|DKpo%5(9T!on*nw81BIau~+uGSVi@zrq_F`k%*DEdN zLxIYH4kwXC^Nem*#dsfY*PO5I_U; zA3M=XDRXRTT8x7`mJpJ}2 za3L>Y&lGa{aJ(M4PBXAv&r9WNTw%Sj<`aT^fb)YKxQI3jH z^6=HvS+4&)D_znN|HBu<$*~?9K6eBygpKO#hnBFIlDrM^OSR5vMgpX;U*lkK<16zs zbP<$i@p)ukqa~zz?;p7IS zRkiVxw&X!OrH4kAz=Xq~- zF=E;y1sn2i!|yWs;Vr-w-tQuV1tXJw;cvhHN(RRt zB%YwWZ3h=UW5cNO?x?hhY26Vp-x2}IIeN@CDC?GJ%pKxm&>?J9bAUQDtjX<$lTDuD zE7D<8o^g8c49tIP>!RT z{v>z#OY@sQh!dVK@l$__W!=N5;Bu&x?^7ca%e4Vn#H1IItH)=Ks594~20~s&ou|-DgPg~-aC-W{{J73$Y>y;2rYz=tZeR5WEKw2u_DBA>|<|5 zl9W9%O6EDoKIfPRWt2S+&dG?ZbBt_`^}Tf8b>HvL@At3c8n5SkJm(*{uxeF7FXPa{`BXHv{z&R%EX zAn53JQ|G))UxBmkHITgfj7U7t6$S1rlG)l!bE4|o@dGQpCJkI}EuUPX=Hc%Z? ztEjECJEw>^=)B;RB${p1hAwynSzEG(ZWZ5jYqhCJrDD!o92Rl`-``^t<6`ulU~hcKpj_krB_f^Za<2WlFWIY ziim;NA77BM^?oH6l~gODnTQitdj;O| zYhQ$E3k>o$o^XtFIIM^Y7I|Yp1*zFrDc;dkx-2Dk${kb_mc^IpcqM_;S1HZ&xuBTT zo8tOmyG{qju)P>1m^M`IS#kZ|@DJ3!F=Mg~);4-6e+|3SXx-!9oPNo^UUv6Kkf6Q^ zap#1i#XH=nu=h@@v(b}KjjNVh-(ZSQL!Q)aQ9&VFrPaqVOVhB38;KoWvltRFXn|Ov zm8i2|-KhjBM#THJ#AW*~y*L9>F)~u<|B$I*+PFKOo0g~*yKyqxZ&(26V_d9>QPt;? z^s^5i@_}-n#_KGP56~1T51I7VqG{U<%5&o;nElY-(a^pauIwZyEAHZ@iTOe_O7gUCEm3*BE8xe);FO-VzWd|~nUP0p z-nVE0jH;d=9H890I1VW{?aQrecGh1KIQt+$=jQ{K5#PONdf>7}jH;J{= zcX|zOP@3ZQ!yYEyNYQS%U5pmqKL8(QzNVo(Yv_5L{R5a{_!4Ft(8+0tlB4XeplCIb z_S{;S+6!7TdcX>cn7Mvau*X99BikFty>^JFX4c1cxoq0$Ak%5iIwpvvnk}9<>KmB~ z8$YHL;1ew`d*<~{4P(4*FyB(zYu3Krht9Uw@av)y8PW0&=IyL?AAeN6&)uLI_TIA? zzr-r@rE^}w1Xg(*!&fMIE6jDHBC+PsWy>E$SY;D5z=fj;+{th{#|W&5m~vnc$lq^` z0CQlj49bo`nQ$9x`%O4p=v#d#%on!VwkR=mRbVs>-M8mDy{dL$p!TC;+5`{A^LQyO zEKc4S(R#N5kGu7&4m?wQY>oD&(Amo^+Q~P{?Ygl#D5LJ8RY!Clb%yPJc<1!b@7Z|Y zan*~!CI*2;f)^T}AgKQ+{PYFp67DS}zs?Hamo|&>)k-;s*E{^`OPD;@vq$t*?){)_ zFwX=EdAV68VnPy!qQ|nwEOs&aQl*666XRxR5M_(k3SIZK@y6GT{WHB4r>2Fy4@66r z8#zr2%(Fw_Vzq|{7x6KEf(Kup&t5!gTY2-8I<*|r9E&|WFcwdO$6m`r9eA5{edCgx z4i2zLmGBCA#k~~{f5$D4d3$2Rq1mSccRXyzNw3&RWPbQP`ohnf&(RK*7qVR6UdR{M zbDaeijyRN_okkTlM{&Fr&sK=>~y91KM4iKs8yulMDGL?bC zaKIXoKzv#}`Za)LQvO_cAT|$D>!@85Gk9kBVDGaR|4+{CR@NHrT|+;zL-A-kM|XP( z-UitW3LL}rFAA9#d+Hf+9Haqal6?@0sTP&>!xLKnYQQH>umKwVVj>u}tRy#wzenaQ zHm|yS>xnw=PhVY$ut@D&VK41hI+e*?!n+UZ#~$st>gs*6uwF7Ri{`|~Z7zbn4a@b} z<~T?NajhDZ_4#)j0Lat{bJeO`yQ}mtC$@I)QSohzr4$fPPgq=13IUyd^;8U8<4C07 zOrfh)_8Lgf3e-`vkwE6E!o7T5u6Q9sQw)q~uPF7NES0yjFS{IfA{uP0JZ#Us-zZu> zfBL@av5=3f>gvnj-KVjINsIErp!No%2$Pxui+YU5EmgzQmP+Q+CQuX85It1IX5Hz& zt(-aD4Pere?-us#TPGNo?Rk$H3f*dekI816Q?8e9S=XD!zu!~97u`GAkYS$e0OywKTUx2=SJ(Q*UY9wUJB51$! z+sQQf)~tl}0*TY+yvhe?wl5gs>f*4a*sRnonph!A=mvXwmBiC)L8^LNEg{qxqdIe0B4WSW(#O2=hgLL>XxMlbN>sB*lD=B3hPedI z=Y85RggSkw)%WS{J-%lh>hJ8)l9gR zvuve-oQm!($)uGl37=_4A5w|8?0tS;xkE?ukModEXsq5Edkd^k`0A`rp?BHh33vy` z#c&FM`2+BvZ=SG0{xe~Jdqi93%*~c~; zV$;VSO2-6Qqa<3yQodc`q4b!7Np4Og!%qxsao!b*EiOK(tvkk&d%rkQ z4(^~n)U}AT511^pp5^Hprjt7p#uL;+bVB2yH@5~GuRd8M!11+8kvEBZ6KauKAudeA zqA5M?obg)4ug_S4N<0j!mK!HOQ1wD?JxScju9gdnpk*9Z8bQXKLm9}l(0Vdm*_@N; z%&}7Jj*B~>#?+hbXq=E1bU?qodU*9wsnhKF#VU@yWr9KM%In=9TNXiYsiIFp5FQid z(s$Ua5VHNp)6Tj2o)!Q#fVjNqV2kN|@Gh{Q@}@8q1QI%=$EHp?=IBpkG8A|%>`HS* z8W@PtKb_^k6oG=^TME%YUS@t^Bo2{ph_GEX?GM-4rveZpWB=M;?V;EX6-h4}FZ_;9 zrC)^N)71ofF@mKg02FWTrrmTctlgP0ML4*f%4O*ge@I6~^9hngUaLFGDd05>q(ZvK z_>Ykwl6s;K!5BwjZ+kUafrrgYFB z1FmEufNQV3S*K1IU*A)Y?NLNIE$pv9`ioeKbw3(X$K|7>Sfoty3 z*(@$@Y?#D>nh#j~e`W;+u6^lBt5?4lv$FohukS}#z*icz#Z~9y7!FbM*w)V5jNrZK z)~t4*?{xmu_S}KeZb+50m&BH{h|k(gqF`K$oUWqr$-|w`qoobw!EcwUwIYgDD(M_Y z3#jE@c@r5!tBb>H>>RR!Q8imgKVo#0KwG%l6iN*)SI_Sgt?+xmzhijK?F!tCZBLZ&rMj#oi}k~r^b9O z=)|49Vo7IkeB-0`(lmoC9fpB7q9+BefpTRpatm4B7?2S`cC%tRW>BgIh+M0ps+a^2owR$?56fIzaK#3-TTQTRs_nP z3GO)R8CzlP;dvqgfqO{zwZ0@K^ERyCmk_b*&WP(W^8<%G%8N}g-dM5{Zm<*sAl|~} zUL64GQf-;lPnXQC)Rpgv6rYniz&ySHWN%-qtCW>k%tUi?(<;q+`$5kdU=LvU0n?}?smEx z4u^YQJXd*6$|uS+O$hDos>7{#-Fdxeu>-K{4$s;5XTPLxak!8I?fRHr ziQCgJ^x6NAk8S)hI#~9^pJ~UNECj7?PacdFjT7MeDj#R@c9e@9(vH9e7_KUlG&HP4 zZU$ZahIurW(PtqU1Urb;eb88zaqdPtKkmApj0m<+(SW2;u++AX*zuW-S-76LJn}>) zZjK6)_x2?ZZ2eRUlY;3Hmm#mIsQu8#|;5)CGm%1Ih$M*5r4%J1jQ$-SC*`uQha`WX$@ zKmA_SwQWkrwcu zh)Xtz`%I^1nC9O1>B@&i(UQ;(&K%bx7QeA@|5!822*S=cSUztXd^2EQl*DSW5NGIo z#E?wQ6W#x+0UNo2Hbzcm;}{`68}v^j$MrCqy3RN3%%A9vC8sJ4l|MdT&*|$JFCY1 z2M3iN^K?E7D~0$%U_)Bl&-WS9`-2;1iN>vDVv*uub5cZ(M!&SqL50&yDUL9+qIA^K z@g|viNg?upzY3?tR9nC48rwVXUJkQ}bhU+Go#JxZLB{Qi ze&IEJrg0?84&{O~;b-Q>Y}(`9iqAO6iBn^O_Ez!~z%#C7zl<~Nn+F7JdH}hS)*>jN zFLh`dnC0GNHQ)5VSqy9-iZ_uEpw&;1d(8hPo{Cs`o#e?a;`0(zQFt`%r>Hx7W^Ipq z**S=?yD^E)=>97!c=32MZ&Da>Xq#wy%eKY{d?s1AK#R$|U$<3=vt<9roo=s`u56B@Je3$SHk?hesIep8&={z*7 z68C~vk&-Zg8t*8CAacLL@tr|M63cadGiS-(`{;nx0s8`dY=MMawKIV(i1=#>pn85o zp6$K6m?kdML`z^0GEtwjk@mEj#?Vul8=^z^cnjt~5Fa9wy)$E9)*X&Qbb>LvI~r z#?Fm*QsajjE5@XCPtZWt4@w@7*38hQ&$S}+w9*CjbA9_RZIeT|w1|MF4(_j$m5o6t zV6b$0;Oo?MBi-7|KstX+b>5Kk_fOBCe7e1ycj@IhVXltLzJrnEu|>m_l#;XR3&AKq z7i8t7Z&VO3aBz|JP_pFl40D7h*AfqgjqH(lAE7pj!NWEAH(6@#Bb~DC>Dus5g(EzR zB2odT4p{aK%At*l4P6j z!jg1J!n@LbftThLNM?BvFh-5XhP#CITr;c-^4;x| z<7+kT)Q?%-51D$^%Z+Cr)s0&EKs}85$9NEm0LziTSnk;%-Se7yx5<;-?c|w2J zvB9(Q0)yAv3oJ(Ma}V!ysz|6&o0sy`QQC5~A*c=aS*^H>TccA0aHf_C9>bx6iPRpR z^LN5=wm`&L8ZDV`)Q$!rLp*_0xy4I1;VV9CKUTp>fa(tBr}W-`3%BIfW_qvY7jcT) zF|c`mHpv2dIq0aY^7UF)T|--9&?gF2fy?($e(#$=yRMG9{PE5S)#YT>XBDqxRHLr& zdw)M;JI4e|mj__uOe;3mcEJ1ex0bC|EKT|;uFEb74A(v;EoN7(wVhOZa4j`H5T}`h zn%qm~cKrN1yW$J|kA@Y|-h!MNO zf-Il*8Sfpeu$DycK`%bAJ6}pgOvsIB6wb{HVGoKa8R1a%GqwMzQeO$}j*KQ7Jph)- zjv$&9eMZE1Fi1NT7b*r#?A}V^0e6%pXKJR^M5`kwi3txTKsC9@*GkZ zIR)pGWKE4Jb=uFxTPjzZhFzU%IVH1mC7ZX(b;yqMSF)@j^ttAAUS<&H9*47Wz0RxJ z3eTFQ5T@PKhkcp1vU6%QtsqL_GzPW z+f5C2^4GKioL_x{kWqQYm7a4<5NXugJOmztYbVtzxq2?5hkUs+&NO&WHVxs+V36^c z(lNv>2^KMC4JzU@(;L7J(mE7(?Y>qo4R26{#Kfn^y} zgZF}D>YE&xNB?0wdx!os6`#aQcge2PDOx@pQGVW9yM`h2afJN^0 z2OVX+Ia4~4hJ?|_l{oO2;j$pOE^pBer`x8BRrAt``SGJI7FMNTf z*hr~$o|OFDU{a2MRo`ae`C^Ah-%In-8_ycmmh0UboAHSU*E=VOE5a8Igb+p|3F|XT zQ;-UopdqI^l(`?DX5t$i?hp0H9U3rjVi%qtD0Q!K?%|z)a>ZfdWQ;+HZ4`&tmF&)~ zhe0-dKQ7z~XmNxlC@tn}$%s(6jr_h*5*b+Y+K?t|$Y!&e3Z~n*#(4=lo6q5$Gx9Ft zRl7?IxXzorm#K}s8t`W@zM{FT5mKy6mr%1j^99gBSD_Q$tjYOE`I}H$m&IVz3C~6Q z`7$I$NN^G7Mj`^Si#i6Ro^Nf#w zovUT{iaC*PQ8}SqCA^z1H*ff@PC#-SQHMGzNab|_O$0ffqx?Dqs-Q;3#jgm9&7i}5 zFKEq3Ie+`Utov=)++6_21{N$^`o@l^&d4u!@RyIjTYxW_%iA8UGu}?3UTO`MI$!NO zZB;d&oAwSQmHfV{8tc48qfVWZ4CIsEai=kO5z;Q?+P#zK)6U|-bV5Ae=qkxRU0t3j zS;}16Oul#NB2BEsPl~gGWZvRJ_ZeVtGb3@ib4yT!kS(p7d!z5BF79rp36yshNC|a% zmDwRp_RX63CJR|VMA(rB3_eU_aWAEJzDE^DNja%!P*g=G%^7dT6*46Mj5|G?A zj|z{5$SHr=nj0H|216Db5!R=l`g~DH&(VFnlW2Jy14LHkZtz{F;<`}xS=_i+DX_CB zejtB--X)9Oxy$>``d4Z%01O$$nIj_Cnm}pzZlEHVQCqp>s})h-FvwLBebsnZR}X&% zPY3}EzacXY6SmBXgTolUkb*dqH=1lWHZm=d&~%*NLUZr(M}*i@%?4=-N#gktcE7zf zI3dFjl?v3D6}=ARp;@%@>b_*ug&!-e!eG@Avzo0h)$p`;JS+sr<5yqdT=`FVhOJv) zLl9Eu9~M0FiR-&m?;kj)X@d4e^^^a)KQ;)gAfOUlkPh0J<^X0;pED|51F8$QVxH!# zWba*^f*!ueY`J3hZo&iGyA#QEQR$4fA0B2`2l_p$B;N$K70}b1?cvR-*g~E-Spif& z?{Uf$3C#EBCB==uiv=cm+cj9v_k5VQVaEZV+fp3C0w~C{2Brh|FR1~e;k+{!>E2{*Kr8BVRB0|jDkj~vTsCWZjFsk z&_JcG7tW*o>je^vx8v8$$_xt5&eS+~e$70j5(Ho}It^eixXQI3uk%tgeM`~YY({js zn0P&a;(NlhZ(7R1Ai+xQWE$_NQ@o$%$mj^MuI6;Tk8^P$ z0^wI3R4!V6NGA8zU+cfqS{#JV-Kx1beLw3KEz!pcm0d^T$4Ci72gBJM!k|2?LtcLw z&(`wIL>9Z#g73dW6(G2=GiwBgk7aiuG!Q=y%ge_?{2AiIUO@1nDD#QT(10omueY}c z>qW0#nNv>TVz{5*UhR5zCX3%WBX5=E&!VueF#2AmsXFws&NKC)mKYAJTDZ?-vC`AO zwp^xykI`JxGols>BngS{@|l<_Q+B-VN)7zi3P+n)i{MEBEXJK-R;o#+8 z%_k0Bu#a8Hl0%14j94CC>S&-eD6PEew=}9u;oCzuhA|D9LpSbnFIBGb^or%|u_1yE zWCf>-QIm257TXp+&CkD!E$#aT+#X)Uj;Ei+FCsmf5j<7&7+o4Bql^BHIS(x&F1iI@ z^j7HKM0_S(linr5i# zH7Wzehd;q|6~VT)iALv?gAud7jE7ib{?baP>!Pn^aX+@nFzm|j+;#iOt!zWWyg^?o{AZ;qRjl**G# zJrim-32EPtb1#hMAe!+eb|SKi@l*N-G{Yo!^v-Let=r{w1F;!gjnaaGtCx<2Xwl@J z2y*Zrl#*$S3$dKwspix?G}!*g`Z{`4_gkl7J@bAg(iCu%71p=4yZB5*4};7Lw)behEo> zPpqDM>A%%uA#LV54PTu}bFTURlS54yS%Q2QfG_BSmx>C)oxZ<4RJ=T7?o~c_g-UTf z=^o|MO+_~rNAx~>9p&y;sIIcqUAdM$wL8P5Yf~!|?z1XVF#vYA{ZkELvpr*f$Q8VXzQEPZK`10NjXEk^R zAlyUjc*~cj$e?FIx%g_hFjhz)sPE&~?)hwp- zyReS)z1<}lihkG5o}4_PpC33$*|e_a{@h)^cV&_NDTk6{M{(Y%knk(P>O{SdD@9WFqdf>q*SXXz^_^*_rm*0Hyk*kUF32$dD)>xYIII4ksX z_uNxMSSN;_o#@uN6kb{wakR?RYQg3u6Gy_LmJ9zBT}uoe$q9lHXHG`ksoGKBHc&)JHR z)j48zy9e|cV9LzfTxtkE?^k+CpBnHN%`5siXxx@aU)|=p@&NCrFRK^t&VRz3f^R@v8p@`P>C%A6pZJ7mh`u^2^`?dW7GFITpq; z5`r0_W>-&8e|H)*SRMFg2#VtQF1&EHGloN1uXi)gB?0*o{T*85LZ+nZ=@)YsSd6V0KKAH-lFT9Dd#@b6xC`RK<#2{f1{D z)m;j}GFQdo@gn1v?=exgj+8(Pc%tah6E`m73B$~=Xc~5ab1I)1GDeJNg==SsO62X( zp!}Hw5p|3K>4?Ptur`+Y%j~95CPt%$J*ofv>?)?n@4$xs-s^xLxXp#9B_n6qufQN3LRRae-k*ZI1-aW z10l+((gs&1ZBD;DUgSL6cw{H8+fi@qR~aQ8ko)+FQh$|n-h1Ku`y7|v1P3!vGd#+U zudayXY`y(_No?kv;QMeTi?*+VM`u;P)3EP&%L287`2cF4+5Lb*6%Kk|ZUS=^Mq>Co zS|YKOW?*d$0>{HC^RNNg{Fx^3=&I{isF!99?wmsO%px>{;P!E^Plv+fZZ-X(pb9lL z|FLW8r}f=ByYbF_2eC6Y^1K^IXM33vd}xwq6O~ddovsJ{gkr!vKL?FY6DG7UVEAW9 z96?5vQkPXwJNP^c%`NC^B5}nCzma+s3caD$R(M=-UwQ#ojCK0qw2a1 z`=_KV0OjcJ_Yh-+64B74gS)iI6a}9$U}X@W=W~=8fs_=umGjx<`LQ9f3FdjmBSMTY z_jC_>+%L*}U-e@)7CLpOMCz>ZzcTVXnBka7-z~;sSJ-G^rwnu_aAflDpYtzI1nLwz z+pO&mqB*^c@D9LUG+562CUA|D5CQ1Sl(I2I)%Stw7g|weaJ6GYSX}8ZO5KbJK9se$ zDNmiJtbud4VrK+8%Ox%kb28lct+UKuR2p#GcIuH$AzHGa*{!_4LU;ndt&$y1j#`+t zs>&a|-G+99(()uy81GP*IGV(WjlPWMWMzeoF0wd2M+JVBDa9i(Dqwj~4y zEU`HR;xhwVsw0|5jpdXzoMJDMc^mQS095=(xm7r+H>Z`g;pcT?vm>1{C?M&y`HP?= z%_6kmGZ=D>-D+W-ii$p7nQHfy8;Y{&rUqe!qPv>FqgaeM(O4)9*#nXjS7PC{7`58cJT`d}w^$u<2F2Mg5p(8o#W4Kmj z)|NPhM>yM*D_P4dQ3B1CrYR(uO!3}dB5%epY?lfh#2US`M3hRy2+x=`xsLH2)m+rtBPeW6>tF@hFdP=3#|06J~?u>1OgoVuX%e8s_9aI#P%?b&)ZN;^b*+ zYVGuG1C2@y=*3SujTbF%eaG8Cx$tyH$EOTjKf39WBJ1_i#D3$kX~l$^03`;34Q87Sb{U4 zvpY6nb5ZETJiK`-)U|F0I#%nmZdZ(FI+DD__T=!p`|7|PS)Eb`k zJH~mgnT|Ur86XFh4DwNhg{w8cjOjltJ;De#Lr5f&UZvs6fVmtEtDXK`V5JZWv*Iq5 zxL6`hj~P*a$n={QBdlMp;i}`X3gu4eJ4=k{&P#KOH8qNGabZAz+6!#PwTKIav zpVfWpp0lj&l-sxD>C3~_20wqBl>FP&DNRNk;nOK_a)+1NNM$kx&0&RN`Sizc94UPz zeG}kPbE~OgrX87))5#m;{jwQADh>XXN^zQ7k;O_htk(OL38TK`AuImA!a?KyTHqnT`}zMdsV*9vv4qWMYMxvEZ%dbKj!I01}e>8Y2E-Xx0b% zC)b3w9e#DzWtvJlZa@Q*GEI!ToO3@(HB%n?MI$8}kHEKFC48L^h z=;k3;uG|cutp61IVeoEn*P9gzf5DGSbwP+@&D#$iSK03S3Sa&I+}tA$<6G|P^XulW z!sIqEtD_+j;QveV>pv3mw^rY!@eqRm4&Kr*1Y|@YJ^qAbD7GD~z9~KvF`XK%@tBEt z`}&_3y6#NP|1mc$2eM3Y!Zmj~qywJ7;yIWVI*5S|iPko{?|%ACy}w25WlZo`zix(t zEZ7Y3;mGSfH!|{<8b>M%0|wlQN7&JfbNe?9;}xk`4f?eQP+kEtY}RI`d`sFMy;kZ0eoiV)m<>e2KpBQ>{r$ALLRN$0TtT}#gM|p&K`oP{$+k! zx=J-9v(g)rY*8GFkw-G{A$)$QT73* z-=eE{79=`#baTSL~ zSVH6fAm?}~Dhtbv_Jbe$zSso{zKaHea&HE2j1GM|DdwpC=ih$aT;(lm@@-eEYh9`8 z2rC4x!toPAY?xGm?An@Y<19b^UwCjGN?r7YL~)IKjqtKADqcjtTbeE^GOP#ki>`Us zPW(rf0e^Qngn^a+nJ`rQ9o%Rn)rAc9Vgw+1r#o4nKx-j7{29*|`p4jyoGpRyl&A2| z&t4ORzQ*k(U@!!L!U1s7fM9d^ zDMQ;l{|_S7!_b&E4sP^o4|lt^7dbCV*#f{ID#a3FX2v}O=&97d9{=dJnZb-0p*E1A zp&Id0vN|H$XdEf_#o>r47I`-E%#MG@N542+#%Fm2G2+MyUo*8JHYZ5gy0SVBR$HO) zWJaPIyU8`;e8K-wk7o^)u2UZ(qIW)^&h*ki*sK?)&nU*JlZQ;?X&_fap8s>gtQ!o; zZycn*UK=$X8p62RL|2J*N;HB{jA(F-CF05L{~8QEIpBC8teRd3-dye^tGyYytBb>C zw2Yir!GKdJi9l)6{Km{7Wmhc!a_G~j!rlYewqMp_@MiFHm$fYaK=mgS1zB?1b>;Yf zO&p)93N5f$z7w!MtUsTFJ6D)2lHo@r{Ga$No{x(4QJhW}jZvr9zK2bF=~^YoXrMY2 zl?W`=dj~8t`V)ryl8k6A%Z1_6?}_yM_(C+@n<^_5LovI11PspZ4j`;SItwA-?vj6m zGoFo#Ro6Wwev~r>PNawf6uUXzRbb;KOvCEL;uwAYe?5`z(F;Sh^U=Ug+S}wJBs?Jf zG4eXsf=?Pobo)_=CD-J4y5Ami`d-7`0n-^9>^<92Okl_2xPRwE3sn6l&=fsJ^r8R1 z78#IY87iZajpq=NwDaVb6-CA60 zg{k?oX5<7dUZ6K|#t2s#+gW{t80%9rK!8Qesy#|Y|BfeqI}t#Ww}E8o$HGFPbCza} zpk@%8BTNcqlKz^Z!ge%S-i!v4bVBJj6>PLs)E*gWb=s8i*HU2L4kjsHYG4>bc8L*! z8oCvV(oH<|EZJ$ajHS}Z zAIlgp_+pbqivU(fR2?{Kz75=|TGF}U@aDJL|5BwEKFd%PV-cngqy}OI4?3iqaG@9~ zaA@Chd`!aNmEmg1KTzVj54F&%YAc5#)?1B(&UOJ5(3;jez{fO?CSZ^yhH@AG$H1Sa zF0zCQ!wjEDy&pu+kURX}CT; z{FoMWuhMAXXc+~MN0Y7&xAgvxr3~r2^af#xD0h2KtSnP@r-5YB+x&j!gN$I|kEADi zZm|s2)Q+Y&3+GSBnL_8;3h#Hu2yqZ_E5834-H^#^6DKi3MFb%TcWERFh(nfJ2DfNU zqpKn;x)~u!Xa4Y>Potsf5m&7R#+#pfvMjKOp_FsW9o^Ms@8fV3%iby3`1&aPKSoz& zz|$!G`pU12({FyqvxoT8Lefz$f$~5OeDs3IZ^4CMv;0s%R1lrP zx9;FukeS)8kjGGXB0_p8XJ@IM#uPNnsrvup1TX{~8uJN+swu>8z(HV7rgksu8Hm%9 zFtPK8V7`A1PdsCY2lnRtWXg;Utbr`Fq}abt6Y-{T*v zF27R(xBu62c+zNH-w;R?T>^p+s2#r8sBy5kzpS~#O9W8DxBsJr4`Ni_1J1+Mup(Oi zLju~}XnM7$^!9_M-+Fr8fto*_5~jtmwYFD=mLTJyTFpj>J(a*5Oce-kh$az91QN-? z#DArEzvvIN{#(h_9#{_KKYV0p$Oenbnk;kz{LNF?G!T4n7A@h;oSx(p(s?* zk^KE1`DAsWg_vDNOu{g17&%1cA`@VJ2%;SfIO9vhLZ|;u5FI)B3>6G9(Q(6-)q~iy z!|6VSzyHpX{1Q#L*9->yaQJUOd<1G$=2^b*4;MB#K)8n)P10@n8$skz({Vc{2wxMB z1o<00X)wQF)qza_F|9yX^!2gLX-&0E1rMl1-K+fwSmJCmVgrO ztHyN-0W|XAA4o-?4@EuvRn|Dt54{1J$-DYq4I?A~1b7isoIz^?UhS^p?GGP=0?IMf zAXE#BquJ^oIDPaY08xQg&3Et{Aprh$AQi<|+p=Itp1n?`9Bv8OTRwS@{`VWJG;nAK zTpuCrKe)jc@_QG6zi`dsz*c+eYzuOs1)0u(w%vGa4F)V_#sBh7gc|T{lZA@@9l&Q6 z(9ed>H-hXk1$D{Hj+$h}Pf!0rwQL#2o;i(3b9)<0e_SVf#g-4_un*`1z-eh3Y$ z_Kn)D0(J2Zrv|t4VD6p$O`~7lby6TJ6mX}Q2vmah8^bg}r_Ujadk*)~dg(FEhhvt{ z{x+c@FZq}SKDIQfrzQcB8(|{Iw+W54fY!j@JF^i)w=;nxqgN{MsShb($FR^21`zQ; z-m7^rF%8L`5ySi23jeJTE3Dr0=&d`Ao;XWdn0~-*<4avdmFrf5)Tl@lKY@U}v6MJC zR2gJ^!!gW~JoWx4a(@eNTZGR%gHFQCrVNC*eTU07>DTWFY+NM9#y z)~aK|viUxOm%&-xi;RV;btGy0CsvH-2;r~@&@C)1yjB2sR9zMeZdZKtZah-dk=K9T z@;OTP#UE>`rg|xf7;owZa}%l{e8+mVF^mi(_>)>17LxrLF0g z?(q0XzMGv+GP_Z;jK?m_cKoV1{d)0ZG;L80Kzw?U5mW6e-JeJ=RO#@V8;nWfidvHj zw}d|VBRc1#sEp2aO81z$p~YB1D2w_!$Ywx20I0wtY>tCNMmhADB4flW7RSZ(|JtGJ ze1N?y)Pst#fwU{pBFtLJY9%5$!tKVtL&$tqDx>S21FC%rSSAaPja?VuETKrhWEE%t zxatutQKDPU$f;((i~eCfuI5XEktt^a7hz{RPItOrS2?a*nOE?t626b0f>q1_Uz^HME!`P!SkVPy0A~VdxYSaUCi~B8 zXFa9=;T9FES)|jm+F31r{0)%CG;Y_2io>$SgaNdJ!wCVA+LDR<&+WJ?3ekf2t_(#; zm%^?>)ojM@hn0`+PSxMRBZ0fHenZy(1XB5W0H#AwBXO|++%pyWL_s*6&KB+gI~j2J z7pRm-asEjtz6@6p#a^%aL81{EM{-FVnpK$)l%sa!WDkwFCZtg${%bA85>F(`E66)9H%n6*@;IMRXNEI4Xst# ztPK*{x#JirKz23(Uy@t2Dh(k;e!~>2MaFh9ftXW1dIU72L2c0TK&NIsZfpGT=Iol8 z`vzNCdzbvox7R2Bqdn6a4Kxrh8$PwK>+xR~) zE?Vc(5HZelb@ZDDj`{_nKe^6Soxca1p16@ijcRE#D-n?{-OL8QGq>n9JW_Y}eGtW7 zp#20FQf#zFMD*%C|7$Ud2OsyAdt3EaLFPVuK2CFSg5r$-d7}hPz$guhumB0EB;mFz z!=RZWg@L8YJpPkLbB@|BZ`}cj+a2p&P${pZ#Uw_+|3nTudvi%%U&&M0M z{Z=xwz6x2gw^}y!nn-8mf{pjD&zkk$NqBtAf19{UF3$e!?lE7M?{SgZ}_(Q{z)qtpCLTFNg37fZB6SK$`}P~*&v`& zGmKb_+Fw-*j}ca=m!A5$TBk?OMHwT)e7-j){RlpYcs5nWds3|Sjj7KLpS@8gI0HIG zLk!&aOt^gKU^aJf)x!62{te!R?_{3(SDbwE>mz*G#?T$2V_m|x^Di*fZ9|H-UGD^U zmx3%S<%XhLcZ3K^o5P>W)bn&6!Y|VhO=n8y`MKIhy+&K^eET3AeEhdt5h7wikbT ziD_h~TE^|)%T~1P;7vc6KTL%dFGqYXW5fc!L>CY7;x>Vzq|{n7mR_(r_D@%@bjlF# zE>-QmzAowX?e>UI(rDP?$-qdfnfww?jv>QpBO2=R(E&1uG2)`{Glj!XQFzHR%^SVt zc+44aRY#v@yLF7xwM8P9$(?*#-x*39zMe0?9mb8dlKUUjMFP}OJhYu-28_lIP$@%y{6>Ar*%x1rIk z+#hp3V)YAF_G7hG*SklzhVv4cDHHo!G*g62j$7;fccyzjzt)<+LpwspTM1z|dBTz+ zZXJHn^+ze1X4E=H_JNMV_sWvdg^_Zg{r0P1fbn-=@IC(i!B#Tc9lwFM5nsO^DvG~M z4{RB6YfbmMZv+2^;^(Ie;B{YMSe?`qyDuyBCTP1+9t}EqpW*f&`H{1_hGc-FA_9NfT*21Mdieb(M^4MHmjsEs2HSh5WrNiT5Z(plIc+!yKP)k` z48h#`@qLojaRZ#MUUbbf1R$(qSHR*1j145%>F*p?b~YfgA*l2=JcRm zQ8qj|=BOwFvRG3VoCQmIGY|VM*IqykM8|T^e$C5B{Cq~45c$Hfq|w*yFu?2nUkIfq zjyZ;S_4(Z|S5MIF4rIjlEdfa9)GA&p^0d!(ph-|2T;J;4A8-J)6y%FFf@U+X^i@Ly zX)Hv6s9>7=)9v3;fl8Jrmj6h8QrbXCouuiWiva~HKm`+!A5<4{^sK5H(Q8a7Lxjb{ z-*b*M7!jsucgTU{i6;6stPT`b79hY$V27_aFA5Cvxcv-q!>8m`b^e&t6iq@D;iUOC zNhKUl=5rEbfu3ts=`oM?_-gCdN{@8pTrD4Ho#cX*skPxxR1Y?C6%QgoW}Z6<`c02U zb5*dyKVvEfYk8x+jpX19b9v#@M~DalE5Gv~ov}@cb*gz!4;0opnD+tq8MP?xIve z60)giT$gKIduPwcyk=Hh*WTCoo-0?qzn|~p@%#PL=kvbK>zwC#?sd-Ta(`yH3{B*z zvd)Qhlt^J8DBW2~kbX$UooLU(}#SviH{vqnAN-U2nc_AbZQ#pw8-Y&KXdH2`R?sg}1i& zqd}g+UB(-R%+l-EC4EgJF}@I6*|O93xos`GGxV$9nj^XRpf^0;Ysg&Sxm&&Bdczhb zQ;)WCEdn_0(0uge)V*cW1a92?y5EJ%f-8g2%#%lT^3QFIe_XF#H|cQ@MPJqbi1pVg z6DNiH>?r12w+o&bc(B1z?Z0l~E`H7?(KTbh4VQ2stE_nLqMnI|fod}ayWi4RNdAt7 z?g_-JTD6tgaQa|@-!nsb-Kv8wdn*>tY*5GPF;at)=TaxFw%wTHf{0iRq8UI zjC+WgCxPQiXZY`}Pa4!Aln20RYV37R-QG}OymZaRiQp^w1qCMQTYc)PS>#{b3|`gy_5yh)NjjTKXvr1morn6Fwo5R}ozX1C4g8?}ayJu+(qr}S7?!>90>H+n_ku4&&V^*iRAC)XE)0oL=0zC@;9sHe!Cv_If;!w zh|SG%R>Cz7c0O8PVaR8Gr`OZOR&q8nmeh~&{xd}4IfpQ#5O#cMP`J!B8qm&0xz_1Q z!+6KcZ}q%^Ww=t+0?-iWSR9OvR(>*O*r#X3zCN=GH+J6%abQaEn;*+ zt#_lFzP~L0Jboc!FFnT%Fnb&%J8QPIhs|O!(Q7_BLQ`c>-2LTw&*wBJjjq10s}DD8 zRL>tU#Bf?WmP*_%a@QPuTe!beHI_) zXiAKbZ4Q!IQW^O&Zu7j+CZ2bU8UJRP(lW8Jtyqh>>GipDGh1GGb32UaM~_W#4^KV&?bQ zcuY#$^qXw9q7SPdC`ms{$EUyXM^JM(paTkEGTS3Q*_Fq?;%W?sT-wSxNZGDdyt2jm zX-b=h%5J@Q=jn4gM)uvs=xRnt-e4d(!$kX0<#Y7V{Fy;Dhmz4Vz}52*`h1S*Fy=bR z2rD8(Ny2VdALTee9d;p7$qXmq99EA2Yl9;ku-s(MP}Vea&>k_A8C) z@M<7k^G_qkQ`%&ON!gu&tB3Z?f(Y9wYQ6F$|#=Ih70xRl=Z_ve`R`6k)&~{_f*1qJ+SHU zly{1CkG_u{`?RiG`icL^2a&^iB`u#75h!eUub!47Y}b`1SwUA;xoB*q$|aG81%=7XK@|o zyBp*TmIJ*`BBH08s#v8|qm`Jb*monFj-=g=;VKVd769hI_#(1`DEnc1odTt6eQI!t zi!0k$T?iAaTAc=~)sNP~HtzZB?MDfa(SA|J=ZMi<+Mtjw@NkSxGOb!AyQ+K1m}RSy zDR{e#(^mLzp^k%wXmcp^lYNpYw>>8g742S%LhJ z4S<3!WROR;BrppS98bPuL_EITuKd&epMxo6mZ*!>pd-oB1ecs+@Y*Hr>Z+OkWkf?4*?ICR!(RaXq8(*Nc|@urr~hlq-^m;XF^Ue|}%D7E6SuJVyi zE9J^?^?bE(-Rk_*IXZ}79TZ*$$Qklc{lve_kgCFA28s~S`{~86bjKX}oU5KJkZ|ug zs`NAb6`(K2UOCovr_C z5m1)M{cl;~Dmh1Q)THZ!pM-F7{CWkW9Hu{HILIs%)6;SXufNiT%qmeuMTVYhv(s)N z1PuSNwI?sb*!{NefNb{%($~|f`tCZQALx~Vdsq4<%Coys%mg@Ekp>p_frkm`s}x5W z6qh9m_g6q4tUz7aoqE`avtKhMxh2R zP8jX>uIQS_Uc|v)K|)uJ@o(-6P`5^t0~EO6HmgU3$^4;hKDiBrO2xW& z6o>So(n!|I=k%5Hm2kN45W3~t2Ys*_^+4BUK$5{m@VPnW?)U#l+cZ8mQEFfNf*@V> z0Z#?ICx58F>ixEJZn~%CGOVk1q}#yHA=JpxDGziVF*>f+fZ7N%L74XUxnCQZ105Ac z>XX<;+#j#{3UQr=eb(40L}_K41yE%3b|mH*SYk7Z_VX#LWO_g!c6 z@kDt3FL_}dcp_}|ykRCdr1-q^Mstb*LOY+mCo}Rl@x`|M*!!2&da_HmJ%d3Da+$#@ zc*nDkzVhLH0$%V-gDxSUx{4BDxRJ|o2~ZDnG^>7JW>0q4v%<<~ayCipzg=Tj`Ctlz z&kJ@6eA62A6CLwHYSK$zAsq$~dS+&zrq~6llyrwx%KbR!D)~uOWLF>j3x-vI zXf)bGjYg$W!6*yZ4IPHDndw~ehC?q}gXZ+VZB+X?wn!xqJY{Ey=N#nIw55-lokj@I zf?c-#Oq$r#Me8^B|EKQ}k5T^MBmPh;6G!UDR)7l;>6jJ>A-$nl!E_Tt@f};YdS%tdqpVBpRLs zKatOV(>gB%W6xZvd*N^FjSo4O$T)g+heT~^4;b#%`H|ocn@=C%oOf>f*d@lrwf4x; zLau~=qW)KVPN*fPkQkkpFk6@yA6`;wY$ljMK3$?`B_vMxuU&ei#l<5WUCX+5MbrE< z42Scfv{xMfRxOM8e-gakeRe1yJ9!tG2R#XSZiwQpp(&FGO?J$O@jlhfo4rUoi zwj!}plh#X!*8KkRT0Br`{{bph4Y0)HOjd4!)N?2U13%e&QEU*~wE7@o>bPiIOUt-X zf@7Y5UV4{jJ_K$j>L4osxnjaNL)gGR?;8_?^NQHY2V%#JL@|cTqPz%pZx|>9{w=n* zn-f!bQ2tt**oxu#=;7eNGd$xB-zg?SbQfDO*n(O8p=odh)cWbwj@7u-#sUJbcxm?}lMWoLRa*qD7G5%739VBOd5VTXhXBS_w8c zVzSGH;WY)GmgmS%-sO0V$G!Pg!cP4_wCtI03|bc>S=5jrEG|4k|3&_3^7qO1sFd2@ zlqmJstKq;dJd!%b8XVQtuh!(&t8ZdoHu-5aAnpn3#-&$>e0U~MKE+XPVAoi#)AIjX zYT&d#bl~(Ar{w?A=2pdbjht0cQeyNLms&Z&c%1~zdW@8!eED)fYRe}J3uCB#8{3pLNRIuz*Wk3r(7oNo+C;=<(U$gC`@K^Aek_g z+r<7<7$aoYa^HKAmdO81rA+}-2+k)%MJ}~kBpwI=1+Uh_@E_Q=)hia=hYV~213eth zKIAA*HkM$yy2nl}P1;lIip>AYM2!MR=S<&Y*Jt#g&oFqxq~g#g_@YPj>=ZRZE=T2f zX4N;Z0;tb$V_DbQKAj6?iP7Q1yOY!`|FMDKB#(JbYO&>)7Sm_uaS3$H1dP2qdXzzy zQj`(X26^jC2Z_+)BK;SLRCOQ&xtZ)A2{MojBOB*R=V5-kY9po+cg`QN8r?eMF~FD? zI~9cio=6C~*7AWC+;6Q5oWfs7wK{Bh!L!u6D@RMkQ8>qh&qI`G3#0P|m*Gt{r#wM~ zjjpxs4teJLC}%J8pZ+#B$SIJ;o z1*=He7M_?}UqQBo`&&?m*|UCcM}>%m|Kg)YLw-IS>)SUMzUnKH#NES)B13JqryX{B zg(z?^-4UHWg3!!S>5mz)Ep#wij?iy$GV9Nb#G_};c1$5X4<1BN^7|^B>Zo3>&SEa; zmlVEAhVmHwc$pyQsqz)yYZXGfwywr~n%_DF!QT8qY`mjhUIsj|7|SQNF1z4>HIh0@ zOpuHJAC1Ew|8y`|;JI~6?1U0GXy@>9VhnUWpNaV9ib&LMQb~_v05K2?>IT`5!+u-X za}F)`e75e-edm_>tSWUKx0g&Vya}X}ATY|lo2)~$7Htb+Ku;28aRQ7~H}|)koQ~ge z#GnKA={`gjpZA+YZoBd2WvW1d8gy19akq{NW_@*-T zz$aF{BSV|SsC2s7JyM=tcAVgO?5m`oRoSr+InhLLW)Jl6a8>R}aJ-4C@a9sFZRXWckGr)zsnc$^DrMPqzOagWL~Tn1_>~85cU&o<=Rle_@f&;^++O7x;OdR4V0p?(2xH!W$Cl8E zn@3j+_ZZXb!HW&nxo=Ua8JEa(RmCWEiAAA?egae_7FriAh+HPO1^h?_Ol?R6a%_m_ zKQE9CNmAz8aw7cK@5$D!lv_7_x^U%#koJkha*r!RNpy68|B~O6H{-ld>`GQ_rar`x z7^-4)Tb9pkv3Kr8neD~bsP>oeb(|*pO1#pVkMUnt3+mn+EdR8|?{AJ__}c~5hYxMy z&7}lstJBou7|WEkzd$?fd~ft;Jct8F6o?C9MR0WL_TPB@{7rmsv7oam-l&u@~ zsLKI3u^ErsJI$Xl*1S3P#xr zCG>Y=ch6^d5u>m1e+v~|y z%BcMvHN~SZ{z7@XlDjATTEr^Jl+a} z4!if#u5;xzl>zmVxsH(!AC_;+Mv%Tf&!t39Ora>xexnQXy9_!X_w?ji)M67MaX8gi|odbimc0KW51d*rNZ)Ywo@$w} z^1UO zo3*oLf+SVot|+_!O6%Q)qdVU5XCe1~mUu)yKC!md`gr@21!&$_k^uG4=jYqS3d~GD zJn%(xarBDKijF}D3tt6Seu0J2iA_ZYUBdC;6!tK#w%G;PsbS8XMe9#f!3>mR>n zmQ&i@oEjeCw1Nb^dC34y3CnxXBB6A#S7S6!VRPkcReToFk2j?@yvG4Ao{5sr87XgL zEVA5vri!BD?6u~;Aw#g1=QWR1ipf>F%?5t`5EeZ*@Dn)bAm?33XZrjmL8 z&nY&NH^UOn>SBCD_gxfzSjDv+cZqAKFattkkL7k;V|SNZ@N~HZ8(CA*osQjPYVCU- zXdV|ryMKHiFGBC6!Oo;fj2K(}fwmjpyT|vHJkTHNzYgq(iiz%V5U`$n3c}B|2zlfL z9_XNoZ)B*DV~IHgJq03mS_mCPZECRbR>%>;5&K)`0dqA5&=bGH^Yvv@##&-Rka!0u z4d6t76F(QAas%v=jtATd0i!qv%m|Dr;X?FT0MXlG%M+&wjQSifYOp!FeO{t9S`JSL z<_^GxT8UuYrsX0L_!1ZR)U+p}kKh7m(d>hS8HFlEuiggsCh=$|z^qm__*reOUfnD5R zBBw;@i;x2NR_V!|)AV2o@O}y;_?O5fGBQiBp*T94NCFSZ%M(|gs*KvBRt*CfnKrp{ z6Eu@v1+VL&pN}>haDZbb#Axr|`)9`Y?dmI_dqAK?=eQyQ{AXy4iB=k5;ghey$CX+g zbi^|N+0fFI)CU9&()jF%zo0*~uq0Z*mJPTdkMm-H>3Ty6<~4p8P6?~!d}@xqHXw0m z&&~tv17Qsu$}k8j>Ud>u-C|oG2%5a~g+D7I5lrciDFA5*{ET|pHc|3eps$lGG;ftO8 zcy(>%DiL#n!0D^k_o0v-(hKS0^@s9%5Tmu(-r;*035mU^|4C1I?sJ4un`72-ELe|G z9DGNk3dC&__%4Eb_RS~MlJH12Q?$mrgZo~k4EU205;2vpAK(^d9`_2|V-!gWfJ@%S zZ){K0`gtmlIn+uf=M}t@weLnIf zZTpOY*%a(f9-I>B6)J7c&Til_3Vg6TiOC!X579T+ZzqLqU&>sYJ`=_&Cz?JpaACRn zJ1wM>?i@8hxBx)7b7^)nJRa!HsLn1+Ap*jG0#br|Ydk$3h~E7SQZ*U+;6fa|TqUIF z+x-ZcN)fEFTT1t65U-ksCJ|~HBI8{63WuuQMa;EsHgA8G?4^fl-0FHRvxoyqvx#3s& zZBo2?Tun&U%rMU`GM&=^59B1hJQ7-vU-gWpl(#%I?rg%NOjCizttR)EjWu&6yPFR^ zHX?hSR7B{$v}8( zL%z&sx-|nWKL&3CIAtnP?)tlWUB)C4{>Y^QH&XV#X{+vJLZTy$&)1;MR z$5o%x`a_Rj)4raZNG`qHyeu;8z1)C8uL=E*nSl>K4!D6-S58AN9us7v!_YZkCt==hyQ2Rs06uz#Kp}tD< zT?aw^moJ{XBf-_3U(LO?Z1)7~zqYYFPLamV23weYPVjsS$sg1unHImtONNU1eKKth zcR6A_7i0Po3xTa6#wQt2p$GvKhd*@8gpL?p`=Bl6Fo>iBN+^}HS9W29due;1RHjX8 z{jos_=6=>ZQcbw{Cg{I-sPDexs#kAlpK)r743*~;V;-lHo~N7f5Y&XUo%2CgYFNoe z$0ZMJp19@DFJ`Hr>VfY`?sJP9%I>#=-vVW8+>^P@=<#YA<$B@rZGO-r8X3yU6s4nQ zqU6@^RNU^ay!M#mhR;G}kj2CDowcY$nWEyZ3%hTW*&@QZ%TGMO?GBq}f2WtZI|Ht* zr15askXqWT4`1qvHdE8lxia0K7Yxa&vBsC;1K|w!&S*WAe@P2Y6|p*V;_s^IlBI)0 zDtMfYmR*8*FDwd=T0YiU(`6B6z>>f#n@HE9gjoB(Yq<5l?sLAgfD|d-lZMW(R+VsO z`f;0WU%k$AJDx`{K#w~(t8pzVoX-&(OzzY^}HB7d=K@P>L5HBjzg%K}s zrD!_Rx1r|LyJMc2@5G{Cc>t|Bl~qA-8jlcV5zjuCKxKzs$6o32)d_T>0T*Mafa--X zR@wHi2`)@Qk-DYJ9dV>(r@`WVH1JELzQ6^8x& zqrBm1btoO9%vk8rW7H?~f^0m0_b%iQMOIewSIF(fpX^aOEw!_<_nZiMeqgVn+8Ge` zS&fO?G&k>Azt=jcz2$ouQ7!qsV%x^;ucA%8Re{=LoB(&^lSwRo>a<*&?e`-}R}nzu z`h%|Jt`{h}%kg))M<~#LW8I+9%I0p_=8ed7t#o9ds1?u6HNv7I6k2029e#=cX zvpiQC%^`*GGYyFvTeogVy((-4y_6eLhWW>)h!(>zBG{jS-H#Gmz(|Pe*Jt zL_#n>@*I>$8HFi*-kZm&m6M?g+h4Wqh|+%F!lE4cu8BhXwM|*Xv}46HJr+p)q0%{9 zp}=y|>V~`ZlzDxAk+3y1+YNQvT&zpt3ePnuCb3)^kJV9E43g!?qVs}m&E4#74EwS~R;Y0TBdLA%ssyWsz0g+|wN)IGg+IO>u%e<65uF>*| z5|urKm#-AB#WpbnqxieoJbub=uA%2Yeii?u59d`vhP3wtFYo4$jc3c7=Y8DEuveY$ zDsBqbE9YaV)1<0i&VR_`o=_H$`bpmm3H_06V3^f?#-X$!JKHZ)`$sn;WYs&zx|Xu6 zyY7QYe-mSnqeD%58UtiUVy<-OTXuDkX!#L$se-M=uyF*9?`s7;Qlsl2iU=I3*8rwl zid%$WbiO>o>nd>CTkm+;+E$$Nj~cxj_j^D(k2{D|;1m`dBcZ3Vr-Rr(NqY3_>yj=~ zQa23T<<#ggl}MLyOJ`JDE+C_PRJU-xjMV<^)b3*vqn19ao>I$!f<+5NhP4d#Cqt^& zy2G8g;<++Shob2#Lbi>6s_Ymw$~Ry$AF3>Sy3RyUV&JGE&mLbMj$L zLdEi+89brAhutRLBN23W!Yw?^7b?mV-21O<=XNRT;pXzzkN)uUS|4@~TKRq1(b$4s zjzddZ!Ryp0A$^;|R*}iD^6{=P-?#IA?;q-n znh6=Z8E3wOo&r5Y^m=6dj-{>i7Q0Q{zEPUWp`p5?cCBSn2qAQa=zN)Qf;qf!j{lcX za9(s1jT)nusLh_a&SG=9-R{i&N@~Q!bJ%LRa!z9YS!&>x6})ObN{C84L4+eUUt21a zT-R!%-cfiDU34|mCGJjnXw)t#8(YR~oEX$oRjzmyt#q8tJ@Be+$GKPBy*K&J{Jf52 zjJag-VYZ-ij&2<{S1Q>1>XWjz*wlw$;b`8(C$+DBQKB+Q1k97XmtvC3$(@(gdx&X% z+A~kY<|rolj;b0lK4bTTBp%sb63A>|wuxs+t3j;AU3N)ZnH%KYp1cjgcb0rwrzDxQs#a+6k^qDtbOIE<-!|4{*b6a@&YhUJ3<=G&@KxLQr zEtCiAeS}3Oo+)Tr(8sk7MBNO&sw1Xozbz zUF{|Fz*Q%u$86h#%sCGT+26D>Lx!M3N3fZ-^*ZZita*#9!sy>e&j~u9t7+sK z*t}S^;6Feo6u&aNsJyPRMd3S1V)V(gRJ!s=MvsLQ;jl@3=^51s=)*K{#QTUCaH>>W1@aPj4rd7iAa5X}7GhA~I- z5Hs0Vx3h&)ewNjYOgSG;l#DWNLLaxVjj0C&`3|~thgRBPz3-GtmYEmpBT471j)|!? z{P3UC^cqoWtA9N$DxmL*36#=|%Wv@)=oLfQak(dDJy?jQ`8w6%+giFVxcLj7HS@eK zgx8T5i*9D$0xbi6e*HV{riv)j9A$OhN==_jefIM|Av-AoA&xYtr!UY`Vs=j>6o6_W zAtfOMj2v2V@)=cjST;LlT8RCX3y*KqAeMy-u6n=d|NY~EW%K*2AF{EY8M~z0NhiqG zI&<-tt6WW2LNYq7e}B9l6;e!JJfD>WS{Uv1Bh`^zLB~VSh=Mmit;<8%1dAG1^LmC} z7x^qc`~1ljqkE^1wJtT9I%>5Cr>Q;V5JQ_!w6S9DIww%cZz3huXQ?=icDFIGnusL2 zQ?M5B@FEQ*>@M#c^;~cyOxJ_Ew|lsFt`}n(mGyuph*yhqZ79cGmCn-V`uc**E;mc& zRn7LU=Vj&?%9Od^!rs4SHaBu&{TQz9jwG9Wu+u|!A!u6%Y<9l1x<2=jRCVy&*x`Hp zYnP=yR!xvT>Iyk3wtdgvW;}B`r)r=kfHc~~xjro=Q%k|&nh|`kw0`7g?59Fa6W_% z@OzWJBROi8+ZD89;)R_U9SD_nHgEJ}3dy7Lr#u5%H||{XvqS1(Dk~EaZn+P;jMq+} zjy?+O%YjdnnNNIW9V7~0zOOv~vp~2v(W9OxTOt2hy2>lorCRZ&@+rBn`}y%jrMXnC z@F0QSH3}5hwRVQ~LYtFsNANS}2oj^px2i4+JyUgIQ4p9kScdbN86B`wO2$Pf0K2B41?xIkkrKZP7S!~cHaK&B9^E@&X7dSWc&U<&0 ziE~3QNJgOO{Pm)-+|IUei)vFExKHKU&bo4a#h9jsfr`VlkV8bp&gw zz;%~(d+p}j(DP?x&)r^jH6k7q8C^6V9taNDaap~_->YHSCbRXdY)|o-iO;qE_LR0D zT;JAeQ8~6t&x~J9SO=%_%U8&X?A;kq`^`MTc2ms9vn6qwAKXV}^eoq5&@fbHlC006 zxYqACy+3rPqRQ?^~`Y0dmq#h+xnQ6SfG@zh~rM&6ta1gcB)kkv+qf<@hwfeXsrcXfC>d z1MiL}rGAoI+)(VudVuBq`1#zOr}E_V8{j10_zUjiH$NcMuh;ZrGK!6(3_LGT3ekKv zJ96X{ugZ<<+M?e;R)>8%$apLMcFc-iYr=dPmOp!WYk7#J%-m~b2(zDnz^-q7mW}Ee z-r@XKJRhI%(Z|lD(hb{H+^|@j!8lRasyrMP9X$8s3PmB@0^q#=_Y1h`n_=GDl<4&n zY}sy=FqWq4Of-?U_pG01>G;cdYf`N(P1NI4a1JH)gtHaNL_k}d0`&qKORtrz&kA%X z#USeJRbA04i=uqYnvWYL`^cwNa6I}ENbJQ$k)sSFRB~Nw3|o|tIus3I;Dmtg^AjEy zA&+Lh@;0p5>W)m~O7!MsKm1B(%P_}vqvspRdE?L2>Y4d4{wRF}|Msma8&}O}298|~ zVmyGG9i-lE;?62D2ErJ)gDA4w5Z=_KXENg!UEd?~SW|Z5_9i$SQ@ss47WNh#qj>j4 zPzCP?^YgofXSiszQve8{X1jJG*6j^|@LYHZr@W${@&rze(71S*`lvqiY5L zlh#T%_Omy5dld=XV$=q>G~-A9&~c-ij$J*^sqm?Un^rxW%WW#zU1FkU53ee_tb%Kf zE_7{_(X#ON^E7-NTrMFKfGB}p{bLey1$)o6PMMX!2iPH^*JUZz{ zf|d%<$pU9j9;{y593M+g(fg%hm@CV21k(E4b=!O=O{&2aD0NE53U|xVszE5h zs%&tNQ52DTLZ9+CA`Dy7?$ztZhqrE?G)%|%JNG?p`H(HpYqt=8G_En*sYMeOukeC6 zLt>QcFwvxnPsnfkBg%x=2luo#XW+4aD*8&m-JUR_fl+YXukbx&0{1^up#9pY{08c>!4)%F0W+!p;G@ zykGtT2jpo4JAa&Xnpxj`lx;wdSAVVp}jwhdds_%2L#>r&r?^|EeJ(BkpX9Bk(qX_*<4bT(an z`{&2aZ5`)zW*?En@lway#tHXw#tBH?qKLEnd?X&bc8^9ipc8N9U+0xN_{CgO(kNfl ziIIUz&OF#l=y`+anWc;LsYDqdHRqD$bFo8Tt&QRuI&B&X*GtZSoXP;+hrq=igMB9> z3^cp&Bza@(mpV1em9fozk4w*6Rk*Eez7wS3k*9HiC%q@=Atz7(G|8#7O8R-~4Z z^o*D}X12A8KL4cR2mM_W8Rary$(WbwAB6Lz!R^^SM>M7f3h(tEuM|_zYkJ9GjZc7L z4d7J2bcefV_<-ANbZnx}#_Zklag)<@hE6pTsqXWFpNx=uv+lz_!ui9#nz@Yr=L`K2 z<(|4|hl0_q(V4PvGjC={(t^UmuzZW~)pQ@p%C*e$-M4~XsTnW&9dL+=+_h(C1lE2Hq;V*lc9xTP8w}?;w#Tbc?H_xJ6 zF49UroShtjJ(wG%1UFn1ZVBWy4EYxK@8$72Fd$aCwmf-y<~C3_`rnQ1SYuCcy_?d9%U7R1rC?XS4<8NJFLOZcX>N z53vRN%7DwVl6Ub|B5H9HrnPCnq2GUbqh8SRC3y4oeRrDu6eS9d7|@a3o$blp`Q6w@ z8P;oj%81Xk%~%g<;@j7{G|}^*b1lV>(W!S1Q(r3}81*(n8@V%;cO>9W75)1 z(XW!`<8n_!f%E_A7=R4+>bGgOJn-T}o;P?aPsHi|OwyF={E+%?POIT)Qe6JS%X=lk zXP=OvE?m1$>GT0AdmoWV49YC444TxD;H~xZR+wWg`nIWzlkJ7un0Vzq- zb-4MkH<*m_3;lcDEnNtD4NA5zY0D${S|do?LoGJv8OS2LDrGY~b0LGqbJwhJH+UD; zlLsva&rcw+dW>es(%-)YCnDH+0%_LnTKtrWGR*#XVz$_=@tZ!}odk_fUBiXDRD_DW zo*=pkS^a}PvSu~KW_isO`9pPb(wyfFqzu>dW=G@;c7M`k;2iSat_{g(Wm^)0x0(!hDC{OE4M*i`HQ6J)&~Qg}&kJ!8jd;A9LdgemVvdtDV} z?k%*k5F?Y^cG>HV$J)I&^k#>Ax2QWrPV*`cg2F_12n*sc3&nxYLJ9OvE{Q22Tb}8T zI)i3{x@;|(X&cjFUtInBLd`K%ZO7zz4Jaanz!bnm`v(QM0@0J25vmcXpW2&1x{4fgNr2Y8V6Wj1tmaJ@X>OW-h7Cf5;8&T z0jlKGECMa`#Js<>&4(vqcU$1Ti}PNHW!`zon^y4yKoloiU!NkZsC|0B#OCbT#NC@_ z+VbN8ZxBpL5~Ys#g6wz^CL0brrWrNa64wAylpp(sU8h>IA0tzVNI~IO7AzZ#GmLs= zj{CjfI5BD?2Per{{(v2C!|!qcQFPp6Ua5{(n_# z5hp<9e)#6&;R@o~(4;eoSuUTOy*k0;6bsKr9|KB%1QlKAidw}HjyI7&PIYgb+ea-Z z-fB&Q{m?-KcFJLQe6^hz!1X-288npPo2#}rew-m>^C&>I9k(|-*yO-% zz)CtY);m2QCF7&gCVy<^y770SN}`ukG?y;+BCV>AA+JjxzYqS$qUkxw@{yeD_bXqJ z{Nj4?l+8NLv2%JL{=3_?I&~$DPradVh+bs*TZKNS!kPH_?Xk7(YqF<$h2&#;GJ=WF z{ZwD6={U6BJgq=+-1^LUN$DsId(tT(_Q+8pVlvtE)hiuEVekj0lMdj=k+)AP*64$zh*d9e zAO$Co4^QsT%b~?{6o#lk-Cq47I7UtesdI4#e+cH~K$?_X?irf_Kf%SV4R1f)2cubE z-dq5g;M7oPe3Xa?O+=gEe*|VoK?bpxNSD;Paufz_Ij-%FhvDfF*e?Jb5&9Rrk@>SA z2QmSLTxQ_V(g9<1lr@T(ROHQzZ+%2$?nC^v;szdM?2Tt*DlUw)y{(bMHRQB>SpXN` z13uak?+SB(i0IGIBQU!Cu`lQsACZG4&YwN0&Ly9G62No!M8Hkj)BGGr*2b~xe{k_s zo{R_`55wl{yf|HjmNII5Som}OW=;Xj|315-0ESIU zJp0M73`$Jatj|&ALq6=C8-w{)TwI*e2U+tw6LM4E&~Rp012^m2Z?>btq+ZTqBlqO? zp4)a9PbRaE75X1aeZ4rpt02+Pr|JF)v|ISpq!jCI4|9?K1C z$c3>_Q9_c+u920_c|3XKc%|%)_ww~tu|DLtjDXDB|M{eb-TxpvvDQ}$d9Lo$ZX^e69BM=VIPl^6BDS}hb?(FbeFC(jUh;p$Qb=K|4-!()h$ z$do~kBEK`TLsG1suSo&Vn2sc1jVx^JH*nE+^cZ_X>6fk@FuDg|y|M~aC-&KtFg4EA z+#s-VPvTwKu|8+AuPN*E&_G=m+lO)Ye5^4NhNmp}BEf853gl5|6=rT4=6n6bjHygX zZ%;&s@A>MLU}80s?-H5$d2y%bE(vn;AQ3;`*kAm!(5078E5yvqIy=x6pLXzVy$pJ z*P2ipUE4VVy$l?0$UjNsnF*M?K_!za#O~$s{-K?n0H7UvZ`!W{vd&-76ex7hc(OaI zWYzU_kDo%JhU^Ct~-RUyd?AD{t zsUp~?f@?D{slpt^8nyG}C%Lu0Glfv0ZkS7b85KL=3^kx?Ek}D?YZl-%iGgOjlk6!y zUdu>>r=(SU5;Mgsx9z;KxXxxGxt8XB+@?Qm zDs9AVqT5;DLG)R^c+F$!qeNGjZgFA_KC@_Ovjg%BdeLzfF0L0Kb;2VFH?`tSv_PK);K_X!%mbD|Ll}vG{`d_vAHf<(024JuJfD3a z7qh_P5uy8Z;sogadzV504%fKUqa z^PVHD!g1+5V6}JV2~mH(;tSii>WOwg=?VKeN>mLfQSBqG`UkR~^7xey*O@T~(8)io z@FxQAzE!=5Y03Lzzwx*j2fLp9v26TjNHYDtUvZv7hx-qc;)mP-xDq))qa85QjJ@4u z^{#IS%Or~dyWD>wHFV$b93|=j)FMIkbUhzFASwWvFAmsw2=@n>1Nw~aFEgq%5qP*C z;TG~!2iPwuCPio@<^>qM~>FqI7)X% z`y}PbW5krScRnep7KP907kMp8ObM;emAYF;4fgd}{c&&m&ihmmYzL@({j;i}JvJ zju=xPjCyMZma7okv}e`3v5(RHe=6jT5*h6cT%$M`rEm)vUMCoKOAx2{CAU!LA0#@Y z%WoP{@XQ=1gD}+8RUWKFOF=}8B1WZXX%;FU4u&nzav-U~oX0N^s7Fo$zGCX-vH0=G z?r<1b^AUM_RX0f$*8$*xNk_nbp&MOxiDU;50n!_TkE`=6J%kRvL;^&TLlBJ>C;r** zbs>Pbagy&?&I5Y<0$-6s7|epN9s6fk12;g6bgMDR!SoKv_!Y5K>AuGJ2fqoVCnl%u z<#`dDKzG1>C-)~)%o=iT`-|f63t-8ZiPn36Sb!F&0e}iRoly_{zcal7)S;UGH8x3@ zN_KzL;#c0;fWO=!e~FB?_qgJPM>Gf1zxlL3OvSMBn#4cgA3X_XTzW4`t5ik|cm21(82T+YO;h|FBHLPPi*fstS3z|^xZl7m6vT8+}&f99tHOsQthGP+0n z#QQHx;5SZ{QuRys06F_Y2*l8iTKOL$zS#zIH8{2sP{F*W+dhU`EWN~(Xp6ar<%TND~umIF&5mRaiI6%u&VLZkrKz5z{tEnO*tu{pjK0#@kidX!`wTepHDrMNAH+KWwyDKd z>k>vC`@^PRYNd$|N67~Q*l*stzWn~r{5P`qHN?3dzeLtUdF99jn^uIE6c`;$wXjc| z?l8M*&VRrfpaq(frK(klfGdeV7|khj68s0F^mr9g_S&$y>2k0F4Vf^|5<}0G{up=^yDm@Pe9VPZx2Qt>H8i>1o zu-;RE7W&@fC3l?^{u%ZbubE$(O9&pIhB#~=5eq+W&Vdxnq2ek4TN+!l07nA$2^k36 zA9Y&$0UJ1VK;Qrc06X`mWRKf_e&I3zQ`-`uDVc=obLDKl?4>oeCKSK^0dbWPFfA!~ zSCslG_n~hwXt%m0V%>bYp-cE&lFvAAQbTMWCf!T;ZUM67XL(Xy^KEltaEmkVj+v*D zkZF-+!a}$kjoQwZE5gc}u<{aq<;-S}`v)s)fRz_u*!3~LH$9{!7r>KeAvv;)rPDl{ zlb9cOv&UPU=IUxk=%36kW-LvuFn6m*g8HPj#@?WzHP0m?+&cT4GkG%-8f$aN{D~CO zy|%1Sg8F&^LP>NzzhmO5{e8n;;5DbQxz|J^BmPENB~sL40%+AgmlS$7#SkqPI?p-l z9srOR@%ae&r!EHmM-XW30A*8j?+*wcVDy|m0QnIND^>lx3CI5W)+6TM$7HuhWD3h$ zN_|>=;Cl|v=hx&)!o!X_8DA}`>H8}Zru{~NwbFziRHRKu)< zpTxF(S2|~s&sNrWLj*c&cV)WMSrdcG_Gmg)x0N4s;w`uW75N~c@c*#)-ce0$Ul^c@ z0v3t|e29PzQL3VVfPkV>1(XtcQ9zVXq=X)jXF)}ZbQD3Pm(UYx0*Hci5dugkDm{Uq zKqv{2IX95^-mLkp`FCd4n!nytPtLt(pMCb;=lk~Fx5#~5)OK4b^zr!A>}ydM9CXj> zr$=6Nx@CRjqSLV)gA8eJw3S}crQ<>YE3eV{4#~*O5W6ptSK}ltB|YeGL`Z$EksyCp zBTbECy!R!~DLi^1>9Vgruf&Er0Cx+?9(m_)nPICC>GrLPr*6DF6z&l&AZLYf8FEDB zSyV=q;j&^uZ&u@tH_PR1?-ccb;w8DzgH>x!!q)hIw#VcDX zbgkDbuYF~SQV9wq1q|O?tQ65nK0&~^#$)}LHJ>d`r$-)H%X5s?ayM>`Yoyc&$UXeZ z{URK9*V%E1Dwtz24U;)DsB2pE@U=LsGoL0XX^tuD(z(%o1dl?t^H~R@1W&>Hs~hkx z^u%hdRrm39XM${RiG1k|-!KE0r5vwWvql@wCB%}i>-cIN9WB!~Lql1W!a!F-Cu`wO zC0dzXYg~J=E{&c+e6&$?)t~t2A}G$*FT1}V#GbDPyNQx%1(!J8C8qqOO=BArj3O50 z7Y(y-UCpt=zA39IeQMYK29J2+aoe0O?G`0&ju||oK9u4iY$WJRhD$U>q`c=c7dfoG zWq$szw&(?yQ`(0Q>5dcyL4h0dB{H^;NmZ2lY+o~L_mJ2 zxLH|$@i6W^o7CHL8;U$Xcrk^tW(&hz^MXxPyMj7jTVZJ}D%x=hy`-m23W!L#5ubMU z+i!;gvzolHA52S6&sXkAMZoWPxU(hD;meVOIUlRk1!wKZzkDn!Yzn6Q$=~w|*M5)c zg**FQEtlT#`NZZ(BFo$9_$rG+bGLSee*sM?ZIV?gQ&;iDwAfJ+vh z+|-slmZPNhr;_i4qT{Xny7oV>PB9K?^ZQyn1-@L(<)~<;N8;_xGxjs%3Zh@*AuF^} zt6g!gN~LUv6bP2d*2vY$i?!>r3tnM;ZXjQD$JUtYOl9zpT@{E|m({3ji~tZ*qs7O8DX z8F8SiJY~T5( z5)AZOi*1|o@xod$k;fm8l*LI|R2-XCRF>S!D_+vO`lf69)Tb9J8n_x?lx5AX0Pm3@ z{Xp8RH(Y4>73aB-9Gs8$?C|WcorKB=O@4ZH5P$}Xb@|4H;rUkBMmTpCSMKd=<+z$_ ztTpGqD1`W{g*@FmNgvLN3?L(O!fAB5+ys>YM zpO{|I4uXv63bvbP%-^C7bGPSkO3OR%i{+@>ofjPnE`QrN-=tu@cb%#%1=?@M*p|AW zhthKvlEMXgRD*Y{j@Jc04#)4raB}i)TFvJgkSxW$1UKXI;4dI*0PX`p z=Uknu+{a&fP7hdaBq=wH9un3%6hBMw_Q{t*v`R?-iQnDWH$YKy-Ja5PHL#!`?GcJ6 z_6XQeeYGMQtcW9e$$lky=nc?J_3%(eu>ZIEWb!@Lay2i#?m)T`MaZJwY?jjr#o^XA zbq;}lDGXcQMxI2oVMx8GcwTRedy-DM8TjA!>EAz3>Q_4Icy#&9e%;uQe?#GDQds`G ze11`+2r*KN3+DtDIQJ|+eZ4PRZV3*z9#ZX_+0$Sg)IMO!)=@Q{@Bc=6)gi|W{SsYe zM51BI4zoXOpVjrU?aSNJsbfG6?4nMBJe!V8gNGpp0&O)=I`CsexM-RCXO$>9J#bc^ zh)=m~Bf~c-i0YeGK7Z^z(3IS2*cn)UcJYkFww}}ymlys9uTRY56I^RB zcTome7|)>GJiCqM_sTPeiiTER}S%H%J{6;a|Q>cExS1HXX{jm0D9g6=>yeljnW^ zYj)zvTdsrIsjt>uUb*FOq|$)OH++w+lTy*+9-4Hsh-S!H!V>f0~=u-AiFp7+^>CKl9-&5+n zESq=ZgYC7;hZVet;ur39xX;XPIIdTEOr~q0&BA}{ls~g5@xi6vO#BAlYpzrm=duph z^}8iK)cy!r!j|E;zIWaFwQH>aeB?%8(m5D0_v)9$G0t<8DmUBOI5o#}7nP>#E3{%? zIFCE#8>;Yjq@=M{yxfgko+U`h!29In_zD&3dahLn~M2Q;UXyO-ETfp?N?OkMJN66+0p%@VgJeT+0=%kgux-FsW8hbWnqJ$l!^X` zy59Qwtw4W2bd!Glx#QZ_P1+O$UBHF;UtUkTnY5Uf_G_)$EzGVt>3gx{@x5eNBsuQG zL?yL$F*jhn-FxE0A4d$C!uy-!$fYX^UOqhoBj(%WCi0}lmI!Z5X>EzL_@-@lN1Kph z97lRCEV;2IRE?9UXfYJ;TfZz31(mZwH)-7pS&Cyl{DbRNM4XGr`hjlu)kFt>-?DF% zdow8e`NJt;F>w-e=L&#Hzz&6!7r9Ll9^c@~%oJH(sOl_sCU`yQ@0aIJ;B&OP%@Q43 zceF$%ICke7RoQZ`!i{H z*0>|zz`?295!sH z!&MGh2<3hI_SN>BI0@7H5^pc?%R0pn%m?iyj}$IN4hZxUarOwI z(xnIV4Ho@0*v-G33-mN>@**m)aS$_DU>?M8tLJ@Z@$vTKxp;T)JX#yRF%Mh4tBJKw z_5BXQ>cZic$6PAE6sjjbEX@sMl-kx6FRT1@ysGnFP-aTtnia99KsW+3cdB%9ZT!+_ zoDxBx)$h*SFj7BH_okS$$H`#S+4`-k(Q6Q=^Hb?f!$_{1+7s-a{w+ zyBpDhO-JS34Lz4RmR{8L7SvzfyxROPI13!YzU;Ud?_A#4rRKlBJXrG7d?y-l7n%iO$|Rg^NK2xPiIk8cMt)Cp&M-BPqij=H4kdoGR`! zUHmnT(CBGtV>TV!>RDUkr&UnbYc6JKDd|^KY?RlRP=0S`Dij@{kM_MPpI@_CIro5o z2^%eXof2?w-)RTyX-+2!raMb7luW+ck>p$AwCdh;<-w9IWzE&#v{r0O?AU^oTI(Y@ zR(V+xZ`)Zs8)x6!BXSSy_Nn&G=49Eo#N>nzc{|bi(#&_cqB3?n2{?&w-Sb|9{oijo zbNS+yFoeN1Zlw;^m%tkK#&@UHI(0G5A$gjNR`n(MV~jf;GQ0~N!q$f-ySI<$@@SvB z_H1AHLM07}=P!4$a-Er!_^}r+x!=kc@hD&w-xuzX0-Ssok~WZa+_m;3_}bDZoL1mp zDlj5G&o*DXpblo8-@eWT1=(iHA6l1&mX(X*D6jYm6k$}8{)#`=l_=k~I)@2Ki8mvX z*5Mm%K#{7IzhCpT#w|6Q+rUQ(CiU_H9S)0|WSe~rJYBV`04dG3YoS;Dp=$Eg6pu%a zVH=f>u`VfU5mZC+{jNcrRt=&SV1&o+ZlVH=+i}>JyOXI~F$Z*cuG@(jrbgjqawtlu zG4NR?-l1Qxa?DVrNBlkzXs=FBz7XVb{`1in0P1&av1AcLHrP^5=YrCBr9%n^rjv5s zKtZYZvsv#2zoK(W_Y;yoo-LxtZZjHH;|O!mi9Q|nr>5F#E^Z>1K5)UI<47wtgtMxz zz{&+Ze6s^6Mc>Zeu$;t}SeIB3?UfY1^sr*fwQm_F7Dotv&A-#Y>P{Y%=Tq5Gk08r0 zZrA4Rj8}cS=cP;V<@>)0?h}iA@?L8R78MV#vU2%#cOgT{gQpY_PEsr*0hTrBeXjm= z3>2XLHWIx%j{->2%T#f>=wr zX7_|3Dgos6Nl45&-PswDf>hS>tj$`Qo)*+=0fDqhUetvmC9jzZ!~C(CrH@tnWztw~ z2|PJ%_YGN9m2z7sMbTTbkksz+HW*dz|BW(_H@1q(&83e$X5(tf2GvMp>xH&!VSVMS z*yFQ=rhSGJC~cM@xmo&vlHJbH*7(AU$}vSLSJ==C6YbKY*_^X~XO@S`h(-UBJ!<9|e|RtH^Ne)n3t zRP4e~O%bi5{)9E_B$Os4u$HN2vfzsQ{a@8Nzs?$i1Mf48u~>< zDCi6zx;&hES+WqfCV%%1^cAO>P0{aKPjAGOa*}wv0S*#&;ZoqAr#KLJr-pa$?^n2F zvPEZ{fCAc*e&73Bi_`{-EDA;yC>a-8#nw(rMHbuE#^==PEtsVW`u(Ply{0RP8};;k zEtH$KneFaWUOuve6nIO>KR+#vOMf9?c!#-v{BFNmX97mMp|LzMyr#g| zAj%u`xA}tJaAacy4R+*WwnM%Lm-{%%wbvneR#=68fMA_hURPq9)gf&=Ax=_|aWst9 ztX+d*2ZgfrvF=X$nTkIXq9mhoNoV@h$#1JKbOl+;rr&ABqo(fj5y{e5=R8(^@6WM7 zXC|XFQ(d`aar1@7pC*0VS&$S(#WifI+A{A%;BH^6=X6xp_#?q5?ZYh;a$>%= zp(EG%QZegEOLefq+JM!PH3j?JpV@2|JoFT@odf+Z_*OL;2&R@-&UK|V87}X(eo4;j zGk=&jmt`I=642|mKD_XbDmPyrA|!9NlO)|UbfYK7QoF_IA*ZOi4V<{J$^Ts$+XHNa z%lCz`E!*%4*oGf0=KkYd61%x>2uM>|brMBm$6DVS&yO`r-=4PQietEyM$Z=!fk~%)rI@{O>oM;hFnOP!ry2Z;3xcYq z(ph))+AG{0>`;^c94Gkh#(k3WLDIj!`~_GZey&qqOqBgAgEi%tJ#sX_+q&G!_B-0Y zyeVutc;XrM!gb)%ein!EY{6^bwf_J+7M60*pGhvVGcfvR4=Ef~=6&>J+`3DWQ~yd~ zl04E3e9%q|1i`OQ>m1R}Fc)JTT6e$3oajn6proFey>P4D`kP1_2IsNU_z33~^$6L` zAFN>5@G&3B&@DErSp-_=+W>T!*nb%!$k={bb=wMA*q?xmLBO7}8ydLm-$I(9^+R09 zOQz@{ei<-QOR-68OimBbHDCu^ z9e7@y7>~%mb6q+10t}00kL%tdORoH8kaMhh&SSd&ZU^^sb6|5^gfPree=$ZqyDBrW z|KCw3u7g3Ud)_o{&VMWl*sa}8Co4A=W|$%cOgsqH_|3*Y4{c5LNC<>-J28QV{G3~x z&5-Fc@PJ`%FG(gR-wf`YK&DBQF!+CE3esW-pQhZznTq*@u|^F;Lze^pktukjw#?R! z1s83SU^K0ce^~n+>`y=rpL72qVXnWo_7I}~cRL~R9KD-24#tjfJArqthn*PY+Irqj z3kI$DBlhLN|By|QplS=FxwG{FlezL?O!hcS)?MUZL9l;$L^l*K6x|1Hb(hq9{@Gzg)Jas^enNfhxHiAzK6?w5o^K zzyn;_6%RA1vM~l7tq+!~O*ySsR46BOOPQ&p9*##5rAaxea+Yaf9}W*pg? z{YwAl0YeH;Zr^$Zpo37#gsjucC^qK4S~K1qM`R`aJBXVd+|ma4AVFPhMoF*ylhJ}+?N@X)f@0v9{fiT+jsr~b|Q=rf?|$hWsJIWE6jK2Kcj-# z0n-;2`S-;6&H10(F;2Bc0sXS#*1jHlbmcyD_F=wmWgZN7;5-iWpLRfwn*FFRVuRfYIt(Z{hk!n$_p)19kB-t_dW(AmLw z?<7 zN%r>Sw70QlZAZgZ#uPg-JR2%+9p++g8(^A)=$~Q9Wz+i2Dz0+jmir?r zkJmcK?!Ms7=TG$rxGY&O$(TSkxZVKM5>a}0*xNZzpcHlFP@EiDYS!d%%2U{!_-iap zm%lnrEcRNXvXP8(NHOC)JvzMItl#hI9UkUk1_Ue=lnaD(YQ}dOH@|L}R1$rz5-bKH z*ppBM8+_`Z&yR-jk{jrPuuj7)cPqZ{#dia|&`ZaQ&}R}LtvdjY*xUQ6x=edo4|EIM z6TJq1A*G!@)`r8-OYR~?X!yAZpxHa)>k?M|#~-K2n##pWB1NaaXT}U#o=r*DjaAJo zR1{~a9XS&(sb)@FQ+|&-^d+vt3^%+lc$V^{KOFq}6Uf++-GI$7&&Y96#-o;A+|ILK ztvU(gs7P};{yk`|CjYxnn+b?Fy3Rqg{LXiE@2>GS*FT7{z zq?*+)cs1{##E#gCNNKbjI(y1^Y4O{83*G5~^aMMN=x?N-DV;;YK{=%9oCyi}vF`+| zKZ52MmZTi?xxY|7^q0Om$Jey1(MieH3)Y3vd3_2Lfo}9mCwU*WMu`Eby*+h~hYdr~ z8(cB3VX+H*v;|NO$gSZLOqJ@4_HdBmk9RhaNU5P~>?$n(xNY_TKIDO&7es$Wr{~dv0i^ zD5J+(6Rie%#E&`W9*#UT?4pVy$#`L}Tk>-+6gSFgmbzCeEe-nL0&x9HW>Rp}rrzgxZ8&Qw%jODI~{c%r|Kw)ph^>VxS(Q{3ni zr|{Qg!*iWf`1*M*7JO{g^TGr2`l2!FVQjPz%#K@0FFZqTR z)3i~p#Ty!&o;Hdf;P%t9cPsl`4u4D6IoqIU9Oox`iz2&TGxKQQn&eW1>#{PSA|qcb z?xINl-fGOq@<&U_n)rvfqu^$$O?Gf8|?d1AP)s;)Mf9Ed^|O&w%W&9MSp3 zFR{HP$LdQAmb2?U8xT|Ps1Aifhbh*FcdB7^c3vR7sJ12QJXU_xwfU1_R zcTa2`&|fhRZu?FrN0IU3khfI^mJj)@h?xTM5lU+U0DgHD_m?`D%(K{-9DS|D*t}s$ z`}}T{&m@=2sRxEZp-T@oCT!>1M8vSH*rj#P`!wW;nZ9VyX&Uhn8-_}1Bu^eILPVB= z`LCWihd{*Ctl2q9w!Wb!>UH@q&f^J`NtcP>mbguSqyVshmn~60v z{#K1s+W)1lcl1LaEFl<0V^OrGktm&m)>;ZOKOR?Cyy|}jT6O_vP|VxL3_BBmFKDE5 zk)Id_Utz^eAUr0tq=tI>)I)O%BP0pFs<@;o%MWR`W?IuoL2PNoqT_yonPUU4dw!}~ z8`W#55QFlC3;Gs$T?L5&W`Vbc4&+z$4h1V)g|OG+4AtlD!vr*%1f_R=c#6V><01%- zJdwGdOPg17}C+g+{gVvbX+tQX;5kgim(ow5Y)imE|M0`-JA?UflQJs+{0rVa%I6kc5 zjZ)Tl{AZed=WuuL#?zkSX#c)QL!we&Qq+ke{Nu8rzV}5jhL#FPl{_?e70U4m2`VoS zDXhXxV|*Vx==+c`XpMR_roYZYFI#*Rutb1W<_EG(X{OlziEM1VtO6N!67Ympde3LK zTqyTE5NzuHexgcEkU>xlL1g*ZC29n{&`79w!n3nTI9z4e+P5sJ>~@eiAyy&Z7S*45PkS)C(Y2?rJhOWHUqje8 zF|hT*({?4b@x)QV`!GW*r|}uqAKmiRW2MdJsBUEfrpz;6s2h8;Y)=H7l4y(6$g1@{ zzdBwexL%71^nNh|`-zgr4yV?X6-13##9U#+R4&*>j#y`p{+Z=O)+?;jqxMeTrOFn< zj+ejk`w)c?^1HXxnD)(>V<1r&Zg$q{Txr0PiE!bh+tE)D)$)H$6aX>^pED-FuYA=H zGYh=Jp^%nkQF-CZO$u90az}Q3&5^~o@HUc=z1BqJoRJE8IP;#XWTdUS)L(BsgDSM2 z$rgK+hU^PwcTyZS`Z!r<-+Lnw@{%s^9~IWYYE`@{tJ6KRjW5;Le^|#FdUKR|njFmQ z^q{4|X60KQn+YFukK5jo!mdZ4L(=I}{ekw?7|F9kZw{e_9NUC$OIVoKD2!0=-N<=c z+WI6b&y==Hp@>4M*0laA*iYmwD`mYHc{A7O+(EFiNE0Y--{Zc8WwYULo3G<_r@h62T=B6XJ;n}L9oL%!Ck{@MF|zH* zyw`TEkpm_e#?n-RFmHO!kmV~95pGZ-Q!u~ydz#fO)vb+|RgSw?YNsuB&<`K8+FXOhBAtGkC59e=H-IOI69O#Rd@y;`W$dwyy80el?IM`QEllg@bk z^zq$5sj2qheNG6m5uOGt-Q`;!b>s_A$(;o^CHPH0dds+bvl4z@JG!J2HF9CX%L)XU z!7Gp@Fn+ntjP2}zg?p@0gdbuT_b<=sQ&?&%CymXGpGWQ-U?J?*UTTeW<44*4a@-~3 zJAT!7okZ!yS?4Kpxk^Ogx0X3t#YJLe#5jLz*t91b%(rmS6{?Q>?$yz;C_g%~{Owuc zxaH+LHO2iqj6 zK?>fB>cx?1_#y3!s3^VU+Pri-BZ-HJkRbopA{s6f2`ITn1T41R%d_eb9K7Xjchgpa z;K1u7FR4_3KHW`HAzB#`hoTz#g>lEPL2fE*X7$R02i9_#BR7`M{M?D*JqR*Bx$o{+ z=CBr3^nO=DrV=LM8c#o-7jiKbL$-Zd#`YM4l2Q>d`=LzR#_!z@Hzh(@<>uXlU-$L+ z(+i2-kCF#bHqjS~@O>l5#hS~MakKAPto4gB)Aikrm(49(as!<<-yd8l8`WPRnVXOf zHUYf z=uz^9`)((t=Mb)O=hzRjW8;REH@2y?HolSKyvsV+xv-dI-|_8nuRSc=#a-V-yMxc) zcqciqc^2e(dGp3wNoZZ-f@#}M%*ApA4%nem&KCubbtLtg2+k8=iRV1x&j(?7F}=Hc z+J1J&+x?nnDbYZ@E;2>PyOG=MY4<9v^6oTs04ILs69i%h@N8q;_qPTA1{Yh7&N{D! z`qKFyk)L6^mM9^W!>P1Bxc$$Tgu+hZxNt7*>BU@rR;3}@u>SXqjf!3a%*?bMnM4Wm zrA1ix2>o;otgbh+=Q@A?4!jtOPp_US(&QNE4^nknK3`ZaAgYdituy5E&dp-POxZkL)@R&RK5d7-l6~iE-H94r8qN~C z?DQghqqD!aLM@PQqjtWrX1yuewzuV%QE}}-V5J8-3nvkB2eGxLBI=we<+4cXO_>~{ zzm+>AxWQ?z%i0!<(mNu{ymwZBEq&%-lSgtu1$ulwdQQFE>J8-{OT<+xucOK$%Uo7= zVOq&@u4=2LK>~SxDyWV3$+agkBP_7)^J0kcOpEgxW@Hhnk$P2AqR0joW%pA+cPK0UT7_HB)_+B?UI9Zmt| z?0@!3Klr@;d&Tmr8AZRVYKR;=^f#G8w9DLCUr&?#^@AvvICA^T#J9fCl|29$5o-D! zW`6vWP+&7xSTQW8o#Qk;Y}I-CERVdJhJD`SoTh6T6Eb3by2*&!Mt5CMQj7~PdS9~T zd7|Q2>&RVmgndU8Of65@MSHx{Zc(Ryfj}uiPHMt~l&;y3e%OGp>u-}|RAP|+oQ!X)_I;t!PnKv@#Eal8co`3!6k@d4R|0>Rtj*d1wEVsnSIvyPFx!%GbYpRfRZ(qLwH)Ju?~KloYw{mks+%L^v! z0a&3k5_7NUeHP=!@$6Kaq4BFB%XiJ!%tSofr;d4#MH}VwwimREL$HV-2;Kxw^F_!jc$ z0PVbIifv2o8NO`ljf=ETcmf5f)K&6i|DJwz!MTN7d=HGPBi;5azqdVz@AC*951(b} zLkh$}zL#IP$oy$4ve7xxlBVll22q{pLt+UxSj!}wJ$FZc^)F+?Y+f>xhFB6N;knct znd+RJG-|iNbcTwh$NP)k-WRDyt1=voDY!wL%bkT7!9r^5{>P_XU%v>Nbz9T@5+#A! z2YVc8-yS*8RXCS_mE)8{W?7@}vo(y->9#@pwkAq-bInv-cB%A_Nu83w1vigaO0Kz7 z{Mpw!%D&>6+N^LEsOq5(0RXx}mQVM#pelAGh?3HGJ3TJGH`R;bUrvcrYPxGii2D+) z>2e#{m5JfF#Q`Mi^PL(az+8v=h?-xkICmL zwBkTLm2~RK&IH-m!6>QdwAz7{!6Lz-fIa zQ#2c8dcr@-N-A}^X#;p_Gbk1}vKnNjwy!`?y*z}BJ^n8;#x4q8{=F!t3oE#SKzkpx zi6fpR@=X2*^E!4GtT|dW)`JP4L1iEypWf){7&8qWa&OO}BreXQvdpWM4>;Wi`k$%m zOfZX z$o$O{5a|LGzTengkb6ropk~Sm2%#bKj4$`r8~lb4Ya3FY%RlvJPyl8FogB=8pMlH> z<_CECPR#Z~!=!)b0;m|o@0>8vWrB_Mj8Y-~%jnmNOe7XO=9mlEp9*9@6JWms>InfP z$%;=<-#V#~*r6H>_Otf|H({n=4F(MpHb(6%{TCL00vaKQS4u7B&CxItMo=8i$kWp?I11F?X@J0m%hf0g0Ul_H>StmZEs zsxY7TkO2liG8WbScdkcQ4uD~&_lsvSq4OUALI%}P$pc^B{Rd&^E(ekrRCZ#HI=5Mi z^4PKM)EnL znG6MFFgU<#V2{sO9NLmZlmSB$@+AJgt-3AfAC8>|qIl6Y%B*u^-_2NKWOnx8sV(6^ zuLl)UIfDN(B=P?c^TeuL^sYoy>t2DPILSLXY7|^aa(m9E+ibMyXIz){&4wL6YkADz zZ?QTM8mEtnhzToDbKPe8v+^_x+8!JX5ZvVDeoGWBuk4y$UT2l}oBvR3kUGd`?>VW3 zU0^VPfB0$o0V;A&~t!4kb25eQwm*Qtm5I=?%-_eyd7q zil-pj4CZ`^Sjw)S&ON>S(A2l+-qjSE5246$`Rw%Kus*yy#+an}GijPxKyyIkocoe4 zpN#$6wPouW-*1`P!t|P}P zaxWjDG9pkOGCoBg>nP`K?m9U+YNR-TK64sLu93H*5#NFOA)U|R;I~))-U-FLmde(` z>YV<#po5?yG774Q47LMGqQiSnlBqay0EC1lWxL?@B_W4^`p_1q^sa_b{J~HxPRBEW zM)?~%-<&StZiN0QlQqKD6Tjp8x5Q9494OgqZcqdIR3{be7P{PAw41JAh9A(oZUgUw z8g6p4a{_De;|v=ad@P7@Fr#j5K8cBNM?na8n_p=#bYH*i9t}Gh0}@utdlAl-`c*P# z9VMD%uG#R%a}uCm(|0D{8tNCf_Wq=>5?=Mxj{aw%#GKb z2AL=PR4h1IfH0_%YL8w3c=Bh%DmyQ}k+e5`C-Me7;_y*)P!f^`BotT) zqL5hp;ESud{l_-TMk>g}{Ziun)^8@w_#)pqYu%#}eD+xV?-tUTaC>+ylVNH_8`=1q zgf-%Hb`?*IacVTSjfe^5Zu_Xr9a&izsFNuDbRY5;>;X)&94WH^nN!3rR^8#dGYk48 z^Xpi|5d)CKdZ!!H-2Xta@Ev|N3UESvgQ*`DH=JV8^@R7f)W^Afc)1HRL(?W~7H@NI zDP#rE?0DdmlP8V8P}`eOPSqS?Q zznMt*Aq7+lTqVw$pDVR3C0{M46bY9&xZboO_D`8*r+w^sUBFwmZ z;=@f}bn>B _00P%y|217^ZTf{zTo=EE=(J3w9twC1Tq?Qd)NRoF^4ojb?^{oWZS z8Igp0ctfpoNFo#_P}0(FEM@^`>wBeGgn!!&Xp)E_Q`KDF_S4lpeJ(0%h&+(c(X3En z(v>e=oK>1JH)@?9$3wEE!P^qWu!F|s?|W*6yxMb6M8TgK{&#Cn z@K4qC*688__%e*zcSKope9SaIp<+_{zBuO(X<>ZqMM7Ma!k5`pv-%;Uvk^%OLK36A zv(Z8hv(kFUd0NL}T&q4~q)TNPl-{W;$BKhzhiwm!CCeSYgyXrTg&1*9@rw|9Et1xz zKUc5PF+AR1;MxgL(RxwRGQIVW#7i~&LNgY>SHl;->*Et)+8ANFI)9dWEiZ$}&y~{? zV&j+l-8x0aA^c0L? zfKiem(7I}Zwq*glrB$;RXp;pmC64HoO5aW4SH zPuw$2qu!eN?K0D6jYtXeu*!2?4=(h+oK|IWpW1S{=|UR-US%Gc>F>mp_eq|)CNw|O zx?Hp;c;i*Y;~jZ=i&O>GD`xs%LuH@Gl0i!`Cu^!E zRw}2!qAe#7A0Yh!xeHY0;Maq_>Gz-74yhBDRh94pVabcMk%iIT)(Ok3v5%Ev^FN$# zj6bcmRk_?vd-bMVU3tU4G+8F|cBfG}RVZkw8X@g!8dGc)Qn@!o_VwZeeJg^2U3YNl zd?fKmQ_=xx_DtV>h0t*i0}&zi_Phm?or{8MdqJ`2ete79N|`{oO3%=)9P<}T{_o4m za$t4XvmN%{ASkC3IPM^H7{W$PP{(e`<%!R-k#zbkkZB z9~O`E?>#DEfVfJ0Bx{C5y$zsTGF8fuU}wGMrcV(hC&R{!2wzZ_Y$s{XOX% z|F7Kw0Flnl_Gqjjvv~h}|E#g5T*%13qXbuAj#72uqg)rZEe9;fE<=^t+PokAeTI1> z79_D+KcOLx>(P#@;~iSQM%rabR@b<#C+{jj3M>>1V8o^6&fIa2)~Sy3b17svok4-R zJVp-~+rY{1SqAXcdd*7>lXl%37fS3#Z_7K7K2E$=e5pOBc$clDjIBxdrG0dY(OwIW zm+-fhT+mKmDFV?*%P>JezA@%v=Bh+{${`1VXVW393SkTWmZvURdRPZ1!P{?iCOB+HENlRl2SBY@}1^=e7HIF z+If^4;tbV+uF!}BNwLJx4jAf-6@PjC`S)*VjeB|9#79$dBu$-=)T-q>d_bF@M_jqP z!(3_GxHG1}!msSCaD<%rFG>jk??1Cn#P%i)f|_iQec~2Gz9{EkLzJ|i85w@ah9OHH zwDL<&Dl>W<_r1D9Go#9JW%Au=tLltD6~`DUAICs2%MtbW4_Sui09Irgx-Sa#SJAUK zv?;sp3+-#O@)K$wIG&c}R1VYePs5G1zUeSqk~#Ri4%7T-)&1AXjnM-TFUKdfD!6}8 zkW9qcHs#@LDThYtFiU$q#(zD%KbioM;t2)CKOg3K$9)+_W`#NT!SBFlJZD1$Pfhk2 zvDr_@9V{`RbWRBlN*tdoNr?xaZ@N+^8JPgEv#b`6(){jeSMz=T6-j8PltlE;=M3K% zt5jrJHTuMJ_1MzmD_DbqLB8}HB4_5k7f$-qnNCq6+GaVua14IF7YNvPMhKTUH@@V0 zt0y-`U3u0sZ#b3#?eGE3jXW#r!o2dWZ59~PK4s%e0*3bIvCps|O~ne^D`*K6{9zQW z0@}~*E}nV0_H(ib>qZl0|MO-nSAdkK)>RdxZa7Zwy4j-N;0N)?|sPf3upA1q%O zka|1b=j)%3U#j!^F(xs;kd(0f6vdy=hlOi^j1&}-(&md_R~;gG)}GUPN4G@?C}kMV zg{fdo2wegn&)^H4W$?8U3|FQFTv@82*&wqw!pdfe#}ehmTl;zI;vi41z?u((rsoU$ z=6x2UV@q7R&%+6y;z?TP@s314gJU}gT|}1%=B&?Ju?HFkvOhA>TzuQ;e+a zBTNW8S=rrR#Y9ao$KZ=w_*R^ULTs>NTJclU7y5)`S^G3|4(#>#ae?&7v2mzs)d7#V zwj2MH1$w_9g^;yoQx}hK&+RnzI5LbXxhNUk3MxGcvvHm9<#+I1)qWZ4SjD`_KdtjD^AqL#uaJv?(Q`s%n-|U!2P9Gk0N;s{yfGid!#AC^DL z2oP2OS5Ft9?*;t`eL*2yn<&eWA0puh&)^1I)y8N50Osv~4JPm!_)U7|*5W_s(w?l` z1cWc5^}8CNpQoni`Pu{KD@62&#GuIB`tL%t(zVQsB@b_1gZpatnEL)eeeNxBDV8ZR z*md%~vhT*r8v3MH;zc>xnqEaJfB%4a!t}!BF56?y(4o+-r{CW4YUq_u^WuwyiMS=7Ny~BVwQj-!zm&1UZoVb_U8v> z-9)02(`ZTPT=N87;&S-<`k=W@p5716$aeT}8nsv8J+D2s(<(3YAGh|ig>=z`?d-_l6j0yzJt}j_rNmbW z!@u28C0p>ly4pAsv_{(Q9O##dQQ!L`(^WhYKn^BNB);`nOPc&F|2l`$5X;1r$2}NQ zHcl*AhclZrXK<&HEzce2_EHGy| zp$pDJnqLrHZc)f1y6fH5*B?#OpHtNuF)R*aKk7>b=PGeK2qQ4{W-)72X@`9WGg!75 zV?+i2>%2oX8tX$6s>s+EoT}=VO-+e|Nez9Hf+QB6e&RtrqoA7Fnehm3+6}}ukfd=$ zfAzFO$_wCiKdii1j`w}CYvPZ>r6JS~B8y|>Ii*z)i`dp8&?|USjn3+VLrk%radcAR zH$Os~0u-hV?*RJa4FC&z){Z`H;#&?}CX8cGYfSC3*;^IzZ6jjbt99(}+Sg)s4HF42 z`}5y9U7%j8-<#X{aG~J}Xw9%8t15x-L#?yOD?R#t6EDogINmRz<89(Ncmb#jsSo%Yu9qhDvUSpNZh}-sy?vXo+$# zX_MQg(_ay7&l^vylr^Pha1 zwR}KL1W%EN+NS)7sC$6l<28gcD50K zM1p^CUkW6b+%)CMpi*>CHUte3r*QW^85pGp<|Ng-r48vj)KSnFmp9#R$ZUV5mmyR-;R&kf@ zSk4U=@}5;5uc(CpnV!QWEnXRulML-{fwbGgZ;+W!{0VFxXy<0d^Yk4fZc$aUi6pY# z0ZEJp1Oz1HOEaT0dB9f=I6^gEM*8kx`1ao*b(KVTCc%tYPlG7|psgS4yKhS)fDl0A z!lJN8suTM+1N!Hl3}9D-E?2iDWawx;2?wy)R1A+d6Y38H(J-hNFhyJfA75s?4-cfQKd_KzMhiPZPb)w!a2u(+Fnh;AYrF&^;nA@>Tm8P+pFC!a zy3}Kv%uF@}22UF7^vSd&U#-pgPna?G?gM@M@2zSMP%&g-wVdyN(-iFE1LTBU{ltwhae$nQg*-?h@= zpW_=0HQotpbDzxFGGm}G4-m!k+~1d(g*{*<4RG+EdH!*OkXmSNZXw2~m7ar3|2c8T z{sO1>aq6K8wyo(k^cllWp=^?l{>R#FgAf7kXanXQ`60t5vO2Vn75r;exPOBeqg=eh zv9+EjiHviZVDvzcS*-%>#VcS`8Y&+8Ufg=(b08VvqVbWfZW)Z%O$Fp9zo_tMB-30# z#4(_bjRiUXONK*D1EcwpTA6P(&oFkUgHWR{nGyv{Ujd9YDTSZee((xA!!dIqAR~>FhD;U>duto9@<-C+h8gcL-vMEiXzF$#h#VH? zi2u*G5d;<@ilovBm9K1_ssEMS0TL0^(YvRwEeTd1OPidH(~`4~?KN7^ei<3~W@Tut z3>{*(kvUr8Hupd?MK&WwBIZW2^KI3VbUk6s+2Vjn&BThC_k+etwSZof2$XBH+IrTb zM^KfT(7AjF2!qt;Hxv*A*eC+dEfM=OJO8_z{s+#KSh4s*Es&*{ZumN1A9Y>!fpJ!m zoo>8nfaq;@rRK!Yu5Z7eR?d$EotH!EHJp%suam<+zf&*VR7{aG>3qQuu36_>fmiCI zktRTWWell{*;Vh+8R~u&%yA0&#!!=Zet9JA+d{WdZw50_)l9b_@oe6Qu~8Kae|&4Q zFzVIZZHY?BcEpxS9jgP1v7L3?lPR+R@aN#YPEzW0ks+MLNwHp`7p3o^G*xRA152&( z&O?)dPWx)=gmN<;(7WKMgQR0fka39`A4|$%fclPfj3zrpK@X3e5$(rpP zr*f41!Y!pd;swhJMzZ~&OUoWm$g%1%bi9l1wb)Z}lYDCRoGp_SlhM!6I^H_$?AXSr ztAP%xD)0ibi!HAdnIhf^S-sOmVG4-bf&s2MNtfNuTM0*=c>3i>lW2;S%D6X1}RXT?_mg=2wG}xIkIjK?RXrCt{U?`jaMo){UO?%27?u04@t(LJ)@o_`z0y#%5Vx3oYE*#4KR2n|%eJFm|JEkbEJu!XhQUEn- z%0=}}Y^#K?q4&=JQ$H2Fel2wgp?AMccDxO<3{R;R?+n1| z7FZEhbjn4~qdbg-q7vbptr%>Ua0pe@KM?>6-mM3sq~Hp)9Hj|F?fVh&ez9)+pO6Ua z$X4P2b;aHBcd1}|sOHb3(@NoPg};}NvWU384x{N->rHx8`Y-&_FHfJeF>LCvisH(e zi!pNCR$dD3laBZ!m5mbe84p$m9e?KnxZW-0a3v-+o@gvXw7c2I6Cs0Z2IWwKwj;fh z7+sl9URK>R#DD6hftW)96}P?NSgB| z-R=rWkweavL(Jy5VHi2)IK?&$3uQ5*#fHt{`*z=^?$6`%`{Vcj#~&UZkIi*>U9ZFQ zb+}%ac&}`a{_a9G&y$+xz?B5fLzWnu_CvE)$oKG#>!_s8@KJF zdgk+;QR!80*7=qRKWlpys6YZbqoT_~<3`LsqkPk2O!B1ce3E{8=(wN0{gOn>t8l2v zws`YdA^O!!pQc|jS97txewh`RACP8}w?cLs`Cg-@N-sxrU0BUI1mrRZ|K2un>@A`Z z+jf1-C=$=VM=iRklxdt`ID}ZV%ypE{2{KPq%0#tjrfe<2xD2@r ztly2)V%!*27%~fQGH&`9E1|-xKxzFpaWN zh_nzr>}@=Ew!*-{6A@Vyx%7Gya~RV-3Ow^wH?bQuzd-6?dJn#>>cZq}1G!NbDG6m_ z(N5>F-uEK+=`BYb{R-r_lxXQa`vE*dvX+;FCw+*vdZkr8tAK_WMGck6aQna9)wE9I zI7=|j@hkj}EC6;jmYAflhI?vvu9mO?ofsoA9z+|I(TmA!7U$>2Hj#rKdCg4 zlP*NqFNu5D%Y+EM;%Y$q)emaHac z@LGICKq64#xmmA3z~3iuY}xE{?)kkwFZr>YYgYh7a=T&7Y|Vt+a{=}bR88nEH+t9< zEkAv?XUF@3YMNuti_+XQN8n1uXzv*8gM{Ze;(@|vWxqki10+h{*-5?Q>DT)vwmFMi z66K_{%|2+RE+1N!kk8k7cLD4pZ-1(Cz!8-(@JivY#d+e!*OiMImr$W)?e6|%t)I)U zEBo9O@P58!0yRqA9pv>IKiwO!diMaXBT?94wh^2S*+>NnR)2O;SFF+I>@U#W>Ximl zxhakhx-={igDX~~Q=d~FyePkW@3;>OU%=W4WrxqQ``=IPejqA@hdkPw2YQeAQod@+ zwBgfZnP6vi|A4gPcZonMz7%8Mbyu*;7W;O2whZ?CR8KR06SYC?J5T!!{-SlwN@Rlq1zjO^U(C}ALqF*>thou%p1N5nN{szv ztLM~$Jb23U9X5YZ>x_b|lKhw|zRcfmLcPx)T`5p){_TFnv#Fi!n}WCC0(mQCesWzg z_VDUvzt7{Dr$22zr7wJKYtNt3*Di=1JG%Rkko+-uui=Y-&^F!Nv%ldZG;wp>`7K*q z{k6k|T5rWaeYpE5L1=T`o+H;k2;KVQg22(+6AzyJ=&bQXl2(TN(tS9&n&uz`1WgTE zo<``xODx%XIi@;OQRzGAqS2Lwl*c14#pzX34L6`Q-Hco>p7Z=b0AvM0?d#;0JP9*y z998w_I{_;K(oo)6H-5wZ?=}y^n8WC&)Dm~8<<`^nSjyzJSKM0PvPti&l6%tTYcJMS zN4R~=cJRIrabdN0n-WIC+>dpW?cjsBA3qXObgNI#)NY#FE)_KVJS1r;DcWw&&{9!k z&Tz=s_f7SVdJFH}sq%EY*}s02)+`Q`s+efv_PQL>&g(txEyewLI@=_EF_7*vE&g2l z!IKu3h~^8ysB6&vHsQND+H=U^sjbr`=9zQUQQ_rfR5zg~71RCU{b%X(3ph8a$|;S! z-2r_Ehqqc4=xm~Nt}N(*sX{CN!F|y}b0-L0tu-TGE&ER2S)qeFchZsU zpx7+mty4KGvmd(u)O~%|#cjV|nx|q+8jF!Rhg1q)oNUV;lsXYZ@H-h(!|^!YbmpE# zz)u?TXmIYluyXZCh^^$xKDM0p&mTVqu1@(k<&$m3i2<}Ai9JImEU~}zc-YE<9S7wuES-KJwJ>4&w*tmGX#XYByF-(HUxCcCdK7aX4tB7C zo-((KYNI_u8@Cb0sc5km?@hRCNrpOw_ZCwi%fpQB2F56oQ}|=?>QcjP4^SOhcK%YO z&ZE(i0>sA$k^Yk@&d{Y5f!8KE{Ah{9ju(YYu|$4A@z1Iaf>h2v+_F9P>W1JEh}Gk{ zlmMIgpJxer2xU}9(QQVqil*{Fu0JlndLjlKYtSfFu+sbY@T+LMGw$3l^q|xHk%Y~Q zQI6$C^VLtX3W$=!_w2l_-Z;dI>5S8-G%Jj}hr}Yr+f426!Tp=W_4JtiZnVLAIfuYS zd}RpDuk+h5Xu6;E{;%;zNrsEoPx8hq1gUZ>i^IcxyB$OPyhwVZdP6!joI)*{Yzmh* zr=%01_r$ap=i234=PMG8r;W=SeOTgX5%%jYH7bzWm8Bk}|5Ya*q1DF(B@{-XhvuKX zlOrC+VdoSGub?~})=gI`r2YJGlxaV!{jNBjUjV+e9Uu!Od2r3uy0u}WFm62Tj;L4T z?y}_*i(_D7D)Pfi=I}~Oi2Z#dH+iF82Z!MBZen`yKIRf{h7jan*~drG{d- zy~l@$X?0o+fvILvIg{sJ`vb`W`aoN**Po-HWI@tI2GjKen>O!3=dM2xy*R0K><=E>wQR6=pOGDFVFa=@VoeP}}tuad~ zO30A=4p*gc0bJ;CN*J@HaplB3eI!Jzw~g>)`gCJL{L<7(`rqApevO$0Ei3yI6~FA} z>yt}>K9S4c%un#D3MyWxBUeqPXhJ}_0rFlI-{M;|6+&j;NgW9PjKz_d^dI$f(_Y;% zHa*O1g|b`Di{TLDCFIsKFdk6XlJf*o(5L=7gts&&Bo)FUUZ0qeg(^K=QRgW=8I)b@ z_W8Ubz0yMrk*k_ab$mSu37JA}-Rip_1XZ}i+=3=KK z)BjS~s;m?$3Q}w4%XZY$mKgoV^`CWJKf51i?4Th?UEvNz4Sy;)2RX#?LeA+9`>k*W z3eo;OPpc(^Mx2H(M>_<`PCXD_*Shu@s4%8-<>cZ*U76p><@-gxm6xXz+8(dL$-)Q$ z`{3Cd#iijnGGg`W9dn)Fx({fA;;u6$y07|$&r-~Qj1q}o-hiiy5nU;pnEGbyqn&F+gmSC z!<#g!hYa!9Es~rkGC6vjx>1i<*qlmQJxbb!ln~xG811`ty1ERyOKu3Ua*wiUE@=t` z$~A1Yj5>J-RHqJH_j3&HdNcg32EVNAmfnjk*L8w0)rCYE#chd zwuW}Yf@#MZrNvII&K-X8NaFL8Q+6S}I&-_rXl`>Y_e=o2t2=wZ?eR1qExX45+C3y^ z=i3M0E~U%;Ia+_dtk0!Co3DWD0ZS#(lxn{g3(dH?QAUS4VAk?kR#jBPNt~wSF4*O^ z)N1;-obHdVLMqx%pnv6Mi0RAP;3Xb0UAK)CJSjdc-16{tQ2NlbM9*+K--tY7y9T(zt1?m=QQu!U}J%xska42R)=t@NB+Oj?YLK{lSr& z|5DHbRL99<;QoG6J^#Qs^_2?Zr%wI5XhQw0301UuMSR$i*z1i@KdBoc{zv4C!fNhg z=5T}Pa!oEpuvv2d@`&J76ZDxMKde#@U>2vMVzZa#*i|bQcC^uyN zO7)4V(RxvjWP=JnR+e4RR0Z{`O|jwI{)dBX?n}|bXR9kMBgdjx59#S5p7Mm-9X0Lm zCgJTmUV6rdz|ZH3ralSanuLi@Xznxvf%&&1tbNonX8CcduzyZ9_rtJyvihsPX}LA> zC&6mjM?iw$aVl+>{*Qu0{f<0 z9uN8oPA~k$Go4PtU7CLvQ3+j|?ja=m?S3Na_rU?A?eJBLR)Ne}AuPVTqUh;aM<$5< zs5wwm$zr^2TzMGKD(Dwc>ArTuq!#FQ;#A4NRQ?h4;KSpc;*Tce(X^G`o9x8DEOK@2 zW4varZO*;H$EqrTec0{Q2;9|19+m`Y2eB(@)khVEZu(W)`}4epf^sgog9X7_wKFTj zjA57be($Xw6E`?AhEfRDrbrdGp`0c?+`E)_0o^m?O&g48R*YOdAtkj^F$v!s#1B&)4bPx8tJ5 zc=bsf1bFRDYUD`{n}VEu^n+l!Ou=huDs6<{W|=lR&ddk(=)S#07Bk+5o5S;%b+je& zr|uH)H||JV+VYQT$DM8=tk%@2w4Tf$5#kD>MMY}w^YYQ5iB@@p8OJ@E0P*LBgR>cV zO=nJ;^b*Rh?P_u>40*fq)4b-OZt$2)V*+)MYxfkqX<*J_YuMSPrkh$iSI@;2V#jC1 zg0a`cR=5z|cP>wM6TX+-=KrY+uzP;pWEiDrrB$xC3+yAcd;m*74+U^zn z`DOndvwqRy>hDrDBFg1=nURBw8Gs0P@dj0^z9%40L6xUu=Ty=Q2g`Yw;nSA|aFc9; zkMizK)QSK_Oh|+yKXD}u9U|sii^7|mmG$N{0PR( z1dLMh`H8?*?qp;=;imS`mkh+*Hb1~is(?gZ6-{wmG_i9S$bu5X35?Jn)0j_zcOKX* zrY!GH4Z1x4ZpCNl!2~M(zJ>qSn_Eq&>wILr%17K1enH0U5rB`9!(h9;B)~v!ajSqH zSX*Ik)l2yBdhi3%#CvNHYsHT5g4bRH2=V-D)EBWe3)_{dZv_aNcWf``@~!0q1y~$6 z&#=SX-5ZTjIW)souX)g(o~kLZO)RU&f@~njuiqjcrG|aJ3BGK&N?L zv_q-6HBX?VOpn*wa{7tip$wp*#Xkf61$ZYCi%MTM@Q20f$7Xs=+3YuW?ZlsRfg%^rZx;_P%`!f}G0zA>nsdXfn^+;=1`ndAb=t|NTv(ypM81 z80@*Q&ze$L%@E&HrJc$Ocwx|6@vf$t4u)8 z`{GM1{ra+}Fr>i}P*&5VFaq&edD*%CH1z6^F`u)AjVku}!$o}ka1;6oyxP-We~ z)h$I9esy2`$v|U#?fNzKJd1j8r%cGUfb`@Wi~p0l`!|2b+R>g=Xe@J^2Kf$NE z{kLrKEz;)x`ANI@LabZAJS*=r%?U-El<#nWcTjk5mfb7Qof8DRuOAxyAK(idnW&S` z=mLS+Jc^8*ZZ;PLGt6Vi6uNP*Cyk&39Vl0&3%}++iU*ugt>KPRR-Z;(AxZSbNmgD= z7}IbC@6G!6^b|1u|bWp8S<^g6sFmXO;k=8th516@ln|0-2{QHuy_neoDbY2tciwSgp>GVdDkHsy7!S`Xa{mNM zzD*cME>O|B%i9G`?VBpC9)2ud2fV7baO~6@KBEGPDF4+%#28^L2~y_}#3c2nVg;V< z!*T0W2c3-SEX`i6X^z4!0YfA%VDBpP`KAkk2fZs@+u~E+sU^9zd;wsiXUt(-rJyej zG1sy(=(RtrfB$^Kf#`)m^=S4;ZbJLq_(`-&d_kD4@$i;p+B5pj=gE3C2FS zYwRHI^BX=_3~laT-uBiX(D;{HKpjyOTQEW%<~iU6Yc$iiRA)&!&#x`{XF}$-_Siyp zxHSoFVJ~M#QC@y@zRpsUPrI&UeX7*?{id#+f1jwxt6#L|1EM3}r z36N>Kr!lA`@l_mP(LYd5>yP+mgkqS0QL%+_XVy6p;Ht=@U-seRQ%I+wh__@+L%;4p z216b2TlcR+jrUuE1xlm-l22<*NmQp0=iuP!<|XSqns5ontd2bPy#hS+-ai z6^}_n#TC9ye_D9RW;!?1m9bmFhxuVD#=)EV* zry;864*jdq+7!Du&3n=>b-+t5<%Kl5{Zw7D9w<0R_JT*zf@eBn@iLxhuhFKc;f%j_ z{REq>LGynt?%wTo-i-&GcpPSISiX#hl4>Q@vl6X?JAy}98rW4nn>Vo?yevKk!PGnu z#yR{20MdW($gDDeE!7x9K*8INR= z8|Xj7ZKS{uHQLyME()AJRSc^0og4I{D}#3%{CXF5L+DGv-a#xC2TKORbVVM16cgdR z%Y$+raZlNZ<@>K*k+h?7X=QS%5jEFJgCLQ<8SABU9)Q{qb7mzqT}OwzoN$69j5aUY zq9AE;hf2%@!8#%zn&zlpHHFgz9(kK8&;aR|+#q(?1u?P16R3hTSvR;9I^^&p8Oykb zAYn?UhC#WAOW;Cg{#Z^^z9|Fk7pJR zMz9j2PP#*~blQB0I&+hxl#btktA2*vmnLy9AzwdqOsTw5-vp!kYhERl{5H=~>&0&* zR1AA4^CuO#@YTZvDr3DgFmI=OM?0H6VHHE31M9#O&@!+&T1d!LDSMvJw5zyS>{{&< zkR!-L$%fkus-dJ|!G3^I$3rY(=^5CzAFvM6w*}RX)P|GG0-u&?uSym8M|R}K(XK{- z5$({uftt77o)Y(#!HP$kTx<)FdPF&|C3_rsI)u~f5`C|BS2b z3MkYId=*^1{Q*n0!C5^@yubi$b&ULQvD^_Am{-aUJp70RGZ}D;zS>(A-~&iq_t#BM z1zvw7uVqPB&$RG@0H-e)c=B&J34#&ih;5c}Qc^|X4QXeM^YB-Xo;Zn8Rn4RI!v(=L z@ov3_FZlc&C|a25N>!0DN^USlhZ8LU;YO4?KwiDTs*+&s6CSA2W#F|-i^FW2Tzn&? zZ7vsM=3}AGECA=Q2(864b67pzI?j(g_GRDWi)j^8hh0bEOUMBV98JzaI?4xlAPie= zU*jXmT(zq+N=Umh+|qmka7S?Erwe(S0+=x~{xN1)g<^!g;)P&8i+vj046q1C;LBW# zxvb92N+_&d4#s{4)+!tGsAjtpNK99lV-wpVsQ3$6uXJecTaTN4!oHw14Hq4XHl>08 zq_ciTxPHn8Xfdv>q9hIFVXr+#%|n$!%MFQDdn&kwQRf>ifCB9zrO!JhqdED+->u^({qm|53_8{U^F@d7mZya7&dua zA0<3v7>;q(EUoO~$T~5h%;q(|gv^c01dUTp#53P`Gu^Vr@}{U0 zC1xt(l*7U}vvnA8elz}BMwW0gNHpj4`yM-*rH=B_fWIRILYN@q(#z4hYy}LKnFXIH z!#TLZqj<$Fb~VZv-Z_>S>^JQFDmdkGT>+bIp{VBoq9mG@+NNXU?qPAr5nXimp%9S{ zHbR}~;62Wh-6!mGt=I4|pP~NP`~4UzN7`*_%eas{R++>>JW$$7zirO~TXT-~yKq^Yk!8(pRLFB8}bj__lLzQEYhJj-aukG@u z8zwf*9B7UP094aRSUy)No1{iF)Dwwj2qk&JP(0u!)R;+AezlM41i>w^3Nnt^!v!Wr;X4Ts0}@^V~R8J)2eT>GLX>beNq>Yc9e^zwy;>p5v7hLhP&O^^NN+W7Z8=rM{Ka zWkt`}UL>YK{HYfTV|I%mA$Loyx%Heo1c9?;pnC$vOA?xb2j>=$D8>Qe&6+q@7uFDR zC;T@l=@)q#`zAt4?kvg6)kAU09PH|m%0zoBfG7^?X`1O{3#x2)bicegFCmJR*Q4^`(`nlr z9q0ItfIX-+)-a+f z{P~1@z+<#DU)TZVg^9T*QszDhcoOQF^PQBQ!wf)GZA3BY4K5zdK{hpHh>863rjb() zC{{5t3e}#Pvv4sk@_y%=;Pr0%B92E)M4q!F?h|d)3-a{{4#}d#C@QXrrU7C4KaY+* z)ScvieaUj-z_jZU3tz7D+B`V%+b-})zW%B`B4Cd=eA5mHC$0Wt#9lcw^O-YpYInTz zny|9U*bqC9H0P#K0=j}wfRQW+r@|Qre^Z}Iq38AYpM2t^?OCf)?{VTA)y7#D z%Ys9cL~>7KSC#+Z?evj)bwRM;&9xNIZ&M~DB~KX1Tp0}@Tc)?p3q_c#d(QZbWs-Ba zr6Humv9GUSjV*nVzl9h_MX$*manpcI`v5mdnur@{A@mqTxyeB^PbxGm7Jannu0B zGj~o>pQ*Ji=l=@OiCG?r^G{)4^3E@pXpU+oS>`TyQ@JG31lxBS@X@4nEmLo7XM%P; z8FGW4RrmlH=lO+1f`i}7+zRh>uLKe--M_sI{=D4Oug63C`MYI*`#$ZCXd`fXze3v8 z-$RUq&6AxLGCDq->m41;$mvH)U^*Zeoph=z+dmD{Mzo^c_GFz;)q+-US(1Hhis>)Ie;uX3J#$n++Ak!(UBd$gt_*f zfNOYD%03VpeaNVhGlS4cV>IVaQIVblQgRPqnDkKwQgLd|#gd|+MrM$@(C3qGgs1$4gdjaW4Ny$6sI)lyj7-*hj+mPqka5iR?!X*ASF%+1% zvF|O~QOzhAY>w@Wjw3A@jA#(h0R$oiHc*Dpku=Y5T^{-Cv|n%FNxmZvh_98DL9m@; zLFLEd3P4{eIoN1T%>_{tk-;H$Rzh(s|2%ZLF(uO({)zI{&VJJL`noa?E!9uCcb({w zQ`X|3ZlzaIsQ}aHbvBo8D z>d1mF36#z0PK?XT89V7ac(_Jg?JUWvtSQ>hra%jv5VUXoK&>x_7Kb@YiNJ$$n#>Wd zZrBR=%u-5T#UXR|ATGXh&s-z3IAEeICJg;6w)vOfgV*n8iV)Qk&M3gNIL@(xYgRGC z412y0ryg&cqZ_AtB`;0O6tWcTNSPOFElPt3ssFmU_Gf7ErQt5kWjjKe4`yH?Dd%&u z2|Ftd#GqIYk{7UqDLNPFIOnrpWy(A`>^FsUZ&e|A50u;c4ufVE6AO6O1lk0FNnZ$* zcV{#oxCr1PKuE|@5CcN{AatLBjKj6H+Bg2*j~ngGERd2`l%-fC)1 zbmo_1DPonOY?I{U8u8|HfdRYE-zKC=-7O6;q-CCjCJ-0s*y~$0Uu#@Pj^snU(DPgH z+`GcfQPkW>&r@=Kn2xqoh+AGV_-tCl%M#gdFDD?UE#-9)zntYrnHveup!d}PVNZ?_P;ADsi0>#_#%pK`zcGwfUEBJ1pi*V?EqTv86~Y%;pZjCB!Ij-O zPfrhRk{hd)3(KGQMp+0XCFK>VJ6klm{kn~OD@6b<_%X$tCq_ssvGi#rXK~FD5iVI# zj80oxdY(djYtLb}YsX1lYo90RhIOj}9FlI*D(##frfA@r#?)S;5P6cZH$+rO=@Z?O z@NbF`AIjHGl-BXlUz-};^U>g3zkv^Z0hQz$Mb05-b0<2-VoO~a*c`)T%54le4q$n( z>_xq`uz}FAF4spY2ee3{j{cp8!7ejN?Ic|gV`8KcP?14BaU~d3Bv^fD4(UqI_yyLE zD7{F2c)h@LNQ;34jEzKkCUoE*d#W0&=0n3oQS--E@O$bMOyC{HuR`2+UgLiwr%R5<#l;zW0zP5i_ z42Z#r9LFY1&%l`n6Idzb5=2w1n@w!Q>D#nZcJ(iill+UGqx)`{c?HY0>3ve9>;ddx z?%>j4N6Nr}Zbx*RdMs81Oh4)*Zq&`sg?!k8zg`^IsLT+(0_-Zc-MHVfF{*h4$1#jc zLY-2(ihy<8)Ly%N{SSjXZV|P{2Fwva3bir1ngMyNfz694WPj%S&bRgp zXb3jg?6y5n>Cw(XiO;!xwu?h5VkjM~QG#T1t_KmXe4yJIdr$?t^>@Zrx+QomJuGF; z<4)8nOHOFRM{!qtEV4%$5OAMSZ(&@~5x!?A_BW9G{eUkAje=ZGp6OWiBM2!P>Q*xr z9tckj20m}zz9GMVT?BxOZQk1(!kg7iG$7Z}<~DxuDFI3Eij}jQP(WM>@EV`9jydz|#~}jtvP<_}a>lZ_dCHn;Qe~r9_$YiPIp6El*&#nN zXHQUPpe6ZN9K}NJaOKaFMz^y$k@O~J&mo%CSv|>Us;*^TT2lJN30lKwO725Wv%+KAl_JeG`)eDH;;sp;ku6}U`=M%e{psw zY2SOp2z64Tnq`%;XHMtK)6E4&9j5FBH3Ep~%z{jHk(< z|CCz0mX{(uaZdA>_oo>7Fy`?^N7F%#i6-WvhL0IVqfN7>iDJ$&M<90!QeW*^KW+I? zLQG)Ef`?9UoR)4J@g#)tSE}^NfN_Cvl$j zGn>(Nd}oa)tlD-BOV%)K3>}+*@QOGu2SIa#D z2-$7aUL#ct^$)48#_~w8w^>me_i=B@q~h!vmIOk$59Dsd-<$Mo?lOGa(|NY74}0aC zHpS+^Utvt`;(UHl@X!|S^*?Y$R)>#!QZ}lmIvyzKum)T%XgQC}fA+bGZchp6nT31PDvq;{wy%>5b&9 z=N6K-_sFayHHmjGsu!T$^LrL8Xo?PS?`y!xwen9+%p!xBX_p)n*C@}3e(6JRWaRb# z4=b>7bKd5OnAadkTho1)_znez3bi0lPfkRTDu2F-AG3QUfRH;#9Vk$?94xOss^N1d zU=$yr)n;S8?pGfv)D+M#Xtz0Ye}vqTEADk4Ghi(ZO@4ohFJV`Xclq5f>HrizsRJdR zKG!j!xm-neS?#X)Z!Jo#^Y*W@%5K$o{5*WL|Eyoym{pvy^UFeX%xyjZyQ0+PcAXl)fq`mtfRMep=Ge$x&r-CI9RJ0mFwF1X6)bPBGZD6A_Ka-@vzPMb0G1QFgYRws~UIFu@a|TS?`;ZVH%2yeF;mg9*0f56 zk2O}K;${LfvRdY<<_LRc_Z2|%=K4L;U6W30>(HaZFYKrKTqoy^r+ffS!L=u8w!2=7*MmOJ`~{0 zKkVlXRt_mE4Xa%4;hXlK=C; zqe9{mZvgWCEc^h*`vjQ7R|6yftX7+&=sA zjIq7HBY-oF$GiD`kBnsgjBohXMHdTP$>L^>IP)2E<_lZ>6*Lh=HB&L+M3l1D?6r zMmXv!^LwiUmelOl)6BcyLL)vLC0?q-O$|En8=L@BK?PfiQgbGv95PER?YFx8V&D30 zLa#T#0vj);$A!VV{hsklH-JhLm+RWkS=Wt+zFyV~iG{fG4`DT+S=$xf`7`!g)U$7k z($JY9l{zROy!EImH(>TU)Cn`zH*p6>7(Y3w% zp1A1IZg?pwUu;=d3X1sJUf~!Q)?w5RL2A+B<9oaKMhJ9kZ%jz!y(S0R8TGX**sCd{ zj4h!>vL0}EX{gM4MTWx3!V?CcE^E*YmxaAQ{o3|BQL&&H%ZI)u!nn`;ym4sU0qe}$ z-;brjT|?fK-&>mvIP*{26b;{!Yadt&hmWic^Jix5G1&{EtoDn9=5^l(NIM=9 zFbr1yOyZu7Ews<{dtSoFMRbA4q|Np{K7PxOi}`h(tHoy9=ELa6?C(tsNJB-(CBEjb z4c`@6TP&@Y@J%x?pu6wa%Ne(vHk%oA{;g4^b+-@xq7Z(~VqK>QDng2VYzmB~#n-dA z4{PrWzLHTBU6My(BEy((YbsOt248cZb==pnJUchHniHGXd@+EGcQ0qihxfJqaa_>M zFI5_P_2(6D{uzoD)aJ>Zv0CCb^O9Ry_$(gUDE!{YLYYiDqX(N}#}>jo+qSRK&ieeu znD~yN2USS{s=vZKXF>clXAHNXz6FNE5}V4Hy2Wx+d^@|SWVz+ z>3WUn1_33(7v(U)m_L6T@R@Z6^AcJ)?ziC6hES0$*ZOf!4Ss*1=89|=sFL?Bfb?wrWiiP0Vc)*DzC>d{yzim+H!5c_o>m{b)Mh2SySZu@tY{4BTfo} z>mEwR){VktI!8*j{H8&b1ZQ8rC%pu6YmfMz>z?m7A2z_Ed!fJ8!RTKEY!g=V*njrB zN$^FL#I`ipItOpwb5G!+toxwq{AbnZ^L*pKN6hx&S7z7r2Hr1dm>*MX9aB1#0>pOz z;Kz3LZ(S0Q_PRQI=idJHjf7_H6?2Ipj{;GF^=h6Cp?i0{sFh$P*MItT#8(vl7V4JZ?sKQszgRmU z(Dovey-oT*D-_&v?W^)|a;wa`gRO9)5E|ZBT=pUi_F8C(fAqBx+g^0pzdW1NwvIfn zC>P2L_TkGy!(gd<)+1K65j%h{vK%)k^96g)U4w^VP)TV)sx2L2QvmFU0yi70RkhX(@;}n|`!5@y+`S|*@mFuMU+Y=@>wyYTo*(4m`%eYz z|MIICsK>vfs=C?``G5Iz&vysl8sUFM|M$ta-4=XN*x~Ffynb~5`SeIvHBd!A71j4! zyR-jH^ilYTQ*vViU(x)}6=Vbfv>6mH;Xl;(KWXqnM!!xyGTeZF^8cOuq5d2|o656y z_zled=kQ02fX#{Qi~V1B4j8W~;3}4{SNpF2ui@i?%_+*tuCwF+_}<{^&E)?(`2Ur< q|99~JC-JLAcK=f(GlD`_cIygODHTOL#%=(93@)2o!d$rZ=>Gw?oaV3q literal 0 HcmV?d00001