From e1cea8eb513c06ef7de4a007c7419acdcb716e88 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 2 Apr 2020 16:02:02 -0700 Subject: [PATCH] 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, ];