From ede6b4fd642e5406bed75b85bda0c7cf0330222c Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Wed, 31 Mar 2021 12:14:56 +0300 Subject: [PATCH] [TSVB] metrics:max_buckets setting should limit buckets on server side too. (#95639) * tmp * [TSVB] Remove metrics:max_buckets setting because it is redundant to histogram:maxBars Closes: #94212 Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- ...regexp.test.js => interval_regexp.test.ts} | 0 ...idate_interval.js => validate_interval.ts} | 15 ++++++++-- .../public/request_handler.ts | 7 +++-- .../default_search_capabilities.test.ts | 23 ++++----------- .../default_search_capabilities.ts | 29 +++++++------------ .../rollup_search_capabilities.test.ts | 11 +++---- .../rollup_search_capabilities.ts | 16 +++++----- .../search_strategies_registry.test.ts | 14 +++++++-- .../abstract_search_strategy.test.ts | 3 ++ .../default_search_strategy.test.ts | 25 ++++++++++++---- .../strategies/default_search_strategy.ts | 8 ++++- .../strategies/rollup_search_strategy.ts | 10 ++++++- .../lib/vis_data/helpers/get_bucket_size.js | 12 +++++--- .../vis_data/helpers/get_bucket_size.test.js | 18 ++++++++---- .../annotations/date_histogram.js | 2 +- .../series/date_histogram.js | 2 +- .../series/date_histogram.test.js | 3 +- .../series/metric_buckets.test.js | 2 +- .../series/positive_rate.test.js | 20 +++++++++++-- .../series/sibling_buckets.test.js | 20 +++++++++++-- .../table/date_histogram.js | 2 +- .../series/build_request_body.test.ts | 2 +- .../vis_type_timeseries/server/types.ts | 2 +- 23 files changed, 157 insertions(+), 89 deletions(-) rename src/plugins/vis_type_timeseries/common/{interval_regexp.test.js => interval_regexp.test.ts} (100%) rename src/plugins/vis_type_timeseries/public/application/lib/{validate_interval.js => validate_interval.ts} (82%) diff --git a/src/plugins/vis_type_timeseries/common/interval_regexp.test.js b/src/plugins/vis_type_timeseries/common/interval_regexp.test.ts similarity index 100% rename from src/plugins/vis_type_timeseries/common/interval_regexp.test.js rename to src/plugins/vis_type_timeseries/common/interval_regexp.test.ts diff --git a/src/plugins/vis_type_timeseries/public/application/lib/validate_interval.js b/src/plugins/vis_type_timeseries/public/application/lib/validate_interval.ts similarity index 82% rename from src/plugins/vis_type_timeseries/public/application/lib/validate_interval.js rename to src/plugins/vis_type_timeseries/public/application/lib/validate_interval.ts index 016d119ed167..a602b34d9998 100644 --- a/src/plugins/vis_type_timeseries/public/application/lib/validate_interval.js +++ b/src/plugins/vis_type_timeseries/public/application/lib/validate_interval.ts @@ -6,12 +6,20 @@ * Side Public License, v 1. */ -import { GTE_INTERVAL_RE } from '../../../common/interval_regexp'; import { i18n } from '@kbn/i18n'; +import { GTE_INTERVAL_RE } from '../../../common/interval_regexp'; import { search } from '../../../../../plugins/data/public'; + +import type { TimeRangeBounds } from '../../../../data/common'; +import type { TimeseriesVisParams } from '../../types'; + const { parseInterval } = search.aggs; -export function validateInterval(bounds, panel, maxBuckets) { +export function validateInterval( + bounds: TimeRangeBounds, + panel: TimeseriesVisParams, + maxBuckets: number +) { const { interval } = panel; const { min, max } = bounds; // No need to check auto it will return around 100 @@ -20,8 +28,9 @@ export function validateInterval(bounds, panel, maxBuckets) { const greaterThanMatch = interval.match(GTE_INTERVAL_RE); if (greaterThanMatch) return; const duration = parseInterval(interval); + if (duration) { - const span = max.valueOf() - min.valueOf(); + const span = max!.valueOf() - min!.valueOf(); const buckets = Math.floor(span / duration.asMilliseconds()); if (buckets > maxBuckets) { throw new Error( diff --git a/src/plugins/vis_type_timeseries/public/request_handler.ts b/src/plugins/vis_type_timeseries/public/request_handler.ts index bf3779674b6e..bf58287870c8 100644 --- a/src/plugins/vis_type_timeseries/public/request_handler.ts +++ b/src/plugins/vis_type_timeseries/public/request_handler.ts @@ -28,14 +28,15 @@ export const metricsRequestHandler = async ({ searchSessionId, }: MetricsRequestHandlerParams): Promise => { const config = getUISettings(); + const data = getDataStart(); + const timezone = getTimezone(config); const uiStateObj = uiState[visParams.type] ?? {}; - const data = getDataStart(); - const dataSearch = getDataStart().search; + const dataSearch = data.search; const parsedTimeRange = data.query.timefilter.timefilter.calculateBounds(input?.timeRange!); if (visParams && visParams.id && !visParams.isModelInvalid) { - const maxBuckets = config.get(MAX_BUCKETS_SETTING); + const maxBuckets = config.get(MAX_BUCKETS_SETTING); validateInterval(parsedTimeRange, visParams, maxBuckets); diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/default_search_capabilities.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/default_search_capabilities.test.ts index e2012c533151..8029e8684c44 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/default_search_capabilities.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/default_search_capabilities.test.ts @@ -7,20 +7,19 @@ */ import { DefaultSearchCapabilities } from './default_search_capabilities'; -import { VisTypeTimeseriesRequest } from '../../../types'; describe('DefaultSearchCapabilities', () => { let defaultSearchCapabilities: DefaultSearchCapabilities; - let req: VisTypeTimeseriesRequest; beforeEach(() => { - req = {} as VisTypeTimeseriesRequest; - defaultSearchCapabilities = new DefaultSearchCapabilities(req); + defaultSearchCapabilities = new DefaultSearchCapabilities({ + timezone: 'UTC', + maxBucketsLimit: 2000, + }); }); test('should init default search capabilities', () => { - expect(defaultSearchCapabilities.request).toBe(req); - expect(defaultSearchCapabilities.fieldsCapabilities).toEqual({}); + expect(defaultSearchCapabilities.timezone).toBe('UTC'); }); test('should return defaultTimeInterval', () => { @@ -35,18 +34,6 @@ describe('DefaultSearchCapabilities', () => { }); }); - test('should return Search Timezone', () => { - defaultSearchCapabilities.request = ({ - body: { - timerange: { - timezone: 'UTC', - }, - }, - } as unknown) as VisTypeTimeseriesRequest; - - expect(defaultSearchCapabilities.searchTimezone).toEqual('UTC'); - }); - test('should return a valid time interval', () => { expect(defaultSearchCapabilities.getValidTimeInterval('20m')).toBe('20m'); }); diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/default_search_capabilities.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/default_search_capabilities.ts index 967b34707de5..b60d2e61e9a4 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/default_search_capabilities.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/default_search_capabilities.ts @@ -13,23 +13,20 @@ import { getSuitableUnit, } from '../../vis_data/helpers/unit_to_seconds'; import { RESTRICTIONS_KEYS } from '../../../../common/ui_restrictions'; -import { VisTypeTimeseriesRequest, VisTypeTimeseriesVisDataRequest } from '../../../types'; -const isVisDataRequest = ( - request: VisTypeTimeseriesRequest -): request is VisTypeTimeseriesVisDataRequest => { - return !!(request as VisTypeTimeseriesVisDataRequest).body; -}; - -const getTimezoneFromRequest = (request: VisTypeTimeseriesRequest) => { - if (isVisDataRequest(request)) return request.body.timerange.timezone; -}; +export interface SearchCapabilitiesOptions { + timezone?: string; + maxBucketsLimit: number; +} export class DefaultSearchCapabilities { - constructor( - public request: VisTypeTimeseriesRequest, - public fieldsCapabilities: Record = {} - ) {} + public timezone: SearchCapabilitiesOptions['timezone']; + public maxBucketsLimit: SearchCapabilitiesOptions['maxBucketsLimit']; + + constructor(options: SearchCapabilitiesOptions) { + this.timezone = options.timezone; + this.maxBucketsLimit = options.maxBucketsLimit; + } public get defaultTimeInterval() { return null; @@ -55,10 +52,6 @@ export class DefaultSearchCapabilities { }; } - public get searchTimezone() { - return getTimezoneFromRequest(this.request); - } - createUiRestriction(restrictionsObject?: Record) { return { '*': !restrictionsObject, diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.test.ts index bb79c61d2b03..7426c74dc242 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.test.ts @@ -8,13 +8,11 @@ import { Unit } from '@elastic/datemath'; import { RollupSearchCapabilities } from './rollup_search_capabilities'; -import { VisTypeTimeseriesRequest } from '../../../types'; describe('Rollup Search Capabilities', () => { const testTimeZone = 'time_zone'; const testInterval = '10s'; const rollupIndex = 'rollupIndex'; - const request = ({} as unknown) as VisTypeTimeseriesRequest; let fieldsCapabilities: Record; let rollupSearchCaps: RollupSearchCapabilities; @@ -33,16 +31,19 @@ describe('Rollup Search Capabilities', () => { }, }; - rollupSearchCaps = new RollupSearchCapabilities(request, fieldsCapabilities, rollupIndex); + rollupSearchCaps = new RollupSearchCapabilities( + { maxBucketsLimit: 2000, timezone: 'UTC' }, + fieldsCapabilities, + rollupIndex + ); }); test('should create instance of RollupSearchRequest', () => { - expect(rollupSearchCaps.fieldsCapabilities).toBe(fieldsCapabilities); expect(rollupSearchCaps.rollupIndex).toBe(rollupIndex); }); test('should return the "timezone" for the rollup request', () => { - expect(rollupSearchCaps.searchTimezone).toBe(testTimeZone); + expect(rollupSearchCaps.timezone).toBe(testTimeZone); }); test('should return the default "interval" for the rollup request', () => { diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.ts index f4dbccc84690..eafd5a0ee1cf 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.ts @@ -5,26 +5,28 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - import { get, has } from 'lodash'; import { leastCommonInterval, isCalendarInterval } from '../lib/interval_helper'; -import { DefaultSearchCapabilities } from './default_search_capabilities'; -import { VisTypeTimeseriesRequest } from '../../../types'; +import { + DefaultSearchCapabilities, + SearchCapabilitiesOptions, +} from './default_search_capabilities'; export class RollupSearchCapabilities extends DefaultSearchCapabilities { rollupIndex: string; availableMetrics: Record; constructor( - req: VisTypeTimeseriesRequest, + options: SearchCapabilitiesOptions, fieldsCapabilities: Record, rollupIndex: string ) { - super(req, fieldsCapabilities); + super(options); this.rollupIndex = rollupIndex; this.availableMetrics = get(fieldsCapabilities, `${rollupIndex}.aggs`, {}); + this.timezone = get(this.dateHistogram, 'time_zone', null); } public get dateHistogram() { @@ -46,10 +48,6 @@ export class RollupSearchCapabilities extends DefaultSearchCapabilities { ); } - public get searchTimezone() { - return get(this.dateHistogram, 'time_zone', null); - } - public get whiteListedMetrics() { const baseRestrictions = this.createUiRestriction({ count: this.createUiRestriction(), diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/search_strategies_registry.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/search_strategies_registry.test.ts index a6e7c5b11ee6..f6114a4117bb 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/search_strategies_registry.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/search_strategies_registry.test.ts @@ -25,7 +25,15 @@ class MockSearchStrategy extends AbstractSearchStrategy { } describe('SearchStrategyRegister', () => { - const requestContext = {} as VisTypeTimeseriesRequestHandlerContext; + const requestContext = ({ + core: { + uiSettings: { + client: { + get: jest.fn(), + }, + }, + }, + } as unknown) as VisTypeTimeseriesRequestHandlerContext; let registry: SearchStrategyRegistry; beforeAll(() => { @@ -44,7 +52,7 @@ describe('SearchStrategyRegister', () => { }); test('should return a DefaultSearchStrategy instance', async () => { - const req = {} as VisTypeTimeseriesRequest; + const req = { body: {} } as VisTypeTimeseriesRequest; const { searchStrategy, capabilities } = (await registry.getViableStrategy( requestContext, @@ -65,7 +73,7 @@ describe('SearchStrategyRegister', () => { }); test('should return a MockSearchStrategy instance', async () => { - const req = {} as VisTypeTimeseriesRequest; + const req = { body: {} } as VisTypeTimeseriesRequest; const anotherSearchStrategy = new MockSearchStrategy(); registry.addStrategy(anotherSearchStrategy); diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts index fb66e32447c2..7add5cb4a455 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts @@ -33,6 +33,9 @@ describe('AbstractSearchStrategy', () => { asCurrentUser: jest.fn(), }, }, + uiSettings: { + client: jest.fn(), + }, }, search: { search: jest.fn().mockReturnValue(from(Promise.resolve({}))), diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.test.ts index d7a4e6ddedc8..9fa79c7b80f8 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.test.ts @@ -13,12 +13,23 @@ import { import { DefaultSearchStrategy } from './default_search_strategy'; describe('DefaultSearchStrategy', () => { - const requestContext = {} as VisTypeTimeseriesRequestHandlerContext; + const requestContext = ({ + core: { + uiSettings: { + client: { + get: jest.fn(), + }, + }, + }, + } as unknown) as VisTypeTimeseriesRequestHandlerContext; + let defaultSearchStrategy: DefaultSearchStrategy; let req: VisTypeTimeseriesVisDataRequest; beforeEach(() => { - req = {} as VisTypeTimeseriesVisDataRequest; + req = { + body: {}, + } as VisTypeTimeseriesVisDataRequest; defaultSearchStrategy = new DefaultSearchStrategy(); }); @@ -32,9 +43,11 @@ describe('DefaultSearchStrategy', () => { const value = await defaultSearchStrategy.checkForViability(requestContext, req); expect(value.isViable).toBe(true); - expect(value.capabilities).toEqual({ - request: req, - fieldsCapabilities: {}, - }); + expect(value.capabilities).toMatchInlineSnapshot(` + DefaultSearchCapabilities { + "maxBucketsLimit": undefined, + "timezone": undefined, + } + `); }); }); diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts index f95bf81b5c1d..17451f7e5777 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts @@ -15,15 +15,21 @@ import type { VisTypeTimeseriesRequestHandlerContext, VisTypeTimeseriesRequest, } from '../../../types'; +import { MAX_BUCKETS_SETTING } from '../../../../common/constants'; export class DefaultSearchStrategy extends AbstractSearchStrategy { async checkForViability( requestContext: VisTypeTimeseriesRequestHandlerContext, req: VisTypeTimeseriesRequest ) { + const uiSettings = requestContext.core.uiSettings.client; + return { isViable: true, - capabilities: new DefaultSearchCapabilities(req), + capabilities: new DefaultSearchCapabilities({ + timezone: req.body.timerange?.timezone, + maxBucketsLimit: await uiSettings.get(MAX_BUCKETS_SETTING), + }), }; } diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts index e6333ca420e0..ec6f2a7c21af 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts @@ -17,6 +17,7 @@ import type { VisTypeTimeseriesRequestHandlerContext, VisTypeTimeseriesVisDataRequest, } from '../../../types'; +import { MAX_BUCKETS_SETTING } from '../../../../common/constants'; const getRollupIndices = (rollupData: { [key: string]: any }) => Object.keys(rollupData); const isIndexPatternContainsWildcard = (indexPattern: string) => indexPattern.includes('*'); @@ -62,6 +63,7 @@ export class RollupSearchStrategy extends AbstractSearchStrategy { ) { const rollupData = await this.getRollupData(requestContext, indexPatternString); const rollupIndices = getRollupIndices(rollupData); + const uiSettings = requestContext.core.uiSettings.client; isViable = rollupIndices.length === 1; @@ -69,7 +71,13 @@ export class RollupSearchStrategy extends AbstractSearchStrategy { const [rollupIndex] = rollupIndices; const fieldsCapabilities = getCapabilitiesForRollupIndices(rollupData); - capabilities = new RollupSearchCapabilities(req, fieldsCapabilities, rollupIndex); + capabilities = new RollupSearchCapabilities( + { + maxBucketsLimit: await uiSettings.get(MAX_BUCKETS_SETTING), + }, + fieldsCapabilities, + rollupIndex + ); } } diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.js index f9ac4ea2088c..b9ce76f7176b 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.js @@ -30,6 +30,10 @@ const calculateBucketData = (timeInterval, capabilities) => { bucketSize = 1; } + if (bucketSize > capabilities.maxBucketsLimit) { + bucketSize = capabilities.maxBucketsLimit; + } + // Check decimal if (parsedInterval && parsedInterval.value % 1 !== 0) { if (parsedInterval.unit !== 'ms') { @@ -61,16 +65,16 @@ const calculateBucketSizeForAutoInterval = (req, maxBars) => { return search.aggs.calcAutoIntervalLessThan(maxBars, timerange).asSeconds(); }; -export const getBucketSize = (req, interval, capabilities, maxBars) => { - const bucketSize = calculateBucketSizeForAutoInterval(req, maxBars); - let intervalString = `${bucketSize}s`; +export const getBucketSize = (req, interval, capabilities, bars) => { + const defaultBucketSize = calculateBucketSizeForAutoInterval(req, bars); + let intervalString = `${defaultBucketSize}s`; const gteAutoMatch = Boolean(interval) && interval.match(GTE_INTERVAL_RE); if (gteAutoMatch) { const bucketData = calculateBucketData(gteAutoMatch[1], capabilities); - if (bucketData.bucketSize >= bucketSize) { + if (bucketData.bucketSize >= defaultBucketSize) { return bucketData; } } diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.test.js index aa5b55f7e0e7..2ca77da2cc64 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.test.js @@ -18,43 +18,49 @@ describe('getBucketSize', () => { }, }; + const capabilities = { + timezone: 'UTC', + maxBucketsLimit: 200000, + getValidTimeInterval: jest.fn((v) => v), + }; + test('returns auto calculated buckets', () => { - const result = getBucketSize(req, 'auto', undefined, 100); + const result = getBucketSize(req, 'auto', capabilities, 100); expect(result).toHaveProperty('bucketSize', 30); expect(result).toHaveProperty('intervalString', '30s'); }); test('returns overridden buckets (1s)', () => { - const result = getBucketSize(req, '1s', undefined, 100); + const result = getBucketSize(req, '1s', capabilities, 100); expect(result).toHaveProperty('bucketSize', 1); expect(result).toHaveProperty('intervalString', '1s'); }); test('returns overridden buckets (10m)', () => { - const result = getBucketSize(req, '10m', undefined, 100); + const result = getBucketSize(req, '10m', capabilities, 100); expect(result).toHaveProperty('bucketSize', 600); expect(result).toHaveProperty('intervalString', '10m'); }); test('returns overridden buckets (1d)', () => { - const result = getBucketSize(req, '1d', undefined, 100); + const result = getBucketSize(req, '1d', capabilities, 100); expect(result).toHaveProperty('bucketSize', 86400); expect(result).toHaveProperty('intervalString', '1d'); }); test('returns overridden buckets (>=2d)', () => { - const result = getBucketSize(req, '>=2d', undefined, 100); + const result = getBucketSize(req, '>=2d', capabilities, 100); expect(result).toHaveProperty('bucketSize', 86400 * 2); expect(result).toHaveProperty('intervalString', '2d'); }); test('returns overridden buckets (>=10s)', () => { - const result = getBucketSize(req, '>=10s', undefined, 100); + const result = getBucketSize(req, '>=10s', capabilities, 100); expect(result).toHaveProperty('bucketSize', 30); expect(result).toHaveProperty('intervalString', '30s'); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/annotations/date_histogram.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/annotations/date_histogram.js index 48b33c1e787e..22a475a9997a 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/annotations/date_histogram.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/annotations/date_histogram.js @@ -32,7 +32,7 @@ export function dateHistogram( barTargetUiSettings ); const { from, to } = getTimerange(req); - const timezone = capabilities.searchTimezone; + const { timezone } = capabilities; overwrite(doc, `aggs.${annotation.id}.date_histogram`, { field: timeField, diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/date_histogram.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/date_histogram.js index dab9a24d06c0..a9b4f99fdb69 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/date_histogram.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/date_histogram.js @@ -37,7 +37,7 @@ export function dateHistogram( const getDateHistogramForLastBucketMode = () => { const { from, to } = offsetTime(req, series.offset_time); - const timezone = capabilities.searchTimezone; + const { timezone } = capabilities; overwrite(doc, `aggs.${series.id}.aggs.timeseries.date_histogram`, { field: timeField, diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/date_histogram.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/date_histogram.test.js index 945c57b2341f..a1fd242dc150 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/date_histogram.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/date_histogram.test.js @@ -23,7 +23,6 @@ describe('dateHistogram(req, panel, series)', () => { req = { body: { timerange: { - timezone: 'UTC', min: '2017-01-01T00:00:00Z', max: '2017-01-01T01:00:00Z', }, @@ -40,7 +39,7 @@ describe('dateHistogram(req, panel, series)', () => { queryStringOptions: {}, }; indexPattern = {}; - capabilities = new DefaultSearchCapabilities(req); + capabilities = new DefaultSearchCapabilities({ timezone: 'UTC', maxBucketsLimit: 2000 }); uiSettings = { get: async (key) => (key === UI_SETTINGS.HISTOGRAM_MAX_BARS ? 100 : 50), }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/metric_buckets.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/metric_buckets.test.js index 7f126a39e4f3..db5767f29d09 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/metric_buckets.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/metric_buckets.test.js @@ -50,7 +50,7 @@ describe('metricBuckets(req, panel, series)', () => { }, {}, {}, - undefined, + { maxBucketsLimit: 2000, getValidTimeInterval: jest.fn(() => '1d') }, { get: async () => 50, } diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.test.js index cecfee7c660f..b79e8de13062 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.test.js @@ -46,14 +46,30 @@ describe('positiveRate(req, panel, series)', () => { test('calls next when finished', async () => { const next = jest.fn(); - await positiveRate(req, panel, series, {}, {}, undefined, uiSettings)(next)({}); + await positiveRate( + req, + panel, + series, + {}, + {}, + { maxBucketsLimit: 2000, getValidTimeInterval: jest.fn(() => '1d') }, + uiSettings + )(next)({}); expect(next.mock.calls.length).toEqual(1); }); test('returns positive rate aggs', async () => { const next = (doc) => doc; - const doc = await positiveRate(req, panel, series, {}, {}, undefined, uiSettings)(next)({}); + const doc = await positiveRate( + req, + panel, + series, + {}, + {}, + { maxBucketsLimit: 2000, getValidTimeInterval: jest.fn(() => '1d') }, + uiSettings + )(next)({}); expect(doc).toEqual({ aggs: { diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/sibling_buckets.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/sibling_buckets.test.js index 8c9179f12824..16cb01c510bf 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/sibling_buckets.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/sibling_buckets.test.js @@ -51,13 +51,29 @@ describe('siblingBuckets(req, panel, series)', () => { test('calls next when finished', async () => { const next = jest.fn(); - await siblingBuckets(req, panel, series, {}, {}, undefined, uiSettings)(next)({}); + await siblingBuckets( + req, + panel, + series, + {}, + {}, + { maxBucketsLimit: 2000, getValidTimeInterval: jest.fn(() => '1d') }, + uiSettings + )(next)({}); expect(next.mock.calls.length).toEqual(1); }); test('returns sibling aggs', async () => { const next = (doc) => doc; - const doc = await siblingBuckets(req, panel, series, {}, {}, undefined, uiSettings)(next)({}); + const doc = await siblingBuckets( + req, + panel, + series, + {}, + {}, + { maxBucketsLimit: 2000, getValidTimeInterval: jest.fn(() => '1d') }, + uiSettings + )(next)({}); expect(doc).toEqual({ aggs: { diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/date_histogram.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/date_histogram.js index 551806564317..aff1bd5041be 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/date_histogram.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/date_histogram.js @@ -32,7 +32,7 @@ export function dateHistogram(req, panel, esQueryConfig, indexPattern, capabilit barTargetUiSettings ); const { from, to } = getTimerange(req); - const timezone = capabilities.searchTimezone; + const { timezone } = capabilities; panel.series.forEach((column) => { const aggRoot = calculateAggRoot(doc, column); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/series/build_request_body.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/series/build_request_body.test.ts index d97af8ac748f..89d87da5f3d7 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/series/build_request_body.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/series/build_request_body.test.ts @@ -72,7 +72,7 @@ describe('buildRequestBody(req)', () => { const series = panel.series[0]; const getValidTimeInterval = jest.fn(() => '10s'); const capabilities = { - searchTimezone: 'UTC', + timezone: 'UTC', getValidTimeInterval, }; const config = { diff --git a/src/plugins/vis_type_timeseries/server/types.ts b/src/plugins/vis_type_timeseries/server/types.ts index 7b42cf61d52b..2fc46b7cd1f1 100644 --- a/src/plugins/vis_type_timeseries/server/types.ts +++ b/src/plugins/vis_type_timeseries/server/types.ts @@ -23,7 +23,7 @@ export type ConfigObservable = Observable; export type VisTypeTimeseriesRequestHandlerContext = DataRequestHandlerContext; export type VisTypeTimeseriesRouter = IRouter; export type VisTypeTimeseriesVisDataRequest = KibanaRequest<{}, {}, VisPayload>; -export type VisTypeTimeseriesFieldsRequest = KibanaRequest<{}, { index: string }, {}>; +export type VisTypeTimeseriesFieldsRequest = KibanaRequest<{}, { index: string }, any>; export type VisTypeTimeseriesRequest = | VisTypeTimeseriesFieldsRequest | VisTypeTimeseriesVisDataRequest;