influx connector: refactor
This commit is contained in:
@@ -54,6 +54,10 @@ export default class DBConnector {
|
|||||||
getTrends() {
|
getTrends() {
|
||||||
throw new ZabbixNotImplemented('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
|
// Define Zabbix DB Connector exception type for non-implemented methods
|
||||||
@@ -68,3 +72,37 @@ export class ZabbixNotImplemented {
|
|||||||
return this.message;
|
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');
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import DBConnector from '../dbConnector';
|
import DBConnector from '../dbConnector';
|
||||||
// import InfluxSeries from 'grafana/app/plugins/datasource/influxdb/influx_series';
|
|
||||||
|
|
||||||
const DEFAULT_QUERY_LIMIT = 10000;
|
const DEFAULT_QUERY_LIMIT = 10000;
|
||||||
const HISTORY_TO_TABLE_MAP = {
|
const HISTORY_TO_TABLE_MAP = {
|
||||||
@@ -36,8 +35,7 @@ export class InfluxDBConnector extends DBConnector {
|
|||||||
super(options, backendSrv, datasourceSrv);
|
super(options, backendSrv, datasourceSrv);
|
||||||
this.limit = options.limit || DEFAULT_QUERY_LIMIT;
|
this.limit = options.limit || DEFAULT_QUERY_LIMIT;
|
||||||
super.loadDBDataSource().then(ds => {
|
super.loadDBDataSource().then(ds => {
|
||||||
console.log(ds);
|
this.influxDS = ds;
|
||||||
this.ds = ds;
|
|
||||||
return ds;
|
return ds;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -46,7 +44,7 @@ export class InfluxDBConnector extends DBConnector {
|
|||||||
* Try to invoke test query for one of Zabbix database tables.
|
* Try to invoke test query for one of Zabbix database tables.
|
||||||
*/
|
*/
|
||||||
testDataSource() {
|
testDataSource() {
|
||||||
return this.ds.testDatasource();
|
return this.influxDS.testDatasource();
|
||||||
}
|
}
|
||||||
|
|
||||||
getHistory(items, timeFrom, timeTill, options) {
|
getHistory(items, timeFrom, timeTill, options) {
|
||||||
@@ -62,7 +60,6 @@ export class InfluxDBConnector extends DBConnector {
|
|||||||
const itemids = _.map(items, 'itemid');
|
const itemids = _.map(items, 'itemid');
|
||||||
const table = HISTORY_TO_TABLE_MAP[value_type];
|
const table = HISTORY_TO_TABLE_MAP[value_type];
|
||||||
const query = this.buildHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);
|
const query = this.buildHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);
|
||||||
console.log(query);
|
|
||||||
return this.invokeInfluxDBQuery(query);
|
return this.invokeInfluxDBQuery(query);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -88,7 +85,6 @@ export class InfluxDBConnector extends DBConnector {
|
|||||||
let valueColumn = _.includes(['avg', 'min', 'max', 'sum'], consolidateBy) ? consolidateBy : 'avg';
|
let valueColumn = _.includes(['avg', 'min', 'max', 'sum'], consolidateBy) ? consolidateBy : 'avg';
|
||||||
valueColumn = consolidateByTrendColumns[valueColumn];
|
valueColumn = consolidateByTrendColumns[valueColumn];
|
||||||
const query = this.buildTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);
|
const query = this.buildTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);
|
||||||
console.log(query);
|
|
||||||
return this.invokeInfluxDBQuery(query);
|
return this.invokeInfluxDBQuery(query);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -122,14 +118,9 @@ export class InfluxDBConnector extends DBConnector {
|
|||||||
return `(${itemidsWhere})`;
|
return `(${itemidsWhere})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
handleGrafanaTSResponse(history, items, addHostName = true) {
|
|
||||||
return convertGrafanaTSResponse(history, items, addHostName);
|
|
||||||
}
|
|
||||||
|
|
||||||
invokeInfluxDBQuery(query) {
|
invokeInfluxDBQuery(query) {
|
||||||
return this.ds._seriesQuery(query).then(data => {
|
return this.influxDS._seriesQuery(query)
|
||||||
return data && data.results ? data.results : [];
|
.then(data => data && data.results ? data.results : []);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,30 +159,6 @@ function handleInfluxHistoryResponse(results) {
|
|||||||
return seriesList;
|
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) {
|
function compactQuery(query) {
|
||||||
return query.replace(/\s+/g, ' ');
|
return query.replace(/\s+/g, ' ');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,10 +112,6 @@ export class SQLConnector extends DBConnector {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleGrafanaTSResponse(history, items, addHostName = true) {
|
|
||||||
return convertGrafanaTSResponse(history, items, addHostName);
|
|
||||||
}
|
|
||||||
|
|
||||||
invokeSQLQuery(query) {
|
invokeSQLQuery(query) {
|
||||||
let queryDef = {
|
let queryDef = {
|
||||||
refId: 'A',
|
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) {
|
function compactSQLQuery(query) {
|
||||||
return query.replace(/\s+/g, ' ');
|
return query.replace(/\s+/g, ' ');
|
||||||
|
|||||||
Reference in New Issue
Block a user