From 8a51d1d8540e224e48784eeb5e96f61718c232c2 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Tue, 28 Aug 2018 16:37:51 +0300 Subject: [PATCH] minor refactor --- .../add-metric-function.directive.js | 6 ++- src/datasource-zabbix/config.controller.js | 3 +- src/datasource-zabbix/datasource.js | 40 ++++++------------- .../metric-function-editor.directive.js | 10 +++-- src/datasource-zabbix/module.js | 16 +++++--- src/datasource-zabbix/query.controller.js | 8 +--- .../specs/datasource.spec.js | 4 +- src/datasource-zabbix/utils.js | 13 ++++++ .../zabbix/connectors/dbConnector.js | 13 ++++++ 9 files changed, 64 insertions(+), 49 deletions(-) diff --git a/src/datasource-zabbix/add-metric-function.directive.js b/src/datasource-zabbix/add-metric-function.directive.js index 88448e5..795a254 100644 --- a/src/datasource-zabbix/add-metric-function.directive.js +++ b/src/datasource-zabbix/add-metric-function.directive.js @@ -3,10 +3,12 @@ import _ from 'lodash'; import $ from 'jquery'; import * as metricFunctions from './metricFunctions'; -/** @ngInject */ angular .module('grafana.directives') - .directive('addMetricFunction', function($compile) { + .directive('addMetricFunction', + + /** @ngInject */ + function($compile) { var inputTemplate = ''; diff --git a/src/datasource-zabbix/config.controller.js b/src/datasource-zabbix/config.controller.js index 0160ac9..703c13c 100644 --- a/src/datasource-zabbix/config.controller.js +++ b/src/datasource-zabbix/config.controller.js @@ -9,6 +9,7 @@ const defaultConfig = { }; export class ZabbixDSConfigController { + /** @ngInject */ constructor($scope, $injector, datasourceSrv) { this.datasourceSrv = datasourceSrv; @@ -24,5 +25,3 @@ export class ZabbixDSConfigController { }); } } - -ZabbixDSConfigController.templateUrl = 'datasource-zabbix/partials/config.html'; diff --git a/src/datasource-zabbix/datasource.js b/src/datasource-zabbix/datasource.js index 4a91e31..972a849 100644 --- a/src/datasource-zabbix/datasource.js +++ b/src/datasource-zabbix/datasource.js @@ -6,11 +6,10 @@ import * as metricFunctions from './metricFunctions'; import * as c from './constants'; import dataProcessor from './dataProcessor'; import responseHandler from './responseHandler'; -import './zabbixAlerting.service.js'; import { Zabbix } from './zabbix/zabbix'; -import {ZabbixAPIError} from './zabbix/connectors/zabbix_api/zabbixAPICore'; +import { ZabbixAPIError } from './zabbix/connectors/zabbix_api/zabbixAPICore'; -class ZabbixAPIDatasource { +export class ZabbixDatasource { /** @ngInject */ constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) { @@ -96,7 +95,7 @@ class ZabbixAPIDatasource { // Create request for each target let promises = _.map(options.targets, t => { - // Don't request undefined and hidden targets + // Don't request for hidden targets if (t.hide) { return []; } @@ -111,7 +110,7 @@ class ZabbixAPIDatasource { // Apply Time-related functions (timeShift(), etc) let timeFunctions = bindFunctionDefs(target.functions, 'Time'); if (timeFunctions.length) { - const [time_from, time_to] = sequence(timeFunctions)([timeFrom, timeTo]); + const [time_from, time_to] = utils.sequence(timeFunctions)([timeFrom, timeTo]); timeFrom = time_from; timeTo = time_to; } @@ -124,8 +123,8 @@ class ZabbixAPIDatasource { // Migrate old targets target = migrations.migrate(target); - // Don't request undefined and hidden targets - if (target.hide || !target.group || !target.host || !target.item) { + // Don't request undefined targets + if (!target.group || !target.host || !target.item) { return []; } @@ -167,9 +166,7 @@ class ZabbixAPIDatasource { itemtype: 'num' }; return this.zabbix.getItemsFromTarget(target, getItemOptions) - .then(items => { - return this.queryNumericDataForItems(items, target, timeRange, useTrends, options); - }); + .then(items => this.queryNumericDataForItems(items, target, timeRange, useTrends, options)); } /** @@ -208,19 +205,19 @@ class ZabbixAPIDatasource { // Apply transformation functions timeseries_data = _.cloneDeep(_.map(timeseries_data, timeseries => { - timeseries.datapoints = sequence(transformFunctions)(timeseries.datapoints); + timeseries.datapoints = utils.sequence(transformFunctions)(timeseries.datapoints); return timeseries; })); // Apply filter functions if (filterFunctions.length) { - timeseries_data = sequence(filterFunctions)(timeseries_data); + timeseries_data = utils.sequence(filterFunctions)(timeseries_data); } // Apply aggregations if (aggregationFunctions.length) { let dp = _.map(timeseries_data, 'datapoints'); - dp = sequence(aggregationFunctions)(dp); + dp = utils.sequence(aggregationFunctions)(dp); let aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name'); let lastAgg = _.findLast(target.functions, func => { @@ -234,7 +231,7 @@ class ZabbixAPIDatasource { } // Apply alias functions - _.forEach(timeseries_data, sequence(aliasFunctions)); + _.forEach(timeseries_data, utils.sequence(aliasFunctions)); // Apply Time-related functions (timeShift(), etc) // Find timeShift() function and get specified trend value @@ -648,7 +645,7 @@ function formatMetric(metricObj) { * template variables, for example * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait */ -function zabbixTemplateFormat(value) { +export function zabbixTemplateFormat(value) { if (typeof value === 'string') { return utils.escapeRegex(value); } @@ -680,17 +677,6 @@ function replaceTemplateVars(templateSrv, target, scopedVars) { return replacedTarget; } -// Apply function one by one: -// sequence([a(), b(), c()]) = c(b(a())); -function sequence(funcsArray) { - return function(result) { - for (var i = 0; i < funcsArray.length; i++) { - result = funcsArray[i].call(this, result); - } - return result; - }; -} - function filterEnabledTargets(targets) { return _.filter(targets, target => { return !(target.hide || !target.group || !target.host || !target.item); @@ -709,8 +695,6 @@ function getTriggerThreshold(expression) { } } -export {ZabbixAPIDatasource, zabbixTemplateFormat}; - // Fix for backward compatibility with lodash 2.4 if (!_.includes) {_.includes = _.contains;} if (!_.keyBy) {_.keyBy = _.indexBy;} diff --git a/src/datasource-zabbix/metric-function-editor.directive.js b/src/datasource-zabbix/metric-function-editor.directive.js index e0d35b4..b87ff90 100644 --- a/src/datasource-zabbix/metric-function-editor.directive.js +++ b/src/datasource-zabbix/metric-function-editor.directive.js @@ -2,10 +2,14 @@ import angular from 'angular'; import _ from 'lodash'; import $ from 'jquery'; -/** @ngInject */ +const DOCS_FUNC_REF_URL = 'http://docs.grafana-zabbix.org/reference/functions/'; + angular .module('grafana.directives') - .directive('metricFunctionEditor', function($compile, templateSrv) { + .directive('metricFunctionEditor', + + /** @ngInject */ + function($compile, templateSrv) { var funcSpanTemplate = '{{func.def.name}}('; var paramTemplate = ' { let ctx = {}; diff --git a/src/datasource-zabbix/utils.js b/src/datasource-zabbix/utils.js index 4d2d704..efc8ad2 100644 --- a/src/datasource-zabbix/utils.js +++ b/src/datasource-zabbix/utils.js @@ -227,6 +227,19 @@ export function callOnce(func, promiseKeeper) { }; } +/** + * Apply function one by one: `sequence([a(), b(), c()]) = c(b(a()))` + * @param {*} funcsArray functions to apply + */ +export function sequence(funcsArray) { + return function(result) { + for (var i = 0; i < funcsArray.length; i++) { + result = funcsArray[i].call(this, result); + } + return result; + }; +} + // Fix for backward compatibility with lodash 2.4 if (!_.includes) { _.includes = _.contains; diff --git a/src/datasource-zabbix/zabbix/connectors/dbConnector.js b/src/datasource-zabbix/zabbix/connectors/dbConnector.js index 1974d35..6699b45 100644 --- a/src/datasource-zabbix/zabbix/connectors/dbConnector.js +++ b/src/datasource-zabbix/zabbix/connectors/dbConnector.js @@ -2,6 +2,10 @@ import _ from 'lodash'; const NOT_IMPLEMENTED = 'Method should be implemented in subclass of DBConnector'; +/** + * Base class for external history database connectors. Subclasses should implement `getHistory()`, `getTrends()` and + * `testDataSource()` methods, which describe how to fetch data from source other than Zabbix API. + */ export default class DBConnector { constructor(options, backendSrv, datasourceSrv) { this.backendSrv = backendSrv; @@ -24,14 +28,23 @@ export default class DBConnector { } } + /** + * Send test request to datasource in order to ensure it's working. + */ testDataSource() { throw NOT_IMPLEMENTED; } + /** + * Get history data from external sources. + */ getHistory() { throw NOT_IMPLEMENTED; } + /** + * Get trends data from external sources. + */ getTrends() { throw NOT_IMPLEMENTED; }