Fill trends with null values

This commit is contained in:
Alexander Zobnin
2020-12-22 16:29:22 +03:00
parent 83618178f0
commit 1d15f3c11b
2 changed files with 43 additions and 3 deletions

View File

@@ -6,7 +6,7 @@ import * as utils from './utils';
import * as migrations from './migrations'; import * as migrations from './migrations';
import * as metricFunctions from './metricFunctions'; import * as metricFunctions from './metricFunctions';
import * as c from './constants'; import * as c from './constants';
import { align } from './timeseries'; import { align, fillTrendsWithNulls } from './timeseries';
import dataProcessor from './dataProcessor'; import dataProcessor from './dataProcessor';
import responseHandler from './responseHandler'; import responseHandler from './responseHandler';
import problemsHandler from './problemsHandler'; import problemsHandler from './problemsHandler';
@@ -251,13 +251,16 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
let getHistoryPromise; let getHistoryPromise;
options.valueType = this.getTrendValueType(target); options.valueType = this.getTrendValueType(target);
options.consolidateBy = getConsolidateBy(target) || options.valueType; options.consolidateBy = getConsolidateBy(target) || options.valueType;
const disableDataAlignment = this.disableDataAlignment || target.options?.disableDataAlignment;
if (useTrends) { if (useTrends) {
getHistoryPromise = this.zabbix.getTrends(items, timeRange, options); getHistoryPromise = this.zabbix.getTrends(items, timeRange, options)
.then(timeseries => {
return !disableDataAlignment ? this.fillTrendTimeSeriesWithNulls(timeseries) : timeseries;
});
} else { } else {
getHistoryPromise = this.zabbix.getHistoryTS(items, timeRange, options) getHistoryPromise = this.zabbix.getHistoryTS(items, timeRange, options)
.then(timeseries => { .then(timeseries => {
const disableDataAlignment = this.disableDataAlignment || target.options?.disableDataAlignment;
return !disableDataAlignment ? this.alignTimeSeriesData(timeseries) : timeseries; return !disableDataAlignment ? this.alignTimeSeriesData(timeseries) : timeseries;
}); });
} }
@@ -284,6 +287,13 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
return timeseries; return timeseries;
} }
fillTrendTimeSeriesWithNulls(timeseries: any[]) {
for (const ts of timeseries) {
ts.datapoints = fillTrendsWithNulls(ts.datapoints);
}
return timeseries;
}
applyDataProcessingFunctions(timeseries_data, target) { applyDataProcessingFunctions(timeseries_data, target) {
const transformFunctions = bindFunctionDefs(target.functions, 'Transform'); const transformFunctions = bindFunctionDefs(target.functions, 'Transform');
const aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate'); const aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');

View File

@@ -17,6 +17,8 @@ import { TimeSeriesPoints, TimeSeriesValue } from '@grafana/data';
const POINT_VALUE = 0; const POINT_VALUE = 0;
const POINT_TIMESTAMP = 1; const POINT_TIMESTAMP = 1;
const HOUR_MS = 3600 * 1000;
/** /**
* Downsample time series by using given function (avg, min, max). * Downsample time series by using given function (avg, min, max).
*/ */
@@ -118,6 +120,34 @@ function detectSeriesInterval(datapoints: TimeSeriesPoints): number {
return intervalSec * 1000; return intervalSec * 1000;
} }
export function fillTrendsWithNulls(datapoints: TimeSeriesPoints): TimeSeriesPoints {
if (datapoints.length <= 1) {
return datapoints;
}
const interval = HOUR_MS;
const filled_ts: TimeSeriesPoints = [];
let frame_ts = datapoints[0][POINT_TIMESTAMP];
let point_frame_ts = frame_ts;
let point: TimeSeriesValue[];
for (let i = 0; i < datapoints.length; i++) {
point = datapoints[i];
point_frame_ts = point[POINT_TIMESTAMP];
if (point_frame_ts > frame_ts) {
// Move frame window to next non-empty interval and fill empty by null
while (frame_ts < point_frame_ts) {
filled_ts.push([null, frame_ts]);
frame_ts += interval;
}
}
filled_ts.push(point);
frame_ts += interval;
}
return filled_ts;
}
/** /**
* Group points by given time interval * Group points by given time interval
* datapoints: [[<value>, <unixtime>], ...] * datapoints: [[<value>, <unixtime>], ...]