From c3da65e23716dcabb9102a43101914d5ddd90582 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Sun, 19 Jun 2016 20:09:59 +0300 Subject: [PATCH] Resolved #201 - add scale() function. --- src/datasource-zabbix/DataProcessor.js | 10 ++++++++ src/datasource-zabbix/datasource.js | 4 ++-- .../metric-function-editor.directive.js | 3 ++- src/datasource-zabbix/metricFunctions.js | 24 +++++++++++++++++-- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/datasource-zabbix/DataProcessor.js b/src/datasource-zabbix/DataProcessor.js index e2743bd..0c311bc 100644 --- a/src/datasource-zabbix/DataProcessor.js +++ b/src/datasource-zabbix/DataProcessor.js @@ -142,6 +142,15 @@ export default class DataProcessor { return timeseries; } + static scale(factor, datapoints) { + return _.map(datapoints, point => { + return [ + point[0] * factor, + point[1] + ]; + }); + } + static groupByWrapper(interval, groupFunc, datapoints) { var groupByCallback = DataProcessor.aggregationFunctions[groupFunc]; return DataProcessor.groupBy(interval, groupByCallback, datapoints); @@ -171,6 +180,7 @@ export default class DataProcessor { static get metricFunctions() { return { groupBy: this.groupByWrapper, + scale: this.scale, aggregateBy: this.aggregateByWrapper, average: _.partial(this.aggregateWrapper, this.AVERAGE), min: _.partial(this.aggregateWrapper, this.MIN), diff --git a/src/datasource-zabbix/datasource.js b/src/datasource-zabbix/datasource.js index a3f1f12..fa2153f 100644 --- a/src/datasource-zabbix/datasource.js +++ b/src/datasource-zabbix/datasource.js @@ -176,10 +176,10 @@ export class ZabbixAPIDatasource { // Apply transformation functions timeseries_data = _.map(timeseries_data, timeseries => { - // Filter only transform functions + // Filter only transformation functions var transformFunctions = bindFunctionDefs(target.functions, 'Transform', DataProcessor); - // Metric data processing + // Timeseries processing var dp = timeseries.datapoints; for (var i = 0; i < transformFunctions.length; i++) { dp = transformFunctions[i](dp); diff --git a/src/datasource-zabbix/metric-function-editor.directive.js b/src/datasource-zabbix/metric-function-editor.directive.js index e001194..8862c01 100644 --- a/src/datasource-zabbix/metric-function-editor.directive.js +++ b/src/datasource-zabbix/metric-function-editor.directive.js @@ -102,7 +102,8 @@ angular $input.attr('data-provide', 'typeahead'); var options = funcDef.params[paramIndex].options; - if (funcDef.params[paramIndex].type === 'int') { + if (funcDef.params[paramIndex].type === 'int' || + funcDef.params[paramIndex].type === 'float') { options = _.map(options, function(val) { return val.toString(); }); } diff --git a/src/datasource-zabbix/metricFunctions.js b/src/datasource-zabbix/metricFunctions.js index 024aa0d..5616bc2 100644 --- a/src/datasource-zabbix/metricFunctions.js +++ b/src/datasource-zabbix/metricFunctions.js @@ -30,6 +30,15 @@ addFuncDef({ defaultParams: ['1m', 'avg'], }); +addFuncDef({ + name: 'scale', + category: 'Transform', + params: [ + { name: 'factor', type: 'float', options: [100, 0.01, 10, -1]} + ], + defaultParams: [100], +}); + addFuncDef({ name: 'sumSeries', category: 'Aggregate', @@ -126,8 +135,16 @@ class FuncInstance { // Bind function arguments var bindedFunc = func; + var param; for (var i = 0; i < this.params.length; i++) { - bindedFunc = _.partial(bindedFunc, this.params[i]); + param = this.params[i]; + + // Convert numeric params + if (this.def.params[i].type === 'int' || + this.def.params[i].type === 'float') { + param = Number(param); + } + bindedFunc = _.partial(bindedFunc, param); } return bindedFunc; } else { @@ -140,7 +157,10 @@ class FuncInstance { var parameters = _.map(this.params, function(value, index) { var paramType = this.def.params[index].type; - if (paramType === 'int' || paramType === 'value_or_series' || paramType === 'boolean') { + if (paramType === 'int' || + paramType === 'float' || + paramType === 'value_or_series' || + paramType === 'boolean') { return value; } else if (paramType === 'int_or_interval' && $.isNumeric(value)) {