From 376183e8e4a2a9896c19b5bf31eba27575ddf857 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Wed, 15 Jan 2020 11:02:17 +0300 Subject: [PATCH] Transform percentile function, closes #868 --- src/datasource-zabbix/dataProcessor.js | 22 ++++++++++++---------- src/datasource-zabbix/metricFunctions.js | 12 +++++++++++- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/datasource-zabbix/dataProcessor.js b/src/datasource-zabbix/dataProcessor.js index eb5d1a1bf..a8ecdb635 100644 --- a/src/datasource-zabbix/dataProcessor.js +++ b/src/datasource-zabbix/dataProcessor.js @@ -2,6 +2,14 @@ import _ from 'lodash'; import * as utils from './utils'; import ts, { groupBy_perf as groupBy } from './timeseries'; +let SUM = ts.SUM; +let COUNT = ts.COUNT; +let AVERAGE = ts.AVERAGE; +let MIN = ts.MIN; +let MAX = ts.MAX; +let MEDIAN = ts.MEDIAN; +let PERCENTILE = ts.PERCENTILE; + let downsampleSeries = ts.downsample; let groupBy_exported = (interval, groupFunc, datapoints) => groupBy(datapoints, interval, groupFunc); let sumSeries = ts.sumSeries; @@ -11,14 +19,7 @@ let scale = (factor, datapoints) => ts.scale_perf(datapoints, factor); let offset = (delta, datapoints) => ts.offset(datapoints, delta); let simpleMovingAverage = (n, datapoints) => ts.simpleMovingAverage(datapoints, n); let expMovingAverage = (a, datapoints) => ts.expMovingAverage(datapoints, a); - -let SUM = ts.SUM; -let COUNT = ts.COUNT; -let AVERAGE = ts.AVERAGE; -let MIN = ts.MIN; -let MAX = ts.MAX; -let MEDIAN = ts.MEDIAN; -let PERCENTILE = ts.PERCENTILE; +let percentile = (interval, n, datapoints) => groupBy(datapoints, interval, _.partial(PERCENTILE, n)); function limit(order, n, orderByFunc, timeseries) { let orderByCallback = aggregationFunctions[orderByFunc]; @@ -120,7 +121,7 @@ function aggregateWrapper(groupByCallback, interval, datapoints) { return groupBy(sortedPoints, interval, groupByCallback); } -function percentile(interval, n, datapoints) { +function percentileAgg(interval, n, datapoints) { const flattenedPoints = ts.flattenDatapoints(datapoints); // groupBy_perf works with sorted series only const sortedPoints = ts.sortByTime(flattenedPoints); @@ -153,10 +154,11 @@ let metricFunctions = { rate: rate, movingAverage: simpleMovingAverage, exponentialMovingAverage: expMovingAverage, + percentile: percentile, transformNull: transformNull, aggregateBy: aggregateByWrapper, // Predefined aggs - percentile: percentile, + percentileAgg: percentileAgg, average: _.partial(aggregateWrapper, AVERAGE), min: _.partial(aggregateWrapper, MIN), max: _.partial(aggregateWrapper, MAX), diff --git a/src/datasource-zabbix/metricFunctions.js b/src/datasource-zabbix/metricFunctions.js index 891e27104..150e03a1e 100644 --- a/src/datasource-zabbix/metricFunctions.js +++ b/src/datasource-zabbix/metricFunctions.js @@ -85,6 +85,16 @@ addFuncDef({ defaultParams: [0.2], }); +addFuncDef({ + name: 'percentile', + category: 'Transform', + params: [ + { name: 'interval', type: 'string' }, + { name: 'percent', type: 'float', options: [25, 50, 75, 90, 95, 99, 99.9] } + ], + defaultParams: ['1m', 95], +}); + addFuncDef({ name: 'removeAboveValue', category: 'Transform', @@ -140,7 +150,7 @@ addFuncDef({ }); addFuncDef({ - name: 'percentile', + name: 'percentileAgg', category: 'Aggregate', params: [ { name: 'interval', type: 'string' },