From 4f62d168541b826fb49fbbc0ef9cfc5c7b4ef3fc Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Thu, 17 Jun 2021 18:00:56 +0200 Subject: [PATCH 1/5] fix time shift bug --- .../data/common/search/aggs/agg_config.ts | 8 +++++--- .../run_pipeline/esaggs_timeshift.ts | 19 +++++++++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/plugins/data/common/search/aggs/agg_config.ts b/src/plugins/data/common/search/aggs/agg_config.ts index 3c83b5bdf6084..f3a19e2cfdeb6 100644 --- a/src/plugins/data/common/search/aggs/agg_config.ts +++ b/src/plugins/data/common/search/aggs/agg_config.ts @@ -22,6 +22,7 @@ import { IAggType } from './agg_type'; import { writeParams } from './agg_params'; import { IAggConfigs } from './agg_configs'; import { parseTimeShift } from './utils'; +import { calculateBounds } from '../../query'; type State = string | number | boolean | null | undefined | SerializableState; @@ -192,9 +193,10 @@ export class AggConfig { } else if (!this.aggConfigs.timeRange) { return; } - return moment.duration( - moment(this.aggConfigs.timeRange.to).diff(this.aggConfigs.timeRange.from) - ); + const resolvedBounds = calculateBounds(this.aggConfigs.timeRange, { + forceNow: this.aggConfigs.forceNow, + }); + return moment.duration(moment(resolvedBounds.max).diff(resolvedBounds.min)); } return parsedTimeShift; } diff --git a/test/interpreter_functional/test_suites/run_pipeline/esaggs_timeshift.ts b/test/interpreter_functional/test_suites/run_pipeline/esaggs_timeshift.ts index c750602f735bd..8fc09ce2d7342 100644 --- a/test/interpreter_functional/test_suites/run_pipeline/esaggs_timeshift.ts +++ b/test/interpreter_functional/test_suites/run_pipeline/esaggs_timeshift.ts @@ -71,6 +71,21 @@ export default function ({ expect(getCell(result, 0, 2)).to.be(4618); }); + it('shifts multiple metrics with relative time range and previous', async () => { + const expression = ` + kibana_context timeRange={timerange from='${timeRange.from}' to='now'} + | esaggs index={indexPatternLoad id='logstash-*'} + aggs={aggCount id="1" enabled=true schema="metric"} + aggs={aggCount id="2" enabled=true schema="metric" timeShift="previous"} + `; + const result = await expectExpression( + 'esaggs_shift_multi_metric_previous', + expression + ).getResponse(); + expect(getCell(result, 0, 0)).to.be(9247); + expect(getCell(result, 0, 1)).to.be(4763); + }); + it('shifts single percentile', async () => { const expression = ` kibana_context timeRange={timerange from='${timeRange.from}' to='${timeRange.to}'} @@ -137,7 +152,7 @@ export default function ({ customMetric={aggAvg id="3" field="bytes" enabled=true - schema="metric" + schema="metric" } enabled=true schema="metric" @@ -154,7 +169,7 @@ export default function ({ customMetric={aggAvg id="5" field="bytes" enabled=true - schema="metric" + schema="metric" } enabled=true schema="metric" From 216d7927df6c514b8d3e6563c3ed57e41d90d823 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Thu, 17 Jun 2021 18:22:09 +0200 Subject: [PATCH 2/5] adjust docs --- ...ibana-plugin-plugins-data-public.aggconfig.gettimerange.md | 4 ++-- src/plugins/data/public/public.api.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfig.gettimerange.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfig.gettimerange.md index 897a6d8dda3f1..f93c489dec6ed 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfig.gettimerange.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfig.gettimerange.md @@ -7,9 +7,9 @@ Signature: ```typescript -getTimeRange(): import("../../../public").TimeRange | undefined; +getTimeRange(): import("../../query").TimeRange | undefined; ``` Returns: -`import("../../../public").TimeRange | undefined` +`import("../../query").TimeRange | undefined` diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index d56727b468da6..89e14581c3744 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -153,7 +153,7 @@ export class AggConfig { // (undocumented) getResponseAggs(): AggConfig[]; // (undocumented) - getTimeRange(): import("../../../public").TimeRange | undefined; + getTimeRange(): import("../../query").TimeRange | undefined; // (undocumented) getTimeShift(): undefined | moment.Duration; // (undocumented) From 717ba62bf56323d59b7d39f6f9c800cccf8336ec Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Fri, 18 Jun 2021 09:56:27 +0200 Subject: [PATCH 3/5] restructure fix --- src/plugins/data/common/search/aggs/agg_config.ts | 5 +---- src/plugins/data/common/search/aggs/agg_configs.ts | 11 ++++++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/plugins/data/common/search/aggs/agg_config.ts b/src/plugins/data/common/search/aggs/agg_config.ts index f3a19e2cfdeb6..9a35cf983c805 100644 --- a/src/plugins/data/common/search/aggs/agg_config.ts +++ b/src/plugins/data/common/search/aggs/agg_config.ts @@ -22,7 +22,6 @@ import { IAggType } from './agg_type'; import { writeParams } from './agg_params'; import { IAggConfigs } from './agg_configs'; import { parseTimeShift } from './utils'; -import { calculateBounds } from '../../query'; type State = string | number | boolean | null | undefined | SerializableState; @@ -193,9 +192,7 @@ export class AggConfig { } else if (!this.aggConfigs.timeRange) { return; } - const resolvedBounds = calculateBounds(this.aggConfigs.timeRange, { - forceNow: this.aggConfigs.forceNow, - }); + const resolvedBounds = this.aggConfigs.getResolvedTimeRange()!; return moment.duration(moment(resolvedBounds.max).diff(resolvedBounds.min)); } return parsedTimeShift; diff --git a/src/plugins/data/common/search/aggs/agg_configs.ts b/src/plugins/data/common/search/aggs/agg_configs.ts index 8593a0b0ed0fa..1a0430f3cc08d 100644 --- a/src/plugins/data/common/search/aggs/agg_configs.ts +++ b/src/plugins/data/common/search/aggs/agg_configs.ts @@ -23,7 +23,7 @@ import { IAggType } from './agg_type'; import { AggTypesRegistryStart } from './agg_types_registry'; import { AggGroupNames } from './agg_groups'; import { IndexPattern } from '../../index_patterns/index_patterns/index_pattern'; -import { TimeRange, getTime, isRangeFilter } from '../../../common'; +import { TimeRange, getTime, isRangeFilter, calculateBounds } from '../../../common'; import { IBucketAggConfig } from './buckets'; import { insertTimeShiftSplit, mergeTimeShifts } from './utils/time_splits'; @@ -127,6 +127,15 @@ export class AggConfigs { this.aggs.forEach(updateAggTimeRange); } + getResolvedTimeRange() { + return ( + this.timeRange && + calculateBounds(this.timeRange, { + forceNow: this.forceNow, + }) + ); + } + // clone method will reuse existing AggConfig in the list (will not create new instances) clone({ enabledOnly = true } = {}) { const filterAggs = (agg: AggConfig) => { From c8cd5e72d531834a41ef5fe9be5e9dcb0355b147 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Fri, 18 Jun 2021 10:13:24 +0200 Subject: [PATCH 4/5] add docs --- ...-plugins-data-public.aggconfig.gettimerange.md | 4 ++-- ...data-public.aggconfigs.getresolvedtimerange.md | 15 +++++++++++++++ ...ibana-plugin-plugins-data-public.aggconfigs.md | 1 + src/plugins/data/public/public.api.md | 4 +++- 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfig.gettimerange.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfig.gettimerange.md index f93c489dec6ed..897a6d8dda3f1 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfig.gettimerange.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfig.gettimerange.md @@ -7,9 +7,9 @@ Signature: ```typescript -getTimeRange(): import("../../query").TimeRange | undefined; +getTimeRange(): import("../../../public").TimeRange | undefined; ``` Returns: -`import("../../query").TimeRange | undefined` +`import("../../../public").TimeRange | undefined` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md new file mode 100644 index 0000000000000..9dd627e5de5cf --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [AggConfigs](./kibana-plugin-plugins-data-public.aggconfigs.md) > [getResolvedTimeRange](./kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md) + +## AggConfigs.getResolvedTimeRange() method + +Signature: + +```typescript +getResolvedTimeRange(): import("../..").TimeRangeBounds | undefined; +``` +Returns: + +`import("../..").TimeRangeBounds | undefined` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md index 45333b6767cac..dbef55526b68d 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md @@ -42,6 +42,7 @@ export declare class AggConfigs | [getAll()](./kibana-plugin-plugins-data-public.aggconfigs.getall.md) | | | | [getRequestAggById(id)](./kibana-plugin-plugins-data-public.aggconfigs.getrequestaggbyid.md) | | | | [getRequestAggs()](./kibana-plugin-plugins-data-public.aggconfigs.getrequestaggs.md) | | | +| [getResolvedTimeRange()](./kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md) | | | | [getResponseAggById(id)](./kibana-plugin-plugins-data-public.aggconfigs.getresponseaggbyid.md) | | Find a response agg by it's id. This may be an agg in the aggConfigs, or one created specifically for a response value | | [getResponseAggs()](./kibana-plugin-plugins-data-public.aggconfigs.getresponseaggs.md) | | Gets the AggConfigs (and possibly ResponseAggConfigs) that represent the values that will be produced when all aggs are run.With multi-value metric aggs it is possible for a single agg request to result in multiple agg values, which is why the length of a vis' responseValuesAggs may be different than the vis' aggs {array\[AggConfig\]} | | [getSearchSourceTimeFilter(forceNow)](./kibana-plugin-plugins-data-public.aggconfigs.getsearchsourcetimefilter.md) | | | diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 89e14581c3744..db82976f2f3c4 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -153,7 +153,7 @@ export class AggConfig { // (undocumented) getResponseAggs(): AggConfig[]; // (undocumented) - getTimeRange(): import("../../query").TimeRange | undefined; + getTimeRange(): import("../../../public").TimeRange | undefined; // (undocumented) getTimeShift(): undefined | moment.Duration; // (undocumented) @@ -259,6 +259,8 @@ export class AggConfigs { getRequestAggById(id: string): AggConfig | undefined; // (undocumented) getRequestAggs(): AggConfig[]; + // (undocumented) + getResolvedTimeRange(): import("../..").TimeRangeBounds | undefined; getResponseAggById(id: string): AggConfig | undefined; getResponseAggs(): AggConfig[]; // (undocumented) From b19141288ddeb8ceeb242662eab0eaee29fcf413 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 21 Jun 2021 14:40:42 +0200 Subject: [PATCH 5/5] documentation --- ...gin-plugins-data-public.aggconfigs.getresolvedtimerange.md | 4 ++++ .../public/kibana-plugin-plugins-data-public.aggconfigs.md | 2 +- src/plugins/data/common/search/aggs/agg_configs.ts | 4 ++++ src/plugins/data/public/public.api.md | 1 - 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md index 9dd627e5de5cf..2af44037292a2 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md @@ -4,6 +4,8 @@ ## AggConfigs.getResolvedTimeRange() method +Returns the current time range as moment instance (date math will get resolved using the current "now" value or system time if not set) + Signature: ```typescript @@ -13,3 +15,5 @@ getResolvedTimeRange(): import("../..").TimeRangeBounds | undefined; `import("../..").TimeRangeBounds | undefined` +Current time range as resolved date. + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md index dbef55526b68d..9e671675b0b29 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md @@ -42,7 +42,7 @@ export declare class AggConfigs | [getAll()](./kibana-plugin-plugins-data-public.aggconfigs.getall.md) | | | | [getRequestAggById(id)](./kibana-plugin-plugins-data-public.aggconfigs.getrequestaggbyid.md) | | | | [getRequestAggs()](./kibana-plugin-plugins-data-public.aggconfigs.getrequestaggs.md) | | | -| [getResolvedTimeRange()](./kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md) | | | +| [getResolvedTimeRange()](./kibana-plugin-plugins-data-public.aggconfigs.getresolvedtimerange.md) | | Returns the current time range as moment instance (date math will get resolved using the current "now" value or system time if not set) | | [getResponseAggById(id)](./kibana-plugin-plugins-data-public.aggconfigs.getresponseaggbyid.md) | | Find a response agg by it's id. This may be an agg in the aggConfigs, or one created specifically for a response value | | [getResponseAggs()](./kibana-plugin-plugins-data-public.aggconfigs.getresponseaggs.md) | | Gets the AggConfigs (and possibly ResponseAggConfigs) that represent the values that will be produced when all aggs are run.With multi-value metric aggs it is possible for a single agg request to result in multiple agg values, which is why the length of a vis' responseValuesAggs may be different than the vis' aggs {array\[AggConfig\]} | | [getSearchSourceTimeFilter(forceNow)](./kibana-plugin-plugins-data-public.aggconfigs.getsearchsourcetimefilter.md) | | | diff --git a/src/plugins/data/common/search/aggs/agg_configs.ts b/src/plugins/data/common/search/aggs/agg_configs.ts index 1a0430f3cc08d..c205b46e077f0 100644 --- a/src/plugins/data/common/search/aggs/agg_configs.ts +++ b/src/plugins/data/common/search/aggs/agg_configs.ts @@ -127,6 +127,10 @@ export class AggConfigs { this.aggs.forEach(updateAggTimeRange); } + /** + * Returns the current time range as moment instance (date math will get resolved using the current "now" value or system time if not set) + * @returns Current time range as resolved date. + */ getResolvedTimeRange() { return ( this.timeRange && diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index db82976f2f3c4..4d9c69b137a3e 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -259,7 +259,6 @@ export class AggConfigs { getRequestAggById(id: string): AggConfig | undefined; // (undocumented) getRequestAggs(): AggConfig[]; - // (undocumented) getResolvedTimeRange(): import("../..").TimeRangeBounds | undefined; getResponseAggById(id: string): AggConfig | undefined; getResponseAggs(): AggConfig[];