From af25b3f6eb4ca255f4000556b28233e543fc2fe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Ferna=CC=81ndez=20Haro?= Date: Thu, 7 May 2020 11:40:11 +0100 Subject: [PATCH 1/2] Move Kibana Usage collectors outside the telemetry plugin --- src/plugins/kibana_usage_collection/README.md | 9 ++ .../common/constants.ts | 47 ++++++++++ .../kibana_usage_collection/kibana.json | 10 +++ .../server/__snapshots__/index.test.ts.snap | 11 +++ .../application_usage/index.test.ts | 0 .../collectors/application_usage/index.ts | 0 .../application_usage/saved_objects_types.ts | 0 .../telemetry_application_usage_collector.ts | 0 .../server/collectors/find_all.test.ts | 0 .../server/collectors/find_all.ts | 0 .../server/collectors/index.ts | 24 +++++ .../kibana/get_saved_object_counts.test.ts | 0 .../kibana/get_saved_object_counts.ts | 0 .../server/collectors/kibana/index.test.ts | 0 .../server/collectors/kibana/index.ts | 0 .../kibana/kibana_usage_collector.ts | 0 .../__snapshots__/index.test.ts.snap | 7 ++ .../collectors/management/index.test.ts | 67 ++++++++++++++ .../server/collectors/management/index.ts | 0 .../telemetry_management_collector.ts | 6 -- .../__snapshots__/index.test.ts.snap | 0 .../server/collectors/ops_stats/index.test.ts | 0 .../server/collectors/ops_stats/index.ts | 0 .../ops_stats/ops_stats_collector.ts | 0 .../server/collectors/ui_metric/index.test.ts | 0 .../server/collectors/ui_metric/index.ts | 0 .../telemetry_ui_metric_collector.ts | 0 .../server/index.test.ts | 61 +++++++++++++ .../kibana_usage_collection/server/index.ts | 28 ++++++ .../kibana_usage_collection/server/plugin.ts | 87 +++++++++++++++++++ src/plugins/telemetry/common/constants.ts | 26 ------ .../telemetry/server/collectors/index.ts | 5 -- src/plugins/telemetry/server/plugin.ts | 23 +---- 33 files changed, 353 insertions(+), 58 deletions(-) create mode 100644 src/plugins/kibana_usage_collection/README.md create mode 100644 src/plugins/kibana_usage_collection/common/constants.ts create mode 100644 src/plugins/kibana_usage_collection/kibana.json create mode 100644 src/plugins/kibana_usage_collection/server/__snapshots__/index.test.ts.snap rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/application_usage/index.test.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/application_usage/index.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/application_usage/saved_objects_types.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/application_usage/telemetry_application_usage_collector.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/find_all.test.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/find_all.ts (100%) create mode 100644 src/plugins/kibana_usage_collection/server/collectors/index.ts rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/kibana/get_saved_object_counts.test.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/kibana/get_saved_object_counts.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/kibana/index.test.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/kibana/index.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/kibana/kibana_usage_collector.ts (100%) create mode 100644 src/plugins/kibana_usage_collection/server/collectors/management/__snapshots__/index.test.ts.snap create mode 100644 src/plugins/kibana_usage_collection/server/collectors/management/index.test.ts rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/management/index.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/management/telemetry_management_collector.ts (89%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/ops_stats/__snapshots__/index.test.ts.snap (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/ops_stats/index.test.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/ops_stats/index.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/ops_stats/ops_stats_collector.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/ui_metric/index.test.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/ui_metric/index.ts (100%) rename src/plugins/{telemetry => kibana_usage_collection}/server/collectors/ui_metric/telemetry_ui_metric_collector.ts (100%) create mode 100644 src/plugins/kibana_usage_collection/server/index.test.ts create mode 100644 src/plugins/kibana_usage_collection/server/index.ts create mode 100644 src/plugins/kibana_usage_collection/server/plugin.ts diff --git a/src/plugins/kibana_usage_collection/README.md b/src/plugins/kibana_usage_collection/README.md new file mode 100644 index 0000000000000..1aade472c2326 --- /dev/null +++ b/src/plugins/kibana_usage_collection/README.md @@ -0,0 +1,9 @@ +# Kibana Usage Collection + +This plugin registers the basic usage collectors from Kibana: + +- Application Usage +- UI Metrics +- Ops stats +- Number of Saved Objects per type +- Non-default UI Settings diff --git a/src/plugins/kibana_usage_collection/common/constants.ts b/src/plugins/kibana_usage_collection/common/constants.ts new file mode 100644 index 0000000000000..df0adfc52184b --- /dev/null +++ b/src/plugins/kibana_usage_collection/common/constants.ts @@ -0,0 +1,47 @@ +/* + * 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 const PLUGIN_ID = 'kibanaUsageCollection'; +export const PLUGIN_NAME = 'kibana_usage_collection'; + +/** + * UI metric usage type + */ +export const UI_METRIC_USAGE_TYPE = 'ui_metric'; + +/** + * Application Usage type + */ +export const APPLICATION_USAGE_TYPE = 'application_usage'; + +/** + * The type name used within the Monitoring index to publish management stats. + */ +export const KIBANA_STACK_MANAGEMENT_STATS_TYPE = 'stack_management'; + +/** + * The type name used to publish Kibana usage stats. + * NOTE: this string shows as-is in the stats API as a field name for the kibana usage stats + */ +export const KIBANA_USAGE_TYPE = 'kibana'; + +/** + * The type name used to publish Kibana usage stats in the formatted as bulk. + */ +export const KIBANA_STATS_TYPE = 'kibana_stats'; diff --git a/src/plugins/kibana_usage_collection/kibana.json b/src/plugins/kibana_usage_collection/kibana.json new file mode 100644 index 0000000000000..87d83ebecde12 --- /dev/null +++ b/src/plugins/kibana_usage_collection/kibana.json @@ -0,0 +1,10 @@ +{ + "id": "kibanaUsageCollection", + "version": "kibana", + "server": true, + "ui": false, + "requiredPlugins": [ + "usageCollection" + ], + "optionalPlugins": [] +} diff --git a/src/plugins/kibana_usage_collection/server/__snapshots__/index.test.ts.snap b/src/plugins/kibana_usage_collection/server/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000000..f07912eff02b7 --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/__snapshots__/index.test.ts.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`kibana_usage_collection Runs the setup method without issues 1`] = `false`; + +exports[`kibana_usage_collection Runs the setup method without issues 2`] = `true`; + +exports[`kibana_usage_collection Runs the setup method without issues 3`] = `false`; + +exports[`kibana_usage_collection Runs the setup method without issues 4`] = `false`; + +exports[`kibana_usage_collection Runs the setup method without issues 5`] = `false`; diff --git a/src/plugins/telemetry/server/collectors/application_usage/index.test.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/index.test.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/application_usage/index.test.ts rename to src/plugins/kibana_usage_collection/server/collectors/application_usage/index.test.ts diff --git a/src/plugins/telemetry/server/collectors/application_usage/index.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/index.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/application_usage/index.ts rename to src/plugins/kibana_usage_collection/server/collectors/application_usage/index.ts diff --git a/src/plugins/telemetry/server/collectors/application_usage/saved_objects_types.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/saved_objects_types.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/application_usage/saved_objects_types.ts rename to src/plugins/kibana_usage_collection/server/collectors/application_usage/saved_objects_types.ts diff --git a/src/plugins/telemetry/server/collectors/application_usage/telemetry_application_usage_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/telemetry_application_usage_collector.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/application_usage/telemetry_application_usage_collector.ts rename to src/plugins/kibana_usage_collection/server/collectors/application_usage/telemetry_application_usage_collector.ts diff --git a/src/plugins/telemetry/server/collectors/find_all.test.ts b/src/plugins/kibana_usage_collection/server/collectors/find_all.test.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/find_all.test.ts rename to src/plugins/kibana_usage_collection/server/collectors/find_all.test.ts diff --git a/src/plugins/telemetry/server/collectors/find_all.ts b/src/plugins/kibana_usage_collection/server/collectors/find_all.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/find_all.ts rename to src/plugins/kibana_usage_collection/server/collectors/find_all.ts diff --git a/src/plugins/kibana_usage_collection/server/collectors/index.ts b/src/plugins/kibana_usage_collection/server/collectors/index.ts new file mode 100644 index 0000000000000..1ca237528b41f --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/collectors/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. + */ + +export { registerUiMetricUsageCollector } from './ui_metric'; +export { registerManagementUsageCollector } from './management'; +export { registerApplicationUsageCollector } from './application_usage'; +export { registerKibanaUsageCollector } from './kibana'; +export { registerOpsStatsCollector } from './ops_stats'; diff --git a/src/plugins/telemetry/server/collectors/kibana/get_saved_object_counts.test.ts b/src/plugins/kibana_usage_collection/server/collectors/kibana/get_saved_object_counts.test.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/kibana/get_saved_object_counts.test.ts rename to src/plugins/kibana_usage_collection/server/collectors/kibana/get_saved_object_counts.test.ts diff --git a/src/plugins/telemetry/server/collectors/kibana/get_saved_object_counts.ts b/src/plugins/kibana_usage_collection/server/collectors/kibana/get_saved_object_counts.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/kibana/get_saved_object_counts.ts rename to src/plugins/kibana_usage_collection/server/collectors/kibana/get_saved_object_counts.ts diff --git a/src/plugins/telemetry/server/collectors/kibana/index.test.ts b/src/plugins/kibana_usage_collection/server/collectors/kibana/index.test.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/kibana/index.test.ts rename to src/plugins/kibana_usage_collection/server/collectors/kibana/index.test.ts diff --git a/src/plugins/telemetry/server/collectors/kibana/index.ts b/src/plugins/kibana_usage_collection/server/collectors/kibana/index.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/kibana/index.ts rename to src/plugins/kibana_usage_collection/server/collectors/kibana/index.ts diff --git a/src/plugins/telemetry/server/collectors/kibana/kibana_usage_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/kibana/kibana_usage_collector.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/kibana/kibana_usage_collector.ts rename to src/plugins/kibana_usage_collection/server/collectors/kibana/kibana_usage_collector.ts diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/__snapshots__/index.test.ts.snap b/src/plugins/kibana_usage_collection/server/collectors/management/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000000..def230dea8d70 --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/collectors/management/__snapshots__/index.test.ts.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`telemetry_application_usage_collector fetch() 1`] = ` +Object { + "my-key": "my-value", +} +`; diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/index.test.ts b/src/plugins/kibana_usage_collection/server/collectors/management/index.test.ts new file mode 100644 index 0000000000000..a14edb55861be --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/collectors/management/index.test.ts @@ -0,0 +1,67 @@ +/* + * 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 { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; +import { uiSettingsServiceMock } from '../../../../../core/server/mocks'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { CollectorOptions } from '../../../../../plugins/usage_collection/server/collector/collector'; + +import { registerManagementUsageCollector } from './'; + +describe('telemetry_application_usage_collector', () => { + let collector: CollectorOptions; + + const usageCollectionMock: jest.Mocked = { + makeUsageCollector: jest.fn().mockImplementation(config => (collector = config)), + registerCollector: jest.fn(), + } as any; + + const uiSettingsClient = uiSettingsServiceMock.createClient(); + const getUiSettingsClient = jest.fn(() => uiSettingsClient); + const callCluster = jest.fn(); + + beforeAll(() => { + registerManagementUsageCollector(usageCollectionMock, getUiSettingsClient); + }); + + test('registered collector is set', () => { + expect(collector).not.toBeUndefined(); + }); + + test('isReady() => false if no client', () => { + getUiSettingsClient.mockImplementationOnce(() => undefined as any); + expect(collector.isReady()).toBe(false); + }); + + test('isReady() => true', () => { + expect(collector.isReady()).toBe(true); + }); + + test('fetch()', async () => { + uiSettingsClient.getUserProvided.mockImplementationOnce(async () => ({ + 'my-key': { userValue: 'my-value' }, + })); + await expect(collector.fetch(callCluster)).resolves.toMatchSnapshot(); + }); + + test('fetch() should not fail if invoked when not ready', async () => { + getUiSettingsClient.mockImplementationOnce(() => undefined as any); + await expect(collector.fetch(callCluster)).resolves.toBe(undefined); + }); +}); diff --git a/src/plugins/telemetry/server/collectors/management/index.ts b/src/plugins/kibana_usage_collection/server/collectors/management/index.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/management/index.ts rename to src/plugins/kibana_usage_collection/server/collectors/management/index.ts diff --git a/src/plugins/telemetry/server/collectors/management/telemetry_management_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.ts similarity index 89% rename from src/plugins/telemetry/server/collectors/management/telemetry_management_collector.ts rename to src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.ts index 7dc4ca64e6bc3..39cd351884955 100644 --- a/src/plugins/telemetry/server/collectors/management/telemetry_management_collector.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.ts @@ -17,18 +17,12 @@ * under the License. */ -import { size } from 'lodash'; import { IUiSettingsClient } from 'kibana/server'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; import { KIBANA_STACK_MANAGEMENT_STATS_TYPE } from '../../../common/constants'; export type UsageStats = Record; -export async function getTranslationCount(loader: any, locale: string): Promise { - const translations = await loader.getTranslationsByLocale(locale); - return size(translations.messages); -} - export function createCollectorFetch(getUiSettingsClient: () => IUiSettingsClient | undefined) { return async function fetchUsageStats(): Promise { const uiSettingsClient = getUiSettingsClient(); diff --git a/src/plugins/telemetry/server/collectors/ops_stats/__snapshots__/index.test.ts.snap b/src/plugins/kibana_usage_collection/server/collectors/ops_stats/__snapshots__/index.test.ts.snap similarity index 100% rename from src/plugins/telemetry/server/collectors/ops_stats/__snapshots__/index.test.ts.snap rename to src/plugins/kibana_usage_collection/server/collectors/ops_stats/__snapshots__/index.test.ts.snap diff --git a/src/plugins/telemetry/server/collectors/ops_stats/index.test.ts b/src/plugins/kibana_usage_collection/server/collectors/ops_stats/index.test.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/ops_stats/index.test.ts rename to src/plugins/kibana_usage_collection/server/collectors/ops_stats/index.test.ts diff --git a/src/plugins/telemetry/server/collectors/ops_stats/index.ts b/src/plugins/kibana_usage_collection/server/collectors/ops_stats/index.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/ops_stats/index.ts rename to src/plugins/kibana_usage_collection/server/collectors/ops_stats/index.ts diff --git a/src/plugins/telemetry/server/collectors/ops_stats/ops_stats_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/ops_stats/ops_stats_collector.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/ops_stats/ops_stats_collector.ts rename to src/plugins/kibana_usage_collection/server/collectors/ops_stats/ops_stats_collector.ts diff --git a/src/plugins/telemetry/server/collectors/ui_metric/index.test.ts b/src/plugins/kibana_usage_collection/server/collectors/ui_metric/index.test.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/ui_metric/index.test.ts rename to src/plugins/kibana_usage_collection/server/collectors/ui_metric/index.test.ts diff --git a/src/plugins/telemetry/server/collectors/ui_metric/index.ts b/src/plugins/kibana_usage_collection/server/collectors/ui_metric/index.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/ui_metric/index.ts rename to src/plugins/kibana_usage_collection/server/collectors/ui_metric/index.ts diff --git a/src/plugins/telemetry/server/collectors/ui_metric/telemetry_ui_metric_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/ui_metric/telemetry_ui_metric_collector.ts similarity index 100% rename from src/plugins/telemetry/server/collectors/ui_metric/telemetry_ui_metric_collector.ts rename to src/plugins/kibana_usage_collection/server/collectors/ui_metric/telemetry_ui_metric_collector.ts diff --git a/src/plugins/kibana_usage_collection/server/index.test.ts b/src/plugins/kibana_usage_collection/server/index.test.ts new file mode 100644 index 0000000000000..a0ec21ed46f91 --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/index.test.ts @@ -0,0 +1,61 @@ +/* + * 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 { Observable } from 'rxjs'; +import { coreMock } from '../../../core/server/mocks'; +import { UsageCollectionSetup } from '../../usage_collection/server'; +import { plugin } from './'; + +describe('kibana_usage_collection', () => { + const pluginInstance = plugin(coreMock.createPluginInitializerContext({})); + + const usageCollectors: Array<{ isReady: () => boolean }> = []; + + const usageCollection: jest.Mocked = { + makeStatsCollector: jest.fn().mockImplementation(opts => { + usageCollectors.push(opts); + return opts; + }), + makeUsageCollector: jest.fn().mockImplementation(opts => { + usageCollectors.push(opts); + return opts; + }), + registerCollector: jest.fn(), + } as any; + + test('Runs the setup method without issues', () => { + const coreSetup = coreMock.createSetup(); + coreSetup.metrics.getOpsMetrics$.mockImplementation(() => new Observable()); + expect(pluginInstance.setup(coreSetup, { usageCollection })).toBe(undefined); + usageCollectors.forEach(({ isReady }) => { + expect(isReady()).toMatchSnapshot(); // Some should return false at this stage + }); + }); + + test('Runs the start method without issues', () => { + expect(pluginInstance.start(coreMock.createStart())).toBe(undefined); + usageCollectors.forEach(({ isReady }) => { + expect(isReady()).toBe(true); // All should return true at this point + }); + }); + + test('Runs the stop method without issues', () => { + expect(pluginInstance.stop()).toBe(undefined); + }); +}); diff --git a/src/plugins/kibana_usage_collection/server/index.ts b/src/plugins/kibana_usage_collection/server/index.ts new file mode 100644 index 0000000000000..968a28fcf912b --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/index.ts @@ -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 { PluginInitializerContext } from '../../../core/server'; +import { KibanaUsageCollectionPlugin } from './plugin'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. + +export function plugin(initializerContext: PluginInitializerContext) { + return new KibanaUsageCollectionPlugin(initializerContext); +} diff --git a/src/plugins/kibana_usage_collection/server/plugin.ts b/src/plugins/kibana_usage_collection/server/plugin.ts new file mode 100644 index 0000000000000..5e76083469d95 --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/plugin.ts @@ -0,0 +1,87 @@ +/* + * 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 { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; +import { Observable } from 'rxjs'; +import { + PluginInitializerContext, + CoreSetup, + Plugin, + MetricsServiceSetup, + ISavedObjectsRepository, + IUiSettingsClient, + SharedGlobalConfig, + SavedObjectsClient, + CoreStart, + SavedObjectsServiceSetup, +} from '../../../core/server'; +import { + registerApplicationUsageCollector, + registerKibanaUsageCollector, + registerManagementUsageCollector, + registerOpsStatsCollector, + registerUiMetricUsageCollector, +} from './collectors'; + +interface KibanaUsageCollectionPluginsDepsSetup { + usageCollection: UsageCollectionSetup; +} + +type SavedObjectsRegisterType = SavedObjectsServiceSetup['registerType']; + +export class KibanaUsageCollectionPlugin implements Plugin { + private readonly legacyConfig$: Observable; + private savedObjectsClient?: ISavedObjectsRepository; + private uiSettingsClient?: IUiSettingsClient; + + constructor(initializerContext: PluginInitializerContext) { + this.legacyConfig$ = initializerContext.config.legacy.globalConfig$; + } + + public setup( + { savedObjects, metrics, getStartServices }: CoreSetup, + { usageCollection }: KibanaUsageCollectionPluginsDepsSetup + ) { + this.registerUsageCollectors(usageCollection, metrics, opts => savedObjects.registerType(opts)); + } + + public start(core: CoreStart) { + const { savedObjects, uiSettings } = core; + this.savedObjectsClient = savedObjects.createInternalRepository(); + const savedObjectsClient = new SavedObjectsClient(this.savedObjectsClient); + this.uiSettingsClient = uiSettings.asScopedToClient(savedObjectsClient); + } + + public stop() {} + + private registerUsageCollectors( + usageCollection: UsageCollectionSetup, + metrics: MetricsServiceSetup, + registerType: SavedObjectsRegisterType + ) { + const getSavedObjectsClient = () => this.savedObjectsClient; + const getUiSettingsClient = () => this.uiSettingsClient; + + registerOpsStatsCollector(usageCollection, metrics.getOpsMetrics$()); + registerKibanaUsageCollector(usageCollection, this.legacyConfig$); + registerManagementUsageCollector(usageCollection, getUiSettingsClient); + registerUiMetricUsageCollector(usageCollection, registerType, getSavedObjectsClient); + registerApplicationUsageCollector(usageCollection, registerType, getSavedObjectsClient); + } +} diff --git a/src/plugins/telemetry/common/constants.ts b/src/plugins/telemetry/common/constants.ts index fd32862896528..2e058fdc13e4a 100644 --- a/src/plugins/telemetry/common/constants.ts +++ b/src/plugins/telemetry/common/constants.ts @@ -65,29 +65,3 @@ export const TELEMETRY_STATS_TYPE = 'telemetry'; * The endpoint version when hitting the remote telemetry service */ export const ENDPOINT_VERSION = 'v2'; - -/** - * UI metric usage type - */ -export const UI_METRIC_USAGE_TYPE = 'ui_metric'; - -/** - * Application Usage type - */ -export const APPLICATION_USAGE_TYPE = 'application_usage'; - -/** - * The type name used within the Monitoring index to publish management stats. - */ -export const KIBANA_STACK_MANAGEMENT_STATS_TYPE = 'stack_management'; - -/** - * The type name used to publish Kibana usage stats. - * NOTE: this string shows as-is in the stats API as a field name for the kibana usage stats - */ -export const KIBANA_USAGE_TYPE = 'kibana'; - -/** - * The type name used to publish Kibana usage stats in the formatted as bulk. - */ -export const KIBANA_STATS_TYPE = 'kibana_stats'; diff --git a/src/plugins/telemetry/server/collectors/index.ts b/src/plugins/telemetry/server/collectors/index.ts index a874f8dd6202c..cbce4494e043c 100644 --- a/src/plugins/telemetry/server/collectors/index.ts +++ b/src/plugins/telemetry/server/collectors/index.ts @@ -18,9 +18,4 @@ */ export { registerTelemetryUsageCollector } from './usage'; -export { registerUiMetricUsageCollector } from './ui_metric'; export { registerTelemetryPluginUsageCollector } from './telemetry_plugin'; -export { registerManagementUsageCollector } from './management'; -export { registerApplicationUsageCollector } from './application_usage'; -export { registerKibanaUsageCollector } from './kibana'; -export { registerOpsStatsCollector } from './ops_stats'; diff --git a/src/plugins/telemetry/server/plugin.ts b/src/plugins/telemetry/server/plugin.ts index d1530c272027a..05fcb385429c5 100644 --- a/src/plugins/telemetry/server/plugin.ts +++ b/src/plugins/telemetry/server/plugin.ts @@ -32,19 +32,12 @@ import { SavedObjectsClient, Plugin, Logger, - SharedGlobalConfig, - MetricsServiceSetup, } from '../../../core/server'; import { registerRoutes } from './routes'; import { registerCollection } from './telemetry_collection'; import { - registerUiMetricUsageCollector, registerTelemetryUsageCollector, registerTelemetryPluginUsageCollector, - registerManagementUsageCollector, - registerApplicationUsageCollector, - registerKibanaUsageCollector, - registerOpsStatsCollector, } from './collectors'; import { TelemetryConfigType } from './config'; import { FetcherTask } from './fetcher'; @@ -65,7 +58,6 @@ export class TelemetryPlugin implements Plugin { private readonly logger: Logger; private readonly currentKibanaVersion: string; private readonly config$: Observable; - private readonly legacyConfig$: Observable; private readonly isDev: boolean; private readonly fetcherTask: FetcherTask; private savedObjectsClient?: ISavedObjectsRepository; @@ -76,7 +68,6 @@ export class TelemetryPlugin implements Plugin { this.isDev = initializerContext.env.mode.dev; this.currentKibanaVersion = initializerContext.env.packageInfo.version; this.config$ = initializerContext.config.create(); - this.legacyConfig$ = initializerContext.config.legacy.globalConfig$; this.fetcherTask = new FetcherTask({ ...initializerContext, logger: this.logger, @@ -103,7 +94,7 @@ export class TelemetryPlugin implements Plugin { }); this.registerMappings(opts => savedObjects.registerType(opts)); - this.registerUsageCollectors(usageCollection, metrics, opts => savedObjects.registerType(opts)); + this.registerUsageCollectors(usageCollection); } public async start(core: CoreStart, { telemetryCollectionManager }: TelemetryPluginsStart) { @@ -157,24 +148,14 @@ export class TelemetryPlugin implements Plugin { }); } - private registerUsageCollectors( - usageCollection: UsageCollectionSetup, - metrics: MetricsServiceSetup, - registerType: SavedObjectsRegisterType - ) { + private registerUsageCollectors(usageCollection: UsageCollectionSetup) { const getSavedObjectsClient = () => this.savedObjectsClient; - const getUiSettingsClient = () => this.uiSettingsClient; - registerOpsStatsCollector(usageCollection, metrics.getOpsMetrics$()); - registerKibanaUsageCollector(usageCollection, this.legacyConfig$); registerTelemetryPluginUsageCollector(usageCollection, { currentKibanaVersion: this.currentKibanaVersion, config$: this.config$, getSavedObjectsClient, }); registerTelemetryUsageCollector(usageCollection, this.config$); - registerManagementUsageCollector(usageCollection, getUiSettingsClient); - registerUiMetricUsageCollector(usageCollection, registerType, getSavedObjectsClient); - registerApplicationUsageCollector(usageCollection, registerType, getSavedObjectsClient); } } From d1e158340ae4d31a7862952a5dee06cf58215683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Ferna=CC=81ndez=20Haro?= Date: Thu, 7 May 2020 12:42:55 +0100 Subject: [PATCH 2/2] Add CODEOWNERS + fix test --- .github/CODEOWNERS | 1 + .../server/__snapshots__/index.test.ts.snap | 2 +- .../server/index.test.ts | 43 +++++++++++++++++-- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 638e86ef375fe..477089e48367f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -162,6 +162,7 @@ # Pulse /packages/kbn-analytics/ @elastic/pulse /src/legacy/core_plugins/ui_metric/ @elastic/pulse +/src/plugins/kibana_usage_collection/ @elastic/pulse /src/plugins/telemetry/ @elastic/pulse /src/plugins/telemetry_collection_manager/ @elastic/pulse /src/plugins/telemetry_management_section/ @elastic/pulse diff --git a/src/plugins/kibana_usage_collection/server/__snapshots__/index.test.ts.snap b/src/plugins/kibana_usage_collection/server/__snapshots__/index.test.ts.snap index f07912eff02b7..41c4c33b53c8d 100644 --- a/src/plugins/kibana_usage_collection/server/__snapshots__/index.test.ts.snap +++ b/src/plugins/kibana_usage_collection/server/__snapshots__/index.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`kibana_usage_collection Runs the setup method without issues 1`] = `false`; +exports[`kibana_usage_collection Runs the setup method without issues 1`] = `true`; exports[`kibana_usage_collection Runs the setup method without issues 2`] = `true`; diff --git a/src/plugins/kibana_usage_collection/server/index.test.ts b/src/plugins/kibana_usage_collection/server/index.test.ts index a0ec21ed46f91..0060b6caa1815 100644 --- a/src/plugins/kibana_usage_collection/server/index.test.ts +++ b/src/plugins/kibana_usage_collection/server/index.test.ts @@ -17,8 +17,12 @@ * under the License. */ -import { Observable } from 'rxjs'; -import { coreMock } from '../../../core/server/mocks'; +import { BehaviorSubject } from 'rxjs'; +import { + coreMock, + savedObjectsRepositoryMock, + uiSettingsServiceMock, +} from '../../../core/server/mocks'; import { UsageCollectionSetup } from '../../usage_collection/server'; import { plugin } from './'; @@ -41,7 +45,31 @@ describe('kibana_usage_collection', () => { test('Runs the setup method without issues', () => { const coreSetup = coreMock.createSetup(); - coreSetup.metrics.getOpsMetrics$.mockImplementation(() => new Observable()); + coreSetup.metrics.getOpsMetrics$.mockImplementation( + () => + new BehaviorSubject({ + process: { + memory: { + heap: { total_in_bytes: 1, used_in_bytes: 1, size_limit: 1 }, + resident_set_size_in_bytes: 1, + }, + event_loop_delay: 1, + pid: 1, + uptime_in_millis: 1, + }, + os: { + platform: 'darwin' as const, + platformRelease: 'test', + load: { '1m': 1, '5m': 1, '15m': 1 }, + memory: { total_in_bytes: 1, free_in_bytes: 1, used_in_bytes: 1 }, + uptime_in_millis: 1, + }, + response_times: { avg_in_millis: 1, max_in_millis: 1 }, + requests: { disconnects: 1, total: 1, statusCodes: { '200': 1 } }, + concurrent_connections: 1, + }) + ); + expect(pluginInstance.setup(coreSetup, { usageCollection })).toBe(undefined); usageCollectors.forEach(({ isReady }) => { expect(isReady()).toMatchSnapshot(); // Some should return false at this stage @@ -49,7 +77,14 @@ describe('kibana_usage_collection', () => { }); test('Runs the start method without issues', () => { - expect(pluginInstance.start(coreMock.createStart())).toBe(undefined); + const coreStart = coreMock.createStart(); + coreStart.savedObjects.createInternalRepository.mockImplementation(() => + savedObjectsRepositoryMock.create() + ); + coreStart.uiSettings.asScopedToClient.mockImplementation(() => + uiSettingsServiceMock.createClient() + ); + expect(pluginInstance.start(coreStart)).toBe(undefined); usageCollectors.forEach(({ isReady }) => { expect(isReady()).toBe(true); // All should return true at this point });