Add $__range_series variable for calculating function over the whole series, #531

This commit is contained in:
Alexander Zobnin
2019-10-09 15:15:51 +03:00
parent ca50d0db98
commit 1827aa942a
5 changed files with 40 additions and 3 deletions

View File

@@ -37,3 +37,5 @@ export const TRIGGER_SEVERITY = [
/** Minimum interval for SLA over time (1 hour) */ /** Minimum interval for SLA over time (1 hour) */
export const MIN_SLA_INTERVAL = 3600; export const MIN_SLA_INTERVAL = 3600;
export const RANGE_VARIABLE_VALUE = 'range_series';

View File

@@ -1,9 +1,8 @@
import _ from 'lodash'; import _ from 'lodash';
import * as utils from './utils'; import * as utils from './utils';
import ts from './timeseries'; import ts, { groupBy_perf as groupBy } from './timeseries';
let downsampleSeries = ts.downsample; let downsampleSeries = ts.downsample;
let groupBy = ts.groupBy_perf;
let groupBy_exported = (interval, groupFunc, datapoints) => groupBy(datapoints, interval, groupFunc); let groupBy_exported = (interval, groupFunc, datapoints) => groupBy(datapoints, interval, groupFunc);
let sumSeries = ts.sumSeries; let sumSeries = ts.sumSeries;
let delta = ts.delta; let delta = ts.delta;

View File

@@ -111,6 +111,9 @@ export class ZabbixDatasource {
let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000); let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);
let timeTo = Math.ceil(dateMath.parse(options.range.to) / 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 // Prevent changes of original object
let target = _.cloneDeep(t); let target = _.cloneDeep(t);

View File

@@ -11,6 +11,7 @@
import _ from 'lodash'; import _ from 'lodash';
import * as utils from './utils'; import * as utils from './utils';
import * as c from './constants';
const POINT_VALUE = 0; const POINT_VALUE = 0;
const POINT_TIMESTAMP = 1; 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) { if (datapoints.length === 0) {
return []; return [];
} }
if (interval === c.RANGE_VARIABLE_VALUE) {
return groupByRange(datapoints, groupByCallback);
}
let ms_interval = utils.parseInterval(interval); let ms_interval = utils.parseInterval(interval);
let grouped_series = []; let grouped_series = [];
let frame_values = []; let frame_values = [];
@@ -132,6 +137,19 @@ function groupBy_perf(datapoints, interval, groupByCallback) {
return grouped_series; 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. * Summarize set of time series into one.
* @param {datapoints[]} timeseries array of time series * @param {datapoints[]} timeseries array of time series
@@ -495,6 +513,7 @@ const exportedFunctions = {
downsample, downsample,
groupBy, groupBy,
groupBy_perf, groupBy_perf,
groupByRange,
sumSeries, sumSeries,
scale, scale,
offset, offset,

View File

@@ -1,5 +1,7 @@
import _ from 'lodash'; import _ from 'lodash';
import moment from 'moment'; import moment from 'moment';
import kbn from 'grafana/app/core/utils/kbn';
import * as c from './constants';
/** /**
* Expand Zabbix item name * 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) { export function buildRegex(str) {
var matches = str.match(regexPattern); var matches = str.match(regexPattern);
var pattern = matches[1]; var pattern = matches[1];