From 3937a1d623b172ec29becab9bc46ca409facff62 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 11 Dec 2019 15:34:11 +0100 Subject: [PATCH] also move usage collector over --- src/legacy/core_plugins/kibana/index.js | 2 -- .../kibana/ui_setting_defaults.js | 3 +- src/plugins/data/common/constants.ts | 20 +++++++++++++ src/plugins/data/common/index.ts | 1 + src/plugins/data/kibana.json | 3 +- .../kql_telemetry/kql_telemetry_service.ts | 15 +++++++++- .../usage_collector/fetch.test.ts} | 30 +++++++++++-------- .../kql_telemetry/usage_collector/fetch.ts} | 15 ++++++---- .../kql_telemetry/usage_collector/index.ts} | 0 .../make_kql_usage_collector.test.ts} | 29 +++++++----------- .../make_kql_usage_collector.ts} | 9 ++++-- src/plugins/data/server/plugin.ts | 14 +++++++-- 12 files changed, 95 insertions(+), 46 deletions(-) create mode 100644 src/plugins/data/common/constants.ts rename src/{legacy/core_plugins/kibana/server/lib/kql_usage_collector/fetch.test.js => plugins/data/server/kql_telemetry/usage_collector/fetch.test.ts} (85%) rename src/{legacy/core_plugins/kibana/server/lib/kql_usage_collector/fetch.js => plugins/data/server/kql_telemetry/usage_collector/fetch.ts} (85%) rename src/{legacy/core_plugins/kibana/server/lib/kql_usage_collector/index.js => plugins/data/server/kql_telemetry/usage_collector/index.ts} (100%) rename src/{legacy/core_plugins/kibana/server/lib/kql_usage_collector/make_kql_usage_collector.test.js => plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.test.ts} (62%) rename src/{legacy/core_plugins/kibana/server/lib/kql_usage_collector/make_kql_usage_collector.js => plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.ts} (81%) diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index d8e56e4b5f0fe..542e305c59c02 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -33,7 +33,6 @@ import { registerTutorials } from './server/tutorials/register'; 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'; @@ -332,7 +331,6 @@ export default function (kibana) { registerSuggestionsApi(server); registerFieldFormats(server); registerTutorials(server); - makeKQLUsageCollector(usageCollection, server); registerCspCollector(usageCollection, server); server.expose('systemApi', systemApi); server.injectUiAppVars('kibana', () => injectVars(server)); diff --git a/src/legacy/core_plugins/kibana/ui_setting_defaults.js b/src/legacy/core_plugins/kibana/ui_setting_defaults.js index ca57395481409..f724d7dac2f53 100644 --- a/src/legacy/core_plugins/kibana/ui_setting_defaults.js +++ b/src/legacy/core_plugins/kibana/ui_setting_defaults.js @@ -20,6 +20,7 @@ import moment from 'moment-timezone'; import numeralLanguages from '@elastic/numeral/languages'; import { i18n } from '@kbn/i18n'; +import { DEFAULT_QUERY_LANGUAGE } from '../../../plugins/data/common'; export function getUiSettingDefaults() { const weekdays = moment.weekdays().slice(); @@ -114,7 +115,7 @@ export function getUiSettingDefaults() { }, 'search:queryLanguage': { name: queryLanguageSettingName, - value: 'kuery', + value: DEFAULT_QUERY_LANGUAGE, description: i18n.translate('kbn.advancedSettings.searchQueryLanguageText', { defaultMessage: 'Query language used by the query bar. KQL is a new language built specifically for Kibana.', diff --git a/src/plugins/data/common/constants.ts b/src/plugins/data/common/constants.ts new file mode 100644 index 0000000000000..00786a0c72cf1 --- /dev/null +++ b/src/plugins/data/common/constants.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 const DEFAULT_QUERY_LANGUAGE = 'kuery'; diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index b334342a57ec6..e02045de24e8f 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -24,3 +24,4 @@ export * from './index_patterns'; export * from './es_query'; export * from './utils'; export * from './types'; +export * from './constants'; diff --git a/src/plugins/data/kibana.json b/src/plugins/data/kibana.json index 998eaa55858d2..6553ce8ce4d91 100644 --- a/src/plugins/data/kibana.json +++ b/src/plugins/data/kibana.json @@ -3,5 +3,6 @@ "version": "kibana", "server": true, "ui": true, - "requiredPlugins": ["uiActions"] + "requiredPlugins": ["uiActions"], + "optionalPlugins": ["usageCollection"] } diff --git a/src/plugins/data/server/kql_telemetry/kql_telemetry_service.ts b/src/plugins/data/server/kql_telemetry/kql_telemetry_service.ts index 5890341eb41d0..3ba004ab24436 100644 --- a/src/plugins/data/server/kql_telemetry/kql_telemetry_service.ts +++ b/src/plugins/data/server/kql_telemetry/kql_telemetry_service.ts @@ -17,18 +17,31 @@ * under the License. */ +import { first } from 'rxjs/operators'; import { CoreSetup, Plugin, PluginInitializerContext } from 'kibana/server'; import { registerKqlTelemetryRoute } from './route'; +import { UsageCollectionSetup } from '../../../usage_collection/server'; +import { makeKQLUsageCollector } from './usage_collector'; export class KqlTelemetryService implements Plugin { constructor(private initializerContext: PluginInitializerContext) {} - public setup({ http, savedObjects }: CoreSetup) { + public async setup( + { http, savedObjects }: CoreSetup, + { usageCollection }: { usageCollection?: UsageCollectionSetup } + ) { registerKqlTelemetryRoute( http.createRouter(), savedObjects, this.initializerContext.logger.get('data', 'kql-telemetry') ); + + if (usageCollection) { + const config = await this.initializerContext.config.legacy.globalConfig$ + .pipe(first()) + .toPromise(); + makeKQLUsageCollector(usageCollection, config.kibana.index); + } } public start() {} diff --git a/src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/fetch.test.js b/src/plugins/data/server/kql_telemetry/usage_collector/fetch.test.ts similarity index 85% rename from src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/fetch.test.js rename to src/plugins/data/server/kql_telemetry/usage_collector/fetch.test.ts index a5db4602872ee..446320b09757a 100644 --- a/src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/fetch.test.js +++ b/src/plugins/data/server/kql_telemetry/usage_collector/fetch.test.ts @@ -17,18 +17,22 @@ * under the License. */ -jest.mock('../../../ui_setting_defaults', () => ({ - getUiSettingDefaults: () => ({ 'search:queryLanguage': { value: 'lucene' } }), -})); - import { fetchProvider } from './fetch'; +import { APICaller } from 'kibana/server'; + +jest.mock('../../../common', () => ({ + DEFAULT_QUERY_LANGUAGE: 'lucene', +})); -let fetch; -let callCluster; +let fetch: ReturnType; +let callCluster: APICaller; -function setupMockCallCluster(optCount, language) { - callCluster = jest.fn((method, params) => { - if ('id' in params && params.id === 'kql-telemetry:kql-telemetry') { +function setupMockCallCluster( + optCount: { optInCount?: number; optOutCount?: number } | null, + language: string | undefined | null +) { + callCluster = (jest.fn((method, params) => { + if (params && 'id' in params && params.id === 'kql-telemetry:kql-telemetry') { if (optCount === null) { return Promise.resolve({ _index: '.kibana_1', @@ -46,9 +50,9 @@ function setupMockCallCluster(optCount, language) { }, }); } - } else if ('body' in params && params.body.query.term.type === 'config') { + } else if (params && 'body' in params && params.body.query.term.type === 'config') { if (language === 'missingConfigDoc') { - Promise.resolve({ + return Promise.resolve({ hits: { hits: [], }, @@ -69,7 +73,9 @@ function setupMockCallCluster(optCount, language) { }); } } - }); + + throw new Error('invalid call'); + }) as unknown) as APICaller; } describe('makeKQLUsageCollector', () => { diff --git a/src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/fetch.js b/src/plugins/data/server/kql_telemetry/usage_collector/fetch.ts similarity index 85% rename from src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/fetch.js rename to src/plugins/data/server/kql_telemetry/usage_collector/fetch.ts index 74ccf01195fab..9f3437161541f 100644 --- a/src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/fetch.js +++ b/src/plugins/data/server/kql_telemetry/usage_collector/fetch.ts @@ -17,14 +17,14 @@ * under the License. */ -import { getUiSettingDefaults } from '../../../ui_setting_defaults'; import { get } from 'lodash'; +import { APICaller } from 'kibana/server'; +import { DEFAULT_QUERY_LANGUAGE } from '../../../common'; -const uiSettingDefaults = getUiSettingDefaults(); -const defaultSearchQueryLanguageSetting = uiSettingDefaults['search:queryLanguage'].value; +const defaultSearchQueryLanguageSetting = DEFAULT_QUERY_LANGUAGE; -export function fetchProvider(index) { - return async callCluster => { +export function fetchProvider(index: string) { + return async (callCluster: APICaller) => { const [response, config] = await Promise.all([ callCluster('get', { index, @@ -38,7 +38,10 @@ export function fetchProvider(index) { }), ]); - const queryLanguageConfigValue = get(config, 'hits.hits[0]._source.config.search:queryLanguage'); + const queryLanguageConfigValue = get( + config, + 'hits.hits[0]._source.config.search:queryLanguage' + ); // search:queryLanguage can potentially be in four states in the .kibana index: // 1. undefined: this means the user has never touched this setting diff --git a/src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/index.js b/src/plugins/data/server/kql_telemetry/usage_collector/index.ts similarity index 100% rename from src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/index.js rename to src/plugins/data/server/kql_telemetry/usage_collector/index.ts diff --git a/src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/make_kql_usage_collector.test.js b/src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.test.ts similarity index 62% rename from src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/make_kql_usage_collector.test.js rename to src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.test.ts index 7737a0fbc2a71..97a714f09474b 100644 --- a/src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/make_kql_usage_collector.test.js +++ b/src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.test.ts @@ -18,33 +18,26 @@ */ import { makeKQLUsageCollector } from './make_kql_usage_collector'; +import { UsageCollectionSetup } from '../../../../usage_collection/server'; describe('makeKQLUsageCollector', () => { - let server; - let makeUsageCollectorStub; - let registerStub; - let usageCollection; + let usageCollectionMock: jest.Mocked; beforeEach(() => { - makeUsageCollectorStub = jest.fn(); - registerStub = jest.fn(); - usageCollection = { - makeUsageCollector: makeUsageCollectorStub, - registerCollector: registerStub, - }; - server = { - config: () => ({ get: () => '.kibana' }) - }; + usageCollectionMock = ({ + makeUsageCollector: jest.fn(), + registerCollector: jest.fn(), + } as unknown) as jest.Mocked; }); it('should call registerCollector', () => { - makeKQLUsageCollector(usageCollection, server); - expect(registerStub).toHaveBeenCalledTimes(1); + makeKQLUsageCollector(usageCollectionMock, '.kibana'); + expect(usageCollectionMock.registerCollector).toHaveBeenCalledTimes(1); }); it('should call makeUsageCollector with type = kql', () => { - makeKQLUsageCollector(usageCollection, server); - expect(makeUsageCollectorStub).toHaveBeenCalledTimes(1); - expect(makeUsageCollectorStub.mock.calls[0][0].type).toBe('kql'); + makeKQLUsageCollector(usageCollectionMock, '.kibana'); + expect(usageCollectionMock.makeUsageCollector).toHaveBeenCalledTimes(1); + expect(usageCollectionMock.makeUsageCollector.mock.calls[0][0].type).toBe('kql'); }); }); diff --git a/src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/make_kql_usage_collector.js b/src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.ts similarity index 81% rename from src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/make_kql_usage_collector.js rename to src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.ts index 6d751a9e9ff45..db4c9a8f0b4c7 100644 --- a/src/legacy/core_plugins/kibana/server/lib/kql_usage_collector/make_kql_usage_collector.js +++ b/src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.ts @@ -18,10 +18,13 @@ */ import { fetchProvider } from './fetch'; +import { UsageCollectionSetup } from '../../../../usage_collection/server'; -export function makeKQLUsageCollector(usageCollection, server) { - const index = server.config().get('kibana.index'); - const fetch = fetchProvider(index); +export async function makeKQLUsageCollector( + usageCollection: UsageCollectionSetup, + kibanaIndex: string +) { + const fetch = fetchProvider(kibanaIndex); const kqlUsageCollector = usageCollection.makeUsageCollector({ type: 'kql', fetch, diff --git a/src/plugins/data/server/plugin.ts b/src/plugins/data/server/plugin.ts index bfd04aec5711f..9899e96bc0455 100644 --- a/src/plugins/data/server/plugin.ts +++ b/src/plugins/data/server/plugin.ts @@ -23,28 +23,38 @@ import { ISearchSetup } from './search'; import { SearchService } from './search/search_service'; import { ScriptsService } from './scripts'; import { KqlTelemetryService } from './kql_telemetry'; +import { UsageCollectionSetup } from '../../usage_collection/server'; export interface DataPluginSetup { search: ISearchSetup; } + +export interface DataPluginSetupDependencies { + usageCollection?: UsageCollectionSetup; +} + export class DataServerPlugin implements Plugin { private readonly searchService: SearchService; private readonly scriptsService: ScriptsService; private readonly kqlTelemetryService: KqlTelemetryService; private readonly indexPatterns = new IndexPatternsService(); + constructor(initializerContext: PluginInitializerContext) { this.searchService = new SearchService(initializerContext); this.scriptsService = new ScriptsService(); this.kqlTelemetryService = new KqlTelemetryService(initializerContext); } - public setup(core: CoreSetup) { + + public async setup(core: CoreSetup, { usageCollection }: DataPluginSetupDependencies) { this.indexPatterns.setup(core); this.scriptsService.setup(core); - this.kqlTelemetryService.setup(core); + await this.kqlTelemetryService.setup(core, { usageCollection }); + return { search: this.searchService.setup(core), }; } + public start(core: CoreStart) {} public stop() {} }