diff --git a/.i18nrc.json b/.i18nrc.json index 4a43d0a87a036..b8bd8729139c0 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -28,6 +28,7 @@ "kbnESQuery": "packages/kbn-es-query", "inspector": "src/plugins/inspector", "kibana-react": "src/plugins/kibana_react", + "telemetry": "src/legacy/core_plugins/telemetry", "esUi": "src/plugins/es_ui_shared", "uiActions": "src/plugins/ui_actions" }, diff --git a/docs/settings/monitoring-settings.asciidoc b/docs/settings/monitoring-settings.asciidoc index 97fb891c95bdb..f08ae8e942f4a 100644 --- a/docs/settings/monitoring-settings.asciidoc +++ b/docs/settings/monitoring-settings.asciidoc @@ -54,7 +54,7 @@ Specifies the password that {kib} uses for authentication when it retrieves data from the monitoring cluster. If not set, {kib} uses the value of the `elasticsearch.password` setting. -`xpack.telemetry.enabled`:: +`telemetry.enabled`:: Set to `true` (default) to send cluster statistics to Elastic. Reporting your cluster statistics helps us improve your user experience. Your data is never shared with anyone. Set to `false` to disable statistics reporting from any diff --git a/src/dev/build/tasks/os_packages/docker_generator/resources/bin/kibana-docker b/src/dev/build/tasks/os_packages/docker_generator/resources/bin/kibana-docker index 60f94f7f38056..0926ef365c894 100755 --- a/src/dev/build/tasks/os_packages/docker_generator/resources/bin/kibana-docker +++ b/src/dev/build/tasks/os_packages/docker_generator/resources/bin/kibana-docker @@ -180,7 +180,7 @@ kibana_vars=( xpack.security.encryptionKey xpack.security.secureCookies xpack.security.sessionTimeout - xpack.telemetry.enabled + telemetry.enabled ) longopts='' diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index bb041924215dd..8b12f71660844 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -38,6 +38,7 @@ import * as systemApi from './server/lib/system_api'; import mappings from './mappings.json'; import { getUiSettingDefaults } from './ui_setting_defaults'; import { makeKQLUsageCollector } from './server/lib/kql_usage_collector'; +import { registerCspCollector } from './server/lib/csp_usage_collector'; import { injectVars } from './inject_vars'; import { i18n } from '@kbn/i18n'; @@ -344,6 +345,7 @@ export default function (kibana) { registerFieldFormats(server); registerTutorials(server); makeKQLUsageCollector(server); + registerCspCollector(server); server.expose('systemApi', systemApi); server.injectUiAppVars('kibana', () => injectVars(server)); }, diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx index 5fa842291b028..e0f37277dd226 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx @@ -24,7 +24,7 @@ import { EuiCard, EuiButton, } from '@elastic/eui'; -import { OptInMessage } from './opt_in_message'; +import { OptInMessage } from '../../../../../telemetry/public/components/opt_in_message'; export interface Props { urlBasePath: string; diff --git a/src/legacy/core_plugins/kibana/public/home/kibana_services.js b/src/legacy/core_plugins/kibana/public/home/kibana_services.js index c5480e16491a9..792c5e09435a4 100644 --- a/src/legacy/core_plugins/kibana/public/home/kibana_services.js +++ b/src/legacy/core_plugins/kibana/public/home/kibana_services.js @@ -20,7 +20,7 @@ import { uiModules } from 'ui/modules'; import { npStart } from 'ui/new_platform'; import { createUiStatsReporter, METRIC_TYPE } from '../../../ui_metric/public'; -import { TelemetryOptInProvider } from './telemetry_opt_in'; +import { TelemetryOptInProvider } from '../../../telemetry/public/services'; export let indexPatternService; export let shouldShowTelemetryOptIn; diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/csp/csp_collector.test.ts b/src/legacy/core_plugins/kibana/server/lib/csp_usage_collector/csp_collector.test.ts similarity index 67% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/csp/csp_collector.test.ts rename to src/legacy/core_plugins/kibana/server/lib/csp_usage_collector/csp_collector.test.ts index caea9fd49fed6..36e7dc81d4708 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/csp/csp_collector.test.ts +++ b/src/legacy/core_plugins/kibana/server/lib/csp_usage_collector/csp_collector.test.ts @@ -1,18 +1,35 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import sinon from 'sinon'; -import { DEFAULT_CSP_RULES } from '../../../../../../../../src/legacy/server/csp'; -import { - getMockCallWithInternal, - getMockKbnServer, - getMockTaskFetch, -} from '../../../../test_utils'; +import { Server } from 'hapi'; +import { DEFAULT_CSP_RULES } from '../../../../../server/csp'; import { createCspCollector } from './csp_collector'; +interface MockConfig { + get: (x: string) => any; +} + +const getMockKbnServer = (mockConfig: MockConfig) => ({ + config: () => mockConfig, +}); + test('fetches whether strict mode is enabled', async () => { const { collector, mockConfig } = setupCollector(); @@ -72,7 +89,7 @@ function setupCollector() { mockConfig.get.withArgs('csp.strict').returns(true); mockConfig.get.withArgs('csp.warnLegacyBrowsers').returns(true); - const mockKbnServer = getMockKbnServer(getMockCallWithInternal(), getMockTaskFetch(), mockConfig); + const mockKbnServer = getMockKbnServer(mockConfig); - return { mockConfig, collector: createCspCollector(mockKbnServer) }; + return { mockConfig, collector: createCspCollector(mockKbnServer as Server) }; } diff --git a/src/legacy/core_plugins/kibana/server/lib/csp_usage_collector/csp_collector.ts b/src/legacy/core_plugins/kibana/server/lib/csp_usage_collector/csp_collector.ts new file mode 100644 index 0000000000000..3ff39c1a4eb8c --- /dev/null +++ b/src/legacy/core_plugins/kibana/server/lib/csp_usage_collector/csp_collector.ts @@ -0,0 +1,49 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Server } from 'hapi'; +import { createCSPRuleString, DEFAULT_CSP_RULES } from '../../../../../server/csp'; + +export function createCspCollector(server: Server) { + return { + type: 'csp', + isReady: () => true, + async fetch() { + const config = server.config(); + + // It's important that we do not send the value of csp.rules here as it + // can be customized with values that can be identifiable to given + // installs, such as URLs + const defaultRulesString = createCSPRuleString([...DEFAULT_CSP_RULES]); + const actualRulesString = createCSPRuleString(config.get('csp.rules')); + + return { + strict: config.get('csp.strict'), + warnLegacyBrowsers: config.get('csp.warnLegacyBrowsers'), + rulesChangedFromDefault: defaultRulesString !== actualRulesString, + }; + }, + }; +} + +export function registerCspCollector(server: Server): void { + const { collectorSet } = server.usage; + const collector = collectorSet.makeUsageCollector(createCspCollector(server)); + collectorSet.register(collector); +} diff --git a/src/legacy/core_plugins/kibana/server/lib/csp_usage_collector/index.ts b/src/legacy/core_plugins/kibana/server/lib/csp_usage_collector/index.ts new file mode 100644 index 0000000000000..517b21d3d73ff --- /dev/null +++ b/src/legacy/core_plugins/kibana/server/lib/csp_usage_collector/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { registerCspCollector } from './csp_collector'; diff --git a/src/legacy/core_plugins/telemetry/common/constants.ts b/src/legacy/core_plugins/telemetry/common/constants.ts new file mode 100644 index 0000000000000..ab1397b2cc232 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/common/constants.ts @@ -0,0 +1,66 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { i18n } from '@kbn/i18n'; + +/* + * config options opt into telemetry + * @type {string} + */ +export const CONFIG_TELEMETRY = 'telemetry:optIn'; +/* + * config description for opting into telemetry + * @type {string} + */ +export const getConfigTelemetryDesc = () => { + return i18n.translate('telemetry.telemetryConfigDescription', { + defaultMessage: + 'Help us improve the Elastic Stack by providing usage statistics for basic features. We will not share this data outside of Elastic.', + }); +}; + +/** + * The amount of time, in milliseconds, to wait between reports when enabled. + * + * Currently 24 hours. + * @type {Number} + */ +export const REPORT_INTERVAL_MS = 86400000; + +/* + * Key for the localStorage service + */ +export const LOCALSTORAGE_KEY = 'telemetry.data'; + +/** + * Link to the Elastic Telemetry privacy statement. + */ +export const PRIVACY_STATEMENT_URL = `https://www.elastic.co/legal/telemetry-privacy-statement`; + +/** + * The type name used within the Monitoring index to publish localization stats. + * @type {string} + */ +export const KIBANA_LOCALIZATION_STATS_TYPE = 'localization'; + +/** + * UI metric usage type + * @type {string} + */ +export const UI_METRIC_USAGE_TYPE = 'ui_metric'; diff --git a/src/legacy/core_plugins/telemetry/common/get_xpack_config_with_deprecated.ts b/src/legacy/core_plugins/telemetry/common/get_xpack_config_with_deprecated.ts new file mode 100644 index 0000000000000..3f7a8d3410993 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/common/get_xpack_config_with_deprecated.ts @@ -0,0 +1,41 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { KibanaConfig } from 'src/legacy/server/kbn_server'; + +export function getXpackConfigWithDeprecated(config: KibanaConfig, configPath: string) { + try { + const deprecatedXpackmainConfig = config.get(`xpack.xpack_main.${configPath}`); + if (typeof deprecatedXpackmainConfig !== 'undefined') { + return deprecatedXpackmainConfig; + } + } catch (err) { + // swallow error + } + try { + const deprecatedXpackConfig = config.get(`xpack.${configPath}`); + if (typeof deprecatedXpackConfig !== 'undefined') { + return deprecatedXpackConfig; + } + } catch (err) { + // swallow error + } + + return config.get(configPath); +} diff --git a/x-pack/legacy/plugins/telemetry/index.ts b/src/legacy/core_plugins/telemetry/index.ts similarity index 61% rename from x-pack/legacy/plugins/telemetry/index.ts rename to src/legacy/core_plugins/telemetry/index.ts index 71e80cb2bd02f..3271373449eb3 100644 --- a/x-pack/legacy/plugins/telemetry/index.ts +++ b/src/legacy/core_plugins/telemetry/index.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { resolve } from 'path'; @@ -9,10 +22,11 @@ import JoiNamespace from 'joi'; import { Server } from 'hapi'; import { CoreSetup, PluginInitializerContext } from 'src/core/server'; import { i18n } from '@kbn/i18n'; +// @ts-ignore import mappings from './mappings.json'; -import { CONFIG_TELEMETRY, getConfigTelemetryDesc, REPORT_INTERVAL_MS } from './common/constants'; +import { CONFIG_TELEMETRY, getConfigTelemetryDesc } from './common/constants'; import { getXpackConfigWithDeprecated } from './common/get_xpack_config_with_deprecated'; -import { telemetryPlugin } from './server'; +import { telemetryPlugin, getTelemetryOptIn } from './server'; import { createLocalizationUsageCollector, @@ -22,10 +36,10 @@ import { const ENDPOINT_VERSION = 'v2'; -export const telemetry = (kibana: any) => { +const telemetry = (kibana: any) => { return new kibana.Plugin({ id: 'telemetry', - configPrefix: 'xpack.telemetry', + configPrefix: 'telemetry', publicDir: resolve(__dirname, 'public'), require: ['elasticsearch'], config(Joi: typeof JoiNamespace) { @@ -49,7 +63,7 @@ export const telemetry = (kibana: any) => { managementSections: ['plugins/telemetry/views/management'], uiSettingDefaults: { [CONFIG_TELEMETRY]: { - name: i18n.translate('xpack.telemetry.telemetryConfigTitle', { + name: i18n.translate('telemetry.telemetryConfigTitle', { defaultMessage: 'Telemetry opt-in', }), description: getConfigTelemetryDesc(), @@ -62,11 +76,20 @@ export const telemetry = (kibana: any) => { isNamespaceAgnostic: true, }, }, + async replaceInjectedVars(originalInjectedVars: any, request: any) { + const telemetryOptedIn = await getTelemetryOptIn(request); + + return { + ...originalInjectedVars, + telemetryOptedIn, + }; + }, injectDefaultVars(server: Server) { const config = server.config(); return { + telemetryEnabled: getXpackConfigWithDeprecated(config, 'telemetry.enabled'), telemetryUrl: getXpackConfigWithDeprecated(config, 'telemetry.url'), - telemetryBanner: config.get('xpack.telemetry.banner'), + telemetryBanner: getXpackConfigWithDeprecated(config, 'telemetry.banner'), telemetryOptedIn: null, }; }, @@ -75,8 +98,10 @@ export const telemetry = (kibana: any) => { }, init(server: Server) { const initializerContext = {} as PluginInitializerContext; + const coreSetup = ({ http: { server }, + log: server.log, } as any) as CoreSetup; telemetryPlugin(initializerContext).setup(coreSetup); @@ -85,9 +110,9 @@ export const telemetry = (kibana: any) => { server.usage.collectorSet.register(createLocalizationUsageCollector(server)); server.usage.collectorSet.register(createTelemetryUsageCollector(server)); server.usage.collectorSet.register(createUiMetricUsageCollector(server)); - - // expose - server.expose('telemetryCollectionInterval', REPORT_INTERVAL_MS); }, }); }; + +// eslint-disable-next-line import/no-default-export +export default telemetry; diff --git a/x-pack/legacy/plugins/telemetry/mappings.json b/src/legacy/core_plugins/telemetry/mappings.json similarity index 100% rename from x-pack/legacy/plugins/telemetry/mappings.json rename to src/legacy/core_plugins/telemetry/mappings.json diff --git a/src/legacy/core_plugins/telemetry/package.json b/src/legacy/core_plugins/telemetry/package.json new file mode 100644 index 0000000000000..979e68cce742f --- /dev/null +++ b/src/legacy/core_plugins/telemetry/package.json @@ -0,0 +1,4 @@ +{ + "name": "telemetry", + "version": "kibana" +} diff --git a/x-pack/legacy/plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.tsx.snap b/src/legacy/core_plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.tsx.snap similarity index 90% rename from x-pack/legacy/plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.tsx.snap rename to src/legacy/core_plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.tsx.snap index 36f8c5ca5905e..2601f691cd184 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.tsx.snap +++ b/src/legacy/core_plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.tsx.snap @@ -15,7 +15,7 @@ exports[`OptInDetailsComponent renders as expected 1`] = `

@@ -26,7 +26,7 @@ exports[`OptInDetailsComponent renders as expected 1`] = ` diff --git a/x-pack/legacy/plugins/telemetry/public/components/__snapshots__/telemetry_form.test.js.snap b/src/legacy/core_plugins/telemetry/public/components/__snapshots__/telemetry_form.test.js.snap similarity index 89% rename from x-pack/legacy/plugins/telemetry/public/components/__snapshots__/telemetry_form.test.js.snap rename to src/legacy/core_plugins/telemetry/public/components/__snapshots__/telemetry_form.test.js.snap index 68a1b92666ea9..c1ad6276aee25 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/__snapshots__/telemetry_form.test.js.snap +++ b/src/legacy/core_plugins/telemetry/public/components/__snapshots__/telemetry_form.test.js.snap @@ -16,7 +16,7 @@ exports[`TelemetryForm renders as expected 1`] = `

@@ -43,7 +43,7 @@ exports[`TelemetryForm renders as expected 1`] = ` > @@ -55,7 +55,7 @@ exports[`TelemetryForm renders as expected 1`] = ` > diff --git a/src/legacy/core_plugins/telemetry/public/components/index.ts b/src/legacy/core_plugins/telemetry/public/components/index.ts new file mode 100644 index 0000000000000..1fc55eadd1e10 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/components/index.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// @ts-ignore +export { TelemetryForm } from './telemetry_form'; +export { OptInExampleFlyout } from './opt_in_details_component'; +export { OptInBanner } from './opt_in_banner_component'; +export { OptInMessage } from './opt_in_message'; diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.tsx b/src/legacy/core_plugins/telemetry/public/components/opt_in_banner_component.tsx similarity index 54% rename from x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.tsx rename to src/legacy/core_plugins/telemetry/public/components/opt_in_banner_component.tsx index 19754504c081e..0029eaf666b2d 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.tsx +++ b/src/legacy/core_plugins/telemetry/public/components/opt_in_banner_component.tsx @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import * as React from 'react'; @@ -21,7 +34,7 @@ export class OptInBanner extends React.PureComponent { render() { const title = ( ); @@ -32,18 +45,12 @@ export class OptInBanner extends React.PureComponent { this.props.optInClick(true)}> - + this.props.optInClick(false)}> - + diff --git a/src/legacy/core_plugins/telemetry/public/components/opt_in_details_component.test.tsx b/src/legacy/core_plugins/telemetry/public/components/opt_in_details_component.test.tsx new file mode 100644 index 0000000000000..3676430b55a41 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/components/opt_in_details_component.test.tsx @@ -0,0 +1,34 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { shallowWithIntl } from 'test_utils/enzyme_helpers'; +import { OptInExampleFlyout } from './opt_in_details_component'; + +describe('OptInDetailsComponent', () => { + it('renders as expected', () => { + expect( + shallowWithIntl( + ({ data: [] }))} + onClose={jest.fn()} + /> + ) + ).toMatchSnapshot(); + }); +}); diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/opt_in_details_component.tsx b/src/legacy/core_plugins/telemetry/public/components/opt_in_details_component.tsx similarity index 90% rename from src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/opt_in_details_component.tsx rename to src/legacy/core_plugins/telemetry/public/components/opt_in_details_component.tsx index d90f54b2bcb54..12ab780e75990 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/opt_in_details_component.tsx +++ b/src/legacy/core_plugins/telemetry/public/components/opt_in_details_component.tsx @@ -91,7 +91,7 @@ export class OptInExampleFlyout extends React.PureComponent { } @@ -99,7 +99,7 @@ export class OptInExampleFlyout extends React.PureComponent { iconType="cross" > @@ -111,7 +111,7 @@ export class OptInExampleFlyout extends React.PureComponent { } @@ -119,7 +119,7 @@ export class OptInExampleFlyout extends React.PureComponent { iconType="cross" > {

@@ -147,7 +147,7 @@ export class OptInExampleFlyout extends React.PureComponent { { }; render() { - const { fetchTelemetry } = this.props; const { showDetails, showExample } = this.state; const getDetails = () => ( ), telemetryPrivacyStatementLink: ( - + @@ -78,14 +78,14 @@ export class OptInMessage extends React.PureComponent { const getFlyoutDetails = () => ( this.setState({ showExample: false })} - fetchTelemetry={fetchTelemetry} + fetchTelemetry={this.props.fetchTelemetry} /> ); const getReadMore = () => ( this.setState({ showDetails: true })}> @@ -93,13 +93,13 @@ export class OptInMessage extends React.PureComponent { return ( - {' '} - {!showDetails && getReadMore()} - {showDetails && getDetails()} - {showDetails && showExample && getFlyoutDetails()} + {getConfigTelemetryDesc()} {!showDetails && getReadMore()} + {showDetails && ( + + {getDetails()} + {showExample && getFlyoutDetails()} + + )} ); } diff --git a/x-pack/legacy/plugins/telemetry/public/components/telemetry_form.js b/src/legacy/core_plugins/telemetry/public/components/telemetry_form.js similarity index 77% rename from x-pack/legacy/plugins/telemetry/public/components/telemetry_form.js rename to src/legacy/core_plugins/telemetry/public/components/telemetry_form.js index dc3739bb7ae8e..c2dcd48ee57da 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/telemetry_form.js +++ b/src/legacy/core_plugins/telemetry/public/components/telemetry_form.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import React, { Component, Fragment } from 'react'; @@ -28,8 +41,7 @@ export class TelemetryForm extends Component { telemetryOptInProvider: PropTypes.object.isRequired, query: PropTypes.object, onQueryMatchChange: PropTypes.func.isRequired, - spacesEnabled: PropTypes.bool.isRequired, - activeSpace: PropTypes.object, + showAppliesSettingMessage: PropTypes.bool.isRequired, enableSaving: PropTypes.bool.isRequired, }; @@ -85,7 +97,7 @@ export class TelemetryForm extends Component {

@@ -93,7 +105,7 @@ export class TelemetryForm extends Component {
- {this.maybeGetSpacesWarning()} + {this.maybeGetAppliesSettingMessage()} { - if (!this.props.spacesEnabled) { + maybeGetAppliesSettingMessage = () => { + if (!this.props.showAppliesSettingMessage) { return null; } return ( @@ -123,13 +135,13 @@ export class TelemetryForm extends Component { title={

@@ -148,7 +160,7 @@ export class TelemetryForm extends Component {

@@ -156,7 +168,7 @@ export class TelemetryForm extends Component {

diff --git a/x-pack/legacy/plugins/telemetry/public/components/telemetry_form.test.js b/src/legacy/core_plugins/telemetry/public/components/telemetry_form.test.js similarity index 52% rename from x-pack/legacy/plugins/telemetry/public/components/telemetry_form.test.js rename to src/legacy/core_plugins/telemetry/public/components/telemetry_form.test.js index 4df9cc0da1695..4d2c1dec27176 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/telemetry_form.test.js +++ b/src/legacy/core_plugins/telemetry/public/components/telemetry_form.test.js @@ -1,14 +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; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import '../services/telemetry_opt_in.test.mocks'; import React from 'react'; import { shallowWithIntl } from 'test_utils/enzyme_helpers'; import { TelemetryForm } from './telemetry_form'; -import { TelemetryOptInProvider } from '../services/telemetry_opt_in'; +import { TelemetryOptInProvider } from '../services'; const buildTelemetryOptInProvider = () => { const mockHttp = { diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/__tests__/fetch_telemetry.js b/src/legacy/core_plugins/telemetry/public/hacks/__tests__/fetch_telemetry.js similarity index 52% rename from x-pack/legacy/plugins/telemetry/public/hacks/__tests__/fetch_telemetry.js rename to src/legacy/core_plugins/telemetry/public/hacks/__tests__/fetch_telemetry.js index 26269ef97fa64..8fb8b6e44f0e3 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/__tests__/fetch_telemetry.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/__tests__/fetch_telemetry.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import expect from '@kbn/expect'; diff --git a/src/legacy/core_plugins/telemetry/public/hacks/__tests__/telemetry.js b/src/legacy/core_plugins/telemetry/public/hacks/__tests__/telemetry.js new file mode 100644 index 0000000000000..374927486867e --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/hacks/__tests__/telemetry.js @@ -0,0 +1,28 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { uiModules } from 'ui/modules'; + +// This overrides settings for other UI tests +uiModules.get('kibana') + // disable stat reporting while running tests, + // MockInjector used in these tests is not impacted + .constant('telemetryEnabled', false) + .constant('telemetryOptedIn', null) + .constant('telemetryUrl', 'not.a.valid.url.0'); diff --git a/src/legacy/core_plugins/telemetry/public/hacks/fetch_telemetry.js b/src/legacy/core_plugins/telemetry/public/hacks/fetch_telemetry.js new file mode 100644 index 0000000000000..43ec0c2ce571f --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/hacks/fetch_telemetry.js @@ -0,0 +1,39 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import uiChrome from 'ui/chrome'; +import moment from 'moment'; + +/** + * Fetch Telemetry data by calling the Kibana API. + * + * @param {Object} $http The HTTP handler + * @param {String} basePath The base URI + * @param {Function} _moment moment.js, but injectable for tests + * @return {Promise} An array of cluster Telemetry objects. + */ +export function fetchTelemetry($http, { basePath = uiChrome.getBasePath(), _moment = moment, unencrypted = false } = { }) { + return $http.post(`${basePath}/api/telemetry/v2/clusters/_stats`, { + unencrypted, + timeRange: { + min: _moment().subtract(20, 'minutes').toISOString(), + max: _moment().toISOString() + } + }); +} diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/telemetry.js b/src/legacy/core_plugins/telemetry/public/hacks/telemetry.js similarity index 79% rename from x-pack/legacy/plugins/telemetry/public/hacks/telemetry.js rename to src/legacy/core_plugins/telemetry/public/hacks/telemetry.js index 168bb6d7eec97..4febd8cd9e9a8 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/telemetry.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/telemetry.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/telemetry.test.js b/src/legacy/core_plugins/telemetry/public/hacks/telemetry.test.js similarity index 92% rename from x-pack/legacy/plugins/telemetry/public/hacks/telemetry.test.js rename to src/legacy/core_plugins/telemetry/public/hacks/telemetry.test.js index d08d89d738015..ffb72701f835d 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/telemetry.test.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/telemetry.test.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { Telemetry } from './telemetry'; diff --git a/src/legacy/core_plugins/telemetry/public/hacks/telemetry_init.ts b/src/legacy/core_plugins/telemetry/public/hacks/telemetry_init.ts new file mode 100644 index 0000000000000..364871380a529 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/hacks/telemetry_init.ts @@ -0,0 +1,45 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { npStart } from 'ui/new_platform'; +// @ts-ignore +import { uiModules } from 'ui/modules'; +import { isUnauthenticated } from '../services'; +// @ts-ignore +import { Telemetry } from './telemetry'; +// @ts-ignore +import { fetchTelemetry } from './fetch_telemetry'; + +function telemetryInit($injector: any) { + const $http = $injector.get('$http'); + + const telemetryEnabled = npStart.core.injectedMetadata.getInjectedVar('telemetryEnabled'); + + if (telemetryEnabled) { + // no telemetry for non-logged in users + if (isUnauthenticated()) { + return; + } + + const sender = new Telemetry($injector, () => fetchTelemetry($http)); + sender.start(); + } +} + +uiModules.get('telemetry/hacks').run(telemetryInit); diff --git a/src/legacy/core_plugins/telemetry/public/hacks/telemetry_opt_in.js b/src/legacy/core_plugins/telemetry/public/hacks/telemetry_opt_in.js new file mode 100644 index 0000000000000..4e53c7ecd7030 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/hacks/telemetry_opt_in.js @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { uiModules } from 'ui/modules'; + +import { injectBanner } from './welcome_banner'; + +uiModules.get('telemetry/hacks').run(injectBanner); diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/click_banner.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/click_banner.js similarity index 60% rename from x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/click_banner.js rename to src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/click_banner.js index f337a8025e01d..a20c99b7eee55 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/click_banner.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/click_banner.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import React from 'react'; @@ -41,7 +54,7 @@ export async function clickBanner( _toastNotifications.addDanger({ title: ( ), @@ -49,13 +62,13 @@ export async function clickBanner(

diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/click_banner.test.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/click_banner.test.js similarity index 80% rename from x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/click_banner.test.js rename to src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/click_banner.test.js index 751a8f5498ee5..9b17d51d6ea61 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/click_banner.test.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/click_banner.test.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { mockInjectedMetadata } from '../../services/telemetry_opt_in.test.mocks'; diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.js similarity index 66% rename from x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.js rename to src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.js index 4188676bad1e0..31091e1952053 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { CONFIG_TELEMETRY } from '../../../common/constants'; diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.test.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.test.js similarity index 89% rename from x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.test.js rename to src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.test.js index 40e3bb042fa88..fd21a5122b594 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.test.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/handle_old_settings.test.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { mockInjectedMetadata } from '../../services/telemetry_opt_in.test.mocks'; diff --git a/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/index.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/index.js new file mode 100644 index 0000000000000..ffb0e88c60a0d --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/index.js @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { injectBanner } from './inject_banner'; diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/inject_banner.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/inject_banner.js similarity index 64% rename from x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/inject_banner.js rename to src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/inject_banner.js index 384086dfed3c7..13417a137e6c3 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/inject_banner.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/inject_banner.js @@ -1,15 +1,28 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import chrome from 'ui/chrome'; -import { Path } from 'plugins/xpack_main/services/path'; + import { fetchTelemetry } from '../fetch_telemetry'; import { renderBanner } from './render_banner'; import { shouldShowBanner } from './should_show_banner'; -import { TelemetryOptInProvider } from '../../services/telemetry_opt_in'; +import { TelemetryOptInProvider, isUnauthenticated } from '../../services'; import { npStart } from 'ui/new_platform'; /** @@ -26,7 +39,7 @@ async function asyncInjectBanner($injector) { const config = $injector.get('config'); // and no banner for non-logged in users - if (Path.isUnauthenticated()) { + if (isUnauthenticated()) { return; } diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/render_banner.js similarity index 51% rename from x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.js rename to src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/render_banner.js index 9143d13069316..835d1a8cba62f 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/render_banner.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import React from 'react'; diff --git a/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/render_banner.test.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/render_banner.test.js new file mode 100644 index 0000000000000..9db5103cc9b2f --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/render_banner.test.js @@ -0,0 +1,44 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import '../../services/telemetry_opt_in.test.mocks'; +import { renderBanner } from './render_banner'; + +describe('render_banner', () => { + + it('adds a banner to banners with priority of 10000', () => { + const bannerID = 'brucer-banner'; + + const telemetryOptInProvider = { setBannerId: jest.fn() }; + const banners = { add: jest.fn().mockReturnValue(bannerID) }; + const fetchTelemetry = jest.fn(); + + renderBanner(telemetryOptInProvider, fetchTelemetry, { _banners: banners }); + + expect(banners.add).toBeCalledTimes(1); + expect(fetchTelemetry).toBeCalledTimes(0); + expect(telemetryOptInProvider.setBannerId).toBeCalledWith(bannerID); + + const bannerConfig = banners.add.mock.calls[0][0]; + + expect(bannerConfig.component).not.toBe(undefined); + expect(bannerConfig.priority).toBe(10000); + }); + +}); diff --git a/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/should_show_banner.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/should_show_banner.js new file mode 100644 index 0000000000000..47c6e58422e4c --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/should_show_banner.js @@ -0,0 +1,33 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { handleOldSettings } from './handle_old_settings'; + +/** + * Determine if the banner should be displayed. + * + * This method can have side-effects related to deprecated config settings. + * + * @param {Object} config The advanced settings config object. + * @param {Object} _handleOldSettings handleOldSettings function, but overridable for tests. + * @return {Boolean} {@code true} if the banner should be displayed. {@code false} otherwise. + */ +export async function shouldShowBanner(telemetryOptInProvider, config, { _handleOldSettings = handleOldSettings } = {}) { + return telemetryOptInProvider.getOptIn() === null && await _handleOldSettings(config, telemetryOptInProvider); +} diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/should_show_banner.test.js b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/should_show_banner.test.js similarity index 73% rename from x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/should_show_banner.test.js rename to src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/should_show_banner.test.js index 1bfe7e954738e..19e7ccbe61866 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/should_show_banner.test.js +++ b/src/legacy/core_plugins/telemetry/public/hacks/welcome_banner/should_show_banner.test.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { mockInjectedMetadata } from '../../services/telemetry_opt_in.test.mocks'; @@ -10,7 +23,7 @@ import sinon from 'sinon'; import { CONFIG_TELEMETRY } from '../../../common/constants'; import { shouldShowBanner } from './should_show_banner'; -import { TelemetryOptInProvider } from '../../services/telemetry_opt_in'; +import { TelemetryOptInProvider } from '../../services'; const getMockInjector = () => { const get = sinon.stub(); diff --git a/src/legacy/core_plugins/telemetry/public/services/index.ts b/src/legacy/core_plugins/telemetry/public/services/index.ts new file mode 100644 index 0000000000000..8b02f8ce4c5b0 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/services/index.ts @@ -0,0 +1,21 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { TelemetryOptInProvider } from './telemetry_opt_in'; +export { isUnauthenticated } from './path'; diff --git a/src/legacy/core_plugins/telemetry/public/services/path.ts b/src/legacy/core_plugins/telemetry/public/services/path.ts new file mode 100644 index 0000000000000..4af545e982eaa --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/services/path.ts @@ -0,0 +1,25 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import chrome from 'ui/chrome'; + +export function isUnauthenticated() { + const path = (chrome as any).removeBasePath(window.location.pathname); + return path === '/login' || path === '/logout' || path === '/logged_out' || path === '/status'; +} diff --git a/x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in.test.js b/src/legacy/core_plugins/telemetry/public/services/telemetry_opt_in.test.js similarity index 75% rename from x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in.test.js rename to src/legacy/core_plugins/telemetry/public/services/telemetry_opt_in.test.js index 5b93f84eabf4a..0034fa4438238 100644 --- a/x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in.test.js +++ b/src/legacy/core_plugins/telemetry/public/services/telemetry_opt_in.test.js @@ -1,8 +1,22 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + import { mockInjectedMetadata } from './telemetry_opt_in.test.mocks'; import { TelemetryOptInProvider } from './telemetry_opt_in'; diff --git a/src/legacy/core_plugins/telemetry/public/services/telemetry_opt_in.test.mocks.js b/src/legacy/core_plugins/telemetry/public/services/telemetry_opt_in.test.mocks.js new file mode 100644 index 0000000000000..f98f5e16e00c3 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/services/telemetry_opt_in.test.mocks.js @@ -0,0 +1,50 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + injectedMetadataServiceMock, + notificationServiceMock, + overlayServiceMock, +} from '../../../../../core/public/mocks'; +const injectedMetadataMock = injectedMetadataServiceMock.createStartContract(); + +export function mockInjectedMetadata({ telemetryOptedIn }) { + const mockGetInjectedVar = jest.fn().mockImplementation((key) => { + switch (key) { + case 'telemetryOptedIn': return telemetryOptedIn; + default: throw new Error(`unexpected injectedVar ${key}`); + } + }); + + injectedMetadataMock.getInjectedVar = mockGetInjectedVar; +} + +jest.doMock('ui/new_platform', () => ({ + npSetup: { + core: { + notifications: notificationServiceMock.createSetupContract(), + } + }, + npStart: { + core: { + injectedMetadata: injectedMetadataMock, + overlays: overlayServiceMock.createStartContract(), + }, + }, +})); diff --git a/src/legacy/core_plugins/kibana/public/home/telemetry_opt_in.js b/src/legacy/core_plugins/telemetry/public/services/telemetry_opt_in.ts similarity index 75% rename from src/legacy/core_plugins/kibana/public/home/telemetry_opt_in.js rename to src/legacy/core_plugins/telemetry/public/services/telemetry_opt_in.ts index 274820844da45..f4462ffea7a33 100644 --- a/src/legacy/core_plugins/kibana/public/home/telemetry_opt_in.js +++ b/src/legacy/core_plugins/telemetry/public/services/telemetry_opt_in.ts @@ -23,16 +23,20 @@ import { toastNotifications } from 'ui/notify'; import { npStart } from 'ui/new_platform'; import { i18n } from '@kbn/i18n'; -export function TelemetryOptInProvider($injector, chrome) { - let currentOptInStatus = npStart.core.injectedMetadata.getInjectedVar('telemetryOptedIn'); - let bannerId = null; +let bannerId: string | null = null; +let currentOptInStatus = false; + +export function TelemetryOptInProvider($injector: any, chrome: any) { + currentOptInStatus = npStart.core.injectedMetadata.getInjectedVar('telemetryOptedIn') as boolean; setCanTrackUiMetrics(currentOptInStatus); const provider = { getBannerId: () => bannerId, getOptIn: () => currentOptInStatus, - setBannerId(id) { bannerId = id; }, - setOptIn: async (enabled) => { + setBannerId(id: string) { + bannerId = id; + }, + setOptIn: async (enabled: boolean) => { setCanTrackUiMetrics(enabled); const $http = $injector.get('$http'); @@ -41,10 +45,10 @@ export function TelemetryOptInProvider($injector, chrome) { currentOptInStatus = enabled; } catch (error) { toastNotifications.addError(error, { - title: i18n.translate('kbn.home.telemetry.optInErrorToastTitle', { + title: i18n.translate('telemetry.optInErrorToastTitle', { defaultMessage: 'Error', }), - toastMessage: i18n.translate('kbn.home.telemetry.optInErrorToastText', { + toastMessage: i18n.translate('telemetry.optInErrorToastText', { defaultMessage: 'An error occured while trying to set the usage statistics preference.', }), }); @@ -58,11 +62,13 @@ export function TelemetryOptInProvider($injector, chrome) { return $http.post(chrome.addBasePath(`/api/telemetry/v2/clusters/_stats`), { unencrypted: true, timeRange: { - min: moment().subtract(20, 'minutes').toISOString(), - max: moment().toISOString() - } + min: moment() + .subtract(20, 'minutes') + .toISOString(), + max: moment().toISOString(), + }, }); - } + }, }; return provider; diff --git a/src/legacy/core_plugins/telemetry/public/views/management/index.js b/src/legacy/core_plugins/telemetry/public/views/management/index.js new file mode 100644 index 0000000000000..2e9f064ec80d8 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/views/management/index.js @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import './management'; diff --git a/src/legacy/core_plugins/telemetry/public/views/management/management.js b/src/legacy/core_plugins/telemetry/public/views/management/management.js new file mode 100644 index 0000000000000..9f6e96c925cda --- /dev/null +++ b/src/legacy/core_plugins/telemetry/public/views/management/management.js @@ -0,0 +1,42 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import routes from 'ui/routes'; + +import { registerSettingsComponent, PAGE_FOOTER_COMPONENT } from 'ui/management'; +import { TelemetryOptInProvider } from '../../services'; +import { TelemetryForm } from '../../components'; + +routes.defaults(/\/management/, { + resolve: { + telemetryManagementSection: function (Private) { + const telemetryOptInProvider = Private(TelemetryOptInProvider); + + const Component = (props) => ( + + ); + + registerSettingsComponent(PAGE_FOOTER_COMPONENT, Component, true); + } + } +}); diff --git a/src/legacy/core_plugins/telemetry/server/collection_manager.ts b/src/legacy/core_plugins/telemetry/server/collection_manager.ts new file mode 100644 index 0000000000000..fef0a9b0f9f40 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/collection_manager.ts @@ -0,0 +1,49 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +class TelemetryCollectionManager { + private getterMethod?: any; + private collectionTitle?: string; + private getterMethodPriority = 0; + + public setStatsGetter = (statsGetter: any, title: string, priority = 0) => { + if (priority >= this.getterMethodPriority) { + this.getterMethod = statsGetter; + this.collectionTitle = title; + this.getterMethodPriority = priority; + } + }; + + getCollectionTitle = () => { + return this.collectionTitle; + }; + + public getStatsGetter = () => { + if (!this.getterMethod) { + throw Error('Stats getter method not set.'); + } + return { + getStats: this.getterMethod, + priority: this.getterMethodPriority, + title: this.collectionTitle, + }; + }; +} + +export const telemetryCollectionManager = new TelemetryCollectionManager(); diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/encryption/encrypt.test.ts b/src/legacy/core_plugins/telemetry/server/collectors/encryption/encrypt.test.ts similarity index 53% rename from x-pack/legacy/plugins/telemetry/server/collectors/encryption/encrypt.test.ts rename to src/legacy/core_plugins/telemetry/server/collectors/encryption/encrypt.test.ts index ed13b5569d987..4a4ba7aa1f321 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/encryption/encrypt.test.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/encryption/encrypt.test.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { telemetryJWKS } from './telemetry_jwks'; diff --git a/src/legacy/core_plugins/telemetry/server/collectors/encryption/encrypt.ts b/src/legacy/core_plugins/telemetry/server/collectors/encryption/encrypt.ts new file mode 100644 index 0000000000000..c20f4b768b7dc --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/collectors/encryption/encrypt.ts @@ -0,0 +1,32 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { createRequestEncryptor } from '@elastic/request-crypto'; +import { telemetryJWKS } from './telemetry_jwks'; + +export function getKID(isProd = false): string { + return isProd ? 'kibana' : 'kibana_dev'; +} + +export async function encryptTelemetry(payload: any, isProd = false): Promise { + const kid = getKID(isProd); + const encryptor = await createRequestEncryptor(telemetryJWKS); + const clusters = [].concat(payload); + return Promise.all(clusters.map((cluster: any) => encryptor.encrypt(kid, cluster))); +} diff --git a/src/legacy/core_plugins/telemetry/server/collectors/encryption/index.ts b/src/legacy/core_plugins/telemetry/server/collectors/encryption/index.ts new file mode 100644 index 0000000000000..08636d45861e4 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/collectors/encryption/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { encryptTelemetry } from './encrypt'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/encryption/telemetry_jwks.ts b/src/legacy/core_plugins/telemetry/server/collectors/encryption/telemetry_jwks.ts similarity index 57% rename from x-pack/legacy/plugins/telemetry/server/collectors/encryption/telemetry_jwks.ts rename to src/legacy/core_plugins/telemetry/server/collectors/encryption/telemetry_jwks.ts index b4983ad2d4db7..8615ba2f9d605 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/encryption/telemetry_jwks.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/encryption/telemetry_jwks.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { PublicJWKS } from '@elastic/request-crypto'; diff --git a/src/legacy/core_plugins/telemetry/server/collectors/index.ts b/src/legacy/core_plugins/telemetry/server/collectors/index.ts new file mode 100644 index 0000000000000..0bc1d50fab1be --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/collectors/index.ts @@ -0,0 +1,23 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { encryptTelemetry } from './encryption'; +export { createTelemetryUsageCollector } from './usage'; +export { createUiMetricUsageCollector } from './ui_metric'; +export { createLocalizationUsageCollector } from './localization'; diff --git a/src/legacy/core_plugins/telemetry/server/collectors/localization/file_integrity.test.mocks.ts b/src/legacy/core_plugins/telemetry/server/collectors/localization/file_integrity.test.mocks.ts new file mode 100644 index 0000000000000..cb77ce581eff2 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/collectors/localization/file_integrity.test.mocks.ts @@ -0,0 +1,41 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Readable } from 'stream'; + +jest.doMock('fs', () => ({ + createReadStream(filepath: string): Readable { + if (filepath === 'ERROR') { + throw new Error('MOCK ERROR - Invalid Path'); + } + const readableStream = new Readable(); + const streamData = filepath.split(''); + let cursor = 0; + + readableStream._read = function(size) { + const current = streamData[cursor++]; + if (typeof current === 'undefined') { + return this.push(null); + } + this.push(current); + }; + + return readableStream; + }, +})); diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/localization/file_integrity.test.ts b/src/legacy/core_plugins/telemetry/server/collectors/localization/file_integrity.test.ts similarity index 56% rename from x-pack/legacy/plugins/telemetry/server/collectors/localization/file_integrity.test.ts rename to src/legacy/core_plugins/telemetry/server/collectors/localization/file_integrity.test.ts index 668b0d0c21088..a0b566537f5b4 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/localization/file_integrity.test.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/localization/file_integrity.test.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import './file_integrity.test.mocks'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/localization/file_integrity.ts b/src/legacy/core_plugins/telemetry/server/collectors/localization/file_integrity.ts similarity index 52% rename from x-pack/legacy/plugins/telemetry/server/collectors/localization/file_integrity.ts rename to src/legacy/core_plugins/telemetry/server/collectors/localization/file_integrity.ts index 1db3795828fff..a852fba4a1c5a 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/localization/file_integrity.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/localization/file_integrity.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { createHash } from 'crypto'; diff --git a/src/legacy/core_plugins/telemetry/server/collectors/localization/index.ts b/src/legacy/core_plugins/telemetry/server/collectors/localization/index.ts new file mode 100644 index 0000000000000..3b289752ce39f --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/collectors/localization/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { createLocalizationUsageCollector } from './telemetry_localization_collector'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/localization/telemetry_localization_collector.test.ts b/src/legacy/core_plugins/telemetry/server/collectors/localization/telemetry_localization_collector.test.ts similarity index 51% rename from x-pack/legacy/plugins/telemetry/server/collectors/localization/telemetry_localization_collector.test.ts rename to src/legacy/core_plugins/telemetry/server/collectors/localization/telemetry_localization_collector.test.ts index 2cd3938e58ece..eec5cc8a065e4 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/localization/telemetry_localization_collector.test.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/localization/telemetry_localization_collector.test.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ interface TranslationsMock { diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/localization/telemetry_localization_collector.ts b/src/legacy/core_plugins/telemetry/server/collectors/localization/telemetry_localization_collector.ts similarity index 64% rename from x-pack/legacy/plugins/telemetry/server/collectors/localization/telemetry_localization_collector.ts rename to src/legacy/core_plugins/telemetry/server/collectors/localization/telemetry_localization_collector.ts index b66fe75e7af71..74c93931096b2 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/localization/telemetry_localization_collector.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/localization/telemetry_localization_collector.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { i18nLoader } from '@kbn/i18n'; diff --git a/src/legacy/core_plugins/telemetry/server/collectors/ui_metric/index.ts b/src/legacy/core_plugins/telemetry/server/collectors/ui_metric/index.ts new file mode 100644 index 0000000000000..e1ac7a1f5af12 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/collectors/ui_metric/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { createUiMetricUsageCollector } from './telemetry_ui_metric_collector'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/ui_metric/telemetry_ui_metric_collector.ts b/src/legacy/core_plugins/telemetry/server/collectors/ui_metric/telemetry_ui_metric_collector.ts similarity index 61% rename from x-pack/legacy/plugins/telemetry/server/collectors/ui_metric/telemetry_ui_metric_collector.ts rename to src/legacy/core_plugins/telemetry/server/collectors/ui_metric/telemetry_ui_metric_collector.ts index a931400399b44..fa3159669c33c 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/ui_metric/telemetry_ui_metric_collector.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/ui_metric/telemetry_ui_metric_collector.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { UI_METRIC_USAGE_TYPE } from '../../../common/constants'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/usage/ensure_deep_object.test.ts b/src/legacy/core_plugins/telemetry/server/collectors/usage/ensure_deep_object.test.ts similarity index 72% rename from x-pack/legacy/plugins/telemetry/server/collectors/usage/ensure_deep_object.test.ts rename to src/legacy/core_plugins/telemetry/server/collectors/usage/ensure_deep_object.test.ts index 4fad392302444..5a520fbeef316 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/usage/ensure_deep_object.test.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/usage/ensure_deep_object.test.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { ensureDeepObject } from './ensure_deep_object'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/usage/ensure_deep_object.ts b/src/legacy/core_plugins/telemetry/server/collectors/usage/ensure_deep_object.ts similarity index 63% rename from x-pack/legacy/plugins/telemetry/server/collectors/usage/ensure_deep_object.ts rename to src/legacy/core_plugins/telemetry/server/collectors/usage/ensure_deep_object.ts index 5b00aab010d5c..6594c7f8e7a6f 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/usage/ensure_deep_object.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/usage/ensure_deep_object.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ // diff --git a/src/legacy/core_plugins/telemetry/server/collectors/usage/index.ts b/src/legacy/core_plugins/telemetry/server/collectors/usage/index.ts new file mode 100644 index 0000000000000..a1b3d5a7b1982 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/collectors/usage/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { createTelemetryUsageCollector } from './telemetry_usage_collector'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts b/src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts similarity index 80% rename from x-pack/legacy/plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts rename to src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts index d99f9dba334c9..3806dfc77120f 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.test.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { writeFileSync, unlinkSync } from 'fs'; @@ -28,8 +41,8 @@ const serverWithConfig = (configPath: string): KibanaHapiServer & Server => { ...getMockServer(), config: () => ({ get: (key: string) => { - if (key !== 'xpack.telemetry.config' && key !== 'xpack.xpack_main.telemetry.config') { - throw new Error('Expected `xpack.telemetry.config`'); + if (key !== 'telemetry.config' && key !== 'xpack.xpack_main.telemetry.config') { + throw new Error('Expected `telemetry.config`'); } return configPath; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/usage/telemetry_usage_collector.ts b/src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.ts similarity index 77% rename from x-pack/legacy/plugins/telemetry/server/collectors/usage/telemetry_usage_collector.ts rename to src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.ts index a20f4198b3ad3..c927453641193 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/usage/telemetry_usage_collector.ts +++ b/src/legacy/core_plugins/telemetry/server/collectors/usage/telemetry_usage_collector.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { accessSync, constants, readFileSync, statSync } from 'fs'; diff --git a/x-pack/legacy/plugins/telemetry/server/get_telemetry_opt_in.ts b/src/legacy/core_plugins/telemetry/server/get_telemetry_opt_in.ts similarity index 52% rename from x-pack/legacy/plugins/telemetry/server/get_telemetry_opt_in.ts rename to src/legacy/core_plugins/telemetry/server/get_telemetry_opt_in.ts index 8f5af83985f14..9b365d6dd7ae5 100644 --- a/x-pack/legacy/plugins/telemetry/server/get_telemetry_opt_in.ts +++ b/src/legacy/core_plugins/telemetry/server/get_telemetry_opt_in.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ export async function getTelemetryOptIn(request: any) { diff --git a/src/legacy/core_plugins/telemetry/server/index.ts b/src/legacy/core_plugins/telemetry/server/index.ts new file mode 100644 index 0000000000000..b8ae5fc231fba --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/index.ts @@ -0,0 +1,29 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { PluginInitializerContext } from 'src/core/server'; +import { TelemetryPlugin } from './plugin'; +import * as constants from '../common/constants'; + +export { getTelemetryOptIn } from './get_telemetry_opt_in'; +export { telemetryCollectionManager } from './collection_manager'; + +export const telemetryPlugin = (initializerContext: PluginInitializerContext) => + new TelemetryPlugin(); +export { constants }; diff --git a/src/legacy/core_plugins/telemetry/server/plugin.ts b/src/legacy/core_plugins/telemetry/server/plugin.ts new file mode 100644 index 0000000000000..70de51b2abe99 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/plugin.ts @@ -0,0 +1,30 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CoreSetup } from 'src/core/server'; +import { registerRoutes } from './routes'; +import { telemetryCollectionManager } from './collection_manager'; +import { getStats } from './telemetry_collection'; + +export class TelemetryPlugin { + public setup(core: CoreSetup) { + telemetryCollectionManager.setStatsGetter(getStats, 'local'); + registerRoutes(core); + } +} diff --git a/src/legacy/core_plugins/telemetry/server/routes/index.ts b/src/legacy/core_plugins/telemetry/server/routes/index.ts new file mode 100644 index 0000000000000..12ba541d699f9 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/routes/index.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CoreSetup } from 'src/core/server'; +import { registerOptInRoutes } from './opt_in'; +import { registerTelemetryDataRoutes } from './telemetry_stats'; + +export function registerRoutes(core: CoreSetup) { + registerOptInRoutes(core); + registerTelemetryDataRoutes(core); +} diff --git a/x-pack/legacy/plugins/telemetry/server/routes/opt_in.ts b/src/legacy/core_plugins/telemetry/server/routes/opt_in.ts similarity index 52% rename from x-pack/legacy/plugins/telemetry/server/routes/opt_in.ts rename to src/legacy/core_plugins/telemetry/server/routes/opt_in.ts index 72c602e84f90a..aabc0259f08fc 100644 --- a/x-pack/legacy/plugins/telemetry/server/routes/opt_in.ts +++ b/src/legacy/core_plugins/telemetry/server/routes/opt_in.ts @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import Joi from 'joi'; diff --git a/x-pack/legacy/plugins/telemetry/server/routes/telemetry_stats.ts b/src/legacy/core_plugins/telemetry/server/routes/telemetry_stats.ts similarity index 54% rename from x-pack/legacy/plugins/telemetry/server/routes/telemetry_stats.ts rename to src/legacy/core_plugins/telemetry/server/routes/telemetry_stats.ts index 8ab4e68008e82..8a91d24b34ed2 100644 --- a/x-pack/legacy/plugins/telemetry/server/routes/telemetry_stats.ts +++ b/src/legacy/core_plugins/telemetry/server/routes/telemetry_stats.ts @@ -1,13 +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; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import Joi from 'joi'; import { boomify } from 'boom'; import { CoreSetup } from 'src/core/server'; -import { getStats, encryptTelemetry } from '../collectors'; +import { encryptTelemetry } from '../collectors'; +import { telemetryCollectionManager } from '../collection_manager'; export function registerTelemetryDataRoutes(core: CoreSetup) { const { server } = core.http as any; @@ -34,13 +48,17 @@ export function registerTelemetryDataRoutes(core: CoreSetup) { const isDev = config.get('env.dev'); try { + const { getStats, title } = telemetryCollectionManager.getStatsGetter(); + server.log(['debug', 'telemetry'], `Using Stats Getter: ${title}`); + const usageData = await getStats(req, config, start, end, unencrypted); + if (unencrypted) return usageData; return encryptTelemetry(usageData, isDev); } catch (err) { if (isDev) { // don't ignore errors when running in dev mode - return boomify(err, { statusCode: err.status }); + return boomify(err, { statusCode: err.status || 500 }); } else { const statusCode = unencrypted && err.status === 403 ? 403 : 200; // ignore errors and return empty set diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/__tests__/get_cluster_info.js b/src/legacy/core_plugins/telemetry/server/telemetry_collection/__tests__/get_cluster_info.js new file mode 100644 index 0000000000000..566e5b7019ddd --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/__tests__/get_cluster_info.js @@ -0,0 +1,41 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import expect from '@kbn/expect'; +import sinon from 'sinon'; + +import { getClusterInfo } from '../get_cluster_info'; + +export function mockGetClusterInfo(callCluster, clusterInfo, req) { + callCluster.withArgs(req, 'info').returns(clusterInfo); + callCluster.withArgs('info').returns(clusterInfo); +} + +describe('get_cluster_info', () => { + + it('uses callCluster to get info API', () => { + const callCluster = sinon.stub(); + const response = Promise.resolve({}); + + mockGetClusterInfo(callCluster, response); + + expect(getClusterInfo(callCluster)).to.be(response); + }); + +}); diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/__tests__/get_cluster_stats.js b/src/legacy/core_plugins/telemetry/server/telemetry_collection/__tests__/get_cluster_stats.js new file mode 100644 index 0000000000000..9ca609cd88778 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/__tests__/get_cluster_stats.js @@ -0,0 +1,49 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import expect from '@kbn/expect'; +import sinon from 'sinon'; + +import { TIMEOUT } from '../constants'; +import { getClusterStats } from '../get_cluster_stats'; + +export function mockGetClusterStats(callCluster, clusterStats, req) { + callCluster.withArgs(req, 'cluster.stats', { + timeout: TIMEOUT + }) + .returns(clusterStats); + + callCluster.withArgs('cluster.stats', { + timeout: TIMEOUT + }) + .returns(clusterStats); +} + +describe('get_cluster_stats', () => { + + it('uses callCluster to get cluster.stats API', () => { + const callCluster = sinon.stub(); + const response = Promise.resolve({}); + + mockGetClusterStats(callCluster, response); + + expect(getClusterStats(callCluster)).to.be(response); + }); + +}); diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_local_stats.js b/src/legacy/core_plugins/telemetry/server/telemetry_collection/__tests__/get_local_stats.js similarity index 86% rename from x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_local_stats.js rename to src/legacy/core_plugins/telemetry/server/telemetry_collection/__tests__/get_local_stats.js index e0879d208d6f4..d0de9cc365a71 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_local_stats.js +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/__tests__/get_local_stats.js @@ -1,7 +1,20 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import expect from '@kbn/expect'; @@ -9,7 +22,6 @@ import sinon from 'sinon'; import { mockGetClusterInfo } from './get_cluster_info'; import { mockGetClusterStats } from './get_cluster_stats'; -import { mockGetXPack } from './get_xpack'; import { omit } from 'lodash'; import { @@ -22,17 +34,25 @@ const getMockServer = (getCluster = sinon.stub(), kibanaUsage = {}) => ({ log(tags, message) { console.log({ tags, message }); }, + config() { + return { + get(item) { + switch(item) { + case 'pkg.version': return '8675309-snapshot'; + default: throw Error(`unexpected config.get('${item}') received.`); + } + } + }; + }, usage: { collectorSet: { bulkFetch: () => kibanaUsage, toObject: data => data } }, plugins: { - xpack_main: { status: { plugin: { kbnServer: { version: '8675309-snapshot' } } } }, elasticsearch: { getCluster }, }, }); -function mockGetLocalStats(callCluster, clusterInfo, clusterStats, license, usage, req) { +function mockGetLocalStats(callCluster, clusterInfo, clusterStats, req) { mockGetClusterInfo(callCluster, clusterInfo, req); mockGetClusterStats(callCluster, clusterStats, req); - mockGetXPack(callCluster, license, usage, req); } describe('get_local_stats', () => { @@ -53,8 +73,6 @@ describe('get_local_stats', () => { nodes: { yup: 'abc' }, random: 123 }; - const license = { fancy: 'license' }; - const xpack = { also: 'fancy' }; const kibana = { kibana: { great: 'googlymoogly', @@ -81,9 +99,6 @@ describe('get_local_stats', () => { collection: 'local', cluster_uuid: clusterUuid, cluster_name: clusterName, - license: { - fancy: 'license' - }, version, cluster_stats: omit(clusterStats, '_nodes', 'cluster_name'), stack_stats: { @@ -108,7 +123,6 @@ describe('get_local_stats', () => { snow: { chances: 0 }, } }, - xpack: { also: 'fancy' }, } }; @@ -121,11 +135,11 @@ describe('get_local_stats', () => { expect(result.version).to.be('2.3.4'); expect(result.collection).to.be('local'); expect(result.license).to.be(undefined); - expect(result.stack_stats).to.eql({ kibana: undefined, xpack: undefined }); + expect(result.stack_stats).to.eql({ kibana: undefined }); }); it('returns expected object with xpack', () => { - const result = handleLocalStats(getMockServer(), clusterInfo, clusterStats, license, xpack); + const result = handleLocalStats(getMockServer(), clusterInfo, clusterStats); const { stack_stats: stack, ...cluster } = result; expect(cluster.collection).to.be(combinedStatsResult.collection); expect(cluster.cluster_uuid).to.be(combinedStatsResult.cluster_uuid); @@ -147,8 +161,6 @@ describe('get_local_stats', () => { callClusterUsageFailed, Promise.resolve(clusterInfo), Promise.resolve(clusterStats), - Promise.resolve(license), - Promise.reject('usage failed') ); const result = await getLocalStatsWithCaller(getMockServer(), callClusterUsageFailed); @@ -170,8 +182,6 @@ describe('get_local_stats', () => { callCluster, Promise.resolve(clusterInfo), Promise.resolve(clusterStats), - Promise.resolve(license), - Promise.resolve(xpack) ); const result = await getLocalStatsWithCaller(getMockServer(callCluster, kibana), callCluster); @@ -192,8 +202,6 @@ describe('get_local_stats', () => { callWithInternalUser, Promise.resolve(clusterInfo), Promise.resolve(clusterStats), - Promise.resolve(license), - Promise.resolve(xpack) ); const result = await getLocalStats(req, { useInternalUser: true }); @@ -213,8 +221,6 @@ describe('get_local_stats', () => { callWithRequest, Promise.resolve(clusterInfo), Promise.resolve(clusterStats), - Promise.resolve(license), - Promise.resolve(xpack), req ); diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/constants.ts b/src/legacy/core_plugins/telemetry/server/telemetry_collection/constants.ts new file mode 100644 index 0000000000000..ad14bfe7430da --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/constants.ts @@ -0,0 +1,23 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The timeout used by each request, whenever a timeout can be specified. + */ +export const TIMEOUT = '30s'; diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_cluster_info.js b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_cluster_info.js new file mode 100644 index 0000000000000..2e4ed0b36ed26 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_cluster_info.js @@ -0,0 +1,30 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Get the cluster info from the connected cluster. + * + * This is the equivalent to GET / + * + * @param {function} callCluster The callWithInternalUser handler (exposed for testing) + * @return {Promise} The response from Elasticsearch. + */ +export function getClusterInfo(callCluster) { + return callCluster('info'); +} diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_cluster_stats.js b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_cluster_stats.js new file mode 100644 index 0000000000000..a840c39812e2c --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_cluster_stats.js @@ -0,0 +1,34 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { TIMEOUT } from './constants'; + +/** + * Get the cluster stats from the connected cluster. + * + * This is the equivalent to GET /_cluster/stats?timeout=30s. + * + * @param {function} callCluster The callWithInternalUser handler (exposed for testing) + * @return {Promise} The response from Elasticsearch equivalent to GET /_cluster/stats. + */ +export function getClusterStats(callCluster) { + return callCluster('cluster.stats', { + timeout: TIMEOUT + }); +} diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_kibana.js b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_kibana.js new file mode 100644 index 0000000000000..051ef370fcde5 --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_kibana.js @@ -0,0 +1,58 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { get, omit } from 'lodash'; + +export function handleKibanaStats(server, response) { + if (!response) { + server.log(['warning', 'telemetry', 'local-stats'], 'No Kibana stats returned from usage collectors'); + return; + } + + const { kibana, kibana_stats: kibanaStats, ...plugins } = response; + + const platform = get(kibanaStats, 'os.platform', 'unknown'); + const platformRelease = get(kibanaStats, 'os.platformRelease', 'unknown'); + + const version = server.config().get('pkg.version').replace(/-snapshot/i, ''); + + // combine core stats (os types, saved objects) with plugin usage stats + // organize the object into the same format as monitoring-enabled telemetry + return { + ...omit(kibana, 'index'), // discard index + count: 1, + indices: 1, + os: { + platforms: [{ platform, count: 1 }], + platformReleases: [{ platformRelease, count: 1 }], + }, + versions: [{ version, count: 1 }], + plugins, + }; +} + +/* + * Check user privileges for read access to monitoring + * Pass callWithInternalUser to bulkFetchUsage + */ +export async function getKibana(server, callWithInternalUser) { + const { collectorSet } = server.usage; + const usage = await collectorSet.bulkFetch(callWithInternalUser); + return collectorSet.toObject(usage); +} diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_local_stats.js b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_local_stats.js similarity index 62% rename from x-pack/legacy/plugins/telemetry/server/collectors/local/get_local_stats.js rename to src/legacy/core_plugins/telemetry/server/telemetry_collection/get_local_stats.js index 5f6f738b6e501..67fc721306c21 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_local_stats.js +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_local_stats.js @@ -1,13 +1,25 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ import { get, omit } from 'lodash'; import { getClusterInfo } from './get_cluster_info'; import { getClusterStats } from './get_cluster_stats'; -import { getXPack } from './get_xpack'; import { getKibana, handleKibanaStats } from './get_kibana'; /** @@ -16,10 +28,9 @@ import { getKibana, handleKibanaStats } from './get_kibana'; * * @param {Object} clusterInfo Cluster info (GET /) * @param {Object} clusterStats Cluster stats (GET /_cluster/stats) - * @param {Object} xpack License and X-Pack details * @return {Object} A combined object containing the different responses. */ -export function handleLocalStats(server, clusterInfo, clusterStats, license, xpack, kibana) { +export function handleLocalStats(server, clusterInfo, clusterStats, kibana) { return { timestamp: (new Date()).toISOString(), cluster_uuid: get(clusterInfo, 'cluster_uuid'), @@ -27,10 +38,8 @@ export function handleLocalStats(server, clusterInfo, clusterStats, license, xpa version: get(clusterInfo, 'version.number'), cluster_stats: omit(clusterStats, '_nodes', 'cluster_name'), collection: 'local', - license, stack_stats: { kibana: handleKibanaStats(server, kibana), - xpack, } }; } @@ -42,18 +51,17 @@ export function handleLocalStats(server, clusterInfo, clusterStats, license, xpa * @param {function} callCluster The callWithInternalUser handler (exposed for testing) * @return {Promise} The object containing the current Elasticsearch cluster's telemetry. */ -export function getLocalStatsWithCaller(server, callCluster) { - return Promise.all([ +export async function getLocalStatsWithCaller(server, callCluster) { + const [ clusterInfo, clusterStats, kibana ] = await Promise.all([ getClusterInfo(callCluster), // cluster info getClusterStats(callCluster), // cluster stats (not to be confused with cluster _state_) - getXPack(callCluster), // { license, xpack } - getKibana(server, callCluster) - ]).then(([clusterInfo, clusterStats, { license, xpack }, kibana]) => { - return handleLocalStats(server, clusterInfo, clusterStats, license, xpack, kibana); - } - ); + getKibana(server, callCluster), + ]); + + return handleLocalStats(server, clusterInfo, clusterStats, kibana); } + /** * Get statistics for the connected Elasticsearch cluster. * @@ -61,10 +69,10 @@ export function getLocalStatsWithCaller(server, callCluster) { * @param {Boolean} useRequestUser callWithRequest, otherwise callWithInternalUser * @return {Promise} The cluster object containing telemetry. */ -export function getLocalStats(req, { useInternalUser = false } = {}) { +export async function getLocalStats(req, { useInternalUser = false } = {}) { const { server } = req; const { callWithRequest, callWithInternalUser } = server.plugins.elasticsearch.getCluster('data'); const callCluster = useInternalUser ? callWithInternalUser : (...args) => callWithRequest(req, ...args); - return getLocalStatsWithCaller(server, callCluster); + return await getLocalStatsWithCaller(server, callCluster); } diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_stats.ts b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_stats.ts new file mode 100644 index 0000000000000..024272e0f805c --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/get_stats.ts @@ -0,0 +1,45 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// @ts-ignore +import { getLocalStats } from './get_local_stats'; + +/** + * Get the telemetry data. + * + * @param {Object} req The incoming request. + * @param {Object} config Kibana config. + * @param {String} start The start time of the request (likely 20m ago). + * @param {String} end The end time of the request. + * @param {Boolean} unencrypted Is the request payload going to be unencrypted. + * @return {Promise} An array of telemetry objects. + */ +export async function getStats( + req: any, + config: any, + start: string, + end: string, + unencrypted: boolean +) { + return [ + await getLocalStats(req, { + useInternalUser: !unencrypted, + }), + ]; +} diff --git a/src/legacy/core_plugins/telemetry/server/telemetry_collection/index.ts b/src/legacy/core_plugins/telemetry/server/telemetry_collection/index.ts new file mode 100644 index 0000000000000..f33727d82f44c --- /dev/null +++ b/src/legacy/core_plugins/telemetry/server/telemetry_collection/index.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// @ts-ignore +export { getLocalStats } from './get_local_stats'; + +// @ts-ignore +export { getStats } from './get_stats'; diff --git a/test/common/config.js b/test/common/config.js index 452413fe4e4eb..44e4bef99bf62 100644 --- a/test/common/config.js +++ b/test/common/config.js @@ -55,6 +55,7 @@ export default function () { `--elasticsearch.username=${servers.elasticsearch.username}`, `--elasticsearch.password=${servers.elasticsearch.password}`, `--kibana.disableWelcomeScreen=true`, + '--telemetry.banner=false', `--server.maxPayloadBytes=1679958`, ], }, diff --git a/typings/elastic__node_crypto.d.ts b/typings/elastic__node_crypto.d.ts new file mode 100644 index 0000000000000..8d4b47da96b73 --- /dev/null +++ b/typings/elastic__node_crypto.d.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +declare module '@elastic/node-crypto'; diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 872d4ed9c29d1..e0ba455552966 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -25,7 +25,6 @@ "xpack.ml": "legacy/plugins/ml", "xpack.logstash": "legacy/plugins/logstash", "xpack.main": "legacy/plugins/xpack_main", - "xpack.telemetry": "legacy/plugins/telemetry", "xpack.monitoring": "legacy/plugins/monitoring", "xpack.remoteClusters": "legacy/plugins/remote_clusters", "xpack.reporting": "legacy/plugins/reporting", diff --git a/x-pack/index.js b/x-pack/index.js index f2e602ec05586..756d9b4d3127a 100644 --- a/x-pack/index.js +++ b/x-pack/index.js @@ -38,7 +38,6 @@ import { upgradeAssistant } from './legacy/plugins/upgrade_assistant'; import { uptime } from './legacy/plugins/uptime'; import { ossTelemetry } from './legacy/plugins/oss_telemetry'; import { fileUpload } from './legacy/plugins/file_upload'; -import { telemetry } from './legacy/plugins/telemetry'; import { encryptedSavedObjects } from './legacy/plugins/encrypted_saved_objects'; import { snapshotRestore } from './legacy/plugins/snapshot_restore'; import { transform } from './legacy/plugins/transform'; @@ -49,7 +48,6 @@ import { lens } from './legacy/plugins/lens'; module.exports = function (kibana) { return [ xpackMain(kibana), - telemetry(kibana), graph(kibana), monitoring(kibana), reporting(kibana), diff --git a/x-pack/legacy/plugins/license_management/public/lib/telemetry.js b/x-pack/legacy/plugins/license_management/public/lib/telemetry.js index 08928549916eb..bf8bed05aabed 100644 --- a/x-pack/legacy/plugins/license_management/public/lib/telemetry.js +++ b/x-pack/legacy/plugins/license_management/public/lib/telemetry.js @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { fetchTelemetry } from '../../../telemetry/public/hacks/fetch_telemetry'; -export { PRIVACY_STATEMENT_URL } from '../../../telemetry/common/constants'; -export { TelemetryOptInProvider } from '../../../telemetry/public/services/telemetry_opt_in'; -export { OptInExampleFlyout } from '../../../telemetry/public/components'; +import { fetchTelemetry } from '../../../../../../src/legacy/core_plugins/telemetry/public/hacks/fetch_telemetry'; +export { PRIVACY_STATEMENT_URL } from '../../../../../../src/legacy/core_plugins/telemetry/common/constants'; +export { TelemetryOptInProvider } from '../../../../../../src/legacy/core_plugins/telemetry/public/services'; +export { OptInExampleFlyout } from '../../../../../../src/legacy/core_plugins/telemetry/public/components'; let telemetryEnabled; let httpClient; diff --git a/x-pack/legacy/plugins/monitoring/common/constants.js b/x-pack/legacy/plugins/monitoring/common/constants.js index f953741cd2e02..e40941396b661 100644 --- a/x-pack/legacy/plugins/monitoring/common/constants.js +++ b/x-pack/legacy/plugins/monitoring/common/constants.js @@ -155,10 +155,7 @@ export const METRICBEAT_INDEX_NAME_UNIQUE_TOKEN = '-mb-'; // We use this for metricbeat migration to identify specific products that we do not have constants for export const ELASTICSEARCH_SYSTEM_ID = 'elasticsearch'; -export const KIBANA_SYSTEM_ID = 'kibana'; -export const BEATS_SYSTEM_ID = 'beats'; -export const APM_SYSTEM_ID = 'apm'; -export const LOGSTASH_SYSTEM_ID = 'logstash'; + /** * The id of the infra source owned by the monitoring plugin. */ @@ -181,3 +178,47 @@ export const CODE_PATH_LOGSTASH = 'logstash'; export const CODE_PATH_APM = 'apm'; export const CODE_PATH_LICENSE = 'license'; export const CODE_PATH_LOGS = 'logs'; + +/** + * The header sent by telemetry service when hitting Elasticsearch to identify query source + * @type {string} + */ +export const TELEMETRY_QUERY_SOURCE = 'TELEMETRY'; + +/** + * The name of the Kibana System ID used to publish and look up Kibana stats through the Monitoring system. + * @type {string} + */ +export const KIBANA_SYSTEM_ID = 'kibana'; + +/** + * The name of the Beats System ID used to publish and look up Beats stats through the Monitoring system. + * @type {string} + */ +export const BEATS_SYSTEM_ID = 'beats'; + +/** + * The name of the Apm System ID used to publish and look up Apm stats through the Monitoring system. + * @type {string} + */ +export const APM_SYSTEM_ID = 'apm'; + +/** + * The name of the Kibana System ID used to look up Logstash stats through the Monitoring system. + * @type {string} + */ +export const LOGSTASH_SYSTEM_ID = 'logstash'; + +/** + * The name of the Kibana System ID used to look up Reporting stats through the Monitoring system. + * @type {string} + */ +export const REPORTING_SYSTEM_ID = 'reporting'; + +/** + * The amount of time, in milliseconds, to wait between collecting kibana stats from es. + * + * Currently 24 hours kept in sync with reporting interval. + * @type {Number} + */ +export const TELEMETRY_COLLECTION_INTERVAL = 86400000; diff --git a/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/__tests__/bulk_uploader.js b/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/__tests__/bulk_uploader.js index d494963c4492d..3cacf00016f0d 100644 --- a/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/__tests__/bulk_uploader.js +++ b/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/__tests__/bulk_uploader.js @@ -49,9 +49,6 @@ describe('BulkUploader', () => { server = { log: sinon.spy(), - xpackMainPlugin: { - telemetryCollectionInterval: 3000, - }, elasticsearchPlugin: { createCluster: () => cluster, getCluster: () => cluster, diff --git a/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/bulk_uploader.js b/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/bulk_uploader.js index 015af8f3d633a..da23d4b77a323 100644 --- a/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/bulk_uploader.js +++ b/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/bulk_uploader.js @@ -10,7 +10,9 @@ import { callClusterFactory } from '../../../xpack_main'; import { LOGGING_TAG, KIBANA_MONITORING_LOGGING_TAG, + TELEMETRY_COLLECTION_INTERVAL, } from '../../common/constants'; + import { sendBulkPayload, monitoringBulk, @@ -36,7 +38,7 @@ const LOGGING_TAGS = [LOGGING_TAG, KIBANA_MONITORING_LOGGING_TAG]; * @param {Object} xpackInfo server.plugins.xpack_main.info object */ export class BulkUploader { - constructor({ config, log, interval, xpackMainPlugin, elasticsearchPlugin, kbnServerStatus, kbnServerVersion }) { + constructor({ config, log, interval, elasticsearchPlugin, kbnServerStatus, kbnServerVersion }) { if (typeof interval !== 'number') { throw new Error('interval number of milliseconds is required'); } @@ -44,7 +46,7 @@ export class BulkUploader { this._timer = null; this._interval = interval; this._lastFetchUsageTime = null; - this._usageInterval = xpackMainPlugin.telemetryCollectionInterval; + this._usageInterval = TELEMETRY_COLLECTION_INTERVAL; this._log = { debug: message => log(['debug', ...LOGGING_TAGS], message), diff --git a/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/lib/send_bulk_payload.js b/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/lib/send_bulk_payload.js index 208fb6305457b..3a286e4d7a513 100644 --- a/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/lib/send_bulk_payload.js +++ b/x-pack/legacy/plugins/monitoring/server/kibana_monitoring/lib/send_bulk_payload.js @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MONITORING_SYSTEM_API_VERSION } from '../../../common/constants'; -import { KIBANA_SYSTEM_ID } from '../../../../telemetry/common/constants'; +import { MONITORING_SYSTEM_API_VERSION, KIBANA_SYSTEM_ID } from '../../../common/constants'; /* * Send the Kibana usage data to the ES Monitoring Bulk endpoint diff --git a/x-pack/legacy/plugins/monitoring/server/plugin.js b/x-pack/legacy/plugins/monitoring/server/plugin.js index 349e705434bfa..ab7813aa26566 100644 --- a/x-pack/legacy/plugins/monitoring/server/plugin.js +++ b/x-pack/legacy/plugins/monitoring/server/plugin.js @@ -10,6 +10,9 @@ import { requireUIRoutes } from './routes'; import { instantiateClient } from './es_client/instantiate_client'; import { initMonitoringXpackInfo } from './init_monitoring_xpack_info'; import { initBulkUploader } from './kibana_monitoring'; +import { telemetryCollectionManager } from '../../../../../src/legacy/core_plugins/telemetry/server'; +import { getStatsWithMonitoring } from './telemetry_collection'; + import { getKibanaUsageCollector, getOpsStatsCollector, @@ -36,6 +39,8 @@ export class Plugin { collectorSet.register(getKibanaUsageCollector({ collectorSet, config })); collectorSet.register(getSettingsCollector({ collectorSet, config })); + telemetryCollectionManager.setStatsGetter(getStatsWithMonitoring, 'monitoring', 2); + /* * Instantiate and start the internal background task that calls collector * fetch methods and uploads to the ES monitoring bulk endpoint @@ -90,7 +95,6 @@ export class Plugin { const bulkUploader = initBulkUploader({ elasticsearchPlugin: plugins.elasticsearch, - xpackMainPlugin: plugins.xpack_main, config, log: core.log, kbnServerStatus: kbnServer.status, diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/create_query.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/create_query.js similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/create_query.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/create_query.js diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/fixtures/beats_stats_results.json b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/fixtures/beats_stats_results.json similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/fixtures/beats_stats_results.json rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/fixtures/beats_stats_results.json diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_all_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_all_stats.js similarity index 95% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_all_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_all_stats.js index fff281a0d87ef..0d147b747f2d0 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_all_stats.js +++ b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_all_stats.js @@ -6,7 +6,7 @@ import expect from '@kbn/expect'; import sinon from 'sinon'; -import { addStackStats, getAllStats, getAllStatsForServer, handleAllStats } from '../get_all_stats'; +import { addStackStats, getAllStats, handleAllStats } from '../get_all_stats'; describe('get_all_stats', () => { const size = 123; @@ -106,7 +106,7 @@ describe('get_all_stats', () => { } ]; - describe('getAllStats / getAllStatsForServer return the same results', () => { + describe('getAllStats', () => { it('returns clusters', async () => { const clusterUuidsResponse = { aggregations: { cluster_uuids: { buckets: [ { key: 'a' } ] } } @@ -201,7 +201,6 @@ describe('get_all_stats', () => { .onCall(3).returns(Promise.resolve(logstashStatsResponse)); expect(await getAllStats(req, start, end)).to.eql(allClusters); - expect(await getAllStatsForServer(server, start, end)).to.eql(allClusters); }); it('returns empty clusters', async () => { @@ -213,7 +212,6 @@ describe('get_all_stats', () => { callWithInternalUser.withArgs('search').returns(Promise.resolve(clusterUuidsResponse)); expect(await getAllStats(req, start, end)).to.eql([]); - expect(await getAllStatsForServer(server, start, end)).to.eql([]); }); }); diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_beats_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_beats_stats.js similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_beats_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_beats_stats.js diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_cluster_uuids.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_cluster_uuids.js similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_cluster_uuids.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_cluster_uuids.js diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_es_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_es_stats.js similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_es_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_es_stats.js diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_high_level_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_high_level_stats.js similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_high_level_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_high_level_stats.js diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_kibana_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_kibana_stats.js similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/__tests__/get_kibana_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/__tests__/get_kibana_stats.js diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/create_query.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/create_query.js similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/create_query.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/create_query.js diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_all_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_all_stats.js similarity index 84% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_all_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_all_stats.js index bc93dad72214d..b1e8db1b96005 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_all_stats.js +++ b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_all_stats.js @@ -6,7 +6,11 @@ import { get, set, merge } from 'lodash'; -import { constants } from '../../'; +import { + LOGSTASH_SYSTEM_ID, + KIBANA_SYSTEM_ID, + BEATS_SYSTEM_ID, +} from '../../common/constants'; import { getClusterUuids } from './get_cluster_uuids'; import { getElasticsearchStats } from './get_es_stats'; import { getKibanaStats } from './get_kibana_stats'; @@ -30,20 +34,6 @@ export function getAllStats(req, start, end, { useInternalUser = false } = {}) { return getAllStatsWithCaller(server, callCluster, start, end); } -/** - * Get statistics for all products joined by Elasticsearch cluster. - * - * @param {Object} server The server instance used to call ES as the internal user - * @param {Date} start The starting range to request data - * @param {Date} end The ending range to request data - * @return {Promise} The array of clusters joined with the Kibana and Logstash instances. - */ -export function getAllStatsForServer(server, start, end) { - const { callWithInternalUser } = server.plugins.elasticsearch.getCluster('monitoring'); - - return getAllStatsWithCaller(server, callWithInternalUser, start, end); -} - /** * Get statistics for all products joined by Elasticsearch cluster. * @@ -64,7 +54,7 @@ function getAllStatsWithCaller(server, callCluster, start, end) { return Promise.all([ getElasticsearchStats(server, callCluster, clusterUuids), // cluster_stats, stack_stats.xpack, cluster_name/uuid, license, version getKibanaStats(server, callCluster, clusterUuids, start, end), // stack_stats.kibana - getHighLevelStats(server, callCluster, clusterUuids, start, end, constants.LOGSTASH_SYSTEM_ID), // stack_stats.logstash + getHighLevelStats(server, callCluster, clusterUuids, start, end, LOGSTASH_SYSTEM_ID), // stack_stats.logstash getBeatsStats(server, callCluster, clusterUuids, start, end), // stack_stats.beats ]) .then(([esClusters, kibana, logstash, beats]) => handleAllStats(esClusters, { kibana, logstash, beats })); @@ -83,9 +73,9 @@ function getAllStatsWithCaller(server, callCluster, start, end) { export function handleAllStats(clusters, { kibana, logstash, beats }) { return clusters.map(cluster => { // if they are using Kibana or Logstash, then add it to the cluster details under cluster.stack_stats - addStackStats(cluster, kibana, constants.KIBANA_SYSTEM_ID); - addStackStats(cluster, logstash, constants.LOGSTASH_SYSTEM_ID); - addStackStats(cluster, beats, constants.BEATS_SYSTEM_ID); + addStackStats(cluster, kibana, KIBANA_SYSTEM_ID); + addStackStats(cluster, logstash, LOGSTASH_SYSTEM_ID); + addStackStats(cluster, beats, BEATS_SYSTEM_ID); mergeXPackStats(cluster, kibana, 'graph_workspace', 'graph'); // copy graph_workspace info out of kibana, merge it into stack_stats.xpack.graph return cluster; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_beats_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_beats_stats.js similarity index 97% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_beats_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_beats_stats.js index b8688e8b7a55e..247e4e991125c 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_beats_stats.js +++ b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_beats_stats.js @@ -6,7 +6,7 @@ import { get } from 'lodash'; import { createQuery } from './create_query'; -import { INDEX_PATTERN_BEATS } from '../../../../monitoring/common/constants'; +import { INDEX_PATTERN_BEATS } from '../../common/constants'; const HITS_SIZE = 10000; // maximum hits to receive from ES with each search @@ -118,9 +118,13 @@ export function processResults(results = [], { clusters, clusterHostSets, cluste clusterHb.monitors += heartbeatState.monitors; clusterHb.endpoints += heartbeatState.endpoints; for (const proto in heartbeatState) { - if (!heartbeatState.hasOwnProperty(proto)) continue; + if (!heartbeatState.hasOwnProperty(proto)) { + continue; + } const val = heartbeatState[proto]; - if (typeof val !== 'object') continue; + if (typeof val !== 'object') { + continue; + } if (!clusterHb.hasOwnProperty(proto)) { clusterHb[proto] = { diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_cluster_uuids.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_cluster_uuids.js similarity index 96% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_cluster_uuids.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_cluster_uuids.js index 9ea8de80e05d4..9caf4cac50e09 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_cluster_uuids.js +++ b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_cluster_uuids.js @@ -6,7 +6,7 @@ import { get } from 'lodash'; import { createQuery } from './create_query'; -import { INDEX_PATTERN_ELASTICSEARCH } from '../../../../monitoring/common/constants'; +import { INDEX_PATTERN_ELASTICSEARCH } from '../../common/constants'; /** * Get a list of Cluster UUIDs that exist within the specified timespan. diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_es_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_es_stats.js similarity index 96% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_es_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_es_stats.js index 0a54871165338..f12c337c30604 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_es_stats.js +++ b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_es_stats.js @@ -5,7 +5,7 @@ */ import { get } from 'lodash'; -import { INDEX_PATTERN_ELASTICSEARCH } from '../../../../monitoring/common/constants'; +import { INDEX_PATTERN_ELASTICSEARCH } from '../../common/constants'; /** * Get statistics for all selected Elasticsearch clusters. diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_high_level_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_high_level_stats.js similarity index 97% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_high_level_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_high_level_stats.js index ecd6ccc2d2404..889efe37e7a8f 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_high_level_stats.js +++ b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_high_level_stats.js @@ -6,8 +6,16 @@ import { get } from 'lodash'; import { createQuery } from './create_query'; -import { INDEX_PATTERN_KIBANA, INDEX_PATTERN_BEATS, INDEX_PATTERN_LOGSTASH } from '../../../../monitoring/common/constants'; -import { KIBANA_SYSTEM_ID, BEATS_SYSTEM_ID, APM_SYSTEM_ID, LOGSTASH_SYSTEM_ID, TELEMETRY_QUERY_SOURCE } from '../../../common/constants'; +import { + INDEX_PATTERN_KIBANA, + INDEX_PATTERN_BEATS, + INDEX_PATTERN_LOGSTASH, + KIBANA_SYSTEM_ID, + BEATS_SYSTEM_ID, + APM_SYSTEM_ID, + LOGSTASH_SYSTEM_ID, + TELEMETRY_QUERY_SOURCE, +} from '../../common/constants'; /** * Update a counter associated with the {@code key}. diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_kibana_stats.js b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_kibana_stats.js similarity index 98% rename from x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_kibana_stats.js rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_kibana_stats.js index d92593811b4cd..9364392ab33ae 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/get_kibana_stats.js +++ b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_kibana_stats.js @@ -5,7 +5,7 @@ */ import { get, isEmpty, omit } from 'lodash'; -import { KIBANA_SYSTEM_ID } from '../../../common/constants'; +import { KIBANA_SYSTEM_ID } from '../../common/constants'; import { fetchHighLevelStats, handleHighLevelStatsResponse } from './get_high_level_stats'; export function rollUpTotals(rolledUp, addOn, field) { diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/get_stats.ts b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_stats_with_monitoring.ts similarity index 58% rename from x-pack/legacy/plugins/telemetry/server/collectors/get_stats.ts rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_stats_with_monitoring.ts index 7b1af9e06b14d..fdf46122f13b7 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/get_stats.ts +++ b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/get_stats_with_monitoring.ts @@ -4,7 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getAllStats, getLocalStats } from './'; +// @ts-ignore +import { getAllStats } from './get_all_stats'; +import { getStatsWithXpack } from '../../../xpack_main/server/telemetry_collection'; /** * Get the telemetry data. @@ -16,30 +18,25 @@ import { getAllStats, getLocalStats } from './'; * @param {Boolean} unencrypted Is the request payload going to be unencrypted. * @return {Promise} An array of telemetry objects. */ -export async function getStats( +export async function getStatsWithMonitoring( req: any, config: any, start: string, end: string, - unencrypted: boolean, - statsGetters: any = {} + unencrypted: boolean ) { - const { _getAllStats = getAllStats, _getLocalStats = getLocalStats } = statsGetters; let response = []; const useInternalUser = !unencrypted; - if (config.get('xpack.monitoring.enabled')) { - try { - // attempt to collect stats from multiple clusters in monitoring data - response = await _getAllStats(req, start, end, { useInternalUser }); - } catch (err) { - // no-op - } + try { + // attempt to collect stats from multiple clusters in monitoring data + response = await getAllStats(req, start, end, { useInternalUser }); + } catch (err) { + // no-op } if (!Array.isArray(response) || response.length === 0) { - // return it as an array for a consistent API response - response = [await _getLocalStats(req, { useInternalUser })]; + response = await getStatsWithXpack(req, config, start, end, unencrypted); } return response; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/encryption/index.ts b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/index.ts similarity index 77% rename from x-pack/legacy/plugins/telemetry/server/collectors/encryption/index.ts rename to x-pack/legacy/plugins/monitoring/server/telemetry_collection/index.ts index 0c3ad5a5e3019..db2301932cfdc 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/encryption/index.ts +++ b/x-pack/legacy/plugins/monitoring/server/telemetry_collection/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { encryptTelemetry } from './encrypt'; +export { getStatsWithMonitoring } from './get_stats_with_monitoring'; diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/csp/csp_collector.ts b/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/csp/csp_collector.ts deleted file mode 100644 index 3bacde22bdbc4..0000000000000 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/csp/csp_collector.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - createCSPRuleString, - DEFAULT_CSP_RULES, -} from '../../../../../../../../src/legacy/server/csp'; -import { HapiServer } from '../../../../'; - -export function createCspCollector(server: HapiServer) { - return { - type: 'csp', - isReady: () => true, - async fetch() { - const config = server.config(); - - // It's important that we do not send the value of csp.rules here as it - // can be customized with values that can be identifiable to given - // installs, such as URLs - const defaultRulesString = createCSPRuleString([...DEFAULT_CSP_RULES]); - const actualRulesString = createCSPRuleString(config.get('csp.rules')); - - return { - strict: config.get('csp.strict'), - warnLegacyBrowsers: config.get('csp.warnLegacyBrowsers'), - rulesChangedFromDefault: defaultRulesString !== actualRulesString, - }; - }, - }; -} - -export function registerCspCollector(server: HapiServer): void { - const { usage } = server; - const collector = usage.collectorSet.makeUsageCollector(createCspCollector(server)); - usage.collectorSet.register(collector); -} diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/index.ts b/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/index.ts index abe96fe061faa..8b825b13178f2 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/index.ts +++ b/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/index.ts @@ -5,10 +5,8 @@ */ import { HapiServer } from '../../../'; -import { registerCspCollector } from './csp'; import { registerVisualizationsCollector } from './visualizations/register_usage_collector'; export function registerCollectors(server: HapiServer) { registerVisualizationsCollector(server); - registerCspCollector(server); } diff --git a/x-pack/legacy/plugins/telemetry/common/constants.ts b/x-pack/legacy/plugins/telemetry/common/constants.ts deleted file mode 100644 index c50f36ac94497..0000000000000 --- a/x-pack/legacy/plugins/telemetry/common/constants.ts +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; - -/* - * config options opt into telemetry - * @type {string} - */ -export const CONFIG_TELEMETRY = 'telemetry:optIn'; -/* - * config description for opting into telemetry - * @type {string} - */ -export const getConfigTelemetryDesc = () => { - return i18n.translate('xpack.telemetry.telemetryConfigDescription', { - defaultMessage: - 'Help us improve the Elastic Stack by providing usage statistics for basic features. We will not share this data outside of Elastic.', - }); -}; - -/** - * The name of the Kibana System ID used to publish and look up Kibana stats through the Monitoring system. - * @type {string} - */ -export const KIBANA_SYSTEM_ID = 'kibana'; - -/** - * The name of the Beats System ID used to publish and look up Beats stats through the Monitoring system. - * @type {string} - */ -export const BEATS_SYSTEM_ID = 'beats'; - -/** - * The name of the Apm System ID used to publish and look up Apm stats through the Monitoring system. - * @type {string} - */ -export const APM_SYSTEM_ID = 'beats'; - -/** - * The name of the Kibana System ID used to look up Logstash stats through the Monitoring system. - * @type {string} - */ -export const LOGSTASH_SYSTEM_ID = 'logstash'; - -/** - * The name of the Kibana System ID used to look up Reporting stats through the Monitoring system. - * @type {string} - */ -export const REPORTING_SYSTEM_ID = 'reporting'; - -/** - * The amount of time, in milliseconds, to wait between reports when enabled. - * - * Currently 24 hours. - * @type {Number} - */ -export const REPORT_INTERVAL_MS = 86400000; - -/* - * Key for the localStorage service - */ -export const LOCALSTORAGE_KEY = 'xpack.data'; - -/** - * Link to the Elastic Telemetry privacy statement. - */ -export const PRIVACY_STATEMENT_URL = `https://www.elastic.co/legal/telemetry-privacy-statement`; - -/** - * The type name used within the Monitoring index to publish localization stats. - * @type {string} - */ -export const KIBANA_LOCALIZATION_STATS_TYPE = 'localization'; - -/** - * The header sent by telemetry service when hitting Elasticsearch to identify query source - * @type {string} - */ -export const TELEMETRY_QUERY_SOURCE = 'TELEMETRY'; - -/** - * UI metric usage type - * @type {string} - */ -export const UI_METRIC_USAGE_TYPE = 'ui_metric'; diff --git a/x-pack/legacy/plugins/telemetry/common/get_xpack_config_with_deprecated.ts b/x-pack/legacy/plugins/telemetry/common/get_xpack_config_with_deprecated.ts deleted file mode 100644 index 9fa8ead5c8a09..0000000000000 --- a/x-pack/legacy/plugins/telemetry/common/get_xpack_config_with_deprecated.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { KibanaConfig } from 'src/legacy/server/kbn_server'; - -export function getXpackConfigWithDeprecated(config: KibanaConfig, configPath: string) { - const deprecatedConfig = config.get(`xpack.xpack_main.${configPath}`); - if (typeof deprecatedConfig !== 'undefined') { - return deprecatedConfig; - } - return config.get(`xpack.${configPath}`); -} diff --git a/x-pack/legacy/plugins/telemetry/public/components/index.ts b/x-pack/legacy/plugins/telemetry/public/components/index.ts deleted file mode 100644 index 9675bd997b183..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/components/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// @ts-ignore -export { TelemetryForm } from './telemetry_form'; -export { OptInExampleFlyout } from './opt_in_details_component'; -export { OptInBanner } from './opt_in_banner_component'; -export { OptInMessage } from './opt_in_message'; diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.test.tsx b/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.test.tsx deleted file mode 100644 index c58927c66756b..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.test.tsx +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import React from 'react'; -import { shallowWithIntl } from 'test_utils/enzyme_helpers'; -import { OptInExampleFlyout } from './opt_in_details_component'; - -describe('OptInDetailsComponent', () => { - it('renders as expected', () => { - expect( - shallowWithIntl( - ({ data: [] }))} - onClose={jest.fn()} - /> - ) - ).toMatchSnapshot(); - }); -}); diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.tsx b/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.tsx deleted file mode 100644 index 9cfb55af1dab3..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.tsx +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import * as React from 'react'; - -import { - EuiCallOut, - EuiCodeBlock, - EuiFlexGroup, - EuiFlexItem, - EuiFlyout, - EuiFlyoutHeader, - EuiFlyoutBody, - EuiLoadingSpinner, - EuiPortal, // EuiPortal is a temporary requirement to use EuiFlyout with "ownFocus" - EuiText, - EuiTextColor, - EuiTitle, -} from '@elastic/eui'; - -import { FormattedMessage } from '@kbn/i18n/react'; - -interface Props { - fetchTelemetry: () => Promise; - onClose: () => void; -} - -interface State { - isLoading: boolean; - hasPrivilegeToRead: boolean; - data: any[] | null; -} - -/** - * React component for displaying the example data associated with the Telemetry opt-in banner. - */ -export class OptInExampleFlyout extends React.PureComponent { - public readonly state: State = { - data: null, - isLoading: true, - hasPrivilegeToRead: false, - }; - - componentDidMount() { - this.props - .fetchTelemetry() - .then(response => - this.setState({ - data: Array.isArray(response.data) ? response.data : null, - isLoading: false, - hasPrivilegeToRead: true, - }) - ) - .catch(err => { - this.setState({ - isLoading: false, - hasPrivilegeToRead: err.status !== 403, - }); - }); - } - - renderBody({ data, isLoading, hasPrivilegeToRead }: State) { - if (isLoading) { - return ( - - - - - - ); - } - - if (!hasPrivilegeToRead) { - return ( - - } - color="danger" - iconType="cross" - > - - - ); - } - - if (data === null) { - return ( - - } - color="danger" - iconType="cross" - > - - - ); - } - - return {JSON.stringify(data, null, 2)}; - } - - render() { - return ( - - - - -

- -

-
- - - - - -
- {this.renderBody(this.state)} -
-
- ); - } -} diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx b/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx deleted file mode 100644 index 5be20f8de32c1..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import * as React from 'react'; -import { EuiLink, EuiText } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; - -import { getConfigTelemetryDesc, PRIVACY_STATEMENT_URL } from '../../common/constants'; -import { OptInExampleFlyout } from './opt_in_details_component'; - -interface Props { - fetchTelemetry: () => Promise; -} - -interface State { - showDetails: boolean; - showExample: boolean; -} - -export class OptInMessage extends React.PureComponent { - public readonly state: State = { - showDetails: false, - showExample: false, - }; - - toggleShowExample = () => { - this.setState(prevState => ({ - showExample: !prevState.showExample, - })); - }; - - render() { - const { showDetails, showExample } = this.state; - - const getDetails = () => ( - -

- - - - ), - telemetryPrivacyStatementLink: ( - - - - ), - }} - /> -

-
- ); - - const getFlyoutDetails = () => ( - this.setState({ showExample: false })} - fetchTelemetry={this.props.fetchTelemetry} - /> - ); - - const getReadMore = () => ( - this.setState({ showDetails: true })}> - - - ); - - return ( - - -

- {getConfigTelemetryDesc()} {!showDetails && getReadMore()} -

-
- {showDetails && getDetails()} - {showDetails && showExample && getFlyoutDetails()} -
- ); - } -} diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/__tests__/telemetry.js b/x-pack/legacy/plugins/telemetry/public/hacks/__tests__/telemetry.js deleted file mode 100644 index 2c14538d77374..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/hacks/__tests__/telemetry.js +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { uiModules } from 'ui/modules'; - -// This overrides settings for other UI tests -uiModules.get('kibana') - // disable stat reporting while running tests, - // MockInjector used in these tests is not impacted - .constant('telemetryEnabled', false) - .constant('telemetryOptedIn', null) - .constant('telemetryUrl', 'not.a.valid.url.0'); diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/fetch_telemetry.js b/x-pack/legacy/plugins/telemetry/public/hacks/fetch_telemetry.js deleted file mode 100644 index ced23c58566b9..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/hacks/fetch_telemetry.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import uiChrome from 'ui/chrome'; -import moment from 'moment'; - -/** - * Fetch Telemetry data by calling the Kibana API. - * - * @param {Object} $http The HTTP handler - * @param {String} basePath The base URI - * @param {Function} _moment moment.js, but injectable for tests - * @return {Promise} An array of cluster Telemetry objects. - */ -export function fetchTelemetry($http, { basePath = uiChrome.getBasePath(), _moment = moment, unencrypted = false } = { }) { - return $http.post(`${basePath}/api/telemetry/v2/clusters/_stats`, { - unencrypted, - timeRange: { - min: _moment().subtract(20, 'minutes').toISOString(), - max: _moment().toISOString() - } - }); -} diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/telemetry_init.ts b/x-pack/legacy/plugins/telemetry/public/hacks/telemetry_init.ts deleted file mode 100644 index c44da2b36bf1e..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/hacks/telemetry_init.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// @ts-ignore -import { uiModules } from 'ui/modules'; -// @ts-ignore -import { Path } from 'plugins/xpack_main/services/path'; -// @ts-ignore -import { npStart } from 'ui/new_platform'; -// @ts-ignore -import { Telemetry } from './telemetry'; -// @ts-ignore -import { fetchTelemetry } from './fetch_telemetry'; - -function telemetryInit($injector: any) { - const $http = $injector.get('$http'); - - const telemetryEnabled = npStart.core.injectedMetadata.getInjectedVar('telemetryEnabled'); - - if (telemetryEnabled) { - // no telemetry for non-logged in users - if (Path.isUnauthenticated()) { - return; - } - - const sender = new Telemetry($injector, () => fetchTelemetry($http)); - sender.start(); - } -} - -uiModules.get('telemetry/hacks').run(telemetryInit); diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/telemetry_opt_in.js b/x-pack/legacy/plugins/telemetry/public/hacks/telemetry_opt_in.js deleted file mode 100644 index a7c36516d004c..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/hacks/telemetry_opt_in.js +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { uiModules } from 'ui/modules'; - -import { injectBanner } from './welcome_banner'; - -uiModules.get('telemetry/hacks').run(injectBanner); diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/index.js b/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/index.js deleted file mode 100644 index 2eabe7496b1f2..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/index.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { injectBanner } from './inject_banner'; diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.test.js b/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.test.js deleted file mode 100644 index a55027703f951..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.test.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { renderBanner } from './render_banner'; - -describe('render_banner', () => { - - it('adds a banner to banners with priority of 10000', () => { - const bannerID = 'brucer-banner'; - - const telemetryOptInProvider = { setBannerId: jest.fn() }; - const banners = { add: jest.fn().mockReturnValue(bannerID) }; - const fetchTelemetry = jest.fn(); - - renderBanner(telemetryOptInProvider, fetchTelemetry, { _banners: banners }); - - expect(banners.add).toBeCalledTimes(1); - expect(fetchTelemetry).toBeCalledTimes(0); - expect(telemetryOptInProvider.setBannerId).toBeCalledWith(bannerID); - - const bannerConfig = banners.add.mock.calls[0][0]; - - expect(bannerConfig.component).not.toBe(undefined); - expect(bannerConfig.priority).toBe(10000); - }); - -}); diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/should_show_banner.js b/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/should_show_banner.js deleted file mode 100644 index 5685132a95061..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/should_show_banner.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { handleOldSettings } from './handle_old_settings'; - -/** - * Determine if the banner should be displayed. - * - * This method can have side-effects related to deprecated config settings. - * - * @param {Object} config The advanced settings config object. - * @param {Object} _handleOldSettings handleOldSettings function, but overridable for tests. - * @return {Boolean} {@code true} if the banner should be displayed. {@code false} otherwise. - */ -export async function shouldShowBanner(telemetryOptInProvider, config, { _handleOldSettings = handleOldSettings } = {}) { - return telemetryOptInProvider.getOptIn() === null && await _handleOldSettings(config, telemetryOptInProvider); -} diff --git a/x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in.test.mocks.js b/x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in.test.mocks.js deleted file mode 100644 index 63bfcb4b2a327..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in.test.mocks.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { injectedMetadataServiceMock } from '../../../../../../src/core/public/mocks'; -const injectedMetadataMock = injectedMetadataServiceMock.createStartContract(); - -export function mockInjectedMetadata({ telemetryOptedIn }) { - const mockGetInjectedVar = jest.fn().mockImplementation((key) => { - switch (key) { - case 'telemetryOptedIn': return telemetryOptedIn; - default: throw new Error(`unexpected injectedVar ${key}`); - } - }); - - injectedMetadataMock.getInjectedVar = mockGetInjectedVar; -} - -jest.doMock('ui/new_platform', () => ({ - npStart: { - core: { - injectedMetadata: injectedMetadataMock - }, - }, -})); diff --git a/x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in.ts b/x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in.ts deleted file mode 100644 index 9c1bfde1d27b9..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// @ts-ignore -export { TelemetryOptInProvider } from '../../../../../../src/legacy/core_plugins/kibana/public/home/telemetry_opt_in'; // eslint-disable-line diff --git a/x-pack/legacy/plugins/telemetry/public/views/management/index.js b/x-pack/legacy/plugins/telemetry/public/views/management/index.js deleted file mode 100644 index 0ed6fe09ef80a..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/views/management/index.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import './management'; diff --git a/x-pack/legacy/plugins/telemetry/public/views/management/management.js b/x-pack/legacy/plugins/telemetry/public/views/management/management.js deleted file mode 100644 index 9e580f109d536..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/views/management/management.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import React from 'react'; -import routes from 'ui/routes'; - -import { registerSettingsComponent, PAGE_FOOTER_COMPONENT } from 'ui/management'; -import { TelemetryOptInProvider } from '../../services/telemetry_opt_in'; -import { TelemetryForm } from '../../components'; - -routes.defaults(/\/management/, { - resolve: { - telemetryManagementSection: function (Private, spacesEnabled, activeSpace) { - const telemetryOptInProvider = Private(TelemetryOptInProvider); - - const spaceProps = { - spacesEnabled, - }; - - if (spacesEnabled) { - spaceProps.activeSpace = activeSpace ? activeSpace.space : null; - } - - const Component = (props) => ( - - ); - - registerSettingsComponent(PAGE_FOOTER_COMPONENT, Component, true); - } - } -}); diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/encryption/encrypt.ts b/x-pack/legacy/plugins/telemetry/server/collectors/encryption/encrypt.ts deleted file mode 100644 index 8907292df8445..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/encryption/encrypt.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { createRequestEncryptor } from '@elastic/request-crypto'; -import { telemetryJWKS } from './telemetry_jwks'; - -export function getKID(isProd = false): string { - return isProd ? 'kibana' : 'kibana_dev'; -} - -export async function encryptTelemetry(payload: any, isProd = false): Promise { - const kid = getKID(isProd); - const encryptor = await createRequestEncryptor(telemetryJWKS); - const clusters = [].concat(payload); - return Promise.all(clusters.map((cluster: any) => encryptor.encrypt(kid, cluster))); -} diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/index.ts b/x-pack/legacy/plugins/telemetry/server/collectors/index.ts deleted file mode 100644 index c9b94a8ea5d5e..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// @ts-ignore -export { getAllStats } from './monitoring'; -// @ts-ignore -export { getLocalStats } from './local'; -export { getStats } from './get_stats'; -export { encryptTelemetry } from './encryption'; -export { createTelemetryUsageCollector } from './usage'; -export { createUiMetricUsageCollector } from './ui_metric'; -export { createLocalizationUsageCollector } from './localization'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_cluster_info.js b/x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_cluster_info.js deleted file mode 100644 index dfe7998718a9e..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_cluster_info.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import sinon from 'sinon'; - -import { getClusterInfo } from '../get_cluster_info'; - -export function mockGetClusterInfo(callCluster, clusterInfo, req) { - callCluster.withArgs(req, 'info').returns(clusterInfo); - callCluster.withArgs('info').returns(clusterInfo); -} - -describe('get_cluster_info', () => { - - it('uses callCluster to get info API', () => { - const callCluster = sinon.stub(); - const response = Promise.resolve({}); - - mockGetClusterInfo(callCluster, response); - - expect(getClusterInfo(callCluster)).to.be(response); - }); - -}); diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_cluster_stats.js b/x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_cluster_stats.js deleted file mode 100644 index 29e7e620e3313..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_cluster_stats.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import sinon from 'sinon'; - -import { TIMEOUT } from '../constants'; -import { getClusterStats } from '../get_cluster_stats'; - -export function mockGetClusterStats(callCluster, clusterStats, req) { - callCluster.withArgs(req, 'cluster.stats', { - timeout: TIMEOUT - }) - .returns(clusterStats); - - callCluster.withArgs('cluster.stats', { - timeout: TIMEOUT - }) - .returns(clusterStats); -} - -describe('get_cluster_stats', () => { - - it('uses callCluster to get cluster.stats API', () => { - const callCluster = sinon.stub(); - const response = Promise.resolve({}); - - mockGetClusterStats(callCluster, response); - - expect(getClusterStats(callCluster)).to.be(response); - }); - -}); diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_cluster_info.js b/x-pack/legacy/plugins/telemetry/server/collectors/local/get_cluster_info.js deleted file mode 100644 index 550af3692b97f..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_cluster_info.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -/** - * Get the cluster info from the connected cluster. - * - * This is the equivalent to GET / - * - * @param {function} callCluster The callWithInternalUser handler (exposed for testing) - * @return {Promise} The response from Elasticsearch. - */ -export function getClusterInfo(callCluster) { - return callCluster('info'); -} diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_cluster_stats.js b/x-pack/legacy/plugins/telemetry/server/collectors/local/get_cluster_stats.js deleted file mode 100644 index 34152f8fea4e7..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_cluster_stats.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { TIMEOUT } from './constants'; - -/** - * Get the cluster stats from the connected cluster. - * - * This is the equivalent to GET /_cluster/stats?timeout=30s. - * - * @param {function} callCluster The callWithInternalUser handler (exposed for testing) - * @return {Promise} The response from Elasticsearch equivalent to GET /_cluster/stats. - */ -export function getClusterStats(callCluster) { - return callCluster('cluster.stats', { - timeout: TIMEOUT - }); -} diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_kibana.js b/x-pack/legacy/plugins/telemetry/server/collectors/local/get_kibana.js deleted file mode 100644 index 50e68e2b74d68..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_kibana.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { get, omit } from 'lodash'; - -export function handleKibanaStats(server, response) { - if (!response) { - server.log(['warning', 'telemetry', 'local-stats'], 'No Kibana stats returned from usage collectors'); - return; - } - - const { kibana, kibana_stats: stats, ...plugins } = response; - - const platform = get(stats, 'os.platform', 'unknown'); - const platformRelease = get(stats, 'os.platformRelease', 'unknown'); - - let version; - const { kbnServer } = get(server, 'plugins.xpack_main.status.plugin'); - if (kbnServer) { - version = kbnServer.version.replace(/-snapshot/i, ''); - } - - // combine core stats (os types, saved objects) with plugin usage stats - // organize the object into the same format as monitoring-enabled telemetry - return { - ...omit(kibana, 'index'), // discard index - count: 1, - indices: 1, - os: { - platforms: [{ platform, count: 1 }], - platformReleases: [{ platformRelease, count: 1 }], - }, - versions: [{ version, count: 1 }], - plugins, - }; -} - -/* - * Check user privileges for read access to monitoring - * Pass callWithInternalUser to bulkFetchUsage - */ -export async function getKibana(server, callWithInternalUser) { - const { collectorSet } = server.usage; - const usage = await collectorSet.bulkFetch(callWithInternalUser); - return collectorSet.toObject(usage); -} diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/index.js b/x-pack/legacy/plugins/telemetry/server/collectors/local/index.js deleted file mode 100644 index b78fca22c1af7..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/local/index.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { getLocalStats } from './get_local_stats'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/localization/file_integrity.test.mocks.ts b/x-pack/legacy/plugins/telemetry/server/collectors/localization/file_integrity.test.mocks.ts deleted file mode 100644 index 36f76516e188b..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/localization/file_integrity.test.mocks.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { Readable } from 'stream'; - -jest.doMock('fs', () => ({ - createReadStream(filepath: string): Readable { - if (filepath === 'ERROR') { - throw new Error('MOCK ERROR - Invalid Path'); - } - const readableStream = new Readable(); - const streamData = filepath.split(''); - let cursor = 0; - - readableStream._read = function(size) { - const current = streamData[cursor++]; - if (typeof current === 'undefined') { - return this.push(null); - } - this.push(current); - }; - - return readableStream; - }, -})); diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/localization/index.ts b/x-pack/legacy/plugins/telemetry/server/collectors/localization/index.ts deleted file mode 100644 index dd8a3a9a10400..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/localization/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { createLocalizationUsageCollector } from './telemetry_localization_collector'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/index.js b/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/index.js deleted file mode 100644 index 4500385367d1d..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/monitoring/index.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { getAllStats } from './get_all_stats'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/ui_metric/index.ts b/x-pack/legacy/plugins/telemetry/server/collectors/ui_metric/index.ts deleted file mode 100644 index f5a49587d49c8..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/ui_metric/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { createUiMetricUsageCollector } from './telemetry_ui_metric_collector'; diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/usage/index.ts b/x-pack/legacy/plugins/telemetry/server/collectors/usage/index.ts deleted file mode 100644 index 960fed00152b4..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/collectors/usage/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { createTelemetryUsageCollector } from './telemetry_usage_collector'; diff --git a/x-pack/legacy/plugins/telemetry/server/index.ts b/x-pack/legacy/plugins/telemetry/server/index.ts deleted file mode 100644 index 5748106be8b29..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { PluginInitializerContext } from 'src/core/server'; -import { TelemetryPlugin } from './plugin'; -import * as constants from '../common/constants'; - -export { getTelemetryOptIn } from './get_telemetry_opt_in'; -export const telemetryPlugin = (initializerContext: PluginInitializerContext) => - new TelemetryPlugin(); -export { constants }; diff --git a/x-pack/legacy/plugins/telemetry/server/plugin.ts b/x-pack/legacy/plugins/telemetry/server/plugin.ts deleted file mode 100644 index 13aeb774d4a68..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/plugin.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { CoreSetup } from 'src/core/server'; -import { registerRoutes } from './routes'; - -export class TelemetryPlugin { - public setup(core: CoreSetup) { - registerRoutes(core); - } -} diff --git a/x-pack/legacy/plugins/telemetry/server/routes/index.ts b/x-pack/legacy/plugins/telemetry/server/routes/index.ts deleted file mode 100644 index f6880b644699c..0000000000000 --- a/x-pack/legacy/plugins/telemetry/server/routes/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { CoreSetup } from 'src/core/server'; -import { registerOptInRoutes } from './opt_in'; -import { registerTelemetryDataRoutes } from './telemetry_stats'; - -export function registerRoutes(core: CoreSetup) { - registerOptInRoutes(core); - registerTelemetryDataRoutes(core); -} diff --git a/x-pack/legacy/plugins/xpack_main/index.js b/x-pack/legacy/plugins/xpack_main/index.js index e589caa2819e6..9af4448a8d615 100644 --- a/x-pack/legacy/plugins/xpack_main/index.js +++ b/x-pack/legacy/plugins/xpack_main/index.js @@ -9,7 +9,6 @@ import dedent from 'dedent'; import { XPACK_INFO_API_DEFAULT_POLL_FREQUENCY_IN_MILLIS } from '../../server/lib/constants'; -import { getXpackConfigWithDeprecated } from '../telemetry/common/get_xpack_config_with_deprecated'; import { mirrorPluginStatus } from '../../server/lib/mirror_plugin_status'; import { replaceInjectedVars } from './server/lib/replace_injected_vars'; import { setupXPackMain } from './server/lib/setup_xpack_main'; @@ -17,15 +16,10 @@ import { xpackInfoRoute, settingsRoute } from './server/routes/api/v1'; import { has } from 'lodash'; -function movedToTelemetry(configPath) { - return (settings, log) => { - if (has(settings, configPath)) { - log(`Config key ${configPath} is deprecated. Use "xpack.telemetry.${configPath}" instead.`); - } - }; -} - export { callClusterFactory } from './server/lib/call_cluster_factory'; +import { getStatsWithXpack } from './server/telemetry_collection'; +import { telemetryCollectionManager } from '../../../../src/legacy/core_plugins/telemetry/server'; + export const xpackMain = (kibana) => { return new kibana.Plugin({ id: 'xpack_main', @@ -62,7 +56,6 @@ export const xpackMain = (kibana) => { const config = server.config(); return { - telemetryEnabled: getXpackConfigWithDeprecated(config, 'telemetry.enabled'), activeSpace: null, spacesEnabled: config.get('xpack.spaces.enabled'), }; @@ -86,6 +79,8 @@ export const xpackMain = (kibana) => { mirrorPluginStatus(server.plugins.elasticsearch, this, 'yellow', 'red'); + telemetryCollectionManager.setStatsGetter(getStatsWithXpack, 'local_xpack', 1); + featuresPlugin.registerLegacyAPI({ xpackInfo: setupXPackMain(server), savedObjectTypes: server.savedObjects.types @@ -95,10 +90,19 @@ export const xpackMain = (kibana) => { xpackInfoRoute(server); settingsRoute(server, this.kbnServer); }, - deprecations: () => [ - movedToTelemetry('telemetry.config'), - movedToTelemetry('telemetry.url'), - movedToTelemetry('telemetry.enabled'), - ], + deprecations: () => { + function movedToTelemetry(configPath) { + return (settings, log) => { + if (has(settings, configPath)) { + log(`Config key "xpack.xpack_main.${configPath}" is deprecated. Use "telemetry.${configPath}" instead.`); + } + }; + } + return [ + movedToTelemetry('telemetry.config'), + movedToTelemetry('telemetry.url'), + movedToTelemetry('telemetry.enabled'), + ]; + }, }); }; diff --git a/x-pack/legacy/plugins/xpack_main/server/lib/__tests__/replace_injected_vars.js b/x-pack/legacy/plugins/xpack_main/server/lib/__tests__/replace_injected_vars.js index c926170a2a4de..f094f588cf858 100644 --- a/x-pack/legacy/plugins/xpack_main/server/lib/__tests__/replace_injected_vars.js +++ b/x-pack/legacy/plugins/xpack_main/server/lib/__tests__/replace_injected_vars.js @@ -10,13 +10,8 @@ import expect from '@kbn/expect'; import { replaceInjectedVars } from '../replace_injected_vars'; import { KibanaRequest } from '../../../../../../../src/core/server'; -const buildRequest = (telemetryOptedIn = null, path = '/app/kibana') => { +const buildRequest = (path = '/app/kibana') => { const get = sinon.stub(); - if (telemetryOptedIn === null) { - get.withArgs('telemetry', 'telemetry').rejects(new Error('not found exception')); - } else { - get.withArgs('telemetry', 'telemetry').resolves({ attributes: { enabled: telemetryOptedIn } }); - } return { path, @@ -50,7 +45,6 @@ describe('replaceInjectedVars uiExport', () => { const newVars = await replaceInjectedVars(originalInjectedVars, request, server); expect(newVars).to.eql({ a: 1, - telemetryOptedIn: null, xpackInitialInfo: { b: 1 }, @@ -73,7 +67,6 @@ describe('replaceInjectedVars uiExport', () => { const newVars = await replaceInjectedVars(originalInjectedVars, request, server); expect(newVars).to.eql({ a: 1, - telemetryOptedIn: null, xpackInitialInfo: { b: 1 }, @@ -89,7 +82,6 @@ describe('replaceInjectedVars uiExport', () => { const newVars = await replaceInjectedVars(originalInjectedVars, request, server); expect(newVars).to.eql({ a: 1, - telemetryOptedIn: null, xpackInitialInfo: { b: 1 }, @@ -98,14 +90,13 @@ describe('replaceInjectedVars uiExport', () => { it('respects the telemetry opt-in document when opted-out', async () => { const originalInjectedVars = { a: 1 }; - const request = buildRequest(false); + const request = buildRequest(); const server = mockServer(); server.plugins.xpack_main.info.license.isOneOf.returns(true); const newVars = await replaceInjectedVars(originalInjectedVars, request, server); expect(newVars).to.eql({ a: 1, - telemetryOptedIn: false, xpackInitialInfo: { b: 1 }, @@ -114,14 +105,13 @@ describe('replaceInjectedVars uiExport', () => { it('respects the telemetry opt-in document when opted-in', async () => { const originalInjectedVars = { a: 1 }; - const request = buildRequest(true); + const request = buildRequest(); const server = mockServer(); server.plugins.xpack_main.info.license.isOneOf.returns(true); const newVars = await replaceInjectedVars(originalInjectedVars, request, server); expect(newVars).to.eql({ a: 1, - telemetryOptedIn: true, xpackInitialInfo: { b: 1 }, @@ -137,7 +127,6 @@ describe('replaceInjectedVars uiExport', () => { const newVars = await replaceInjectedVars(originalInjectedVars, request, server); expect(newVars).to.eql({ a: 1, - telemetryOptedIn: false, xpackInitialInfo: { b: 1 }, @@ -174,7 +163,6 @@ describe('replaceInjectedVars uiExport', () => { const newVars = await replaceInjectedVars(originalInjectedVars, request, server); expect(newVars).to.eql({ a: 1, - telemetryOptedIn: null, xpackInitialInfo: undefined, uiCapabilities: { navLinks: { foo: true }, diff --git a/x-pack/legacy/plugins/xpack_main/server/lib/replace_injected_vars.js b/x-pack/legacy/plugins/xpack_main/server/lib/replace_injected_vars.js index 9def7da5e7e4f..cd111240261c4 100644 --- a/x-pack/legacy/plugins/xpack_main/server/lib/replace_injected_vars.js +++ b/x-pack/legacy/plugins/xpack_main/server/lib/replace_injected_vars.js @@ -5,14 +5,12 @@ */ import { KibanaRequest } from '../../../../../../src/core/server'; -import { getTelemetryOptIn } from '../../../telemetry/server'; export async function replaceInjectedVars(originalInjectedVars, request, server) { const xpackInfo = server.plugins.xpack_main.info; const withXpackInfo = async () => ({ ...originalInjectedVars, - telemetryOptedIn: await getTelemetryOptIn(request), xpackInitialInfo: xpackInfo.isAvailable() ? xpackInfo.toJSON() : undefined, }); diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_xpack.js b/x-pack/legacy/plugins/xpack_main/server/telemetry_collection/__tests__/get_xpack.js similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/local/__tests__/get_xpack.js rename to x-pack/legacy/plugins/xpack_main/server/telemetry_collection/__tests__/get_xpack.js diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/constants.js b/x-pack/legacy/plugins/xpack_main/server/telemetry_collection/constants.ts similarity index 100% rename from x-pack/legacy/plugins/telemetry/server/collectors/local/constants.js rename to x-pack/legacy/plugins/xpack_main/server/telemetry_collection/constants.ts diff --git a/x-pack/legacy/plugins/xpack_main/server/telemetry_collection/get_stats_with_xpack.ts b/x-pack/legacy/plugins/xpack_main/server/telemetry_collection/get_stats_with_xpack.ts new file mode 100644 index 0000000000000..f19695ca06525 --- /dev/null +++ b/x-pack/legacy/plugins/xpack_main/server/telemetry_collection/get_stats_with_xpack.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +// @ts-ignore +import { getXPack } from './get_xpack'; +import { getLocalStats } from '../../../../../../src/legacy/core_plugins/telemetry/server/telemetry_collection'; + +/** + * Get the telemetry data. + * + * @param {Object} req The incoming request. + * @param {Object} config Kibana config. + * @param {String} start The start time of the request (likely 20m ago). + * @param {String} end The end time of the request. + * @param {Boolean} unencrypted Is the request payload going to be unencrypted. + * @return {Promise} An array of telemetry objects. + */ +export async function getStatsWithXpack( + req: any, + config: any, + start: string, + end: string, + unencrypted: boolean +) { + const useInternalUser = !unencrypted; + const { server } = req; + const { callWithRequest, callWithInternalUser } = server.plugins.elasticsearch.getCluster('data'); + const callCluster = useInternalUser + ? callWithInternalUser + : (...args: any[]) => callWithRequest(req, ...args); + + const localStats = await getLocalStats(req, { useInternalUser }); + const { license, xpack } = await getXPack(callCluster); + + localStats.license = license; + localStats.stack_stats.xpack = xpack; + + return [localStats]; +} diff --git a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_xpack.js b/x-pack/legacy/plugins/xpack_main/server/telemetry_collection/get_xpack.js similarity index 99% rename from x-pack/legacy/plugins/telemetry/server/collectors/local/get_xpack.js rename to x-pack/legacy/plugins/xpack_main/server/telemetry_collection/get_xpack.js index 3909741c8c556..07d635ef52e22 100644 --- a/x-pack/legacy/plugins/telemetry/server/collectors/local/get_xpack.js +++ b/x-pack/legacy/plugins/xpack_main/server/telemetry_collection/get_xpack.js @@ -83,4 +83,3 @@ export function getXPack(callCluster) { }) .catch(() => { return {}; }); } - diff --git a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/csp/index.ts b/x-pack/legacy/plugins/xpack_main/server/telemetry_collection/index.ts similarity index 80% rename from x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/csp/index.ts rename to x-pack/legacy/plugins/xpack_main/server/telemetry_collection/index.ts index a7c1088f9961b..553f8dc0c4188 100644 --- a/x-pack/legacy/plugins/oss_telemetry/server/lib/collectors/csp/index.ts +++ b/x-pack/legacy/plugins/xpack_main/server/telemetry_collection/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { registerCspCollector } from './csp_collector'; +export { getStatsWithXpack } from './get_stats_with_xpack'; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f3253132604c7..59ac561065fa0 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2464,8 +2464,6 @@ "kbn.visualize.wizard.step1Breadcrumb": "作成", "kbn.visualize.wizard.step2Breadcrumb": "作成", "kbn.visualizeTitle": "可視化", - "kbn.home.telemetry.optInErrorToastText": "使用状況統計設定の設定中にエラーが発生しました。", - "kbn.home.telemetry.optInErrorToastTitle": "エラー", "kbn.advancedSettings.discover.searchOnPageLoadText": "ディスカバリの最初の読み込み時に検索を実行するかを制御します。この設定は、保存された検索の読み込み時には影響しません。", "kbn.advancedSettings.discover.searchOnPageLoadTitle": "ページの読み込み時の検索", "kbn.advancedSettings.visualization.heatmap.maxBucketsText": "1 つのデータソースが返せるバケットの最大数です。値が大きいとブラウザのレンダリング速度が下がる可能性があります。", @@ -2480,17 +2478,6 @@ "kbn.home.addData.siem.addSiemEventsButtonLabel": "セキュリティイベントを追加", "kbn.home.addData.siem.nameDescription": "即利用可能なビジュアライゼーションで、セキュリティイベントをまとめてインタラクティブな調査を可能にします。", "kbn.home.addData.siem.nameTitle": "SIEM", - "kbn.home.telemetry.callout.clusterStatisticsDescription": "これは収集される基本的なクラスター統計の例です。インデックス、チャート、ノードの数が含まれます。監視がオンになっているかどうかなどのハイレベルの使用統計も含まれます。", - "kbn.home.telemetry.callout.clusterStatisticsTitle": "クラスター統計", - "kbn.home.telemetry.callout.errorLoadingClusterStatisticsDescription": "クラスター統計の取得中に予期せぬエラーが発生しました。Elasticsearch、Kibana、またはネットワークのエラーが原因の可能性があります。Kibana を確認し、ページを再読み込みして再試行してください。", - "kbn.home.telemetry.callout.errorLoadingClusterStatisticsTitle": "クラスター統計の読み込みエラー", - "kbn.home.telemetry.callout.errorUnprivilegedUserDescription": "暗号化されていないクラスター統計を表示するアクセス権がありません。", - "kbn.home.telemetry.callout.errorUnprivilegedUserTitle": "クラスター統計の表示エラー", - "kbn.home.telemetry.optInMessage.detailsDescription": "ユーザーが処理したり保管したりするデータに関する情報は一切送信されません。この機能は定期的に基本的な機能利用に関する統計情報を送信します。{exampleLink} をご覧いただくか、{telemetryPrivacyStatementLink} をお読みください。この機能はいつでも無効にできます。", - "kbn.home.telemetry.optInMessage.detailsExampleLinkText": "例", - "kbn.home.telemetry.optInMessage.detailsTelemetryPrivacyStatementLinkText": "遠隔測定に関するプライバシーステートメント", - "kbn.home.telemetry.optInMessage.readMoreLinkText": "さらに詳しく", - "kbn.home.telemetry.optInMessageDescription": "基本的な機能利用に関する統計情報を提供して Elastic Stack の改善にご協力ください。このデータは Elastic 社外と共有されません。", "kbn.home.telemtery.optInCardConfirmButtonLabel": "はい", "kbn.home.telemtery.optInCardDeclineButtonLabel": "いいえ", "kbn.home.telemtery.optInCardTitle": "Elastic Stack の改善にご協力ください", @@ -10127,66 +10114,28 @@ "xpack.spaces.spaceSelector.noSpacesMatchSearchCriteriaDescription": "検索条件に一致するスペースがありません", "xpack.spaces.spaceSelector.selectSpacesTitle": "スペースの選択", "xpack.spaces.spacesTitle": "スペース", - "xpack.spaces.management.copyToSpace.actionDescription": "この保存されたオブジェクトを 1 つまたは複数のスペースにコピーします。", - "xpack.spaces.management.copyToSpace.actionTitle": "スペースにコピー", - "xpack.spaces.management.copyToSpace.automaticallyOverwrite": "すべての保存されたオブジェクトを自動的に上書き", - "xpack.spaces.management.copyToSpace.copyDetail.overwriteButton": "上書き", - "xpack.spaces.management.copyToSpace.copyDetail.skipOverwriteButton": "スキップ", - "xpack.spaces.management.copyToSpace.copyErrorTitle": "保存されたオブジェクトのコピー中にエラーが発生", - "xpack.spaces.management.copyToSpace.copyResultsLabel": "コピー結果", - "xpack.spaces.management.copyToSpace.copyStatus.conflictsMessage": "このスペースには同じ ID 「{id}」の保存されたオブジェクトが既に存在します。", - "xpack.spaces.management.copyToSpace.copyStatus.conflictsOverwriteMessage": "「上書き」をクリックしてこのバージョンをコピーされたバージョンに置き換えます。", - "xpack.spaces.management.copyToSpace.copyStatus.pendingOverwriteMessage": "保存されたオブジェクトは上書きされます。「スキップ」をクリックしてこの操作をキャンセルします。", - "xpack.spaces.management.copyToSpace.copyStatus.successMessage": "保存されたオブジェクトがコピーされました。", - "xpack.spaces.management.copyToSpace.copyStatus.unresolvableErrorMessage": "この保存されたオブジェクトのコピー中にエラーが発生しました。", - "xpack.spaces.management.copyToSpace.copyStatusSummary.conflictsMessage": "{space} スペースに 1 つまたは複数の矛盾が検出されました。解決するにはこのセクションを拡張してください。", - "xpack.spaces.management.copyToSpace.copyStatusSummary.failedMessage": "{space} スペースへのコピーに失敗しました。詳細はこのセクションを拡張してください。", - "xpack.spaces.management.copyToSpace.copyStatusSummary.successMessage": "{space} スペースにコピーされました。", - "xpack.spaces.management.copyToSpace.copyToSpacesButton": "{spaceCount} 個の{spaceCount, plural, one {スペース} other {スペース}}にコピー", - "xpack.spaces.management.copyToSpace.disabledCopyToSpacesButton": "コピー", - "xpack.spaces.management.copyToSpace.dontIncludeRelatedLabel": "関連性のある保存されたオブジェクトを含みません", - "xpack.spaces.management.copyToSpace.dontOverwriteLabel": "保存されたオブジェクトを上書きしません", - "xpack.spaces.management.copyToSpace.finishCopyToSpacesButton": "終了", - "xpack.spaces.management.copyToSpace.finishedButtonLabel": "コピーが完了しました。", - "xpack.spaces.management.copyToSpace.finishPendingOverwritesCopyToSpacesButton": "{overwriteCount} 件のオブジェクトを上書き", - "xpack.spaces.management.copyToSpace.includeRelatedFormLabel": "関連性のある保存されたオブジェクトを含みます", - "xpack.spaces.management.copyToSpace.includeRelatedLabel": "関連性のある保存されたオブジェクトを含みます", - "xpack.spaces.management.copyToSpace.inProgressButtonLabel": "コピーが進行中です。お待ちください。", - "xpack.spaces.management.copyToSpace.noSpacesBody": "コピーできるスペースがありません。", - "xpack.spaces.management.copyToSpace.noSpacesTitle": "スペースがありません", - "xpack.spaces.management.copyToSpace.overwriteLabel": "保存されたオブジェクトを自動的に上書きしています", - "xpack.spaces.management.copyToSpace.resolveCopyErrorTitle": "保存されたオブジェクトの矛盾の解決中にエラーが発生", - "xpack.spaces.management.copyToSpace.resolveCopySuccessTitle": "上書き成功", - "xpack.spaces.management.copyToSpace.selectSpacesLabel": "コピー先のスペースを選択してください", - "xpack.spaces.management.copyToSpace.spacesLoadErrorTitle": "利用可能なスペースを読み込み中にエラーが発生", - "xpack.spaces.management.copyToSpaceFlyoutFooter.conflictCount": "スキップ", - "xpack.spaces.management.copyToSpaceFlyoutFooter.errorCount": "エラー", - "xpack.spaces.management.copyToSpaceFlyoutFooter.pendingCount": "保留中", - "xpack.spaces.management.copyToSpaceFlyoutFooter.successCount": "コピー完了", - "xpack.spaces.management.copyToSpaceFlyoutHeader": "保存されたオブジェクトのスペースへのコピー", - "xpack.telemetry.callout.appliesSettingTitle": "この設定は {allOfKibanaText} に適用されます", - "xpack.telemetry.callout.appliesSettingTitle.allOfKibanaText": "Kibana のすべて", - "xpack.telemetry.callout.clusterStatisticsDescription": "これは収集される基本的なクラスター統計の例です。インデックス、チャート、ノードの数が含まれます。監視がオンになっているかどうかなどのハイレベルの使用統計も含まれます。", - "xpack.telemetry.callout.clusterStatisticsTitle": "クラスター統計", - "xpack.telemetry.callout.errorLoadingClusterStatisticsDescription": "クラスター統計の取得中に予期せぬエラーが発生しました。Elasticsearch、Kibana、またはネットワークのエラーが原因の可能性があります。Kibana を確認し、ページを再読み込みして再試行してください。", - "xpack.telemetry.callout.errorLoadingClusterStatisticsTitle": "クラスター統計の読み込みエラー", - "xpack.telemetry.callout.errorUnprivilegedUserDescription": "暗号化されていないクラスター統計を表示するアクセス権がありません。", - "xpack.telemetry.callout.errorUnprivilegedUserTitle": "クラスター統計の表示エラー", - "xpack.telemetry.readOurUsageDataPrivacyStatementLinkText": "使用データのプライバシーステートメントをお読みください", - "xpack.telemetry.seeExampleOfWhatWeCollectLinkText": "収集されるデータの例を見る", - "xpack.telemetry.telemetryConfigDescription": "基本的な機能利用に関する統計情報を提供して Elastic Stack の改善にご協力ください。このデータは Elastic 社外と共有されません。", - "xpack.telemetry.telemetryConfigTitle": "遠隔測定オプトイン", - "xpack.telemetry.telemetryErrorNotificationMessageDescription.tryAgainText": "Kibana と Elasticsearch が現在も実行中であることを確認し、再試行してください。", - "xpack.telemetry.telemetryErrorNotificationMessageDescription.unableToSaveTelemetryPreferenceText": "遠隔測定設定を保存できません。", - "xpack.telemetry.telemetryErrorNotificationMessageTitle": "遠隔測定エラー", - "xpack.telemetry.usageDataTitle": "使用データ", - "xpack.telemetry.welcomeBanner.noButtonLabel": "いいえ", - "xpack.telemetry.welcomeBanner.telemetryConfigDescription.readMoreLinkText": "続きを読む", - "xpack.telemetry.welcomeBanner.telemetryConfigDetailsDescription": "ユーザーが処理したり保管したりするデータに関する情報は一切送信されません。この機能は定期的に基本的な機能利用に関する統計情報を送信します。{exampleLink} をご覧いただくか、{telemetryPrivacyStatementLink} をお読みください。この機能はいつでも無効にできます。", - "xpack.telemetry.welcomeBanner.telemetryConfigDetailsDescription.exampleLinkText": "例", - "xpack.telemetry.welcomeBanner.telemetryConfigDetailsDescription.telemetryPrivacyStatementLinkText": "遠隔測定に関するプライバシーステートメント", - "xpack.telemetry.welcomeBanner.yesButtonLabel": "はい", - "xpack.telemetry.welcomeBanner.title": "Elastic Stack の改善にご協力ください!", + "telemetry.callout.appliesSettingTitle": "この設定は {allOfKibanaText} に適用されます", + "telemetry.callout.appliesSettingTitle.allOfKibanaText": "Kibana のすべて", + "telemetry.callout.clusterStatisticsDescription": "これは収集される基本的なクラスター統計の例です。インデックス、チャート、ノードの数が含まれます。監視がオンになっているかどうかなどのハイレベルの使用統計も含まれます。", + "telemetry.callout.clusterStatisticsTitle": "クラスター統計", + "telemetry.callout.errorLoadingClusterStatisticsDescription": "クラスター統計の取得中に予期せぬエラーが発生しました。Elasticsearch、Kibana、またはネットワークのエラーが原因の可能性があります。Kibana を確認し、ページを再読み込みして再試行してください。", + "telemetry.callout.errorLoadingClusterStatisticsTitle": "クラスター統計の読み込みエラー", + "telemetry.callout.errorUnprivilegedUserDescription": "暗号化されていないクラスター統計を表示するアクセス権がありません。", + "telemetry.callout.errorUnprivilegedUserTitle": "クラスター統計の表示エラー", + "telemetry.readOurUsageDataPrivacyStatementLinkText": "使用データのプライバシーステートメントをお読みください", + "telemetry.seeExampleOfWhatWeCollectLinkText": "収集されるデータの例を見る", + "telemetry.telemetryConfigDescription": "基本的な機能利用に関する統計情報を提供して Elastic Stack の改善にご協力ください。このデータは Elastic 社外と共有されません。", + "telemetry.telemetryConfigTitle": "遠隔測定オプトイン", + "telemetry.telemetryErrorNotificationMessageDescription.tryAgainText": "Kibana と Elasticsearch が現在も実行中であることを確認し、再試行してください。", + "telemetry.telemetryErrorNotificationMessageDescription.unableToSaveTelemetryPreferenceText": "遠隔測定設定を保存できません。", + "telemetry.telemetryErrorNotificationMessageTitle": "遠隔測定エラー", + "telemetry.usageDataTitle": "使用データ", + "telemetry.welcomeBanner.noButtonLabel": "いいえ", + "telemetry.welcomeBanner.telemetryConfigDescription.readMoreLinkText": "続きを読む", + "telemetry.welcomeBanner.telemetryConfigDetailsDescription": "ユーザーが処理したり保管したりするデータに関する情報は一切送信されません。この機能は定期的に基本的な機能利用に関する統計情報を送信します。{exampleLink} をご覧いただくか、{telemetryPrivacyStatementLink} をお読みください。この機能はいつでも無効にできます。", + "telemetry.welcomeBanner.telemetryConfigDetailsDescription.exampleLinkText": "例", + "telemetry.welcomeBanner.telemetryConfigDetailsDescription.telemetryPrivacyStatementLinkText": "遠隔測定に関するプライバシーステートメント", + "telemetry.welcomeBanner.yesButtonLabel": "はい", "xpack.upgradeAssistant.appTitle": "{version} アップグレードアシスタント", "xpack.upgradeAssistant.checkupTab.backUpCallout.calloutBody.calloutDetail": "{snapshotRestoreDocsButton} でデータをバックアップします。", "xpack.upgradeAssistant.checkupTab.backUpCallout.calloutBody.snapshotRestoreDocsButtonLabel": "API のスナップショットと復元", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 4e8a81028aa88..cf40c5cb6e973 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2465,8 +2465,6 @@ "kbn.visualize.wizard.step1Breadcrumb": "创建", "kbn.visualize.wizard.step2Breadcrumb": "创建", "kbn.visualizeTitle": "可视化", - "kbn.home.telemetry.optInErrorToastText": "尝试设置使用统计信息首选项时发生错误。", - "kbn.home.telemetry.optInErrorToastTitle": "错误", "kbn.advancedSettings.discover.searchOnPageLoadText": "控制在 Discover 首次加载时是否执行搜索。加载已保存搜索时,此设置无效。", "kbn.advancedSettings.discover.searchOnPageLoadTitle": "在页面加载时搜索", "kbn.advancedSettings.visualization.heatmap.maxBucketsText": "单个数据源可以返回的最大存储桶数目。较高的数目可能对浏览器呈现性能有负面影响", @@ -2481,17 +2479,6 @@ "kbn.home.addData.siem.addSiemEventsButtonLabel": "添加安全事件", "kbn.home.addData.siem.nameDescription": "集中安全事件,以通过即用型可视化实现交互式调查。", "kbn.home.addData.siem.nameTitle": "SIEM", - "kbn.home.telemetry.callout.clusterStatisticsDescription": "这是我们将收集的基本集群统计信息的示例。其包括索引、分片和节点的数目。还包括高级使用情况统计信息,例如监测是否打开。", - "kbn.home.telemetry.callout.clusterStatisticsTitle": "集群统计信息", - "kbn.home.telemetry.callout.errorLoadingClusterStatisticsDescription": "尝试提取集群统计信息时发生意外错误。发生此问题的原因可能是 Elasticsearch 出故障、Kibana 出故障,或者有网络错误。检查 Kibana,然后重新加载页面并重试。", - "kbn.home.telemetry.callout.errorLoadingClusterStatisticsTitle": "加载集群统计信息时出错", - "kbn.home.telemetry.callout.errorUnprivilegedUserDescription": "您无权查看未加密的集群统计信息。", - "kbn.home.telemetry.callout.errorUnprivilegedUserTitle": "显示集群统计信息时出错", - "kbn.home.telemetry.optInMessage.detailsDescription": "不会发送有关您处理或存储的数据的信息。此功能将定期发送基本功能使用情况统计信息。请参阅{exampleLink}或阅读我们的{telemetryPrivacyStatementLink}。您可以随时禁用此功能。", - "kbn.home.telemetry.optInMessage.detailsExampleLinkText": "示例", - "kbn.home.telemetry.optInMessage.detailsTelemetryPrivacyStatementLinkText": "遥测隐私声明", - "kbn.home.telemetry.optInMessage.readMoreLinkText": "阅读更多内容", - "kbn.home.telemetry.optInMessageDescription": "通过提供基本功能的使用情况统计信息,来帮助我们改进 Elastic Stack。我们不会在 Elastic 之外共享此数据。", "kbn.home.telemtery.optInCardConfirmButtonLabel": "是", "kbn.home.telemtery.optInCardDeclineButtonLabel": "否", "kbn.home.telemtery.optInCardTitle": "帮助我们改进 Elastic Stack", @@ -10283,66 +10270,28 @@ "xpack.spaces.spaceSelector.noSpacesMatchSearchCriteriaDescription": "没有匹配搜索条件的空间", "xpack.spaces.spaceSelector.selectSpacesTitle": "选择您的空间", "xpack.spaces.spacesTitle": "工作区", - "xpack.spaces.management.copyToSpace.actionDescription": "将此已保存对象复制到一个或多个工作区", - "xpack.spaces.management.copyToSpace.actionTitle": "复制到工作区", - "xpack.spaces.management.copyToSpace.automaticallyOverwrite": "自动覆盖所有已保存对象", - "xpack.spaces.management.copyToSpace.copyDetail.overwriteButton": "覆盖", - "xpack.spaces.management.copyToSpace.copyDetail.skipOverwriteButton": "跳过", - "xpack.spaces.management.copyToSpace.copyErrorTitle": "复制已保存对象时出错", - "xpack.spaces.management.copyToSpace.copyResultsLabel": "复制结果", - "xpack.spaces.management.copyToSpace.copyStatus.conflictsMessage": "具有匹配 ID ({id}) 的已保存对象在此工作区中已存在。", - "xpack.spaces.management.copyToSpace.copyStatus.conflictsOverwriteMessage": "单击“覆盖”可将此版本替换为复制的版本。", - "xpack.spaces.management.copyToSpace.copyStatus.pendingOverwriteMessage": "已保存对象将被覆盖。单击“跳过”可取消此操作。", - "xpack.spaces.management.copyToSpace.copyStatus.successMessage": "已保存对象成功复制。", - "xpack.spaces.management.copyToSpace.copyStatus.unresolvableErrorMessage": "复制此已保存对象时出错。", - "xpack.spaces.management.copyToSpace.copyStatusSummary.conflictsMessage": "在 {space} 工作区中检测到一个或多个冲突。展开此部分以进行解决。", - "xpack.spaces.management.copyToSpace.copyStatusSummary.failedMessage": "复制到 {space} 工作区失败。展开此部分以获取详情。", - "xpack.spaces.management.copyToSpace.copyStatusSummary.successMessage": "已成功复制到 {space} 工作区。", - "xpack.spaces.management.copyToSpace.copyToSpacesButton": "复制到 {spaceCount} 个 {spaceCount, plural, one {工作区} other {工作区}}", - "xpack.spaces.management.copyToSpace.disabledCopyToSpacesButton": "复制", - "xpack.spaces.management.copyToSpace.dontIncludeRelatedLabel": "不包括相关已保存对象", - "xpack.spaces.management.copyToSpace.dontOverwriteLabel": "未覆盖已保存对象", - "xpack.spaces.management.copyToSpace.finishCopyToSpacesButton": "完成", - "xpack.spaces.management.copyToSpace.finishedButtonLabel": "复制已完成。", - "xpack.spaces.management.copyToSpace.finishPendingOverwritesCopyToSpacesButton": "覆盖 {overwriteCount} 个对象", - "xpack.spaces.management.copyToSpace.includeRelatedFormLabel": "包括相关已保存对象", - "xpack.spaces.management.copyToSpace.includeRelatedLabel": "包括相关已保存对象", - "xpack.spaces.management.copyToSpace.inProgressButtonLabel": "复制正在进行中。请稍候。", - "xpack.spaces.management.copyToSpace.noSpacesBody": "没有要复制到的合格工作区。", - "xpack.spaces.management.copyToSpace.noSpacesTitle": "没有可用的工作区", - "xpack.spaces.management.copyToSpace.overwriteLabel": "正在自动覆盖已保存对象", - "xpack.spaces.management.copyToSpace.resolveCopyErrorTitle": "解决已保存对象冲突时出错", - "xpack.spaces.management.copyToSpace.resolveCopySuccessTitle": "覆盖成功", - "xpack.spaces.management.copyToSpace.selectSpacesLabel": "选择要复制到的工作区", - "xpack.spaces.management.copyToSpace.spacesLoadErrorTitle": "加载可用工作区时出错", - "xpack.spaces.management.copyToSpaceFlyoutFooter.conflictCount": "已跳过", - "xpack.spaces.management.copyToSpaceFlyoutFooter.errorCount": "错误", - "xpack.spaces.management.copyToSpaceFlyoutFooter.pendingCount": "待处理", - "xpack.spaces.management.copyToSpaceFlyoutFooter.successCount": "已复制", - "xpack.spaces.management.copyToSpaceFlyoutHeader": "将已保存对象复制到工作区", - "xpack.telemetry.callout.appliesSettingTitle": "此设置适用于{allOfKibanaText}", - "xpack.telemetry.callout.appliesSettingTitle.allOfKibanaText": "所有 Kibana。", - "xpack.telemetry.callout.clusterStatisticsDescription": "这是我们将收集的基本集群统计信息的示例。其包括索引、分片和节点的数目。还包括高级使用情况统计信息,例如监测是否打开。", - "xpack.telemetry.callout.clusterStatisticsTitle": "集群统计信息", - "xpack.telemetry.callout.errorLoadingClusterStatisticsDescription": "尝试提取集群统计信息时发生意外错误。发生此问题的原因可能是 Elasticsearch 出故障、Kibana 出故障,或者有网络错误。检查 Kibana,然后重新加载页面并重试。", - "xpack.telemetry.callout.errorLoadingClusterStatisticsTitle": "加载集群统计信息时出错", - "xpack.telemetry.callout.errorUnprivilegedUserDescription": "您无权查看未加密的集群统计信息。", - "xpack.telemetry.callout.errorUnprivilegedUserTitle": "显示集群统计信息时出错", - "xpack.telemetry.readOurUsageDataPrivacyStatementLinkText": "阅读我们的使用情况数据隐私声明", - "xpack.telemetry.seeExampleOfWhatWeCollectLinkText": "查看我们收集的内容示例", - "xpack.telemetry.telemetryConfigDescription": "通过提供基本功能的使用情况统计信息,来帮助我们改进 Elastic Stack。我们不会在 Elastic 之外共享此数据。", - "xpack.telemetry.telemetryConfigTitle": "遥测选择加入", - "xpack.telemetry.telemetryErrorNotificationMessageDescription.tryAgainText": "确认 Kibana 和 Elasticsearch 仍在运行,然后重试。", - "xpack.telemetry.telemetryErrorNotificationMessageDescription.unableToSaveTelemetryPreferenceText": "无法保存遥测首选项。", - "xpack.telemetry.telemetryErrorNotificationMessageTitle": "遥测错误", - "xpack.telemetry.usageDataTitle": "使用情况数据", - "xpack.telemetry.welcomeBanner.noButtonLabel": "否", - "xpack.telemetry.welcomeBanner.telemetryConfigDescription.readMoreLinkText": "阅读更多内容", - "xpack.telemetry.welcomeBanner.telemetryConfigDetailsDescription": "不会发送有关您处理或存储的数据的信息。此功能将定期发送基本功能使用情况统计信息。请参阅{exampleLink}或阅读我们的{telemetryPrivacyStatementLink}。您可以随时禁用此功能。", - "xpack.telemetry.welcomeBanner.telemetryConfigDetailsDescription.exampleLinkText": "示例", - "xpack.telemetry.welcomeBanner.telemetryConfigDetailsDescription.telemetryPrivacyStatementLinkText": "遥测隐私声明", - "xpack.telemetry.welcomeBanner.yesButtonLabel": "是", - "xpack.telemetry.welcomeBanner.title": "帮助我们改进 Elastic Stack!", + "telemetry.callout.appliesSettingTitle": "此设置适用于{allOfKibanaText}", + "telemetry.callout.appliesSettingTitle.allOfKibanaText": "所有 Kibana。", + "telemetry.callout.clusterStatisticsDescription": "这是我们将收集的基本集群统计信息的示例。其包括索引、分片和节点的数目。还包括高级使用情况统计信息,例如监测是否打开。", + "telemetry.callout.clusterStatisticsTitle": "集群统计信息", + "telemetry.callout.errorLoadingClusterStatisticsDescription": "尝试提取集群统计信息时发生意外错误。发生此问题的原因可能是 Elasticsearch 出故障、Kibana 出故障,或者有网络错误。检查 Kibana,然后重新加载页面并重试。", + "telemetry.callout.errorLoadingClusterStatisticsTitle": "加载集群统计信息时出错", + "telemetry.callout.errorUnprivilegedUserDescription": "您无权查看未加密的集群统计信息。", + "telemetry.callout.errorUnprivilegedUserTitle": "显示集群统计信息时出错", + "telemetry.readOurUsageDataPrivacyStatementLinkText": "阅读我们的使用情况数据隐私声明", + "telemetry.seeExampleOfWhatWeCollectLinkText": "查看我们收集的内容示例", + "telemetry.telemetryConfigDescription": "通过提供基本功能的使用情况统计信息,来帮助我们改进 Elastic Stack。我们不会在 Elastic 之外共享此数据。", + "telemetry.telemetryConfigTitle": "遥测选择加入", + "telemetry.telemetryErrorNotificationMessageDescription.tryAgainText": "确认 Kibana 和 Elasticsearch 仍在运行,然后重试。", + "telemetry.telemetryErrorNotificationMessageDescription.unableToSaveTelemetryPreferenceText": "无法保存遥测首选项。", + "telemetry.telemetryErrorNotificationMessageTitle": "遥测错误", + "telemetry.usageDataTitle": "使用情况数据", + "telemetry.welcomeBanner.noButtonLabel": "否", + "telemetry.welcomeBanner.telemetryConfigDescription.readMoreLinkText": "阅读更多内容", + "telemetry.welcomeBanner.telemetryConfigDetailsDescription": "不会发送有关您处理或存储的数据的信息。此功能将定期发送基本功能使用情况统计信息。请参阅{exampleLink}或阅读我们的{telemetryPrivacyStatementLink}。您可以随时禁用此功能。", + "telemetry.welcomeBanner.telemetryConfigDetailsDescription.exampleLinkText": "示例", + "telemetry.welcomeBanner.telemetryConfigDetailsDescription.telemetryPrivacyStatementLinkText": "遥测隐私声明", + "telemetry.welcomeBanner.yesButtonLabel": "是", "xpack.upgradeAssistant.appTitle": "{version} 升级助手", "xpack.upgradeAssistant.checkupTab.backUpCallout.calloutBody.calloutDetail": "使用 {snapshotRestoreDocsButton} 备份您的数据。", "xpack.upgradeAssistant.checkupTab.backUpCallout.calloutBody.snapshotRestoreDocsButtonLabel": "快照和还原 API", diff --git a/x-pack/test/functional/config.js b/x-pack/test/functional/config.js index d920b368922cd..3ec86a7fc1722 100644 --- a/x-pack/test/functional/config.js +++ b/x-pack/test/functional/config.js @@ -79,12 +79,12 @@ export default async function ({ readConfigFile }) { '--server.uuid=5b2de169-2785-441b-ae8c-186a1936b17d', '--xpack.maps.showMapsInspectorAdapter=true', '--xpack.maps.preserveDrawingBuffer=true', - '--xpack.telemetry.banner=false', '--xpack.reporting.queue.pollInterval=3000', // make it explicitly the default '--xpack.reporting.csv.maxSizeBytes=2850', // small-ish limit for cutting off a 1999 byte report '--stats.maximumWaitTimeForAllCollectorsInS=1', '--xpack.security.encryptionKey="wuGNaIhoMpk5sO4UBxgr3NyW1sFcLgIf"', // server restarts should not invalidate active sessions '--xpack.encrypted_saved_objects.encryptionKey="DkdXazszSCYexXqz4YktBGHCRkV6hyNK"', + '--telemetry.banner=false', '--timelion.ui.enabled=true', ], },