From 2d1921f697fdfbb47b217c745514eb41bc3470bb Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Sat, 15 Aug 2020 17:00:05 +0300 Subject: [PATCH 01/11] New Search API for timelion --- src/plugins/vis_type_timelion/server/plugin.ts | 10 +++++++++- .../vis_type_timelion/server/routes/run.ts | 5 ++++- .../server/series_functions/es/es.test.js | 12 +++++------- .../server/series_functions/es/index.js | 18 ++++++++++++++---- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/plugins/vis_type_timelion/server/plugin.ts b/src/plugins/vis_type_timelion/server/plugin.ts index 5e6557e305692..427dd1549c43b 100644 --- a/src/plugins/vis_type_timelion/server/plugin.ts +++ b/src/plugins/vis_type_timelion/server/plugin.ts @@ -22,6 +22,7 @@ import { first } from 'rxjs/operators'; import { TypeOf, schema } from '@kbn/config-schema'; import { RecursiveReadonly } from '@kbn/utility-types'; +import { PluginStart } from '../../../../src/plugins/data/server'; import { CoreSetup, PluginInitializerContext } from '../../../../src/core/server'; import { deepFreeze } from '../../../../src/core/server'; import { configSchema } from '../config'; @@ -42,6 +43,10 @@ export interface PluginSetupContract { uiEnabled: boolean; } +interface TimelionPluginStartDeps { + data: PluginStart; +} + /** * Represents Timelion Plugin instance that will be managed by the Kibana plugin system. */ @@ -83,9 +88,12 @@ export class Plugin { }; functionsRoute(router, deps); - runRoute(router, deps); validateEsRoute(router); + core.getStartServices().then(([_, depsStart]) => { + runRoute(router, { ...deps, data: (depsStart as TimelionPluginStartDeps).data }); + }); + core.uiSettings.register({ 'timelion:es.timefield': { name: i18n.translate('timelion.uiSettings.timeFieldLabel', { diff --git a/src/plugins/vis_type_timelion/server/routes/run.ts b/src/plugins/vis_type_timelion/server/routes/run.ts index b8cefc8a07f28..09459e64106b1 100644 --- a/src/plugins/vis_type_timelion/server/routes/run.ts +++ b/src/plugins/vis_type_timelion/server/routes/run.ts @@ -26,6 +26,7 @@ import chainRunnerFn from '../handlers/chain_runner.js'; import getNamespacesSettings from '../lib/get_namespaced_settings'; // @ts-ignore import getTlConfig from '../handlers/lib/tl_config'; +import { PluginStart } from '../../../../../src/plugins/data/server'; import { TimelionFunctionInterface } from '../types'; import { ConfigManager } from '../lib/config_manager'; @@ -37,10 +38,12 @@ export function runRoute( logger, getFunction, configManager, + data, }: { logger: Logger; getFunction: (name: string) => TimelionFunctionInterface; configManager: ConfigManager; + data: PluginStart; } ) { router.post( @@ -87,7 +90,7 @@ export function runRoute( allowedGraphiteUrls: configManager.getGraphiteUrls(), esShardTimeout: configManager.getEsShardTimeout(), savedObjectsClient: context.core.savedObjects.client, - esDataClient: () => context.core.elasticsearch.legacy.client, + esDataClient: data.search.search, }); const chainRunner = chainRunnerFn(tlConfig); const sheet = await Bluebird.all(chainRunner.processRequest(request.body)); diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js index a624ff72ead69..a862f70619c6d 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js @@ -34,11 +34,7 @@ import { UI_SETTINGS } from '../../../../data/server'; function stubRequestAndServer(response, indexPatternSavedObjects = []) { return { - esDataClient: sinon.stub().returns({ - callAsCurrentUser: function () { - return Bluebird.resolve(response); - }, - }), + esDataClient: sinon.stub().returns(Bluebird.resolve(response)), savedObjectsClient: { find: function () { return Bluebird.resolve({ @@ -55,7 +51,9 @@ describe('es', () => { describe('seriesList processor', () => { it('throws an error then the index is missing', () => { tlConfig = stubRequestAndServer({ - _shards: { total: 0 }, + rawResponse: { + _shards: { total: 0 }, + }, }); return invoke(es, [5], tlConfig) .then(expect.fail) @@ -65,7 +63,7 @@ describe('es', () => { }); it('returns a seriesList', () => { - tlConfig = stubRequestAndServer(esResponse); + tlConfig = stubRequestAndServer({ rawResponse: esResponse }); return invoke(es, [5], tlConfig).then((r) => { expect(r.output.type).to.eql('seriesList'); }); diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/index.js b/src/plugins/vis_type_timelion/server/series_functions/es/index.js index fd392f599c1d2..7bb21f5f016f2 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/index.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/index.js @@ -129,9 +129,19 @@ export default new Datasource('es', { const body = buildRequest(config, tlConfig, scriptedFields, esShardTimeout); - const { callAsCurrentUser: callWithRequest } = tlConfig.esDataClient(); - const resp = await callWithRequest('search', body); - if (!resp._shards.total) { + const resp = await tlConfig.esDataClient( + tlConfig.context, + { + params: { + ...body, + waitForCompletionTimeout: '5m', + keepAlive: '5m', + }, + }, + {} + ); + + if (!resp.rawResponse._shards.total) { throw new Error( i18n.translate('timelion.serverSideErrors.esFunction.indexNotFoundErrorMessage', { defaultMessage: 'Elasticsearch index not found: {index}', @@ -143,7 +153,7 @@ export default new Datasource('es', { } return { type: 'seriesList', - list: toSeriesList(resp.aggregations, config), + list: toSeriesList(resp.rawResponse.aggregations, config), }; }, }); From 5a11e4b6e2d99ef043ae593cdc47f59ae9df2dc2 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Tue, 18 Aug 2020 17:25:02 +0300 Subject: [PATCH 02/11] Using timeout from config --- src/plugins/vis_type_timelion/server/lib/config_manager.ts | 6 ++++++ src/plugins/vis_type_timelion/server/routes/run.ts | 2 ++ .../vis_type_timelion/server/series_functions/es/es.test.js | 6 +++--- .../vis_type_timelion/server/series_functions/es/index.js | 5 +++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/plugins/vis_type_timelion/server/lib/config_manager.ts b/src/plugins/vis_type_timelion/server/lib/config_manager.ts index cc679b5155368..86bf6e6bff312 100644 --- a/src/plugins/vis_type_timelion/server/lib/config_manager.ts +++ b/src/plugins/vis_type_timelion/server/lib/config_manager.ts @@ -23,6 +23,7 @@ import { configSchema } from '../../config'; export class ConfigManager { private esShardTimeout: number = 0; + private esRequestTimeout: number = 0; private graphiteUrls: string[] = []; constructor(config: PluginInitializerContext['config']) { @@ -32,6 +33,7 @@ export class ConfigManager { config.legacy.globalConfig$.subscribe((configUpdate) => { this.esShardTimeout = configUpdate.elasticsearch.shardTimeout.asMilliseconds(); + this.esRequestTimeout = configUpdate.elasticsearch.requestTimeout.asMilliseconds(); }); } @@ -39,6 +41,10 @@ export class ConfigManager { return this.esShardTimeout; } + getEsRequestTimeout() { + return this.esRequestTimeout; + } + getGraphiteUrls() { return this.graphiteUrls; } diff --git a/src/plugins/vis_type_timelion/server/routes/run.ts b/src/plugins/vis_type_timelion/server/routes/run.ts index 09459e64106b1..9ed0ca20fe36e 100644 --- a/src/plugins/vis_type_timelion/server/routes/run.ts +++ b/src/plugins/vis_type_timelion/server/routes/run.ts @@ -84,11 +84,13 @@ export function runRoute( const uiSettings = await context.core.uiSettings.client.getAll(); const tlConfig = getTlConfig({ + context, request, settings: _.defaults(uiSettings, timelionDefaults), // Just in case they delete some setting. getFunction, allowedGraphiteUrls: configManager.getGraphiteUrls(), esShardTimeout: configManager.getEsShardTimeout(), + esRequestTimeout: configManager.getEsRequestTimeout(), savedObjectsClient: context.core.savedObjects.client, esDataClient: data.search.search, }); diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js index a862f70619c6d..a17aa0cb0500f 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js @@ -25,7 +25,6 @@ import buildRequest from './lib/build_request'; import createDateAgg from './lib/create_date_agg'; import esResponse from '../fixtures/es_response'; -import Bluebird from 'bluebird'; import _ from 'lodash'; import { expect } from 'chai'; import sinon from 'sinon'; @@ -34,14 +33,15 @@ import { UI_SETTINGS } from '../../../../data/server'; function stubRequestAndServer(response, indexPatternSavedObjects = []) { return { - esDataClient: sinon.stub().returns(Bluebird.resolve(response)), + esDataClient: sinon.stub().returns(Promise.resolve(response)), savedObjectsClient: { find: function () { - return Bluebird.resolve({ + return Promise.resolve({ saved_objects: indexPatternSavedObjects, }); }, }, + esRequestTimeout: 30000, }; } diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/index.js b/src/plugins/vis_type_timelion/server/series_functions/es/index.js index 7bb21f5f016f2..651b8c6008474 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/index.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/index.js @@ -134,8 +134,9 @@ export default new Datasource('es', { { params: { ...body, - waitForCompletionTimeout: '5m', - keepAlive: '5m', + waitForCompletionTimeout: + tlConfig.esRequestTimeout > 60000 ? `${tlConfig.esRequestTimeout}ms` : '1m', + keepAlive: tlConfig.esRequestTimeout > 60000 ? `${tlConfig.esRequestTimeout}ms` : '1m', }, }, {} From 3f7c3c4b6f4756647252d3eceef9d5120b6c4d5f Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Thu, 27 Aug 2020 16:31:55 +0300 Subject: [PATCH 03/11] Use only es strategy) --- .../vis_type_timelion/server/lib/config_manager.ts | 6 ------ src/plugins/vis_type_timelion/server/routes/run.ts | 1 - .../server/series_functions/es/es.test.js | 1 - .../server/series_functions/es/index.js | 9 ++------- 4 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/plugins/vis_type_timelion/server/lib/config_manager.ts b/src/plugins/vis_type_timelion/server/lib/config_manager.ts index 86bf6e6bff312..cc679b5155368 100644 --- a/src/plugins/vis_type_timelion/server/lib/config_manager.ts +++ b/src/plugins/vis_type_timelion/server/lib/config_manager.ts @@ -23,7 +23,6 @@ import { configSchema } from '../../config'; export class ConfigManager { private esShardTimeout: number = 0; - private esRequestTimeout: number = 0; private graphiteUrls: string[] = []; constructor(config: PluginInitializerContext['config']) { @@ -33,7 +32,6 @@ export class ConfigManager { config.legacy.globalConfig$.subscribe((configUpdate) => { this.esShardTimeout = configUpdate.elasticsearch.shardTimeout.asMilliseconds(); - this.esRequestTimeout = configUpdate.elasticsearch.requestTimeout.asMilliseconds(); }); } @@ -41,10 +39,6 @@ export class ConfigManager { return this.esShardTimeout; } - getEsRequestTimeout() { - return this.esRequestTimeout; - } - getGraphiteUrls() { return this.graphiteUrls; } diff --git a/src/plugins/vis_type_timelion/server/routes/run.ts b/src/plugins/vis_type_timelion/server/routes/run.ts index 9ed0ca20fe36e..ec5d8375d013d 100644 --- a/src/plugins/vis_type_timelion/server/routes/run.ts +++ b/src/plugins/vis_type_timelion/server/routes/run.ts @@ -90,7 +90,6 @@ export function runRoute( getFunction, allowedGraphiteUrls: configManager.getGraphiteUrls(), esShardTimeout: configManager.getEsShardTimeout(), - esRequestTimeout: configManager.getEsRequestTimeout(), savedObjectsClient: context.core.savedObjects.client, esDataClient: data.search.search, }); diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js index a17aa0cb0500f..c690dcca84e45 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js @@ -41,7 +41,6 @@ function stubRequestAndServer(response, indexPatternSavedObjects = []) { }); }, }, - esRequestTimeout: 30000, }; } diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/index.js b/src/plugins/vis_type_timelion/server/series_functions/es/index.js index 651b8c6008474..d317e7c7508fb 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/index.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/index.js @@ -132,14 +132,9 @@ export default new Datasource('es', { const resp = await tlConfig.esDataClient( tlConfig.context, { - params: { - ...body, - waitForCompletionTimeout: - tlConfig.esRequestTimeout > 60000 ? `${tlConfig.esRequestTimeout}ms` : '1m', - keepAlive: tlConfig.esRequestTimeout > 60000 ? `${tlConfig.esRequestTimeout}ms` : '1m', - }, + params: body, }, - {} + { strategy: 'es' } ); if (!resp.rawResponse._shards.total) { From c3f0f1fc25117adef03a1ee05406b5c8e4e48c15 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Mon, 31 Aug 2020 16:41:43 +0300 Subject: [PATCH 04/11] Fixed remarks --- src/plugins/vis_type_timelion/server/plugin.ts | 8 +++----- src/plugins/vis_type_timelion/server/routes/run.ts | 11 ++++++----- .../server/series_functions/es/index.js | 11 ++++------- .../server/series_functions/es/lib/build_request.js | 4 +++- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/plugins/vis_type_timelion/server/plugin.ts b/src/plugins/vis_type_timelion/server/plugin.ts index 427dd1549c43b..dc3aba9776230 100644 --- a/src/plugins/vis_type_timelion/server/plugin.ts +++ b/src/plugins/vis_type_timelion/server/plugin.ts @@ -43,7 +43,7 @@ export interface PluginSetupContract { uiEnabled: boolean; } -interface TimelionPluginStartDeps { +export interface TimelionPluginStartDeps { data: PluginStart; } @@ -85,14 +85,12 @@ export class Plugin { functions, getFunction, logger, + core, }; functionsRoute(router, deps); validateEsRoute(router); - - core.getStartServices().then(([_, depsStart]) => { - runRoute(router, { ...deps, data: (depsStart as TimelionPluginStartDeps).data }); - }); + runRoute(router, deps); core.uiSettings.register({ 'timelion:es.timefield': { diff --git a/src/plugins/vis_type_timelion/server/routes/run.ts b/src/plugins/vis_type_timelion/server/routes/run.ts index ec5d8375d013d..0d466e71331fb 100644 --- a/src/plugins/vis_type_timelion/server/routes/run.ts +++ b/src/plugins/vis_type_timelion/server/routes/run.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { IRouter, Logger } from 'kibana/server'; +import { IRouter, Logger, CoreSetup } from 'kibana/server'; import { schema } from '@kbn/config-schema'; import Bluebird from 'bluebird'; import _ from 'lodash'; @@ -26,7 +26,7 @@ import chainRunnerFn from '../handlers/chain_runner.js'; import getNamespacesSettings from '../lib/get_namespaced_settings'; // @ts-ignore import getTlConfig from '../handlers/lib/tl_config'; -import { PluginStart } from '../../../../../src/plugins/data/server'; +import { TimelionPluginStartDeps } from '../plugin'; import { TimelionFunctionInterface } from '../types'; import { ConfigManager } from '../lib/config_manager'; @@ -38,12 +38,12 @@ export function runRoute( logger, getFunction, configManager, - data, + core, }: { logger: Logger; getFunction: (name: string) => TimelionFunctionInterface; configManager: ConfigManager; - data: PluginStart; + core: CoreSetup; } ) { router.post( @@ -82,6 +82,7 @@ export function runRoute( router.handleLegacyErrors(async (context, request, response) => { try { const uiSettings = await context.core.uiSettings.client.getAll(); + const deps = (await core.getStartServices())[1] as TimelionPluginStartDeps; const tlConfig = getTlConfig({ context, @@ -91,7 +92,7 @@ export function runRoute( allowedGraphiteUrls: configManager.getGraphiteUrls(), esShardTimeout: configManager.getEsShardTimeout(), savedObjectsClient: context.core.savedObjects.client, - esDataClient: data.search.search, + esDataClient: deps.data.search.search, }); const chainRunner = chainRunnerFn(tlConfig); const sheet = await Bluebird.all(chainRunner.processRequest(request.body)); diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/index.js b/src/plugins/vis_type_timelion/server/series_functions/es/index.js index d317e7c7508fb..4dfb590f44c89 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/index.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/index.js @@ -19,6 +19,7 @@ import { i18n } from '@kbn/i18n'; import _ from 'lodash'; +import { ES_SEARCH_STRATEGY } from '../../../../data/server'; import Datasource from '../../lib/classes/datasource'; import buildRequest from './lib/build_request'; import toSeriesList from './lib/agg_response_to_series_list'; @@ -129,13 +130,9 @@ export default new Datasource('es', { const body = buildRequest(config, tlConfig, scriptedFields, esShardTimeout); - const resp = await tlConfig.esDataClient( - tlConfig.context, - { - params: body, - }, - { strategy: 'es' } - ); + const resp = await tlConfig.esDataClient(tlConfig.context, body, { + strategy: ES_SEARCH_STRATEGY, + }); if (!resp.rawResponse._shards.total) { throw new Error( diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/lib/build_request.js b/src/plugins/vis_type_timelion/server/series_functions/es/lib/build_request.js index e407636c41567..a8a7be6fd8609 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/lib/build_request.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/lib/build_request.js @@ -93,5 +93,7 @@ export default function buildRequest(config, tlConfig, scriptedFields, timeout) request.timeout = `${timeout}ms`; } - return request; + return { + params: request, + }; } From 3566300870742499e12e60e6ad85660c1cc71ded Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Mon, 31 Aug 2020 17:19:53 +0300 Subject: [PATCH 05/11] Fixed tests --- .../server/series_functions/es/es.test.js | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js index c690dcca84e45..522f44502abd9 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js @@ -165,22 +165,22 @@ describe('es', () => { config.index = 'beer'; const request = fn(config, tlConfig, emptyScriptedFields); - expect(request.index).to.equal('beer'); + expect(request.params.index).to.equal('beer'); }); it('always sets body.size to 0', () => { const request = fn(config, tlConfig, emptyScriptedFields); - expect(request.body.size).to.equal(0); + expect(request.params.body.size).to.equal(0); }); it('creates a filters agg that contains each of the queries passed', () => { config.q = ['foo', 'bar']; const request = fn(config, tlConfig, emptyScriptedFields); - expect(request.body.aggs.q.meta.type).to.equal('split'); + expect(request.params.body.aggs.q.meta.type).to.equal('split'); - const filters = request.body.aggs.q.filters.filters; + const filters = request.params.body.aggs.q.filters.filters; expect(filters.foo.query_string.query).to.eql('foo'); expect(filters.bar.query_string.query).to.eql('bar'); }); @@ -190,14 +190,14 @@ describe('es', () => { config.index = 'beer'; const request = fn(config, tlConfig, emptyScriptedFields, 30000); - expect(request.timeout).to.equal('30000ms'); + expect(request.params.timeout).to.equal('30000ms'); }); it('sets no timeout if elasticsearch.shardTimeout is set to 0', () => { config.index = 'beer'; const request = fn(config, tlConfig, emptyScriptedFields, 0); - expect(request).to.not.have.property('timeout'); + expect(request.params).to.not.have.property('timeout'); }); }); @@ -217,7 +217,7 @@ describe('es', () => { tlConfig.settings[UI_SETTINGS.SEARCH_INCLUDE_FROZEN] = false; const request = fn(config, tlConfig, emptyScriptedFields); - expect(request.ignore_throttled).to.equal(true); + expect(request.params.ignore_throttled).to.equal(true); }); it('sets no timeout if elasticsearch.shardTimeout is set to 0', () => { @@ -225,7 +225,7 @@ describe('es', () => { config.index = 'beer'; const request = fn(config, tlConfig, emptyScriptedFields); - expect(request.ignore_throttled).to.equal(false); + expect(request.params.ignore_throttled).to.equal(false); }); }); @@ -259,7 +259,7 @@ describe('es', () => { it('adds the contents of body.extended.es.filter to a filter clause of the bool', () => { config.kibana = true; const request = fn(config, tlConfig, emptyScriptedFields); - const filter = request.body.query.bool.filter.bool; + const filter = request.params.body.query.bool.filter.bool; expect(filter.must.length).to.eql(1); expect(filter.must_not.length).to.eql(2); }); @@ -267,13 +267,13 @@ describe('es', () => { it('does not include filters if config.kibana = false', () => { config.kibana = false; const request = fn(config, tlConfig, emptyScriptedFields); - expect(request.body.query.bool.filter).to.eql(undefined); + expect(request.params.body.query.bool.filter).to.eql(undefined); }); it('adds a time filter to the bool querys must clause', () => { let request = fn(config, tlConfig, emptyScriptedFields); - expect(request.body.query.bool.must.length).to.eql(1); - expect(request.body.query.bool.must[0]).to.eql({ + expect(request.params.body.query.bool.must.length).to.eql(1); + expect(request.params.body.query.bool.must[0]).to.eql({ range: { '@timestamp': { format: 'strict_date_optional_time', @@ -285,7 +285,7 @@ describe('es', () => { config.kibana = true; request = fn(config, tlConfig, emptyScriptedFields); - expect(request.body.query.bool.must.length).to.eql(1); + expect(request.params.body.query.bool.must.length).to.eql(1); }); }); @@ -294,7 +294,7 @@ describe('es', () => { config.split = ['beer:5', 'wine:10']; const request = fn(config, tlConfig, emptyScriptedFields); - const aggs = request.body.aggs.q.aggs; + const aggs = request.params.body.aggs.q.aggs; expect(aggs.beer.meta.type).to.eql('split'); expect(aggs.beer.terms.field).to.eql('beer'); @@ -321,7 +321,7 @@ describe('es', () => { ]; const request = fn(config, tlConfig, scriptedFields); - const aggs = request.body.aggs.q.aggs; + const aggs = request.params.body.aggs.q.aggs; expect(aggs.scriptedBeer.meta.type).to.eql('split'); expect(aggs.scriptedBeer.terms.script).to.eql({ From 5a202b8f1966dad924aa9116edfb734def9de7d3 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Tue, 1 Sep 2020 13:06:00 +0300 Subject: [PATCH 06/11] Fixed fixtures --- .../server/series_functions/fixtures/tl_config.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/plugins/vis_type_timelion/server/series_functions/fixtures/tl_config.js b/src/plugins/vis_type_timelion/server/series_functions/fixtures/tl_config.js index 6107a2845a7cc..374cb5a636a2f 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/fixtures/tl_config.js +++ b/src/plugins/vis_type_timelion/server/series_functions/fixtures/tl_config.js @@ -30,11 +30,7 @@ export default function () { if (!functions[name]) throw new Error('No such function: ' + name); return functions[name]; }, - esDataClient: sinon.stub().returns({ - callAsCurrentUser: function () { - return Promise.resolve(esResponse); - }, - }), + esDataClient: sinon.stub().returns(Promise.resolve({ rawResponse: esResponse })), esShardTimeout: moment.duration(30000), allowedGraphiteUrls: ['https://www.hostedgraphite.com/UID/ACCESS_KEY/graphite'], }); From 3d2e38cf6dadc03c7c3280d5bda439833356a5f4 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Tue, 1 Sep 2020 17:44:41 +0300 Subject: [PATCH 07/11] Fixed ci --- ...-plugins-data-server.es_search_strategy.md | 11 +++++++ ...plugin-plugins-data-server.isearchstart.md | 2 +- ...plugins-data-server.isearchstart.search.md | 2 +- .../kibana-plugin-plugins-data-server.md | 1 + src/plugins/data/server/index.ts | 1 + src/plugins/data/server/search/types.ts | 5 ++- src/plugins/data/server/server.api.md | 33 +++++++++++-------- .../vis_type_timelion/server/plugin.ts | 2 +- .../vis_type_timelion/server/routes/run.ts | 4 +-- .../server/routes/validate_es.ts | 20 ++++++----- .../server/series_functions/es/es.test.js | 2 +- .../server/series_functions/es/index.js | 4 ++- 12 files changed, 54 insertions(+), 33 deletions(-) create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.es_search_strategy.md diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.es_search_strategy.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.es_search_strategy.md new file mode 100644 index 0000000000000..8fac5cf4d7a9e --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.es_search_strategy.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [ES\_SEARCH\_STRATEGY](./kibana-plugin-plugins-data-server.es_search_strategy.md) + +## ES\_SEARCH\_STRATEGY variable + +Signature: + +```typescript +ES_SEARCH_STRATEGY = "es" +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md index 62d954cb80eb7..577532d22b3d3 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md @@ -16,5 +16,5 @@ export interface ISearchStartAggsStart | | | [getSearchStrategy](./kibana-plugin-plugins-data-server.isearchstart.getsearchstrategy.md) | (name: string) => ISearchStrategy<SearchStrategyRequest, SearchStrategyResponse> | Get other registered search strategies. For example, if a new strategy needs to use the already-registered ES search strategy, it can use this function to accomplish that. | -| [search](./kibana-plugin-plugins-data-server.isearchstart.search.md) | (context: RequestHandlerContext, request: IKibanaSearchRequest, options: ISearchOptions) => Promise<IKibanaSearchResponse> | | +| [search](./kibana-plugin-plugins-data-server.isearchstart.search.md) | (context: RequestHandlerContext, request: IEsSearchRequest, options: ISearchOptions) => Promise<IEsSearchResponse> | | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.search.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.search.md index 1c2ae91699559..33ca818afc769 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.search.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.search.md @@ -7,5 +7,5 @@ Signature: ```typescript -search: (context: RequestHandlerContext, request: IKibanaSearchRequest, options: ISearchOptions) => Promise; +search: (context: RequestHandlerContext, request: IEsSearchRequest, options: ISearchOptions) => Promise; ``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md index 0292e08063fbb..70c32adeab9fd 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md @@ -71,6 +71,7 @@ | [AggGroupNames](./kibana-plugin-plugins-data-server.agggroupnames.md) | | | [castEsToKbnFieldTypeName](./kibana-plugin-plugins-data-server.castestokbnfieldtypename.md) | Get the KbnFieldType name for an esType string | | [config](./kibana-plugin-plugins-data-server.config.md) | | +| [ES\_SEARCH\_STRATEGY](./kibana-plugin-plugins-data-server.es_search_strategy.md) | | | [esFilters](./kibana-plugin-plugins-data-server.esfilters.md) | | | [esKuery](./kibana-plugin-plugins-data-server.eskuery.md) | | | [esQuery](./kibana-plugin-plugins-data-server.esquery.md) | | diff --git a/src/plugins/data/server/index.ts b/src/plugins/data/server/index.ts index c3b06992dba0e..b86b06d0cd5aa 100644 --- a/src/plugins/data/server/index.ts +++ b/src/plugins/data/server/index.ts @@ -200,6 +200,7 @@ export { // search IEsSearchRequest, IEsSearchResponse, + ES_SEARCH_STRATEGY, // tabify TabbedAggColumn, TabbedAggRow, diff --git a/src/plugins/data/server/search/types.ts b/src/plugins/data/server/search/types.ts index 5ce1bb3e6b9f8..77d7341b3ae71 100644 --- a/src/plugins/data/server/search/types.ts +++ b/src/plugins/data/server/search/types.ts @@ -18,7 +18,6 @@ */ import { RequestHandlerContext } from '../../../../core/server'; -import { IKibanaSearchResponse, IKibanaSearchRequest } from '../../common/search'; import { AggsSetup, AggsStart } from './aggs'; import { SearchUsage } from './collectors/usage'; import { IEsSearchRequest, IEsSearchResponse } from './es_search'; @@ -74,9 +73,9 @@ export interface ISearchStart< ) => ISearchStrategy; search: ( context: RequestHandlerContext, - request: IKibanaSearchRequest, + request: IEsSearchRequest, options: ISearchOptions - ) => Promise; + ) => Promise; } /** diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 9f114f2132009..ad0e905c33d27 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -323,6 +323,11 @@ export enum ES_FIELD_TYPES { _TYPE = "_type" } +// Warning: (ae-missing-release-tag) "ES_SEARCH_STRATEGY" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const ES_SEARCH_STRATEGY = "es"; + // Warning: (ae-forgotten-export) The symbol "ExpressionFunctionDefinition" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "Input" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "Arguments" needs to be exported by the entry point index.d.ts @@ -709,7 +714,7 @@ export interface ISearchStart Promise; + search: (context: RequestHandlerContext, request: IEsSearchRequest, options: ISearchOptions) => Promise; } // Warning: (ae-missing-release-tag) "ISearchStrategy" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1084,19 +1089,19 @@ export function usageProvider(core: CoreSetup_2): SearchUsage; // src/plugins/data/server/index.ts:101:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:221:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:221:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:221:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:221:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:223:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:224:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:233:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:234:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:235:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:239:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:240:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:244:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:247:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:222:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:222:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:222:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:222:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:224:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:225:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:234:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:235:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:236:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:240:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:241:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:245:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:248:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/server/plugin.ts:88:66 - (ae-forgotten-export) The symbol "DataEnhancements" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/src/plugins/vis_type_timelion/server/plugin.ts b/src/plugins/vis_type_timelion/server/plugin.ts index dc3aba9776230..52c50b0646299 100644 --- a/src/plugins/vis_type_timelion/server/plugin.ts +++ b/src/plugins/vis_type_timelion/server/plugin.ts @@ -89,8 +89,8 @@ export class Plugin { }; functionsRoute(router, deps); - validateEsRoute(router); runRoute(router, deps); + validateEsRoute(router, core); core.uiSettings.register({ 'timelion:es.timefield': { diff --git a/src/plugins/vis_type_timelion/server/routes/run.ts b/src/plugins/vis_type_timelion/server/routes/run.ts index 0d466e71331fb..19bb5238f9de0 100644 --- a/src/plugins/vis_type_timelion/server/routes/run.ts +++ b/src/plugins/vis_type_timelion/server/routes/run.ts @@ -26,7 +26,6 @@ import chainRunnerFn from '../handlers/chain_runner.js'; import getNamespacesSettings from '../lib/get_namespaced_settings'; // @ts-ignore import getTlConfig from '../handlers/lib/tl_config'; -import { TimelionPluginStartDeps } from '../plugin'; import { TimelionFunctionInterface } from '../types'; import { ConfigManager } from '../lib/config_manager'; @@ -82,17 +81,16 @@ export function runRoute( router.handleLegacyErrors(async (context, request, response) => { try { const uiSettings = await context.core.uiSettings.client.getAll(); - const deps = (await core.getStartServices())[1] as TimelionPluginStartDeps; const tlConfig = getTlConfig({ context, request, settings: _.defaults(uiSettings, timelionDefaults), // Just in case they delete some setting. getFunction, + getStartServices: core.getStartServices, allowedGraphiteUrls: configManager.getGraphiteUrls(), esShardTimeout: configManager.getEsShardTimeout(), savedObjectsClient: context.core.savedObjects.client, - esDataClient: deps.data.search.search, }); const chainRunner = chainRunnerFn(tlConfig); const sheet = await Bluebird.all(chainRunner.processRequest(request.body)); diff --git a/src/plugins/vis_type_timelion/server/routes/validate_es.ts b/src/plugins/vis_type_timelion/server/routes/validate_es.ts index d5ce80dc151a2..b0ea6828b9d3e 100644 --- a/src/plugins/vis_type_timelion/server/routes/validate_es.ts +++ b/src/plugins/vis_type_timelion/server/routes/validate_es.ts @@ -18,9 +18,11 @@ */ import _ from 'lodash'; -import { IRouter } from 'kibana/server'; +import { IRouter, CoreSetup } from 'kibana/server'; +import { ES_SEARCH_STRATEGY } from '../../../data/server'; +import { TimelionPluginStartDeps } from '../plugin'; -export function validateEsRoute(router: IRouter) { +export function validateEsRoute(router: IRouter, core: CoreSetup) { router.get( { path: '/api/timelion/validate/es', @@ -28,12 +30,11 @@ export function validateEsRoute(router: IRouter) { }, async function (context, request, response) { const uiSettings = await context.core.uiSettings.client.getAll(); - - const { callAsCurrentUser } = context.core.elasticsearch.legacy.client; + const deps = (await core.getStartServices())[1] as TimelionPluginStartDeps; const timefield = uiSettings['timelion:es.timefield']; - const body = { + const body = {params: { index: uiSettings['es.default_index'], body: { aggs: { @@ -50,11 +51,14 @@ export function validateEsRoute(router: IRouter) { }, size: 0, }, - }; + }}; - let resp = {}; + let resp; try { - resp = await callAsCurrentUser('search', body); + resp = await deps.data.search.search(context, body, { + strategy: ES_SEARCH_STRATEGY, + }); + resp = resp.rawResponse; } catch (errResp) { resp = errResp; } diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js index 522f44502abd9..bfcba895d3e32 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js @@ -33,7 +33,7 @@ import { UI_SETTINGS } from '../../../../data/server'; function stubRequestAndServer(response, indexPatternSavedObjects = []) { return { - esDataClient: sinon.stub().returns(Promise.resolve(response)), + getStartServices: sinon.stub().returns(Promise.resolve([{}, { data: {search: {search: () => Promise.resolve(response)}}}])), savedObjectsClient: { find: function () { return Promise.resolve({ diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/index.js b/src/plugins/vis_type_timelion/server/series_functions/es/index.js index 4dfb590f44c89..57d95aeb62e97 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/index.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/index.js @@ -130,7 +130,9 @@ export default new Datasource('es', { const body = buildRequest(config, tlConfig, scriptedFields, esShardTimeout); - const resp = await tlConfig.esDataClient(tlConfig.context, body, { + const [, deps] = await tlConfig.getStartServices(); + + const resp = await deps.data.search.search(tlConfig.context, body, { strategy: ES_SEARCH_STRATEGY, }); From 8f106c7e7b59deacfe18bd27a27eeb40a1c43c63 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Tue, 1 Sep 2020 18:32:34 +0300 Subject: [PATCH 08/11] Fixed typecheck --- src/plugins/data/server/search/routes.test.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/plugins/data/server/search/routes.test.ts b/src/plugins/data/server/search/routes.test.ts index d91aeee1fe818..1c5321885ec81 100644 --- a/src/plugins/data/server/search/routes.test.ts +++ b/src/plugins/data/server/search/routes.test.ts @@ -33,7 +33,24 @@ describe('Search service', () => { }); it('handler calls context.search.search with the given request and strategy', async () => { - const response = { id: 'yay' }; + const response = { + id: 'yay', + rawResponse: { + took: 100, + timed_out: true, + _shards: { + total: 0, + successful: 0, + failed: 0, + skipped: 0, + }, + hits: { + total: 0, + max_score: 0, + hits: [], + }, + }, + }; mockDataStart.search.search.mockResolvedValue(response); const mockContext = {}; const mockBody = { id: undefined, params: {} }; From 54883005313d7f1f8fdcca8018df9504849d0945 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Wed, 2 Sep 2020 10:19:25 +0300 Subject: [PATCH 09/11] Fixed eslint --- .../server/routes/validate_es.ts | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/plugins/vis_type_timelion/server/routes/validate_es.ts b/src/plugins/vis_type_timelion/server/routes/validate_es.ts index b0ea6828b9d3e..2c06a1d5ef6aa 100644 --- a/src/plugins/vis_type_timelion/server/routes/validate_es.ts +++ b/src/plugins/vis_type_timelion/server/routes/validate_es.ts @@ -34,24 +34,26 @@ export function validateEsRoute(router: IRouter, core: CoreSetup) { const timefield = uiSettings['timelion:es.timefield']; - const body = {params: { - index: uiSettings['es.default_index'], - body: { - aggs: { - maxAgg: { - max: { - field: timefield, + const body = { + params: { + index: uiSettings['es.default_index'], + body: { + aggs: { + maxAgg: { + max: { + ield: timefield, + }, }, - }, - minAgg: { - min: { - field: timefield, + minAgg: { + min: { + field: timefield, + }, }, }, + size: 0, }, - size: 0, }, - }}; + }; let resp; try { From 16929e0a6bc48f150ec2f5c90993575ef206e0ae Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Wed, 2 Sep 2020 12:33:35 +0300 Subject: [PATCH 10/11] Fixed remarks --- .../server/series_functions/es/es.test.js | 6 +++++- .../server/series_functions/es/index.js | 2 +- .../server/series_functions/fixtures/tl_config.js | 10 +++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js index bfcba895d3e32..4b5aab85cfc4e 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js @@ -33,7 +33,11 @@ import { UI_SETTINGS } from '../../../../data/server'; function stubRequestAndServer(response, indexPatternSavedObjects = []) { return { - getStartServices: sinon.stub().returns(Promise.resolve([{}, { data: {search: {search: () => Promise.resolve(response)}}}])), + getStartServices: sinon + .stub() + .returns( + Promise.resolve([{}, { data: { search: { search: () => Promise.resolve(response) } } }]) + ), savedObjectsClient: { find: function () { return Promise.resolve({ diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/index.js b/src/plugins/vis_type_timelion/server/series_functions/es/index.js index 57d95aeb62e97..bfa8d75900d11 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/index.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/index.js @@ -130,7 +130,7 @@ export default new Datasource('es', { const body = buildRequest(config, tlConfig, scriptedFields, esShardTimeout); - const [, deps] = await tlConfig.getStartServices(); + const deps = (await tlConfig.getStartServices())[1]; const resp = await deps.data.search.search(tlConfig.context, body, { strategy: ES_SEARCH_STRATEGY, diff --git a/src/plugins/vis_type_timelion/server/series_functions/fixtures/tl_config.js b/src/plugins/vis_type_timelion/server/series_functions/fixtures/tl_config.js index 374cb5a636a2f..38d70278fbf00 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/fixtures/tl_config.js +++ b/src/plugins/vis_type_timelion/server/series_functions/fixtures/tl_config.js @@ -30,7 +30,15 @@ export default function () { if (!functions[name]) throw new Error('No such function: ' + name); return functions[name]; }, - esDataClient: sinon.stub().returns(Promise.resolve({ rawResponse: esResponse })), + getStartServices: sinon + .stub() + .returns( + Promise.resolve([ + {}, + { data: { search: { search: () => Promise.resolve({ rawResponse: esResponse }) } } }, + ]) + ), + esShardTimeout: moment.duration(30000), allowedGraphiteUrls: ['https://www.hostedgraphite.com/UID/ACCESS_KEY/graphite'], }); From a2cfc07807f8343a9d6b8a7cb893a80ce9ebd4bf Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Wed, 2 Sep 2020 16:50:23 +0300 Subject: [PATCH 11/11] Fix changes --- src/plugins/vis_type_timelion/server/routes/validate_es.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/vis_type_timelion/server/routes/validate_es.ts b/src/plugins/vis_type_timelion/server/routes/validate_es.ts index 2c06a1d5ef6aa..ea08310499a96 100644 --- a/src/plugins/vis_type_timelion/server/routes/validate_es.ts +++ b/src/plugins/vis_type_timelion/server/routes/validate_es.ts @@ -41,7 +41,7 @@ export function validateEsRoute(router: IRouter, core: CoreSetup) { aggs: { maxAgg: { max: { - ield: timefield, + field: timefield, }, }, minAgg: {