From 1827aa942acce0860a52f6a27fc1647e5a11bee6 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Wed, 9 Oct 2019 15:15:51 +0300 Subject: [PATCH] Add $__range_series variable for calculating function over the whole series, #531 --- src/datasource-zabbix/constants.js | 2 ++ src/datasource-zabbix/dataProcessor.js | 3 +-- src/datasource-zabbix/datasource.js | 3 +++ src/datasource-zabbix/timeseries.js | 21 ++++++++++++++++++++- src/datasource-zabbix/utils.js | 14 ++++++++++++++ 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/datasource-zabbix/constants.js b/src/datasource-zabbix/constants.js index af3c8d122..79d2edcec 100644 --- a/src/datasource-zabbix/constants.js +++ b/src/datasource-zabbix/constants.js @@ -37,3 +37,5 @@ export const TRIGGER_SEVERITY = [ /** Minimum interval for SLA over time (1 hour) */ export const MIN_SLA_INTERVAL = 3600; + +export const RANGE_VARIABLE_VALUE = 'range_series'; diff --git a/src/datasource-zabbix/dataProcessor.js b/src/datasource-zabbix/dataProcessor.js index 4ff8c9e33..e69ceda68 100644 --- a/src/datasource-zabbix/dataProcessor.js +++ b/src/datasource-zabbix/dataProcessor.js @@ -1,9 +1,8 @@ import _ from 'lodash'; import * as utils from './utils'; -import ts from './timeseries'; +import ts, { groupBy_perf as groupBy } from './timeseries'; let downsampleSeries = ts.downsample; -let groupBy = ts.groupBy_perf; let groupBy_exported = (interval, groupFunc, datapoints) => groupBy(datapoints, interval, groupFunc); let sumSeries = ts.sumSeries; let delta = ts.delta; diff --git a/src/datasource-zabbix/datasource.js b/src/datasource-zabbix/datasource.js index 09faf6dbd..94c29c887 100644 --- a/src/datasource-zabbix/datasource.js +++ b/src/datasource-zabbix/datasource.js @@ -111,6 +111,9 @@ export class ZabbixDatasource { let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000); let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000); + // Add range variables + options.scopedVars = Object.assign({}, options.scopedVars, utils.getRangeScopedVars(options.range)); + // Prevent changes of original object let target = _.cloneDeep(t); diff --git a/src/datasource-zabbix/timeseries.js b/src/datasource-zabbix/timeseries.js index de20b4ae6..34853e88a 100644 --- a/src/datasource-zabbix/timeseries.js +++ b/src/datasource-zabbix/timeseries.js @@ -11,6 +11,7 @@ import _ from 'lodash'; import * as utils from './utils'; +import * as c from './constants'; const POINT_VALUE = 0; const POINT_TIMESTAMP = 1; @@ -94,11 +95,15 @@ function groupBy(datapoints, interval, groupByCallback) { })); } -function groupBy_perf(datapoints, interval, groupByCallback) { +export function groupBy_perf(datapoints, interval, groupByCallback) { if (datapoints.length === 0) { return []; } + if (interval === c.RANGE_VARIABLE_VALUE) { + return groupByRange(datapoints, groupByCallback); + } + let ms_interval = utils.parseInterval(interval); let grouped_series = []; let frame_values = []; @@ -132,6 +137,19 @@ function groupBy_perf(datapoints, interval, groupByCallback) { return grouped_series; } +export function groupByRange(datapoints, groupByCallback) { + const frame_values = []; + const frame_start = datapoints[0][POINT_TIMESTAMP]; + const frame_end = datapoints[datapoints.length - 1][POINT_TIMESTAMP]; + let point; + for (let i=0; i < datapoints.length; i++) { + point = datapoints[i]; + frame_values.push(point[POINT_VALUE]); + } + const frame_value = groupByCallback(frame_values); + return [ [frame_value, frame_start], [frame_value, frame_end] ]; +} + /** * Summarize set of time series into one. * @param {datapoints[]} timeseries array of time series @@ -495,6 +513,7 @@ const exportedFunctions = { downsample, groupBy, groupBy_perf, + groupByRange, sumSeries, scale, offset, diff --git a/src/datasource-zabbix/utils.js b/src/datasource-zabbix/utils.js index 517569f75..454ebaa3b 100644 --- a/src/datasource-zabbix/utils.js +++ b/src/datasource-zabbix/utils.js @@ -1,5 +1,7 @@ import _ from 'lodash'; import moment from 'moment'; +import kbn from 'grafana/app/core/utils/kbn'; +import * as c from './constants'; /** * Expand Zabbix item name @@ -141,6 +143,18 @@ export function isTemplateVariable(str, templateVariables) { } } +export function getRangeScopedVars(range) { + const msRange = range.to.diff(range.from); + const sRange = Math.round(msRange / 1000); + const regularRange = kbn.secondsToHms(msRange / 1000); + return { + __range_ms: { text: msRange, value: msRange }, + __range_s: { text: sRange, value: sRange }, + __range: { text: regularRange, value: regularRange }, + __range_series: {text: c.RANGE_VARIABLE_VALUE, value: c.RANGE_VARIABLE_VALUE}, + }; +} + export function buildRegex(str) { var matches = str.match(regexPattern); var pattern = matches[1];