From f2d690f92b049b462669fb1c5b75edbcbb4328e6 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Mon, 4 Mar 2019 17:31:42 +0300 Subject: [PATCH] influxdb: fix trends query, closes #675 --- .../specs/influxdbConnector.test.js | 18 ++++++++++++++-- .../connectors/influxdb/influxdbConnector.js | 21 ++++++++++++++----- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/datasource-zabbix/specs/influxdbConnector.test.js b/src/datasource-zabbix/specs/influxdbConnector.test.js index 089770e..a259b6a 100644 --- a/src/datasource-zabbix/specs/influxdbConnector.test.js +++ b/src/datasource-zabbix/specs/influxdbConnector.test.js @@ -34,7 +34,7 @@ describe('InfluxDBConnector', () => { it('should use MEAN instead of AVG', () => { const { itemids, range, intervalSec, table } = ctx.defaultQueryParams; - const aggFunction = 'AVG'; + const aggFunction = 'avg'; const query = ctx.influxDBConnector.buildHistoryQuery(itemids, table, range, intervalSec, aggFunction); const expected = compactQuery(`SELECT MEAN("value") FROM "history" WHERE ("itemid" = '123' OR "itemid" = '234') AND "time" >= 15000s AND "time" <= 15100s @@ -100,7 +100,21 @@ describe('InfluxDBConnector', () => { const items = [ { itemid: '123', value_type: 3 } ]; - const expectedQuery = compactQuery(`SELECT MEAN("value") + const expectedQuery = compactQuery(`SELECT MEAN("value_avg") + FROM "longterm"."history_uint" WHERE ("itemid" = '123') AND "time" >= 15000s AND "time" <= 15100s + GROUP BY time(5s), "itemid" fill(none) + `); + ctx.influxDBConnector.getTrends(items, timeFrom, timeTill, options); + expect(ctx.influxDBConnector.invokeInfluxDBQuery).toHaveBeenCalledWith(expectedQuery); + }); + + it('should use proper value column if retention policy set (trends used)', () => { + const { timeFrom, timeTill } = ctx.defaultQueryParams.range; + const options = { intervalMs: 5000, consolidateBy: 'max' }; + const items = [ + { itemid: '123', value_type: 3 } + ]; + const expectedQuery = compactQuery(`SELECT MAX("value_max") FROM "longterm"."history_uint" WHERE ("itemid" = '123') AND "time" >= 15000s AND "time" <= 15100s GROUP BY time(5s), "itemid" fill(none) `); diff --git a/src/datasource-zabbix/zabbix/connectors/influxdb/influxdbConnector.js b/src/datasource-zabbix/zabbix/connectors/influxdb/influxdbConnector.js index e80fdf6..512f2da 100644 --- a/src/datasource-zabbix/zabbix/connectors/influxdb/influxdbConnector.js +++ b/src/datasource-zabbix/zabbix/connectors/influxdb/influxdbConnector.js @@ -1,6 +1,14 @@ import _ from 'lodash'; import { compactQuery } from '../../../utils'; -import { DBConnector, HISTORY_TO_TABLE_MAP, consolidateByFunc } from '../dbConnector'; +import { DBConnector, HISTORY_TO_TABLE_MAP, consolidateByTrendColumns } from '../dbConnector'; + +const consolidateByFunc = { + 'avg': 'MEAN', + 'min': 'MIN', + 'max': 'MAX', + 'sum': 'SUM', + 'count': 'COUNT' +}; export class InfluxDBConnector extends DBConnector { constructor(options, datasourceSrv) { @@ -25,14 +33,13 @@ export class InfluxDBConnector extends DBConnector { const range = { timeFrom, timeTill }; consolidateBy = consolidateBy || 'avg'; - const aggFunction = consolidateByFunc[consolidateBy] || consolidateBy; // Group items by value type and perform request for each value type const grouped_items = _.groupBy(items, 'value_type'); const promises = _.map(grouped_items, (items, value_type) => { const itemids = _.map(items, 'itemid'); const table = HISTORY_TO_TABLE_MAP[value_type]; - const query = this.buildHistoryQuery(itemids, table, range, intervalSec, aggFunction, retentionPolicy); + const query = this.buildHistoryQuery(itemids, table, range, intervalSec, consolidateBy, retentionPolicy); return this.invokeInfluxDBQuery(query); }); @@ -51,9 +58,13 @@ export class InfluxDBConnector extends DBConnector { buildHistoryQuery(itemids, table, range, intervalSec, aggFunction, retentionPolicy) { const { timeFrom, timeTill } = range; const measurement = retentionPolicy ? `"${retentionPolicy}"."${table}"` : `"${table}"`; - const AGG = aggFunction === 'AVG' ? 'MEAN' : aggFunction; + let value = 'value'; + if (retentionPolicy) { + value = consolidateByTrendColumns[aggFunction] || 'value_avg'; + } + const aggregation = consolidateByFunc[aggFunction] || aggFunction; const where_clause = this.buildWhereClause(itemids); - const query = `SELECT ${AGG}("value") FROM ${measurement} + const query = `SELECT ${aggregation}("${value}") FROM ${measurement} WHERE ${where_clause} AND "time" >= ${timeFrom}s AND "time" <= ${timeTill}s GROUP BY time(${intervalSec}s), "itemid" fill(none)`; return compactQuery(query);