From 0ae549726c08370a3f9295893812ecd32ff37182 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 10 Mar 2020 14:44:06 -0700 Subject: [PATCH 1/7] [TSVB] Add Rate to Aggregations --- .../public/components/aggs/agg_select.js | 6 + .../public/components/aggs/rate.js | 130 ++++++++++++++++++ .../public/components/lib/agg_to_component.js | 2 + .../vis_type_timeseries/common/agg_lookup.js | 1 + .../common/calculate_label.js | 5 + .../request_processors/series/index.js | 2 + .../request_processors/series/rate.js | 68 +++++++++ .../request_processors/series/rate.test.js | 95 +++++++++++++ .../request_processors/table/index.js | 2 + .../vis_data/request_processors/table/rate.js | 35 +++++ 10 files changed, 346 insertions(+) create mode 100644 src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js create mode 100644 src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.js create mode 100644 src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.test.js create mode 100644 src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/rate.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js index f93dee14d0eed3..de1d6eb6a08693 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js @@ -115,6 +115,12 @@ const metricAggs = [ }), value: 'variance', }, + { + label: i18n.translate('visTypeTimeseries.aggSelect.metricsAggs.rateLabel', { + defaultMessage: 'Rate', + }), + value: 'rate', + }, ]; const pipelineAggs = [ diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js new file mode 100644 index 00000000000000..a553e67a8a3350 --- /dev/null +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js @@ -0,0 +1,130 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import PropTypes from 'prop-types'; +import React from 'react'; +import { AggSelect } from './agg_select'; +import { FieldSelect } from './field_select'; +import { AggRow } from './agg_row'; +import { createChangeHandler } from '../lib/create_change_handler'; +import { createSelectHandler } from '../lib/create_select_handler'; +import { createTextHandler } from '../lib/create_text_handler'; +import { + htmlIdGenerator, + EuiFlexGroup, + EuiFlexItem, + EuiFormLabel, + EuiFieldText, + EuiFormRow, + EuiSpacer, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { KBN_FIELD_TYPES } from '../../../../../../plugins/data/public'; + +export const RateAgg = props => { + const defaults = { unit: '' }; + const model = { ...defaults, ...props.model }; + + const handleChange = createChangeHandler(props.onChange, model); + const handleSelectChange = createSelectHandler(handleChange); + const handleTextChange = createTextHandler(handleChange); + + const htmlId = htmlIdGenerator(); + const indexPattern = + (props.series.override_index_pattern && props.series.series_index_pattern) || + props.panel.index_pattern; + + return ( + + + + + + + + + + + + } + fullWidth + > + + + + + + } + fullWidth + > + + + + + + ); +}; + +RateAgg.propTypes = { + disableDelete: PropTypes.bool, + fields: PropTypes.object, + model: PropTypes.object, + onAdd: PropTypes.func, + onChange: PropTypes.func, + onDelete: PropTypes.func, + panel: PropTypes.object, + series: PropTypes.object, + siblings: PropTypes.array, +}; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js index ca40d60f208485..6bcb027e427f9c 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js @@ -33,6 +33,7 @@ import { PercentileRankAgg } from '../aggs/percentile_rank'; import { Static } from '../aggs/static'; import { MathAgg } from '../aggs/math'; import { TopHitAgg } from '../aggs/top_hit'; +import { RateAgg } from '../aggs/rate'; export const aggToComponent = { count: StandardAgg, @@ -65,4 +66,5 @@ export const aggToComponent = { static: Static, math: MathAgg, top_hit: TopHitAgg, + rate: RateAgg, }; diff --git a/src/plugins/vis_type_timeseries/common/agg_lookup.js b/src/plugins/vis_type_timeseries/common/agg_lookup.js index 4dfdc83dcfabb8..1224cec7bee312 100644 --- a/src/plugins/vis_type_timeseries/common/agg_lookup.js +++ b/src/plugins/vis_type_timeseries/common/agg_lookup.js @@ -97,6 +97,7 @@ export const lookup = { defaultMessage: 'Static Value', }), top_hit: i18n.translate('visTypeTimeseries.aggLookup.topHitLabel', { defaultMessage: 'Top Hit' }), + rate: i18n.translate('visTypeTimeseries.aggLookup.rateLabel', { defaultMessage: 'Rate' }), }; const pipeline = [ diff --git a/src/plugins/vis_type_timeseries/common/calculate_label.js b/src/plugins/vis_type_timeseries/common/calculate_label.js index 756d6e57a83e8d..ca71df634427b4 100644 --- a/src/plugins/vis_type_timeseries/common/calculate_label.js +++ b/src/plugins/vis_type_timeseries/common/calculate_label.js @@ -70,6 +70,11 @@ export function calculateLabel(metric, metrics) { defaultMessage: 'Filter Ratio', }); } + if (metric.type === 'rate') { + return i18n.translate('visTypeTimeseries.calculateLabel.rateLabel', { + defaultMessage: 'Rate', + }); + } if (metric.type === 'static') { return i18n.translate('visTypeTimeseries.calculateLabel.staticValueLabel', { defaultMessage: 'Static Value of {metricValue}', diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js index 4b0b8f33716a22..90f88e8de3a8c5 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js @@ -26,6 +26,7 @@ import { dateHistogram } from './date_histogram'; import { metricBuckets } from './metric_buckets'; import { siblingBuckets } from './sibling_buckets'; import { ratios as filterRatios } from './filter_ratios'; +import { rate } from './rate'; import { normalizeQuery } from './normalize_query'; export const processors = [ @@ -38,5 +39,6 @@ export const processors = [ metricBuckets, siblingBuckets, filterRatios, + rate, normalizeQuery, ]; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.js new file mode 100644 index 00000000000000..8dbff25a4933af --- /dev/null +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.js @@ -0,0 +1,68 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getBucketSize } from '../../helpers/get_bucket_size'; +import { getIntervalAndTimefield } from '../../get_interval_and_timefield'; +import { bucketTransform } from '../../helpers/bucket_transform'; +import { set } from 'lodash'; + +export const filter = metric => metric.type === 'rate'; + +export const createRate = (doc, intervalString, aggRoot) => metric => { + const maxFn = bucketTransform.max; + const derivativeFn = bucketTransform.derivative; + const positiveOnlyFn = bucketTransform.positive_only; + + const maxMetric = { id: `${metric.id}-rate-max`, type: 'max', field: metric.field }; + const derivativeMetric = { + id: `${metric.id}-rate-derivative`, + type: 'derivative', + field: `${metric.id}-rate-max`, + unit: metric.unit, + }; + const positiveOnlyMetric = { + id: metric.id, + type: 'positive_only', + field: `${metric.id}-rate-derivative`, + }; + + const fakeSeriesMetrics = [maxMetric, derivativeMetric, positiveOnlyMetric]; + + const maxBucket = maxFn(maxMetric, fakeSeriesMetrics, intervalString); + const derivativeBucket = derivativeFn(derivativeMetric, fakeSeriesMetrics, intervalString); + const positiveOnlyBucket = positiveOnlyFn(positiveOnlyMetric, fakeSeriesMetrics, intervalString); + + set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-rate-max`, maxBucket); + set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-rate-derivative`, derivativeBucket); + set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, positiveOnlyBucket); +}; + +export function rate(req, panel, series, esQueryConfig, indexPatternObject, capabilities) { + return next => doc => { + const { interval } = getIntervalAndTimefield(panel, series, indexPatternObject); + const { intervalString } = getBucketSize(req, interval, capabilities); + if (series.metrics.some(filter)) { + series.metrics + .filter(filter) + .forEach(createRate(doc, intervalString, `aggs.${series.id}.aggs`)); + return next(doc); + } + return next(doc); + }; +} diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.test.js new file mode 100644 index 00000000000000..e09a699e7c14ab --- /dev/null +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.test.js @@ -0,0 +1,95 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { rate } from './rate'; +describe('rate(req, panel, series)', () => { + let panel; + let series; + let req; + beforeEach(() => { + panel = { + time_field: 'timestamp', + }; + series = { + id: 'test', + split_mode: 'terms', + terms_size: 10, + terms_field: 'host', + metrics: [ + { + id: 'metric-1', + type: 'rate', + field: 'system.network.out.bytes', + unit: '1s', + }, + ], + }; + req = { + payload: { + timerange: { + min: '2017-01-01T00:00:00Z', + max: '2017-01-01T01:00:00Z', + }, + }, + }; + }); + + test('calls next when finished', () => { + const next = jest.fn(); + rate(req, panel, series)(next)({}); + expect(next.mock.calls.length).toEqual(1); + }); + + test('returns rate aggs', () => { + const next = doc => doc; + const doc = rate(req, panel, series)(next)({}); + expect(doc).toEqual({ + aggs: { + test: { + aggs: { + timeseries: { + aggs: { + 'metric-1-rate-max': { + max: { field: 'system.network.out.bytes' }, + }, + 'metric-1-rate-derivative': { + derivative: { + buckets_path: 'metric-1-rate-max', + gap_policy: 'skip', + unit: '1s', + }, + }, + 'metric-1': { + bucket_script: { + buckets_path: { value: 'metric-1-rate-derivative[normalized_value]' }, + script: { + source: 'params.value > 0.0 ? params.value : 0.0', + lang: 'painless', + }, + gap_policy: 'skip', + }, + }, + }, + }, + }, + }, + }, + }); + }); +}); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js index a62533ae7a37ce..8fe79788958509 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js @@ -26,6 +26,7 @@ import { metricBuckets } from './metric_buckets'; import { siblingBuckets } from './sibling_buckets'; import { ratios as filterRatios } from './filter_ratios'; import { normalizeQuery } from './normalize_query'; +import { rate } from './rate'; export const processors = [ query, @@ -36,5 +37,6 @@ export const processors = [ metricBuckets, siblingBuckets, filterRatios, + rate, normalizeQuery, ]; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/rate.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/rate.js new file mode 100644 index 00000000000000..ffe81ac869ab2a --- /dev/null +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/rate.js @@ -0,0 +1,35 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getBucketSize } from '../../helpers/get_bucket_size'; +import { getIntervalAndTimefield } from '../../get_interval_and_timefield'; +import { calculateAggRoot } from './calculate_agg_root'; +import { createRate, filter } from '../series/rate'; + +export function rate(req, panel, esQueryConfig, indexPatternObject) { + return next => doc => { + const { interval } = getIntervalAndTimefield(panel, {}, indexPatternObject); + const { intervalString } = getBucketSize(req, interval); + panel.series.forEach(column => { + const aggRoot = calculateAggRoot(doc, column); + column.metrics.filter(filter).forEach(createRate(doc, intervalString, aggRoot)); + }); + return next(doc); + }; +} From 6db5550d6dcea145495bac84b6a1b50d62f0ac2c Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 1 Apr 2020 11:18:18 -0700 Subject: [PATCH 2/7] Fixing i18n labels --- .../vis_type_timeseries/public/components/aggs/rate.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js index a553e67a8a3350..3a5e588b1114d8 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js @@ -63,7 +63,7 @@ export const RateAgg = props => { @@ -81,7 +81,7 @@ export const RateAgg = props => { + } fullWidth > @@ -102,7 +102,7 @@ export const RateAgg = props => { id={htmlId('units')} label={ From e1cea8eb513c06ef7de4a007c7419acdcb716e88 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 2 Apr 2020 16:02:02 -0700 Subject: [PATCH 3/7] Changing from rate to growth_rate; adding message to aggregation form; --- .../public/components/aggs/agg_select.js | 12 +++---- .../aggs/{rate.js => growth_rate.js} | 34 ++++++++++++++++--- .../public/components/lib/agg_to_component.js | 4 +-- .../vis_type_timeseries/common/agg_lookup.js | 4 ++- .../common/calculate_label.js | 7 ++-- .../series/{rate.js => growth_rate.js} | 20 +++++------ .../{rate.test.js => growth_rate.test.js} | 18 +++++----- .../request_processors/series/index.js | 4 +-- .../table/{rate.js => growth_rate.js} | 6 ++-- .../request_processors/table/index.js | 4 +-- 10 files changed, 70 insertions(+), 43 deletions(-) rename src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/{rate.js => growth_rate.js} (78%) rename src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/{rate.js => growth_rate.js} (74%) rename src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/{rate.test.js => growth_rate.test.js} (82%) rename src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/{rate.js => growth_rate.js} (84%) diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js index de1d6eb6a08693..69592587877eb0 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js @@ -49,6 +49,12 @@ const metricAggs = [ }), value: 'filter_ratio', }, + { + label: i18n.translate('visTypeTimeseries.aggSelect.metricsAggs.growthRateLabel', { + defaultMessage: 'Growth Rate', + }), + value: 'growth_rate', + }, { label: i18n.translate('visTypeTimeseries.aggSelect.metricsAggs.maxLabel', { defaultMessage: 'Max', @@ -115,12 +121,6 @@ const metricAggs = [ }), value: 'variance', }, - { - label: i18n.translate('visTypeTimeseries.aggSelect.metricsAggs.rateLabel', { - defaultMessage: 'Rate', - }), - value: 'rate', - }, ]; const pipelineAggs = [ diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js similarity index 78% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js rename to src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js index 3a5e588b1114d8..bad0a3065c4391 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/rate.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js @@ -33,11 +33,13 @@ import { EuiFieldText, EuiFormRow, EuiSpacer, + EuiText, + EuiLink, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { KBN_FIELD_TYPES } from '../../../../../../plugins/data/public'; -export const RateAgg = props => { +export const GrowthRateAgg = props => { const defaults = { unit: '' }; const model = { ...defaults, ...props.model }; @@ -63,7 +65,7 @@ export const RateAgg = props => { @@ -81,7 +83,10 @@ export const RateAgg = props => { + } fullWidth > @@ -102,7 +107,7 @@ export const RateAgg = props => { id={htmlId('units')} label={ @@ -113,11 +118,30 @@ export const RateAgg = props => { + + +

+ + + + ), + }} + /> +

+
); }; -RateAgg.propTypes = { +GrowthRateAgg.propTypes = { disableDelete: PropTypes.bool, fields: PropTypes.object, model: PropTypes.object, diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js index 6bcb027e427f9c..da0ed57834f7da 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js @@ -33,7 +33,7 @@ import { PercentileRankAgg } from '../aggs/percentile_rank'; import { Static } from '../aggs/static'; import { MathAgg } from '../aggs/math'; import { TopHitAgg } from '../aggs/top_hit'; -import { RateAgg } from '../aggs/rate'; +import { GrowthRateAgg } from '../aggs/growth_rate'; export const aggToComponent = { count: StandardAgg, @@ -66,5 +66,5 @@ export const aggToComponent = { static: Static, math: MathAgg, top_hit: TopHitAgg, - rate: RateAgg, + growth_rate: GrowthRateAgg, }; diff --git a/src/plugins/vis_type_timeseries/common/agg_lookup.js b/src/plugins/vis_type_timeseries/common/agg_lookup.js index 1224cec7bee312..543e9f63669227 100644 --- a/src/plugins/vis_type_timeseries/common/agg_lookup.js +++ b/src/plugins/vis_type_timeseries/common/agg_lookup.js @@ -97,7 +97,9 @@ export const lookup = { defaultMessage: 'Static Value', }), top_hit: i18n.translate('visTypeTimeseries.aggLookup.topHitLabel', { defaultMessage: 'Top Hit' }), - rate: i18n.translate('visTypeTimeseries.aggLookup.rateLabel', { defaultMessage: 'Rate' }), + growth_rate: i18n.translate('visTypeTimeseries.aggLookup.growthRateLabel', { + defaultMessage: 'Growth Rate', + }), }; const pipeline = [ diff --git a/src/plugins/vis_type_timeseries/common/calculate_label.js b/src/plugins/vis_type_timeseries/common/calculate_label.js index ca71df634427b4..362a46d7860447 100644 --- a/src/plugins/vis_type_timeseries/common/calculate_label.js +++ b/src/plugins/vis_type_timeseries/common/calculate_label.js @@ -70,9 +70,10 @@ export function calculateLabel(metric, metrics) { defaultMessage: 'Filter Ratio', }); } - if (metric.type === 'rate') { - return i18n.translate('visTypeTimeseries.calculateLabel.rateLabel', { - defaultMessage: 'Rate', + if (metric.type === 'growth_rate') { + return i18n.translate('visTypeTimeseries.calculateLabel.growthRateLabel', { + defaultMessage: 'Growth Rate of {field}', + values: { field: metric.field }, }); } if (metric.type === 'static') { diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.js similarity index 74% rename from src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.js rename to src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.js index 8dbff25a4933af..5c6e322e25c2e2 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.js @@ -22,24 +22,24 @@ import { getIntervalAndTimefield } from '../../get_interval_and_timefield'; import { bucketTransform } from '../../helpers/bucket_transform'; import { set } from 'lodash'; -export const filter = metric => metric.type === 'rate'; +export const filter = metric => metric.type === 'growth_rate'; -export const createRate = (doc, intervalString, aggRoot) => metric => { +export const createGrowthRate = (doc, intervalString, aggRoot) => metric => { const maxFn = bucketTransform.max; const derivativeFn = bucketTransform.derivative; const positiveOnlyFn = bucketTransform.positive_only; - const maxMetric = { id: `${metric.id}-rate-max`, type: 'max', field: metric.field }; + const maxMetric = { id: `${metric.id}-growth-rate-max`, type: 'max', field: metric.field }; const derivativeMetric = { - id: `${metric.id}-rate-derivative`, + id: `${metric.id}-growth-rate-derivative`, type: 'derivative', - field: `${metric.id}-rate-max`, + field: `${metric.id}-growth-rate-max`, unit: metric.unit, }; const positiveOnlyMetric = { id: metric.id, type: 'positive_only', - field: `${metric.id}-rate-derivative`, + field: `${metric.id}-growth-rate-derivative`, }; const fakeSeriesMetrics = [maxMetric, derivativeMetric, positiveOnlyMetric]; @@ -48,19 +48,19 @@ export const createRate = (doc, intervalString, aggRoot) => metric => { const derivativeBucket = derivativeFn(derivativeMetric, fakeSeriesMetrics, intervalString); const positiveOnlyBucket = positiveOnlyFn(positiveOnlyMetric, fakeSeriesMetrics, intervalString); - set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-rate-max`, maxBucket); - set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-rate-derivative`, derivativeBucket); + set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-growth-rate-max`, maxBucket); + set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-growth-rate-derivative`, derivativeBucket); set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, positiveOnlyBucket); }; -export function rate(req, panel, series, esQueryConfig, indexPatternObject, capabilities) { +export function growthRate(req, panel, series, esQueryConfig, indexPatternObject, capabilities) { return next => doc => { const { interval } = getIntervalAndTimefield(panel, series, indexPatternObject); const { intervalString } = getBucketSize(req, interval, capabilities); if (series.metrics.some(filter)) { series.metrics .filter(filter) - .forEach(createRate(doc, intervalString, `aggs.${series.id}.aggs`)); + .forEach(createGrowthRate(doc, intervalString, `aggs.${series.id}.aggs`)); return next(doc); } return next(doc); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.test.js similarity index 82% rename from src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.test.js rename to src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.test.js index e09a699e7c14ab..e5bc1a26bef950 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/rate.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.test.js @@ -17,7 +17,7 @@ * under the License. */ -import { rate } from './rate'; +import { growthRate } from './growth_rate'; describe('rate(req, panel, series)', () => { let panel; let series; @@ -34,7 +34,7 @@ describe('rate(req, panel, series)', () => { metrics: [ { id: 'metric-1', - type: 'rate', + type: 'growth_rate', field: 'system.network.out.bytes', unit: '1s', }, @@ -52,32 +52,32 @@ describe('rate(req, panel, series)', () => { test('calls next when finished', () => { const next = jest.fn(); - rate(req, panel, series)(next)({}); + growthRate(req, panel, series)(next)({}); expect(next.mock.calls.length).toEqual(1); }); - test('returns rate aggs', () => { + test('returns growth rate aggs', () => { const next = doc => doc; - const doc = rate(req, panel, series)(next)({}); + const doc = growthRate(req, panel, series)(next)({}); expect(doc).toEqual({ aggs: { test: { aggs: { timeseries: { aggs: { - 'metric-1-rate-max': { + 'metric-1-growth-rate-max': { max: { field: 'system.network.out.bytes' }, }, - 'metric-1-rate-derivative': { + 'metric-1-growth-rate-derivative': { derivative: { - buckets_path: 'metric-1-rate-max', + buckets_path: 'metric-1-growth-rate-max', gap_policy: 'skip', unit: '1s', }, }, 'metric-1': { bucket_script: { - buckets_path: { value: 'metric-1-rate-derivative[normalized_value]' }, + buckets_path: { value: 'metric-1-growth-rate-derivative[normalized_value]' }, script: { source: 'params.value > 0.0 ? params.value : 0.0', lang: 'painless', diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js index 90f88e8de3a8c5..bbff19b26e5832 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js @@ -26,7 +26,7 @@ import { dateHistogram } from './date_histogram'; import { metricBuckets } from './metric_buckets'; import { siblingBuckets } from './sibling_buckets'; import { ratios as filterRatios } from './filter_ratios'; -import { rate } from './rate'; +import { growthRate } from './growth_rate'; import { normalizeQuery } from './normalize_query'; export const processors = [ @@ -39,6 +39,6 @@ export const processors = [ metricBuckets, siblingBuckets, filterRatios, - rate, + growthRate, normalizeQuery, ]; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/rate.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/growth_rate.js similarity index 84% rename from src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/rate.js rename to src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/growth_rate.js index ffe81ac869ab2a..a63c2ae9fc1797 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/rate.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/growth_rate.js @@ -20,15 +20,15 @@ import { getBucketSize } from '../../helpers/get_bucket_size'; import { getIntervalAndTimefield } from '../../get_interval_and_timefield'; import { calculateAggRoot } from './calculate_agg_root'; -import { createRate, filter } from '../series/rate'; +import { createGrowthRate, filter } from '../series/growth_rate'; -export function rate(req, panel, esQueryConfig, indexPatternObject) { +export function growthRate(req, panel, esQueryConfig, indexPatternObject) { return next => doc => { const { interval } = getIntervalAndTimefield(panel, {}, indexPatternObject); const { intervalString } = getBucketSize(req, interval); panel.series.forEach(column => { const aggRoot = calculateAggRoot(doc, column); - column.metrics.filter(filter).forEach(createRate(doc, intervalString, aggRoot)); + column.metrics.filter(filter).forEach(createGrowthRate(doc, intervalString, aggRoot)); }); return next(doc); }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js index 8fe79788958509..1e084044756439 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js @@ -26,7 +26,7 @@ import { metricBuckets } from './metric_buckets'; import { siblingBuckets } from './sibling_buckets'; import { ratios as filterRatios } from './filter_ratios'; import { normalizeQuery } from './normalize_query'; -import { rate } from './rate'; +import { growthRate } from './growth_rate'; export const processors = [ query, @@ -37,6 +37,6 @@ export const processors = [ metricBuckets, siblingBuckets, filterRatios, - rate, + growthRate, normalizeQuery, ]; From bd1f82df760c20e6d684a1c2d7fbf46e7f69c8f5 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 6 Apr 2020 08:15:43 -0700 Subject: [PATCH 4/7] Change units to scale; change free text to combobox --- .../public/components/aggs/growth_rate.js | 49 ++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js index bad0a3065c4391..c9bc88fd828e23 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js @@ -24,34 +24,64 @@ import { FieldSelect } from './field_select'; import { AggRow } from './agg_row'; import { createChangeHandler } from '../lib/create_change_handler'; import { createSelectHandler } from '../lib/create_select_handler'; -import { createTextHandler } from '../lib/create_text_handler'; import { htmlIdGenerator, EuiFlexGroup, EuiFlexItem, EuiFormLabel, - EuiFieldText, EuiFormRow, EuiSpacer, EuiText, EuiLink, + EuiComboBox, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; import { KBN_FIELD_TYPES } from '../../../../../../plugins/data/public'; +const UNIT_OPTIONS = [ + { + label: i18n.translate('visTypeTimeseries.units.auto', { defaultMessage: 'auto' }), + value: '', + }, + { + label: i18n.translate('visTypeTimeseries.units.perSecond', { + defaultMessage: 'per millisecond', + }), + value: '1ms', + }, + { + label: i18n.translate('visTypeTimeseries.units.perSecond', { defaultMessage: 'per second' }), + value: '1s', + }, + { + label: i18n.translate('visTypeTimeseries.units.perMinute', { defaultMessage: 'per minute' }), + value: '1m', + }, + { + label: i18n.translate('visTypeTimeseries.units.perHour', { defaultMessage: 'per hour' }), + value: '1h', + }, + { + label: i18n.translate('visTypeTimeseries.units.perDay', { defaultMessage: 'per day' }), + value: '1d', + }, +]; + export const GrowthRateAgg = props => { const defaults = { unit: '' }; const model = { ...defaults, ...props.model }; const handleChange = createChangeHandler(props.onChange, model); const handleSelectChange = createSelectHandler(handleChange); - const handleTextChange = createTextHandler(handleChange); const htmlId = htmlIdGenerator(); const indexPattern = (props.series.override_index_pattern && props.series.series_index_pattern) || props.panel.index_pattern; + const selectedUnitOptions = UNIT_OPTIONS.filter(o => o.value === model.unit); + return ( { label={ } fullWidth > - +
From 14694366529db81fbe8cf9b3642a2b7e6b1e97db Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 6 Apr 2020 08:26:54 -0700 Subject: [PATCH 5/7] Fixing placeholder --- .../vis_type_timeseries/public/components/aggs/growth_rate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js index c9bc88fd828e23..c844ee9f09abf6 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js @@ -145,7 +145,7 @@ export const GrowthRateAgg = props => { > Date: Mon, 6 Apr 2020 09:22:02 -0700 Subject: [PATCH 6/7] Fixing i18n label --- .../vis_type_timeseries/public/components/aggs/growth_rate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js index c844ee9f09abf6..c0fc0d3d2be0c5 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js @@ -45,7 +45,7 @@ const UNIT_OPTIONS = [ value: '', }, { - label: i18n.translate('visTypeTimeseries.units.perSecond', { + label: i18n.translate('visTypeTimeseries.units.perMillisecond', { defaultMessage: 'per millisecond', }), value: '1ms', From a058cc16cd7bb548743153d0cb2d2fc9f3f6ee60 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 8 Apr 2020 15:54:03 -0700 Subject: [PATCH 7/7] Changing from Growth Rate to Positive Rate --- .../public/components/aggs/agg_select.js | 6 +++--- .../aggs/{growth_rate.js => positive_rate.js} | 16 +++++++-------- .../public/components/lib/agg_to_component.js | 4 ++-- .../vis_type_timeseries/common/agg_lookup.js | 4 ++-- .../common/calculate_label.js | 6 +++--- .../request_processors/series/index.js | 4 ++-- .../{growth_rate.js => positive_rate.js} | 20 +++++++++---------- ...wth_rate.test.js => positive_rate.test.js} | 20 +++++++++---------- .../request_processors/table/index.js | 4 ++-- .../{growth_rate.js => positive_rate.js} | 6 +++--- 10 files changed, 45 insertions(+), 45 deletions(-) rename src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/{growth_rate.js => positive_rate.js} (91%) rename src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/{growth_rate.js => positive_rate.js} (73%) rename src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/{growth_rate.test.js => positive_rate.test.js} (80%) rename src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/{growth_rate.js => positive_rate.js} (84%) diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js index 69592587877eb0..8607ff184dfaa9 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js @@ -50,10 +50,10 @@ const metricAggs = [ value: 'filter_ratio', }, { - label: i18n.translate('visTypeTimeseries.aggSelect.metricsAggs.growthRateLabel', { - defaultMessage: 'Growth Rate', + label: i18n.translate('visTypeTimeseries.aggSelect.metricsAggs.positiveRateLabel', { + defaultMessage: 'Positive Rate', }), - value: 'growth_rate', + value: 'positive_rate', }, { label: i18n.translate('visTypeTimeseries.aggSelect.metricsAggs.maxLabel', { diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/positive_rate.js similarity index 91% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js rename to src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/positive_rate.js index c0fc0d3d2be0c5..39558fa3a9224e 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/growth_rate.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/positive_rate.js @@ -68,7 +68,7 @@ const UNIT_OPTIONS = [ }, ]; -export const GrowthRateAgg = props => { +export const PositiveRateAgg = props => { const defaults = { unit: '' }; const model = { ...defaults, ...props.model }; @@ -95,7 +95,7 @@ export const GrowthRateAgg = props => { @@ -114,7 +114,7 @@ export const GrowthRateAgg = props => { id={htmlId('field')} label={ } @@ -137,14 +137,14 @@ export const GrowthRateAgg = props => { id={htmlId('units')} label={ } fullWidth > {

@@ -178,7 +178,7 @@ export const GrowthRateAgg = props => { ); }; -GrowthRateAgg.propTypes = { +PositiveRateAgg.propTypes = { disableDelete: PropTypes.bool, fields: PropTypes.object, model: PropTypes.object, diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js index da0ed57834f7da..a53192afafdcc9 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js @@ -33,7 +33,7 @@ import { PercentileRankAgg } from '../aggs/percentile_rank'; import { Static } from '../aggs/static'; import { MathAgg } from '../aggs/math'; import { TopHitAgg } from '../aggs/top_hit'; -import { GrowthRateAgg } from '../aggs/growth_rate'; +import { PositiveRateAgg } from '../aggs/positive_rate'; export const aggToComponent = { count: StandardAgg, @@ -66,5 +66,5 @@ export const aggToComponent = { static: Static, math: MathAgg, top_hit: TopHitAgg, - growth_rate: GrowthRateAgg, + positive_rate: PositiveRateAgg, }; diff --git a/src/plugins/vis_type_timeseries/common/agg_lookup.js b/src/plugins/vis_type_timeseries/common/agg_lookup.js index 543e9f63669227..432da03e3d45dc 100644 --- a/src/plugins/vis_type_timeseries/common/agg_lookup.js +++ b/src/plugins/vis_type_timeseries/common/agg_lookup.js @@ -97,8 +97,8 @@ export const lookup = { defaultMessage: 'Static Value', }), top_hit: i18n.translate('visTypeTimeseries.aggLookup.topHitLabel', { defaultMessage: 'Top Hit' }), - growth_rate: i18n.translate('visTypeTimeseries.aggLookup.growthRateLabel', { - defaultMessage: 'Growth Rate', + positive_rate: i18n.translate('visTypeTimeseries.aggLookup.positiveRateLabel', { + defaultMessage: 'Positive Rate', }), }; diff --git a/src/plugins/vis_type_timeseries/common/calculate_label.js b/src/plugins/vis_type_timeseries/common/calculate_label.js index 362a46d7860447..71aa0aed7dc112 100644 --- a/src/plugins/vis_type_timeseries/common/calculate_label.js +++ b/src/plugins/vis_type_timeseries/common/calculate_label.js @@ -70,9 +70,9 @@ export function calculateLabel(metric, metrics) { defaultMessage: 'Filter Ratio', }); } - if (metric.type === 'growth_rate') { - return i18n.translate('visTypeTimeseries.calculateLabel.growthRateLabel', { - defaultMessage: 'Growth Rate of {field}', + if (metric.type === 'positive_rate') { + return i18n.translate('visTypeTimeseries.calculateLabel.positiveRateLabel', { + defaultMessage: 'Positive Rate of {field}', values: { field: metric.field }, }); } diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js index bbff19b26e5832..c727a3131f5dfe 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/index.js @@ -26,7 +26,7 @@ import { dateHistogram } from './date_histogram'; import { metricBuckets } from './metric_buckets'; import { siblingBuckets } from './sibling_buckets'; import { ratios as filterRatios } from './filter_ratios'; -import { growthRate } from './growth_rate'; +import { positiveRate } from './positive_rate'; import { normalizeQuery } from './normalize_query'; export const processors = [ @@ -39,6 +39,6 @@ export const processors = [ metricBuckets, siblingBuckets, filterRatios, - growthRate, + positiveRate, normalizeQuery, ]; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.js similarity index 73% rename from src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.js rename to src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.js index 5c6e322e25c2e2..1ff548cc19e022 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.js @@ -22,24 +22,24 @@ import { getIntervalAndTimefield } from '../../get_interval_and_timefield'; import { bucketTransform } from '../../helpers/bucket_transform'; import { set } from 'lodash'; -export const filter = metric => metric.type === 'growth_rate'; +export const filter = metric => metric.type === 'positive_rate'; -export const createGrowthRate = (doc, intervalString, aggRoot) => metric => { +export const createPositiveRate = (doc, intervalString, aggRoot) => metric => { const maxFn = bucketTransform.max; const derivativeFn = bucketTransform.derivative; const positiveOnlyFn = bucketTransform.positive_only; - const maxMetric = { id: `${metric.id}-growth-rate-max`, type: 'max', field: metric.field }; + const maxMetric = { id: `${metric.id}-positive-rate-max`, type: 'max', field: metric.field }; const derivativeMetric = { - id: `${metric.id}-growth-rate-derivative`, + id: `${metric.id}-positive-rate-derivative`, type: 'derivative', - field: `${metric.id}-growth-rate-max`, + field: `${metric.id}-positive-rate-max`, unit: metric.unit, }; const positiveOnlyMetric = { id: metric.id, type: 'positive_only', - field: `${metric.id}-growth-rate-derivative`, + field: `${metric.id}-positive-rate-derivative`, }; const fakeSeriesMetrics = [maxMetric, derivativeMetric, positiveOnlyMetric]; @@ -48,19 +48,19 @@ export const createGrowthRate = (doc, intervalString, aggRoot) => metric => { const derivativeBucket = derivativeFn(derivativeMetric, fakeSeriesMetrics, intervalString); const positiveOnlyBucket = positiveOnlyFn(positiveOnlyMetric, fakeSeriesMetrics, intervalString); - set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-growth-rate-max`, maxBucket); - set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-growth-rate-derivative`, derivativeBucket); + set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-positive-rate-max`, maxBucket); + set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-positive-rate-derivative`, derivativeBucket); set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, positiveOnlyBucket); }; -export function growthRate(req, panel, series, esQueryConfig, indexPatternObject, capabilities) { +export function positiveRate(req, panel, series, esQueryConfig, indexPatternObject, capabilities) { return next => doc => { const { interval } = getIntervalAndTimefield(panel, series, indexPatternObject); const { intervalString } = getBucketSize(req, interval, capabilities); if (series.metrics.some(filter)) { series.metrics .filter(filter) - .forEach(createGrowthRate(doc, intervalString, `aggs.${series.id}.aggs`)); + .forEach(createPositiveRate(doc, intervalString, `aggs.${series.id}.aggs`)); return next(doc); } return next(doc); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.test.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.test.js similarity index 80% rename from src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.test.js rename to src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.test.js index e5bc1a26bef950..946884c05c722a 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/growth_rate.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/series/positive_rate.test.js @@ -17,8 +17,8 @@ * under the License. */ -import { growthRate } from './growth_rate'; -describe('rate(req, panel, series)', () => { +import { positiveRate } from './positive_rate'; +describe('positiveRate(req, panel, series)', () => { let panel; let series; let req; @@ -34,7 +34,7 @@ describe('rate(req, panel, series)', () => { metrics: [ { id: 'metric-1', - type: 'growth_rate', + type: 'positive_rate', field: 'system.network.out.bytes', unit: '1s', }, @@ -52,32 +52,32 @@ describe('rate(req, panel, series)', () => { test('calls next when finished', () => { const next = jest.fn(); - growthRate(req, panel, series)(next)({}); + positiveRate(req, panel, series)(next)({}); expect(next.mock.calls.length).toEqual(1); }); - test('returns growth rate aggs', () => { + test('returns positive rate aggs', () => { const next = doc => doc; - const doc = growthRate(req, panel, series)(next)({}); + const doc = positiveRate(req, panel, series)(next)({}); expect(doc).toEqual({ aggs: { test: { aggs: { timeseries: { aggs: { - 'metric-1-growth-rate-max': { + 'metric-1-positive-rate-max': { max: { field: 'system.network.out.bytes' }, }, - 'metric-1-growth-rate-derivative': { + 'metric-1-positive-rate-derivative': { derivative: { - buckets_path: 'metric-1-growth-rate-max', + buckets_path: 'metric-1-positive-rate-max', gap_policy: 'skip', unit: '1s', }, }, 'metric-1': { bucket_script: { - buckets_path: { value: 'metric-1-growth-rate-derivative[normalized_value]' }, + buckets_path: { value: 'metric-1-positive-rate-derivative[normalized_value]' }, script: { source: 'params.value > 0.0 ? params.value : 0.0', lang: 'painless', diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js index 1e084044756439..5864d2538005d8 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/index.js @@ -26,7 +26,7 @@ import { metricBuckets } from './metric_buckets'; import { siblingBuckets } from './sibling_buckets'; import { ratios as filterRatios } from './filter_ratios'; import { normalizeQuery } from './normalize_query'; -import { growthRate } from './growth_rate'; +import { positiveRate } from './positive_rate'; export const processors = [ query, @@ -37,6 +37,6 @@ export const processors = [ metricBuckets, siblingBuckets, filterRatios, - growthRate, + positiveRate, normalizeQuery, ]; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/growth_rate.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/positive_rate.js similarity index 84% rename from src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/growth_rate.js rename to src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/positive_rate.js index a63c2ae9fc1797..da4b834822d706 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/growth_rate.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/positive_rate.js @@ -20,15 +20,15 @@ import { getBucketSize } from '../../helpers/get_bucket_size'; import { getIntervalAndTimefield } from '../../get_interval_and_timefield'; import { calculateAggRoot } from './calculate_agg_root'; -import { createGrowthRate, filter } from '../series/growth_rate'; +import { createPositiveRate, filter } from '../series/positive_rate'; -export function growthRate(req, panel, esQueryConfig, indexPatternObject) { +export function positiveRate(req, panel, esQueryConfig, indexPatternObject) { return next => doc => { const { interval } = getIntervalAndTimefield(panel, {}, indexPatternObject); const { intervalString } = getBucketSize(req, interval); panel.series.forEach(column => { const aggRoot = calculateAggRoot(doc, column); - column.metrics.filter(filter).forEach(createGrowthRate(doc, intervalString, aggRoot)); + column.metrics.filter(filter).forEach(createPositiveRate(doc, intervalString, aggRoot)); }); return next(doc); };