From 6da2479e9d74efa5c7245eeb541660822735ca34 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Tue, 30 Oct 2018 19:35:23 +0300 Subject: [PATCH] influx connector: refactor --- .../zabbix/connectors/dbConnector.js | 38 +++++++++++++++++ .../connectors/influxdb/influxdbConnector.js | 41 ++----------------- .../zabbix/connectors/sql/sqlConnector.js | 29 ------------- 3 files changed, 42 insertions(+), 66 deletions(-) diff --git a/src/datasource-zabbix/zabbix/connectors/dbConnector.js b/src/datasource-zabbix/zabbix/connectors/dbConnector.js index 28fa264..8b23429 100644 --- a/src/datasource-zabbix/zabbix/connectors/dbConnector.js +++ b/src/datasource-zabbix/zabbix/connectors/dbConnector.js @@ -54,6 +54,10 @@ export default class DBConnector { getTrends() { throw new ZabbixNotImplemented('getTrends()'); } + + handleGrafanaTSResponse(history, items, addHostName = true) { + return convertGrafanaTSResponse(history, items, addHostName); + } } // Define Zabbix DB Connector exception type for non-implemented methods @@ -68,3 +72,37 @@ export class ZabbixNotImplemented { return this.message; } } + +/** + * Converts time series returned by the data source into format that Grafana expects + * time_series is Array of series: + * ``` + * [{ + * name: string, + * points: Array<[value: number, timestamp: number]> + * }] + * ``` + */ +function convertGrafanaTSResponse(time_series, items, addHostName) { + //uniqBy is needed to deduplicate + var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid'); + let grafanaSeries = _.map(_.compact(time_series), series => { + let itemid = series.name; + var item = _.find(items, {'itemid': itemid}); + var alias = item.name; + //only when actual multi hosts selected + if (_.keys(hosts).length > 1 && addHostName) { + var host = _.find(hosts, {'hostid': item.hostid}); + alias = host.name + ": " + alias; + } + // CachingProxy deduplicates requests and returns one time series for equal queries. + // Clone is needed to prevent changing of series object shared between all targets. + let datapoints = _.cloneDeep(series.points); + return { + target: alias, + datapoints: datapoints + }; + }); + + return _.sortBy(grafanaSeries, 'target'); +} diff --git a/src/datasource-zabbix/zabbix/connectors/influxdb/influxdbConnector.js b/src/datasource-zabbix/zabbix/connectors/influxdb/influxdbConnector.js index 4f7bbfa..97e6a14 100644 --- a/src/datasource-zabbix/zabbix/connectors/influxdb/influxdbConnector.js +++ b/src/datasource-zabbix/zabbix/connectors/influxdb/influxdbConnector.js @@ -1,6 +1,5 @@ import _ from 'lodash'; import DBConnector from '../dbConnector'; -// import InfluxSeries from 'grafana/app/plugins/datasource/influxdb/influx_series'; const DEFAULT_QUERY_LIMIT = 10000; const HISTORY_TO_TABLE_MAP = { @@ -36,8 +35,7 @@ export class InfluxDBConnector extends DBConnector { super(options, backendSrv, datasourceSrv); this.limit = options.limit || DEFAULT_QUERY_LIMIT; super.loadDBDataSource().then(ds => { - console.log(ds); - this.ds = ds; + this.influxDS = ds; return ds; }); } @@ -46,7 +44,7 @@ export class InfluxDBConnector extends DBConnector { * Try to invoke test query for one of Zabbix database tables. */ testDataSource() { - return this.ds.testDatasource(); + return this.influxDS.testDatasource(); } getHistory(items, timeFrom, timeTill, options) { @@ -62,7 +60,6 @@ export class InfluxDBConnector extends DBConnector { const itemids = _.map(items, 'itemid'); const table = HISTORY_TO_TABLE_MAP[value_type]; const query = this.buildHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction); - console.log(query); return this.invokeInfluxDBQuery(query); }); @@ -88,7 +85,6 @@ export class InfluxDBConnector extends DBConnector { let valueColumn = _.includes(['avg', 'min', 'max', 'sum'], consolidateBy) ? consolidateBy : 'avg'; valueColumn = consolidateByTrendColumns[valueColumn]; const query = this.buildTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn); - console.log(query); return this.invokeInfluxDBQuery(query); }); @@ -122,14 +118,9 @@ export class InfluxDBConnector extends DBConnector { return `(${itemidsWhere})`; } - handleGrafanaTSResponse(history, items, addHostName = true) { - return convertGrafanaTSResponse(history, items, addHostName); - } - invokeInfluxDBQuery(query) { - return this.ds._seriesQuery(query).then(data => { - return data && data.results ? data.results : []; - }); + return this.influxDS._seriesQuery(query) + .then(data => data && data.results ? data.results : []); } } @@ -168,30 +159,6 @@ function handleInfluxHistoryResponse(results) { return seriesList; } -function convertGrafanaTSResponse(time_series, items, addHostName) { - //uniqBy is needed to deduplicate - var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid'); - let grafanaSeries = _.map(_.compact(time_series), series => { - let itemid = series.name; - var item = _.find(items, {'itemid': itemid}); - var alias = item.name; - //only when actual multi hosts selected - if (_.keys(hosts).length > 1 && addHostName) { - var host = _.find(hosts, {'hostid': item.hostid}); - alias = host.name + ": " + alias; - } - // CachingProxy deduplicates requests and returns one time series for equal queries. - // Clone is needed to prevent changing of series object shared between all targets. - let datapoints = _.cloneDeep(series.points); - return { - target: alias, - datapoints: datapoints - }; - }); - - return _.sortBy(grafanaSeries, 'target'); -} - function compactQuery(query) { return query.replace(/\s+/g, ' '); } diff --git a/src/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js b/src/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js index f536c47..127789f 100644 --- a/src/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js +++ b/src/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js @@ -112,10 +112,6 @@ export class SQLConnector extends DBConnector { }); } - handleGrafanaTSResponse(history, items, addHostName = true) { - return convertGrafanaTSResponse(history, items, addHostName); - } - invokeSQLQuery(query) { let queryDef = { refId: 'A', @@ -143,31 +139,6 @@ export class SQLConnector extends DBConnector { } } -/////////////////////////////////////////////////////////////////////////////// - -function convertGrafanaTSResponse(time_series, items, addHostName) { - //uniqBy is needed to deduplicate - var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid'); - let grafanaSeries = _.map(_.compact(time_series), series => { - let itemid = series.name; - var item = _.find(items, {'itemid': itemid}); - var alias = item.name; - //only when actual multi hosts selected - if (_.keys(hosts).length > 1 && addHostName) { - var host = _.find(hosts, {'hostid': item.hostid}); - alias = host.name + ": " + alias; - } - // CachingProxy deduplicates requests and returns one time series for equal queries. - // Clone is needed to prevent changing of series object shared between all targets. - let datapoints = _.cloneDeep(series.points); - return { - target: alias, - datapoints: datapoints - }; - }); - - return _.sortBy(grafanaSeries, 'target'); -} function compactSQLQuery(query) { return query.replace(/\s+/g, ' ');