From 14fba8fe5e301ca5df7f74fd5f200e63093882d8 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Tue, 28 Aug 2018 20:47:45 +0300 Subject: [PATCH] build dist --- .../add-metric-function.directive.js | 4 +- .../add-metric-function.directive.js.map | 2 +- dist/datasource-zabbix/config.controller.js | 20 ++- .../config.controller.js.map | 2 +- dist/datasource-zabbix/datasource.js | 120 ++++++++---------- dist/datasource-zabbix/datasource.js.map | 2 +- .../metric-function-editor.directive.js | 10 +- .../metric-function-editor.directive.js.map | 2 +- dist/datasource-zabbix/migrations.js | 32 ++++- dist/datasource-zabbix/migrations.js.map | 2 +- dist/datasource-zabbix/module.js | 13 +- dist/datasource-zabbix/module.js.map | 2 +- dist/datasource-zabbix/partials/config.html | 8 +- dist/datasource-zabbix/query.controller.js | 7 +- .../datasource-zabbix/query.controller.js.map | 2 +- .../specs/datasource.spec.js | 58 +++------ .../specs/datasource.spec.js.map | 2 +- .../specs/migrations.test.js | 56 ++++++++ .../specs/migrations.test.js.map | 1 + dist/datasource-zabbix/utils.js | 18 ++- dist/datasource-zabbix/utils.js.map | 2 +- .../zabbix/connectors/dbConnector.js | 38 ++++-- .../zabbix/connectors/dbConnector.js.map | 2 +- .../zabbix/connectors/sql/sqlConnector.js | 2 +- .../zabbix/connectors/sql/sqlConnector.js.map | 2 +- dist/datasource-zabbix/zabbix/zabbix.js | 67 +++++++--- dist/datasource-zabbix/zabbix/zabbix.js.map | 2 +- .../panel-triggers/triggers_panel_ctrl.js.map | 2 +- 28 files changed, 308 insertions(+), 172 deletions(-) create mode 100644 dist/datasource-zabbix/specs/migrations.test.js create mode 100644 dist/datasource-zabbix/specs/migrations.test.js.map diff --git a/dist/datasource-zabbix/add-metric-function.directive.js b/dist/datasource-zabbix/add-metric-function.directive.js index 04812b5..7c6763b 100644 --- a/dist/datasource-zabbix/add-metric-function.directive.js +++ b/dist/datasource-zabbix/add-metric-function.directive.js @@ -39,8 +39,10 @@ System.register(['angular', 'lodash', 'jquery', './metricFunctions'], function ( }], execute: function () { + angular.module('grafana.directives').directive('addMetricFunction', + /** @ngInject */ - angular.module('grafana.directives').directive('addMetricFunction', function ($compile) { + function ($compile) { var inputTemplate = ''; var buttonTemplate = '' + ''; diff --git a/dist/datasource-zabbix/add-metric-function.directive.js.map b/dist/datasource-zabbix/add-metric-function.directive.js.map index 24912c0..dabbd26 100644 --- a/dist/datasource-zabbix/add-metric-function.directive.js.map +++ b/dist/datasource-zabbix/add-metric-function.directive.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/add-metric-function.directive.js"],"names":["getAllFunctionNames","categories","_","reduce","list","category","each","func","push","name","createFunctionDropDownMenu","map","text","submenu","value","click","angular","$","metricFunctions","module","directive","$compile","inputTemplate","buttonTemplate","link","$scope","elem","getCategories","allFunctions","functionMenu","$input","$button","appendTo","attr","typeahead","source","minLength","items","updater","funcDef","getFuncDef","toLowerCase","find","funcName","indexOf","$apply","addFunction","trigger","hide","show","focus","keyup","toggleClass","val","blur","setTimeout","removeClass","contents"],"mappings":"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","file":"add-metric-function.directive.js","sourcesContent":["import angular from 'angular';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport * as metricFunctions from './metricFunctions';\n\n/** @ngInject */\nangular\n .module('grafana.directives')\n .directive('addMetricFunction', function($compile) {\n var inputTemplate = '';\n\n var buttonTemplate = '' +\n '';\n\n return {\n link: function($scope, elem) {\n var categories = metricFunctions.getCategories();\n var allFunctions = getAllFunctionNames(categories);\n\n $scope.functionMenu = createFunctionDropDownMenu(categories);\n\n var $input = $(inputTemplate);\n var $button = $(buttonTemplate);\n $input.appendTo(elem);\n $button.appendTo(elem);\n\n $input.attr('data-provide', 'typeahead');\n $input.typeahead({\n source: allFunctions,\n minLength: 1,\n items: 10,\n updater: function (value) {\n var funcDef = metricFunctions.getFuncDef(value);\n if (!funcDef) {\n // try find close match\n value = value.toLowerCase();\n funcDef = _.find(allFunctions, function(funcName) {\n return funcName.toLowerCase().indexOf(value) === 0;\n });\n\n if (!funcDef) { return; }\n }\n\n $scope.$apply(function() {\n $scope.addFunction(funcDef);\n });\n\n $input.trigger('blur');\n return '';\n }\n });\n\n $button.click(function() {\n $button.hide();\n $input.show();\n $input.focus();\n });\n\n $input.keyup(function() {\n elem.toggleClass('open', $input.val() === '');\n });\n\n $input.blur(function() {\n // clicking the function dropdown menu wont\n // work if you remove class at once\n setTimeout(function() {\n $input.val('');\n $input.hide();\n $button.show();\n elem.removeClass('open');\n }, 200);\n });\n\n $compile(elem.contents())($scope);\n }\n };\n });\n\nfunction getAllFunctionNames(categories) {\n return _.reduce(categories, function(list, category) {\n _.each(category, function(func) {\n list.push(func.name);\n });\n return list;\n }, []);\n}\n\nfunction createFunctionDropDownMenu(categories) {\n return _.map(categories, function(list, category) {\n return {\n text: category,\n submenu: _.map(list, function(value) {\n return {\n text: value.name,\n click: \"ctrl.addFunction('\" + value.name + \"')\",\n };\n })\n };\n });\n}\n\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/add-metric-function.directive.js"],"names":["getAllFunctionNames","categories","_","reduce","list","category","each","func","push","name","createFunctionDropDownMenu","map","text","submenu","value","click","angular","$","metricFunctions","module","directive","$compile","inputTemplate","buttonTemplate","link","$scope","elem","getCategories","allFunctions","functionMenu","$input","$button","appendTo","attr","typeahead","source","minLength","items","updater","funcDef","getFuncDef","toLowerCase","find","funcName","indexOf","$apply","addFunction","trigger","hide","show","focus","keyup","toggleClass","val","blur","setTimeout","removeClass","contents"],"mappings":"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","file":"add-metric-function.directive.js","sourcesContent":["import angular from 'angular';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport * as metricFunctions from './metricFunctions';\n\nangular\n .module('grafana.directives')\n .directive('addMetricFunction',\n\n /** @ngInject */\n function($compile) {\n var inputTemplate = '';\n\n var buttonTemplate = '' +\n '';\n\n return {\n link: function($scope, elem) {\n var categories = metricFunctions.getCategories();\n var allFunctions = getAllFunctionNames(categories);\n\n $scope.functionMenu = createFunctionDropDownMenu(categories);\n\n var $input = $(inputTemplate);\n var $button = $(buttonTemplate);\n $input.appendTo(elem);\n $button.appendTo(elem);\n\n $input.attr('data-provide', 'typeahead');\n $input.typeahead({\n source: allFunctions,\n minLength: 1,\n items: 10,\n updater: function (value) {\n var funcDef = metricFunctions.getFuncDef(value);\n if (!funcDef) {\n // try find close match\n value = value.toLowerCase();\n funcDef = _.find(allFunctions, function(funcName) {\n return funcName.toLowerCase().indexOf(value) === 0;\n });\n\n if (!funcDef) { return; }\n }\n\n $scope.$apply(function() {\n $scope.addFunction(funcDef);\n });\n\n $input.trigger('blur');\n return '';\n }\n });\n\n $button.click(function() {\n $button.hide();\n $input.show();\n $input.focus();\n });\n\n $input.keyup(function() {\n elem.toggleClass('open', $input.val() === '');\n });\n\n $input.blur(function() {\n // clicking the function dropdown menu wont\n // work if you remove class at once\n setTimeout(function() {\n $input.val('');\n $input.hide();\n $button.show();\n elem.removeClass('open');\n }, 200);\n });\n\n $compile(elem.contents())($scope);\n }\n };\n });\n\nfunction getAllFunctionNames(categories) {\n return _.reduce(categories, function(list, category) {\n _.each(category, function(func) {\n list.push(func.name);\n });\n return list;\n }, []);\n}\n\nfunction createFunctionDropDownMenu(categories) {\n return _.map(categories, function(list, category) {\n return {\n text: category,\n submenu: _.map(list, function(value) {\n return {\n text: value.name,\n click: \"ctrl.addFunction('\" + value.name + \"')\",\n };\n })\n };\n });\n}\n\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/config.controller.js b/dist/datasource-zabbix/config.controller.js index 328d37e..0948202 100644 --- a/dist/datasource-zabbix/config.controller.js +++ b/dist/datasource-zabbix/config.controller.js @@ -1,9 +1,9 @@ 'use strict'; -System.register(['lodash'], function (_export, _context) { +System.register(['lodash', './migrations'], function (_export, _context) { "use strict"; - var _, _createClass, SUPPORTED_SQL_DS, defaultConfig, ZabbixDSConfigController; + var _, migrateDSConfig, _createClass, SUPPORTED_SQL_DS, defaultConfig, ZabbixDSConfigController; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -14,6 +14,8 @@ System.register(['lodash'], function (_export, _context) { return { setters: [function (_lodash) { _ = _lodash.default; + }, function (_migrations) { + migrateDSConfig = _migrations.migrateDSConfig; }], execute: function () { _createClass = function () { @@ -36,18 +38,24 @@ System.register(['lodash'], function (_export, _context) { SUPPORTED_SQL_DS = ['mysql', 'postgres']; defaultConfig = { - dbConnection: { - enable: false - } + trends: false, + dbConnectionEnable: false, + dbConnectionDatasourceId: null, + alerting: false, + addThresholds: false, + alertingMinSeverity: 3, + disableReadOnlyUsersAck: false }; _export('ZabbixDSConfigController', ZabbixDSConfigController = function () { + /** @ngInject */ function ZabbixDSConfigController($scope, $injector, datasourceSrv) { _classCallCheck(this, ZabbixDSConfigController); this.datasourceSrv = datasourceSrv; + this.current.jsonData = migrateDSConfig(this.current.jsonData); _.defaults(this.current.jsonData, defaultConfig); this.sqlDataSources = this.getSupportedSQLDataSources(); } @@ -66,8 +74,6 @@ System.register(['lodash'], function (_export, _context) { }()); _export('ZabbixDSConfigController', ZabbixDSConfigController); - - ZabbixDSConfigController.templateUrl = 'datasource-zabbix/partials/config.html'; } }; }); diff --git a/dist/datasource-zabbix/config.controller.js.map b/dist/datasource-zabbix/config.controller.js.map index 6f23618..e74907a 100644 --- a/dist/datasource-zabbix/config.controller.js.map +++ b/dist/datasource-zabbix/config.controller.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/config.controller.js"],"names":["_","SUPPORTED_SQL_DS","defaultConfig","dbConnection","enable","ZabbixDSConfigController","$scope","$injector","datasourceSrv","defaults","current","jsonData","sqlDataSources","getSupportedSQLDataSources","datasources","getAll","filter","includes","ds","type","templateUrl"],"mappings":";;;;;;;;;;;;;;;AAAOA,O;;;;;;;;;;;;;;;;;;;;;AAEDC,sB,GAAmB,CAAC,OAAD,EAAU,UAAV,C;AAEnBC,mB,GAAgB;AACpBC,sBAAc;AACZC,kBAAQ;AADI;AADM,O;;0CAMTC,wB;AACX;AACA,0CAAYC,MAAZ,EAAoBC,SAApB,EAA+BC,aAA/B,EAA8C;AAAA;;AAC5C,eAAKA,aAAL,GAAqBA,aAArB;;AAEAR,YAAES,QAAF,CAAW,KAAKC,OAAL,CAAaC,QAAxB,EAAkCT,aAAlC;AACA,eAAKU,cAAL,GAAsB,KAAKC,0BAAL,EAAtB;AACD;;;;uDAE4B;AAC3B,gBAAIC,cAAc,KAAKN,aAAL,CAAmBO,MAAnB,EAAlB;AACA,mBAAOf,EAAEgB,MAAF,CAASF,WAAT,EAAsB,cAAM;AACjC,qBAAOd,EAAEiB,QAAF,CAAWhB,gBAAX,EAA6BiB,GAAGC,IAAhC,CAAP;AACD,aAFM,CAAP;AAGD;;;;;;;;AAGHd,+BAAyBe,WAAzB,GAAuC,wCAAvC","file":"config.controller.js","sourcesContent":["import _ from 'lodash';\n\nconst SUPPORTED_SQL_DS = ['mysql', 'postgres'];\n\nconst defaultConfig = {\n dbConnection: {\n enable: false,\n }\n};\n\nexport class ZabbixDSConfigController {\n /** @ngInject */\n constructor($scope, $injector, datasourceSrv) {\n this.datasourceSrv = datasourceSrv;\n\n _.defaults(this.current.jsonData, defaultConfig);\n this.sqlDataSources = this.getSupportedSQLDataSources();\n }\n\n getSupportedSQLDataSources() {\n let datasources = this.datasourceSrv.getAll();\n return _.filter(datasources, ds => {\n return _.includes(SUPPORTED_SQL_DS, ds.type);\n });\n }\n}\n\nZabbixDSConfigController.templateUrl = 'datasource-zabbix/partials/config.html';\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/config.controller.js"],"names":["_","migrateDSConfig","SUPPORTED_SQL_DS","defaultConfig","trends","dbConnectionEnable","dbConnectionDatasourceId","alerting","addThresholds","alertingMinSeverity","disableReadOnlyUsersAck","ZabbixDSConfigController","$scope","$injector","datasourceSrv","current","jsonData","defaults","sqlDataSources","getSupportedSQLDataSources","datasources","getAll","filter","includes","ds","type"],"mappings":";;;;;;;;;;;;;;;AAAOA,O;;AACEC,qB,eAAAA,e;;;;;;;;;;;;;;;;;;;;;AAEHC,sB,GAAmB,CAAC,OAAD,EAAU,UAAV,C;AAEnBC,mB,GAAgB;AACpBC,gBAAQ,KADY;AAEpBC,4BAAoB,KAFA;AAGpBC,kCAA0B,IAHN;AAIpBC,kBAAU,KAJU;AAKpBC,uBAAe,KALK;AAMpBC,6BAAqB,CAND;AAOpBC,iCAAyB;AAPL,O;;0CAUTC,wB;;AAEX;AACA,0CAAYC,MAAZ,EAAoBC,SAApB,EAA+BC,aAA/B,EAA8C;AAAA;;AAC5C,eAAKA,aAAL,GAAqBA,aAArB;;AAEA,eAAKC,OAAL,CAAaC,QAAb,GAAwBf,gBAAgB,KAAKc,OAAL,CAAaC,QAA7B,CAAxB;AACAhB,YAAEiB,QAAF,CAAW,KAAKF,OAAL,CAAaC,QAAxB,EAAkCb,aAAlC;AACA,eAAKe,cAAL,GAAsB,KAAKC,0BAAL,EAAtB;AACD;;;;uDAE4B;AAC3B,gBAAIC,cAAc,KAAKN,aAAL,CAAmBO,MAAnB,EAAlB;AACA,mBAAOrB,EAAEsB,MAAF,CAASF,WAAT,EAAsB,cAAM;AACjC,qBAAOpB,EAAEuB,QAAF,CAAWrB,gBAAX,EAA6BsB,GAAGC,IAAhC,CAAP;AACD,aAFM,CAAP;AAGD","file":"config.controller.js","sourcesContent":["import _ from 'lodash';\nimport { migrateDSConfig } from './migrations';\n\nconst SUPPORTED_SQL_DS = ['mysql', 'postgres'];\n\nconst defaultConfig = {\n trends: false,\n dbConnectionEnable: false,\n dbConnectionDatasourceId: null,\n alerting: false,\n addThresholds: false,\n alertingMinSeverity: 3,\n disableReadOnlyUsersAck: false\n};\n\nexport class ZabbixDSConfigController {\n\n /** @ngInject */\n constructor($scope, $injector, datasourceSrv) {\n this.datasourceSrv = datasourceSrv;\n\n this.current.jsonData = migrateDSConfig(this.current.jsonData);\n _.defaults(this.current.jsonData, defaultConfig);\n this.sqlDataSources = this.getSupportedSQLDataSources();\n }\n\n getSupportedSQLDataSources() {\n let datasources = this.datasourceSrv.getAll();\n return _.filter(datasources, ds => {\n return _.includes(SUPPORTED_SQL_DS, ds.type);\n });\n }\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/datasource.js b/dist/datasource-zabbix/datasource.js index c7b9925..aab91db 100644 --- a/dist/datasource-zabbix/datasource.js +++ b/dist/datasource-zabbix/datasource.js @@ -1,9 +1,9 @@ 'use strict'; -System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', './metricFunctions', './constants', './dataProcessor', './responseHandler', './zabbixAlerting.service.js', './zabbix/zabbix', './zabbix/connectors/zabbix_api/zabbixAPICore'], function (_export, _context) { +System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', './metricFunctions', './constants', './dataProcessor', './responseHandler', './zabbix/zabbix', './zabbix/connectors/zabbix_api/zabbixAPICore'], function (_export, _context) { "use strict"; - var _, dateMath, utils, migrations, metricFunctions, c, dataProcessor, responseHandler, Zabbix, ZabbixAPIError, _slicedToArray, _createClass, ZabbixAPIDatasource; + var _, dateMath, utils, migrations, metricFunctions, c, dataProcessor, responseHandler, Zabbix, ZabbixAPIError, _slicedToArray, _createClass, ZabbixDatasource; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -71,6 +71,8 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', return '(' + escapedValues.join('|') + ')'; } + _export('zabbixTemplateFormat', zabbixTemplateFormat); + function zabbixItemIdsTemplateFormat(value) { if (typeof value === 'string') { return value; @@ -94,17 +96,6 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', 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, function (target) { return !(target.hide || !target.group || !target.host || !target.item); @@ -123,6 +114,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', } } + // Fix for backward compatibility with lodash 2.4 return { setters: [function (_lodash) { _ = _lodash.default; @@ -140,7 +132,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', dataProcessor = _dataProcessor.default; }, function (_responseHandler) { responseHandler = _responseHandler.default; - }, function (_zabbixAlertingServiceJs) {}, function (_zabbixZabbix) { + }, function (_zabbixZabbix) { Zabbix = _zabbixZabbix.Zabbix; }, function (_zabbixConnectorsZabbix_apiZabbixAPICore) { ZabbixAPIError = _zabbixConnectorsZabbix_apiZabbixAPICore.ZabbixAPIError; @@ -202,15 +194,13 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', }; }(); - _export('ZabbixAPIDatasource', ZabbixAPIDatasource = function () { + _export('ZabbixDatasource', ZabbixDatasource = function () { /** @ngInject */ - function ZabbixAPIDatasource(instanceSettings, templateSrv, alertSrv, dashboardSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) { - _classCallCheck(this, ZabbixAPIDatasource); + function ZabbixDatasource(instanceSettings, templateSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) { + _classCallCheck(this, ZabbixDatasource); this.templateSrv = templateSrv; - this.alertSrv = alertSrv; - this.dashboardSrv = dashboardSrv; this.zabbixAlertingSrv = zabbixAlertingSrv; // Use custom format for template variables @@ -222,7 +212,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', this.basicAuth = instanceSettings.basicAuth; this.withCredentials = instanceSettings.withCredentials; - var jsonData = instanceSettings.jsonData || {}; + var jsonData = migrations.migrateDSConfig(instanceSettings.jsonData); // Zabbix API credentials this.username = jsonData.username; @@ -246,9 +236,8 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', this.disableReadOnlyUsersAck = jsonData.disableReadOnlyUsersAck; // Direct DB Connection options - var dbConnectionOptions = jsonData.dbConnection || {}; - this.enableDirectDBConnection = dbConnectionOptions.enable; - this.datasourceId = dbConnectionOptions.datasourceId; + this.enableDirectDBConnection = jsonData.dbConnectionEnable || false; + this.datasourceId = jsonData.dbConnectionDatasourceId; var zabbixOptions = { url: this.url, @@ -275,7 +264,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', */ - _createClass(ZabbixAPIDatasource, [{ + _createClass(ZabbixDatasource, [{ key: 'query', value: function query(options) { var _this = this; @@ -296,7 +285,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', // Create request for each target var promises = _.map(options.targets, function (t) { - // Don't request undefined and hidden targets + // Don't request for hidden targets if (t.hide) { return []; } @@ -311,10 +300,10 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', // Apply Time-related functions (timeShift(), etc) var timeFunctions = bindFunctionDefs(target.functions, 'Time'); if (timeFunctions.length) { - var _sequence = sequence(timeFunctions)([timeFrom, timeTo]), - _sequence2 = _slicedToArray(_sequence, 2), - time_from = _sequence2[0], - time_to = _sequence2[1]; + var _utils$sequence = utils.sequence(timeFunctions)([timeFrom, timeTo]), + _utils$sequence2 = _slicedToArray(_utils$sequence, 2), + time_from = _utils$sequence2[0], + time_to = _utils$sequence2[1]; timeFrom = time_from; timeTo = time_to; @@ -328,8 +317,8 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', // 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 []; } @@ -413,19 +402,19 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', // Apply transformation functions timeseries_data = _.cloneDeep(_.map(timeseries_data, function (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) { var dp = _.map(timeseries_data, 'datapoints'); - dp = sequence(aggregationFunctions)(dp); + dp = utils.sequence(aggregationFunctions)(dp); var aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name'); var lastAgg = _.findLast(target.functions, function (func) { @@ -439,7 +428,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', } // 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 @@ -551,23 +540,18 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', }, { key: 'testDatasource', value: function testDatasource() { - var _this8 = this; + return this.zabbix.testDataSource().then(function (result) { + var zabbixVersion = result.zabbixVersion, + dbConnectorStatus = result.dbConnectorStatus; - var zabbixVersion = void 0; - return this.zabbix.getVersion().then(function (version) { - zabbixVersion = version; - return _this8.zabbix.login(); - }).then(function () { - if (_this8.enableDirectDBConnection) { - return _this8.zabbix.dbConnector.testDataSource(); - } else { - return Promise.resolve(); + var message = 'Zabbix API version: ' + zabbixVersion; + if (dbConnectorStatus) { + message += ', DB connector type: ' + dbConnectorStatus.dsType; } - }).then(function () { return { status: "success", title: "Success", - message: "Zabbix API version: " + zabbixVersion + message: message }; }).catch(function (error) { if (error instanceof ZabbixAPIError) { @@ -582,7 +566,14 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', title: "Connection failed", message: "Connection failed: " + error.data.message }; + } else if (typeof error === 'string') { + return { + status: "error", + title: "Connection failed", + message: "Connection failed: " + error + }; } else { + console.log(error); return { status: "error", title: "Connection failed", @@ -594,14 +585,14 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', }, { key: 'metricFindQuery', value: function metricFindQuery(query) { - var _this9 = this; + var _this8 = this; var result = void 0; var parts = []; // Split query. Query structure: group.host.app.item _.each(utils.splitTemplateQuery(query), function (part) { - part = _this9.replaceTemplateVars(part, {}); + part = _this8.replaceTemplateVars(part, {}); // Replace wildcard to regex if (part === '*') { @@ -638,7 +629,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', }, { key: 'annotationQuery', value: function annotationQuery(options) { - var _this10 = this; + var _this9 = this; var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000); var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000); @@ -656,7 +647,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', return getTriggers.then(function (triggers) { // Filter triggers by description - var triggerName = _this10.replaceTemplateVars(annotation.trigger, {}); + var triggerName = _this9.replaceTemplateVars(annotation.trigger, {}); if (utils.isRegex(triggerName)) { triggers = _.filter(triggers, function (trigger) { return utils.buildRegex(triggerName).test(trigger.description); @@ -673,7 +664,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', }); var objectids = _.map(triggers, 'triggerid'); - return _this10.zabbix.getEvents(objectids, timeFrom, timeTo, showOkEvents).then(function (events) { + return _this9.zabbix.getEvents(objectids, timeFrom, timeTo, showOkEvents).then(function (events) { var indexedTriggers = _.keyBy(triggers, 'triggerid'); // Hide acknowledged events if option enabled @@ -707,13 +698,13 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', }, { key: 'alertQuery', value: function alertQuery(options) { - var _this11 = this; + var _this10 = this; var enabled_targets = filterEnabledTargets(options.targets); var getPanelItems = _.map(enabled_targets, function (t) { var target = _.cloneDeep(t); - _this11.replaceTargetVariables(target, options); - return _this11.zabbix.getItemsFromTarget(target, { itemtype: 'num' }); + _this10.replaceTargetVariables(target, options); + return _this10.zabbix.getItemsFromTarget(target, { itemtype: 'num' }); }); return Promise.all(getPanelItems).then(function (results) { @@ -723,10 +714,10 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', if (itemids.length === 0) { return []; } - return _this11.zabbix.getAlerts(itemids); + return _this10.zabbix.getAlerts(itemids); }).then(function (triggers) { triggers = _.filter(triggers, function (trigger) { - return trigger.priority >= _this11.alertingMinSeverity; + return trigger.priority >= _this10.alertingMinSeverity; }); if (!triggers || triggers.length === 0) { @@ -754,12 +745,12 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', }, { key: 'replaceTargetVariables', value: function replaceTargetVariables(target, options) { - var _this12 = this; + var _this11 = this; var parts = ['group', 'host', 'application', 'item']; _.forEach(parts, function (p) { if (target[p] && target[p].filter) { - target[p].filter = _this12.replaceTemplateVars(target[p].filter, options.scopedVars); + target[p].filter = _this11.replaceTemplateVars(target[p].filter, options.scopedVars); } }); target.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars); @@ -767,9 +758,9 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', _.forEach(target.functions, function (func) { func.params = _.map(func.params, function (param) { if (typeof param === 'number') { - return +_this12.templateSrv.replace(param.toString(), options.scopedVars); + return +_this11.templateSrv.replace(param.toString(), options.scopedVars); } else { - return _this12.templateSrv.replace(param, options.scopedVars); + return _this11.templateSrv.replace(param, options.scopedVars); } }); }); @@ -788,14 +779,11 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', } }]); - return ZabbixAPIDatasource; + return ZabbixDatasource; }()); - _export('ZabbixAPIDatasource', ZabbixAPIDatasource); + _export('ZabbixDatasource', ZabbixDatasource); - _export('zabbixTemplateFormat', zabbixTemplateFormat); - - // Fix for backward compatibility with lodash 2.4 if (!_.includes) { _.includes = _.contains; } diff --git a/dist/datasource-zabbix/datasource.js.map b/dist/datasource-zabbix/datasource.js.map index 91d29b2..ec89ba1 100644 --- a/dist/datasource-zabbix/datasource.js.map +++ b/dist/datasource-zabbix/datasource.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","getConsolidateBy","target","consolidateBy","funcDef","find","functions","length","downsampleSeries","timeseries_data","options","defaultAgg","consolidateByFunc","timeseries","datapoints","maxDataPoints","groupBy","interval","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","zabbixItemIdsTemplateFormat","replaceTemplateVars","templateSrv","scopedVars","replacedTarget","replace","isRegex","sequence","funcsArray","result","i","call","filterEnabledTargets","targets","hide","group","host","item","getTriggerThreshold","expression","thresholdPattern","finded_thresholds","match","threshold","Number","dateMath","migrations","c","responseHandler","Zabbix","ZabbixAPIError","ZabbixAPIDatasource","instanceSettings","alertSrv","dashboardSrv","backendSrv","datasourceSrv","zabbixAlertingSrv","partial","url","basicAuth","withCredentials","jsonData","username","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","disableReadOnlyUsersAck","dbConnectionOptions","dbConnection","enableDirectDBConnection","enable","datasourceId","zabbixOptions","zabbix","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","t","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","replaceTargetVariables","timeFunctions","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_METRICS","MODE_TEXT","migrate","queryNumericData","queryTextData","MODE_ITEMID","itemids","queryItemIdData","MODE_ITSERVICE","queryITServiceData","MODE_TRIGGERS","queryTriggersData","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","queryNumericDataForItems","items","getHistoryPromise","valueType","getTrendValueType","getTrends","getHistoryTS","applyDataProcessingFunctions","trendFunctions","trendValueFunc","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","series","unShiftTimeSeries","getHistoryText","split","itemid","trim","getItemsByIDs","itservice","itServiceFilter","slaProperty","isOldVersion","getITServices","getSLA","itservices","getHostsFromTarget","results","hosts","apps","hostids","appids","minSeverity","triggers","acknowledged","count","getHostAlerts","handleTriggersResponse","resolve","zabbixVersion","getVersion","version","login","dbConnector","testDataSource","status","title","message","catch","error","query","parts","each","splitTemplateQuery","part","push","template","zipObject","app","getItems","getApps","getHosts","getGroups","metrics","rangeRaw","annotation","showOkEvents","SHOW_ALL_EVENTS","SHOW_OK_EVENTS","triggersOptions","showTriggers","SHOW_ALL_TRIGGERS","hideHostsInMaintenance","getTriggers","application","triggerName","trigger","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport './zabbixAlerting.service.js';\nimport { Zabbix } from './zabbix/zabbix';\nimport {ZabbixAPIError} from './zabbix/connectors/zabbix_api/zabbixAPICore';\n\nclass ZabbixAPIDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) {\n this.templateSrv = templateSrv;\n this.alertSrv = alertSrv;\n this.dashboardSrv = dashboardSrv;\n this.zabbixAlertingSrv = zabbixAlertingSrv;\n\n // Use custom format for template variables\n this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);\n\n // General data source settings\n this.name = instanceSettings.name;\n this.url = instanceSettings.url;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n\n const jsonData = instanceSettings.jsonData || {};\n\n // Zabbix API credentials\n this.username = jsonData.username;\n this.password = jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = jsonData.trends;\n this.trendsFrom = jsonData.trendsFrom || '7d';\n this.trendsRange = jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = jsonData.alerting;\n this.addThresholds = jsonData.addThresholds;\n this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n // Other options\n this.disableReadOnlyUsersAck = jsonData.disableReadOnlyUsersAck;\n\n // Direct DB Connection options\n let dbConnectionOptions = jsonData.dbConnection || {};\n this.enableDirectDBConnection = dbConnectionOptions.enable;\n this.datasourceId = dbConnectionOptions.datasourceId;\n\n let zabbixOptions = {\n url: this.url,\n username: this.username,\n password: this.password,\n basicAuth: this.basicAuth,\n withCredentials: this.withCredentials,\n cacheTTL: this.cacheTTL,\n enableDirectDBConnection: this.enableDirectDBConnection,\n datasourceId: this.datasourceId\n };\n\n this.zabbix = new Zabbix(zabbixOptions, backendSrv, datasourceSrv);\n }\n\n ////////////////////////\n // Datasource methods //\n ////////////////////////\n\n /**\n * Query panel data. Calls for each panel in dashboard.\n * @param {Object} options Contains time range, targets and other info.\n * @return {Object} Grafana metrics object with timeseries data for each target.\n */\n query(options) {\n // Get alerts for current panel\n if (this.alertingEnabled) {\n this.alertQuery(options).then(alert => {\n this.zabbixAlertingSrv.setPanelAlertState(options.panelId, alert.state);\n\n this.zabbixAlertingSrv.removeZabbixThreshold(options.panelId);\n if (this.addThresholds) {\n _.forEach(alert.thresholds, threshold => {\n this.zabbixAlertingSrv.setPanelThreshold(options.panelId, threshold);\n });\n }\n });\n }\n\n // Create request for each target\n let promises = _.map(options.targets, t => {\n // Don't request undefined and hidden targets\n if (t.hide) {\n return [];\n }\n\n let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);\n let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);\n\n // Prevent changes of original object\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n\n // Apply Time-related functions (timeShift(), etc)\n let timeFunctions = bindFunctionDefs(target.functions, 'Time');\n if (timeFunctions.length) {\n const [time_from, time_to] = sequence(timeFunctions)([timeFrom, timeTo]);\n timeFrom = time_from;\n timeTo = time_to;\n }\n let timeRange = [timeFrom, timeTo];\n\n let useTrends = this.isUseTrends(timeRange);\n\n // Metrics or Text query mode\n if (!target.mode || target.mode === c.MODE_METRICS || target.mode === c.MODE_TEXT) {\n // Migrate old targets\n target = migrations.migrate(target);\n\n // Don't request undefined and hidden targets\n if (target.hide || !target.group || !target.host || !target.item) {\n return [];\n }\n\n if (!target.mode || target.mode === c.MODE_METRICS) {\n return this.queryNumericData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_TEXT) {\n return this.queryTextData(target, timeRange);\n }\n } else if (target.mode === c.MODE_ITEMID) {\n // Item ID mode\n if (!target.itemids) {\n return [];\n }\n return this.queryItemIdData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_ITSERVICE) {\n // IT services mode\n return this.queryITServiceData(target, timeRange, options);\n } else if (target.mode === c.MODE_TRIGGERS) {\n // Triggers mode\n return this.queryTriggersData(target, timeRange);\n } else {\n return [];\n }\n });\n\n // Data for panel (all targets)\n return Promise.all(_.flatten(promises))\n .then(_.flatten)\n .then(data => {\n return { data: data };\n });\n }\n\n /**\n * Query target data for Metrics mode\n */\n queryNumericData(target, timeRange, useTrends, options) {\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query history for numeric items\n */\n queryNumericDataForItems(items, target, timeRange, useTrends, options) {\n let getHistoryPromise;\n options.valueType = this.getTrendValueType(target);\n options.consolidateBy = getConsolidateBy(target) || options.valueType;\n\n if (useTrends) {\n getHistoryPromise = this.zabbix.getTrends(items, timeRange, options);\n } else {\n getHistoryPromise = this.zabbix.getHistoryTS(items, timeRange, options);\n }\n\n return getHistoryPromise\n .then(timeseries => this.applyDataProcessingFunctions(timeseries, target))\n .then(timeseries => downsampleSeries(timeseries, options));\n }\n\n getTrendValueType(target) {\n // Find trendValue() function and get specified trend value\n var trendFunctions = _.map(metricFunctions.getCategories()['Trends'], 'name');\n var trendValueFunc = _.find(target.functions, func => {\n return _.includes(trendFunctions, func.def.name);\n });\n return trendValueFunc ? trendValueFunc.params[0] : \"avg\";\n }\n\n applyDataProcessingFunctions(timeseries_data, target) {\n let transformFunctions = bindFunctionDefs(target.functions, 'Transform');\n let aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');\n let filterFunctions = bindFunctionDefs(target.functions, 'Filter');\n let aliasFunctions = bindFunctionDefs(target.functions, 'Alias');\n\n // Apply transformation functions\n timeseries_data = _.cloneDeep(_.map(timeseries_data, timeseries => {\n timeseries.datapoints = sequence(transformFunctions)(timeseries.datapoints);\n return timeseries;\n }));\n\n // Apply filter functions\n if (filterFunctions.length) {\n timeseries_data = sequence(filterFunctions)(timeseries_data);\n }\n\n // Apply aggregations\n if (aggregationFunctions.length) {\n let dp = _.map(timeseries_data, 'datapoints');\n dp = sequence(aggregationFunctions)(dp);\n\n let aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name');\n let lastAgg = _.findLast(target.functions, func => {\n return _.includes(aggFuncNames, func.def.name);\n });\n\n timeseries_data = [{\n target: lastAgg.text,\n datapoints: dp\n }];\n }\n\n // Apply alias functions\n _.forEach(timeseries_data, sequence(aliasFunctions));\n\n // Apply Time-related functions (timeShift(), etc)\n // Find timeShift() function and get specified trend value\n this.applyTimeShiftFunction(timeseries_data, target);\n\n return timeseries_data;\n }\n\n applyTimeShiftFunction(timeseries_data, target) {\n // Find timeShift() function and get specified interval\n let timeShiftFunc = _.find(target.functions, (func) => {\n return func.def.name === 'timeShift';\n });\n if (timeShiftFunc) {\n let shift = timeShiftFunc.params[0];\n _.forEach(timeseries_data, (series) => {\n series.datapoints = dataProcessor.unShiftTimeSeries(shift, series.datapoints);\n });\n }\n }\n\n /**\n * Query target data for Text mode\n */\n queryTextData(target, timeRange) {\n let options = {\n itemtype: 'text'\n };\n return this.zabbix.getItemsFromTarget(target, options)\n .then(items => {\n return this.zabbix.getHistoryText(items, timeRange, target);\n });\n }\n\n /**\n * Query target data for Item ID mode\n */\n queryItemIdData(target, timeRange, useTrends, options) {\n let itemids = target.itemids;\n itemids = this.templateSrv.replace(itemids, options.scopedVars, zabbixItemIdsTemplateFormat);\n itemids = _.map(itemids.split(','), itemid => itemid.trim());\n\n if (!itemids) {\n return [];\n }\n\n return this.zabbix.getItemsByIDs(itemids)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query target data for IT Services mode\n */\n queryITServiceData(target, timeRange, options) {\n // Don't show undefined and hidden targets\n if (target.hide || (!target.itservice && !target.itServiceFilter) || !target.slaProperty) {\n return [];\n }\n\n let itServiceFilter;\n options.isOldVersion = target.itservice && !target.itServiceFilter;\n\n if (options.isOldVersion) {\n // Backward compatibility\n itServiceFilter = '/.*/';\n } else {\n itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);\n }\n\n return this.zabbix.getITServices(itServiceFilter)\n .then(itservices => {\n return this.zabbix.getSLA(itservices, timeRange, target, options);\n });\n }\n\n queryTriggersData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n return this.zabbix.getHostsFromTarget(target)\n .then((results) => {\n let [hosts, apps] = results;\n if (hosts.length) {\n let hostids = _.map(hosts, 'hostid');\n let appids = _.map(apps, 'applicationid');\n let options = {\n minSeverity: target.triggers.minSeverity,\n acknowledged: target.triggers.acknowledged,\n count: target.triggers.count,\n timeFrom: timeFrom,\n timeTo: timeTo\n };\n return this.zabbix.getHostAlerts(hostids, appids, options)\n .then((triggers) => {\n return responseHandler.handleTriggersResponse(triggers, timeRange);\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Test connection to Zabbix API\n * @return {object} Connection status and Zabbix API version\n */\n testDatasource() {\n let zabbixVersion;\n return this.zabbix.getVersion()\n .then(version => {\n zabbixVersion = version;\n return this.zabbix.login();\n })\n .then(() => {\n if (this.enableDirectDBConnection) {\n return this.zabbix.dbConnector.testDataSource();\n } else {\n return Promise.resolve();\n }\n })\n .then(() => {\n return {\n status: \"success\",\n title: \"Success\",\n message: \"Zabbix API version: \" + zabbixVersion\n };\n })\n .catch(error => {\n if (error instanceof ZabbixAPIError) {\n return {\n status: \"error\",\n title: error.message,\n message: error.message\n };\n } else if (error.data && error.data.message) {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error.data.message\n };\n } else {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Could not connect to given url\"\n };\n }\n });\n }\n\n ////////////////\n // Templating //\n ////////////////\n\n /**\n * Find metrics from templated request.\n *\n * @param {string} query Query from Templating\n * @return {string} Metric name - group, host, app or item or list\n * of metrics in \"{metric1,metcic2,...,metricN}\" format.\n */\n metricFindQuery(query) {\n let result;\n let parts = [];\n\n // Split query. Query structure: group.host.app.item\n _.each(utils.splitTemplateQuery(query), part => {\n part = this.replaceTemplateVars(part, {});\n\n // Replace wildcard to regex\n if (part === '*') {\n part = '/.*/';\n }\n parts.push(part);\n });\n let template = _.zipObject(['group', 'host', 'app', 'item'], parts);\n\n // Get items\n if (parts.length === 4) {\n // Search for all items, even it's not belong to any application\n if (template.app === '/.*/') {\n template.app = '';\n }\n result = this.zabbix.getItems(template.group, template.host, template.app, template.item);\n } else if (parts.length === 3) {\n // Get applications\n result = this.zabbix.getApps(template.group, template.host, template.app);\n } else if (parts.length === 2) {\n // Get hosts\n result = this.zabbix.getHosts(template.group, template.host);\n } else if (parts.length === 1) {\n // Get groups\n result = this.zabbix.getGroups(template.group);\n } else {\n result = Promise.resolve([]);\n }\n\n return result.then(metrics => {\n return _.map(metrics, formatMetric);\n });\n }\n\n /////////////////\n // Annotations //\n /////////////////\n\n annotationQuery(options) {\n var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);\n var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);\n var annotation = options.annotation;\n var showOkEvents = annotation.showOkEvents ? c.SHOW_ALL_EVENTS : c.SHOW_OK_EVENTS;\n\n // Show all triggers\n let triggersOptions = {\n showTriggers: c.SHOW_ALL_TRIGGERS,\n hideHostsInMaintenance: false\n };\n\n var getTriggers = this.zabbix.getTriggers(this.replaceTemplateVars(annotation.group, {}),\n this.replaceTemplateVars(annotation.host, {}),\n this.replaceTemplateVars(annotation.application, {}),\n triggersOptions);\n\n return getTriggers.then(triggers => {\n\n // Filter triggers by description\n let triggerName = this.replaceTemplateVars(annotation.trigger, {});\n if (utils.isRegex(triggerName)) {\n triggers = _.filter(triggers, trigger => {\n return utils.buildRegex(triggerName).test(trigger.description);\n });\n } else if (triggerName) {\n triggers = _.filter(triggers, trigger => {\n return trigger.description === triggerName;\n });\n }\n\n // Remove events below the chose severity\n triggers = _.filter(triggers, trigger => {\n return Number(trigger.priority) >= Number(annotation.minseverity);\n });\n\n var objectids = _.map(triggers, 'triggerid');\n return this.zabbix\n .getEvents(objectids, timeFrom, timeTo, showOkEvents)\n .then(events => {\n var indexedTriggers = _.keyBy(triggers, 'triggerid');\n\n // Hide acknowledged events if option enabled\n if (annotation.hideAcknowledged) {\n events = _.filter(events, event => {\n return !event.acknowledges.length;\n });\n }\n\n return _.map(events, event => {\n let tags;\n if (annotation.showHostname) {\n tags = _.map(event.hosts, 'name');\n }\n\n // Show event type (OK or Problem)\n let title = Number(event.value) ? 'Problem' : 'OK';\n\n let formatted_acknowledges = utils.formatAcknowledges(event.acknowledges);\n return {\n annotation: annotation,\n time: event.clock * 1000,\n title: title,\n tags: tags,\n text: indexedTriggers[event.objectid].description + formatted_acknowledges\n };\n });\n });\n });\n }\n\n /**\n * Get triggers and its details for panel's targets\n * Returns alert state ('ok' if no fired triggers, or 'alerting' if at least 1 trigger is fired)\n * or empty object if no related triggers are finded.\n */\n alertQuery(options) {\n let enabled_targets = filterEnabledTargets(options.targets);\n let getPanelItems = _.map(enabled_targets, t => {\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n return this.zabbix.getItemsFromTarget(target, {itemtype: 'num'});\n });\n\n return Promise.all(getPanelItems)\n .then(results => {\n let items = _.flatten(results);\n let itemids = _.map(items, 'itemid');\n\n if (itemids.length === 0) {\n return [];\n }\n return this.zabbix.getAlerts(itemids);\n })\n .then(triggers => {\n triggers = _.filter(triggers, trigger => {\n return trigger.priority >= this.alertingMinSeverity;\n });\n\n if (!triggers || triggers.length === 0) {\n return {};\n }\n\n let state = 'ok';\n\n let firedTriggers = _.filter(triggers, {value: '1'});\n if (firedTriggers.length) {\n state = 'alerting';\n }\n\n let thresholds = _.map(triggers, trigger => {\n return getTriggerThreshold(trigger.expression);\n });\n\n return {\n panelId: options.panelId,\n state: state,\n thresholds: thresholds\n };\n });\n }\n\n // Replace template variables\n replaceTargetVariables(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n _.forEach(parts, p => {\n if (target[p] && target[p].filter) {\n target[p].filter = this.replaceTemplateVars(target[p].filter, options.scopedVars);\n }\n });\n target.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars);\n\n _.forEach(target.functions, func => {\n func.params = _.map(func.params, param => {\n if (typeof param === 'number') {\n return +this.templateSrv.replace(param.toString(), options.scopedVars);\n } else {\n return this.templateSrv.replace(param, options.scopedVars);\n }\n });\n });\n }\n\n isUseTrends(timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);\n let useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);\n let useTrends = this.trends && (\n (timeFrom <= useTrendsFrom) ||\n (timeTo - timeFrom >= useTrendsRange)\n );\n return useTrends;\n }\n}\n\nfunction bindFunctionDefs(functionDefs, category) {\n var aggregationFunctions = _.map(metricFunctions.getCategories()[category], 'name');\n var aggFuncDefs = _.filter(functionDefs, function(func) {\n return _.includes(aggregationFunctions, func.def.name);\n });\n\n return _.map(aggFuncDefs, function(func) {\n var funcInstance = metricFunctions.createFuncInstance(func.def, func.params);\n return funcInstance.bindFunction(dataProcessor.metricFunctions);\n });\n}\n\nfunction getConsolidateBy(target) {\n let consolidateBy;\n let funcDef = _.find(target.functions, func => {\n return func.def.name === 'consolidateBy';\n });\n if (funcDef && funcDef.params && funcDef.params.length) {\n consolidateBy = funcDef.params[0];\n }\n return consolidateBy;\n}\n\nfunction downsampleSeries(timeseries_data, options) {\n let defaultAgg = dataProcessor.aggregationFunctions['avg'];\n let consolidateByFunc = dataProcessor.aggregationFunctions[options.consolidateBy] || defaultAgg;\n return _.map(timeseries_data, timeseries => {\n if (timeseries.datapoints.length > options.maxDataPoints) {\n timeseries.datapoints = dataProcessor\n .groupBy(options.interval, consolidateByFunc, timeseries.datapoints);\n }\n return timeseries;\n });\n}\n\nfunction formatMetric(metricObj) {\n return {\n text: metricObj.name,\n expandable: false\n };\n}\n\n/**\n * Custom formatter for template variables.\n * Default Grafana \"regex\" formatter returns\n * value1|value2\n * This formatter returns\n * (value1|value2)\n * This format needed for using in complex regex with\n * template variables, for example\n * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait\n */\nfunction zabbixTemplateFormat(value) {\n if (typeof value === 'string') {\n return utils.escapeRegex(value);\n }\n\n var escapedValues = _.map(value, utils.escapeRegex);\n return '(' + escapedValues.join('|') + ')';\n}\n\nfunction zabbixItemIdsTemplateFormat(value) {\n if (typeof value === 'string') {\n return value;\n }\n return value.join(',');\n}\n\n/**\n * If template variables are used in request, replace it using regex format\n * and wrap with '/' for proper multi-value work. Example:\n * $variable selected as a, b, c\n * We use filter $variable\n * $variable -> a|b|c -> /a|b|c/\n * /$variable/ -> /a|b|c/ -> /a|b|c/\n */\nfunction replaceTemplateVars(templateSrv, target, scopedVars) {\n var replacedTarget = templateSrv.replace(target, scopedVars, zabbixTemplateFormat);\n if (target !== replacedTarget && !utils.isRegex(replacedTarget)) {\n replacedTarget = '/^' + replacedTarget + '$/';\n }\n return replacedTarget;\n}\n\n// Apply function one by one:\n// sequence([a(), b(), c()]) = c(b(a()));\nfunction sequence(funcsArray) {\n return function(result) {\n for (var i = 0; i < funcsArray.length; i++) {\n result = funcsArray[i].call(this, result);\n }\n return result;\n };\n}\n\nfunction filterEnabledTargets(targets) {\n return _.filter(targets, target => {\n return !(target.hide || !target.group || !target.host || !target.item);\n });\n}\n\nfunction getTriggerThreshold(expression) {\n let thresholdPattern = /.*[<>=]{1,2}([\\d\\.]+)/;\n let finded_thresholds = expression.match(thresholdPattern);\n if (finded_thresholds && finded_thresholds.length >= 2) {\n let threshold = finded_thresholds[1];\n threshold = Number(threshold);\n return threshold;\n } else {\n return null;\n }\n}\n\nexport {ZabbixAPIDatasource, zabbixTemplateFormat};\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {_.includes = _.contains;}\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","getConsolidateBy","target","consolidateBy","funcDef","find","functions","length","downsampleSeries","timeseries_data","options","defaultAgg","consolidateByFunc","timeseries","datapoints","maxDataPoints","groupBy","interval","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","zabbixItemIdsTemplateFormat","replaceTemplateVars","templateSrv","scopedVars","replacedTarget","replace","isRegex","filterEnabledTargets","targets","hide","group","host","item","getTriggerThreshold","expression","thresholdPattern","finded_thresholds","match","threshold","Number","dateMath","migrations","c","responseHandler","Zabbix","ZabbixAPIError","ZabbixDatasource","instanceSettings","backendSrv","datasourceSrv","zabbixAlertingSrv","partial","url","basicAuth","withCredentials","jsonData","migrateDSConfig","username","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","disableReadOnlyUsersAck","enableDirectDBConnection","dbConnectionEnable","datasourceId","dbConnectionDatasourceId","zabbixOptions","zabbix","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","t","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","replaceTargetVariables","timeFunctions","sequence","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_METRICS","MODE_TEXT","migrate","queryNumericData","queryTextData","MODE_ITEMID","itemids","queryItemIdData","MODE_ITSERVICE","queryITServiceData","MODE_TRIGGERS","queryTriggersData","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","queryNumericDataForItems","items","getHistoryPromise","valueType","getTrendValueType","getTrends","getHistoryTS","applyDataProcessingFunctions","trendFunctions","trendValueFunc","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","series","unShiftTimeSeries","getHistoryText","split","itemid","trim","getItemsByIDs","itservice","itServiceFilter","slaProperty","isOldVersion","getITServices","getSLA","itservices","getHostsFromTarget","results","hosts","apps","hostids","appids","minSeverity","triggers","acknowledged","count","getHostAlerts","handleTriggersResponse","resolve","testDataSource","zabbixVersion","result","dbConnectorStatus","message","dsType","status","title","catch","error","console","log","query","parts","each","splitTemplateQuery","part","push","template","zipObject","app","getItems","getApps","getHosts","getGroups","metrics","rangeRaw","annotation","showOkEvents","SHOW_ALL_EVENTS","SHOW_OK_EVENTS","triggersOptions","showTriggers","SHOW_ALL_TRIGGERS","hideHostsInMaintenance","getTriggers","application","triggerName","trigger","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport { Zabbix } from './zabbix/zabbix';\nimport { ZabbixAPIError } from './zabbix/connectors/zabbix_api/zabbixAPICore';\n\nexport class ZabbixDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) {\n this.templateSrv = templateSrv;\n this.zabbixAlertingSrv = zabbixAlertingSrv;\n\n // Use custom format for template variables\n this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);\n\n // General data source settings\n this.name = instanceSettings.name;\n this.url = instanceSettings.url;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n\n const jsonData = migrations.migrateDSConfig(instanceSettings.jsonData);\n\n // Zabbix API credentials\n this.username = jsonData.username;\n this.password = jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = jsonData.trends;\n this.trendsFrom = jsonData.trendsFrom || '7d';\n this.trendsRange = jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = jsonData.alerting;\n this.addThresholds = jsonData.addThresholds;\n this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n // Other options\n this.disableReadOnlyUsersAck = jsonData.disableReadOnlyUsersAck;\n\n // Direct DB Connection options\n this.enableDirectDBConnection = jsonData.dbConnectionEnable || false;\n this.datasourceId = jsonData.dbConnectionDatasourceId;\n\n let zabbixOptions = {\n url: this.url,\n username: this.username,\n password: this.password,\n basicAuth: this.basicAuth,\n withCredentials: this.withCredentials,\n cacheTTL: this.cacheTTL,\n enableDirectDBConnection: this.enableDirectDBConnection,\n datasourceId: this.datasourceId\n };\n\n this.zabbix = new Zabbix(zabbixOptions, backendSrv, datasourceSrv);\n }\n\n ////////////////////////\n // Datasource methods //\n ////////////////////////\n\n /**\n * Query panel data. Calls for each panel in dashboard.\n * @param {Object} options Contains time range, targets and other info.\n * @return {Object} Grafana metrics object with timeseries data for each target.\n */\n query(options) {\n // Get alerts for current panel\n if (this.alertingEnabled) {\n this.alertQuery(options).then(alert => {\n this.zabbixAlertingSrv.setPanelAlertState(options.panelId, alert.state);\n\n this.zabbixAlertingSrv.removeZabbixThreshold(options.panelId);\n if (this.addThresholds) {\n _.forEach(alert.thresholds, threshold => {\n this.zabbixAlertingSrv.setPanelThreshold(options.panelId, threshold);\n });\n }\n });\n }\n\n // Create request for each target\n let promises = _.map(options.targets, t => {\n // Don't request for hidden targets\n if (t.hide) {\n return [];\n }\n\n let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);\n let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);\n\n // Prevent changes of original object\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n\n // Apply Time-related functions (timeShift(), etc)\n let timeFunctions = bindFunctionDefs(target.functions, 'Time');\n if (timeFunctions.length) {\n const [time_from, time_to] = utils.sequence(timeFunctions)([timeFrom, timeTo]);\n timeFrom = time_from;\n timeTo = time_to;\n }\n let timeRange = [timeFrom, timeTo];\n\n let useTrends = this.isUseTrends(timeRange);\n\n // Metrics or Text query mode\n if (!target.mode || target.mode === c.MODE_METRICS || target.mode === c.MODE_TEXT) {\n // Migrate old targets\n target = migrations.migrate(target);\n\n // Don't request undefined targets\n if (!target.group || !target.host || !target.item) {\n return [];\n }\n\n if (!target.mode || target.mode === c.MODE_METRICS) {\n return this.queryNumericData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_TEXT) {\n return this.queryTextData(target, timeRange);\n }\n } else if (target.mode === c.MODE_ITEMID) {\n // Item ID mode\n if (!target.itemids) {\n return [];\n }\n return this.queryItemIdData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_ITSERVICE) {\n // IT services mode\n return this.queryITServiceData(target, timeRange, options);\n } else if (target.mode === c.MODE_TRIGGERS) {\n // Triggers mode\n return this.queryTriggersData(target, timeRange);\n } else {\n return [];\n }\n });\n\n // Data for panel (all targets)\n return Promise.all(_.flatten(promises))\n .then(_.flatten)\n .then(data => {\n return { data: data };\n });\n }\n\n /**\n * Query target data for Metrics mode\n */\n queryNumericData(target, timeRange, useTrends, options) {\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => this.queryNumericDataForItems(items, target, timeRange, useTrends, options));\n }\n\n /**\n * Query history for numeric items\n */\n queryNumericDataForItems(items, target, timeRange, useTrends, options) {\n let getHistoryPromise;\n options.valueType = this.getTrendValueType(target);\n options.consolidateBy = getConsolidateBy(target) || options.valueType;\n\n if (useTrends) {\n getHistoryPromise = this.zabbix.getTrends(items, timeRange, options);\n } else {\n getHistoryPromise = this.zabbix.getHistoryTS(items, timeRange, options);\n }\n\n return getHistoryPromise\n .then(timeseries => this.applyDataProcessingFunctions(timeseries, target))\n .then(timeseries => downsampleSeries(timeseries, options));\n }\n\n getTrendValueType(target) {\n // Find trendValue() function and get specified trend value\n var trendFunctions = _.map(metricFunctions.getCategories()['Trends'], 'name');\n var trendValueFunc = _.find(target.functions, func => {\n return _.includes(trendFunctions, func.def.name);\n });\n return trendValueFunc ? trendValueFunc.params[0] : \"avg\";\n }\n\n applyDataProcessingFunctions(timeseries_data, target) {\n let transformFunctions = bindFunctionDefs(target.functions, 'Transform');\n let aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');\n let filterFunctions = bindFunctionDefs(target.functions, 'Filter');\n let aliasFunctions = bindFunctionDefs(target.functions, 'Alias');\n\n // Apply transformation functions\n timeseries_data = _.cloneDeep(_.map(timeseries_data, timeseries => {\n timeseries.datapoints = utils.sequence(transformFunctions)(timeseries.datapoints);\n return timeseries;\n }));\n\n // Apply filter functions\n if (filterFunctions.length) {\n timeseries_data = utils.sequence(filterFunctions)(timeseries_data);\n }\n\n // Apply aggregations\n if (aggregationFunctions.length) {\n let dp = _.map(timeseries_data, 'datapoints');\n dp = utils.sequence(aggregationFunctions)(dp);\n\n let aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name');\n let lastAgg = _.findLast(target.functions, func => {\n return _.includes(aggFuncNames, func.def.name);\n });\n\n timeseries_data = [{\n target: lastAgg.text,\n datapoints: dp\n }];\n }\n\n // Apply alias functions\n _.forEach(timeseries_data, utils.sequence(aliasFunctions));\n\n // Apply Time-related functions (timeShift(), etc)\n // Find timeShift() function and get specified trend value\n this.applyTimeShiftFunction(timeseries_data, target);\n\n return timeseries_data;\n }\n\n applyTimeShiftFunction(timeseries_data, target) {\n // Find timeShift() function and get specified interval\n let timeShiftFunc = _.find(target.functions, (func) => {\n return func.def.name === 'timeShift';\n });\n if (timeShiftFunc) {\n let shift = timeShiftFunc.params[0];\n _.forEach(timeseries_data, (series) => {\n series.datapoints = dataProcessor.unShiftTimeSeries(shift, series.datapoints);\n });\n }\n }\n\n /**\n * Query target data for Text mode\n */\n queryTextData(target, timeRange) {\n let options = {\n itemtype: 'text'\n };\n return this.zabbix.getItemsFromTarget(target, options)\n .then(items => {\n return this.zabbix.getHistoryText(items, timeRange, target);\n });\n }\n\n /**\n * Query target data for Item ID mode\n */\n queryItemIdData(target, timeRange, useTrends, options) {\n let itemids = target.itemids;\n itemids = this.templateSrv.replace(itemids, options.scopedVars, zabbixItemIdsTemplateFormat);\n itemids = _.map(itemids.split(','), itemid => itemid.trim());\n\n if (!itemids) {\n return [];\n }\n\n return this.zabbix.getItemsByIDs(itemids)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query target data for IT Services mode\n */\n queryITServiceData(target, timeRange, options) {\n // Don't show undefined and hidden targets\n if (target.hide || (!target.itservice && !target.itServiceFilter) || !target.slaProperty) {\n return [];\n }\n\n let itServiceFilter;\n options.isOldVersion = target.itservice && !target.itServiceFilter;\n\n if (options.isOldVersion) {\n // Backward compatibility\n itServiceFilter = '/.*/';\n } else {\n itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);\n }\n\n return this.zabbix.getITServices(itServiceFilter)\n .then(itservices => {\n return this.zabbix.getSLA(itservices, timeRange, target, options);\n });\n }\n\n queryTriggersData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n return this.zabbix.getHostsFromTarget(target)\n .then((results) => {\n let [hosts, apps] = results;\n if (hosts.length) {\n let hostids = _.map(hosts, 'hostid');\n let appids = _.map(apps, 'applicationid');\n let options = {\n minSeverity: target.triggers.minSeverity,\n acknowledged: target.triggers.acknowledged,\n count: target.triggers.count,\n timeFrom: timeFrom,\n timeTo: timeTo\n };\n return this.zabbix.getHostAlerts(hostids, appids, options)\n .then((triggers) => {\n return responseHandler.handleTriggersResponse(triggers, timeRange);\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Test connection to Zabbix API and external history DB.\n */\n testDatasource() {\n return this.zabbix.testDataSource()\n .then(result => {\n const { zabbixVersion, dbConnectorStatus } = result;\n let message = `Zabbix API version: ${zabbixVersion}`;\n if (dbConnectorStatus) {\n message += `, DB connector type: ${dbConnectorStatus.dsType}`;\n }\n return {\n status: \"success\",\n title: \"Success\",\n message: message\n };\n })\n .catch(error => {\n if (error instanceof ZabbixAPIError) {\n return {\n status: \"error\",\n title: error.message,\n message: error.message\n };\n } else if (error.data && error.data.message) {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error.data.message\n };\n } else if (typeof(error) === 'string') {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error\n };\n } else {\n console.log(error);\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Could not connect to given url\"\n };\n }\n });\n }\n\n ////////////////\n // Templating //\n ////////////////\n\n /**\n * Find metrics from templated request.\n *\n * @param {string} query Query from Templating\n * @return {string} Metric name - group, host, app or item or list\n * of metrics in \"{metric1,metcic2,...,metricN}\" format.\n */\n metricFindQuery(query) {\n let result;\n let parts = [];\n\n // Split query. Query structure: group.host.app.item\n _.each(utils.splitTemplateQuery(query), part => {\n part = this.replaceTemplateVars(part, {});\n\n // Replace wildcard to regex\n if (part === '*') {\n part = '/.*/';\n }\n parts.push(part);\n });\n let template = _.zipObject(['group', 'host', 'app', 'item'], parts);\n\n // Get items\n if (parts.length === 4) {\n // Search for all items, even it's not belong to any application\n if (template.app === '/.*/') {\n template.app = '';\n }\n result = this.zabbix.getItems(template.group, template.host, template.app, template.item);\n } else if (parts.length === 3) {\n // Get applications\n result = this.zabbix.getApps(template.group, template.host, template.app);\n } else if (parts.length === 2) {\n // Get hosts\n result = this.zabbix.getHosts(template.group, template.host);\n } else if (parts.length === 1) {\n // Get groups\n result = this.zabbix.getGroups(template.group);\n } else {\n result = Promise.resolve([]);\n }\n\n return result.then(metrics => {\n return _.map(metrics, formatMetric);\n });\n }\n\n /////////////////\n // Annotations //\n /////////////////\n\n annotationQuery(options) {\n var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);\n var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);\n var annotation = options.annotation;\n var showOkEvents = annotation.showOkEvents ? c.SHOW_ALL_EVENTS : c.SHOW_OK_EVENTS;\n\n // Show all triggers\n let triggersOptions = {\n showTriggers: c.SHOW_ALL_TRIGGERS,\n hideHostsInMaintenance: false\n };\n\n var getTriggers = this.zabbix.getTriggers(this.replaceTemplateVars(annotation.group, {}),\n this.replaceTemplateVars(annotation.host, {}),\n this.replaceTemplateVars(annotation.application, {}),\n triggersOptions);\n\n return getTriggers.then(triggers => {\n\n // Filter triggers by description\n let triggerName = this.replaceTemplateVars(annotation.trigger, {});\n if (utils.isRegex(triggerName)) {\n triggers = _.filter(triggers, trigger => {\n return utils.buildRegex(triggerName).test(trigger.description);\n });\n } else if (triggerName) {\n triggers = _.filter(triggers, trigger => {\n return trigger.description === triggerName;\n });\n }\n\n // Remove events below the chose severity\n triggers = _.filter(triggers, trigger => {\n return Number(trigger.priority) >= Number(annotation.minseverity);\n });\n\n var objectids = _.map(triggers, 'triggerid');\n return this.zabbix\n .getEvents(objectids, timeFrom, timeTo, showOkEvents)\n .then(events => {\n var indexedTriggers = _.keyBy(triggers, 'triggerid');\n\n // Hide acknowledged events if option enabled\n if (annotation.hideAcknowledged) {\n events = _.filter(events, event => {\n return !event.acknowledges.length;\n });\n }\n\n return _.map(events, event => {\n let tags;\n if (annotation.showHostname) {\n tags = _.map(event.hosts, 'name');\n }\n\n // Show event type (OK or Problem)\n let title = Number(event.value) ? 'Problem' : 'OK';\n\n let formatted_acknowledges = utils.formatAcknowledges(event.acknowledges);\n return {\n annotation: annotation,\n time: event.clock * 1000,\n title: title,\n tags: tags,\n text: indexedTriggers[event.objectid].description + formatted_acknowledges\n };\n });\n });\n });\n }\n\n /**\n * Get triggers and its details for panel's targets\n * Returns alert state ('ok' if no fired triggers, or 'alerting' if at least 1 trigger is fired)\n * or empty object if no related triggers are finded.\n */\n alertQuery(options) {\n let enabled_targets = filterEnabledTargets(options.targets);\n let getPanelItems = _.map(enabled_targets, t => {\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n return this.zabbix.getItemsFromTarget(target, {itemtype: 'num'});\n });\n\n return Promise.all(getPanelItems)\n .then(results => {\n let items = _.flatten(results);\n let itemids = _.map(items, 'itemid');\n\n if (itemids.length === 0) {\n return [];\n }\n return this.zabbix.getAlerts(itemids);\n })\n .then(triggers => {\n triggers = _.filter(triggers, trigger => {\n return trigger.priority >= this.alertingMinSeverity;\n });\n\n if (!triggers || triggers.length === 0) {\n return {};\n }\n\n let state = 'ok';\n\n let firedTriggers = _.filter(triggers, {value: '1'});\n if (firedTriggers.length) {\n state = 'alerting';\n }\n\n let thresholds = _.map(triggers, trigger => {\n return getTriggerThreshold(trigger.expression);\n });\n\n return {\n panelId: options.panelId,\n state: state,\n thresholds: thresholds\n };\n });\n }\n\n // Replace template variables\n replaceTargetVariables(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n _.forEach(parts, p => {\n if (target[p] && target[p].filter) {\n target[p].filter = this.replaceTemplateVars(target[p].filter, options.scopedVars);\n }\n });\n target.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars);\n\n _.forEach(target.functions, func => {\n func.params = _.map(func.params, param => {\n if (typeof param === 'number') {\n return +this.templateSrv.replace(param.toString(), options.scopedVars);\n } else {\n return this.templateSrv.replace(param, options.scopedVars);\n }\n });\n });\n }\n\n isUseTrends(timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);\n let useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);\n let useTrends = this.trends && (\n (timeFrom <= useTrendsFrom) ||\n (timeTo - timeFrom >= useTrendsRange)\n );\n return useTrends;\n }\n}\n\nfunction bindFunctionDefs(functionDefs, category) {\n var aggregationFunctions = _.map(metricFunctions.getCategories()[category], 'name');\n var aggFuncDefs = _.filter(functionDefs, function(func) {\n return _.includes(aggregationFunctions, func.def.name);\n });\n\n return _.map(aggFuncDefs, function(func) {\n var funcInstance = metricFunctions.createFuncInstance(func.def, func.params);\n return funcInstance.bindFunction(dataProcessor.metricFunctions);\n });\n}\n\nfunction getConsolidateBy(target) {\n let consolidateBy;\n let funcDef = _.find(target.functions, func => {\n return func.def.name === 'consolidateBy';\n });\n if (funcDef && funcDef.params && funcDef.params.length) {\n consolidateBy = funcDef.params[0];\n }\n return consolidateBy;\n}\n\nfunction downsampleSeries(timeseries_data, options) {\n let defaultAgg = dataProcessor.aggregationFunctions['avg'];\n let consolidateByFunc = dataProcessor.aggregationFunctions[options.consolidateBy] || defaultAgg;\n return _.map(timeseries_data, timeseries => {\n if (timeseries.datapoints.length > options.maxDataPoints) {\n timeseries.datapoints = dataProcessor\n .groupBy(options.interval, consolidateByFunc, timeseries.datapoints);\n }\n return timeseries;\n });\n}\n\nfunction formatMetric(metricObj) {\n return {\n text: metricObj.name,\n expandable: false\n };\n}\n\n/**\n * Custom formatter for template variables.\n * Default Grafana \"regex\" formatter returns\n * value1|value2\n * This formatter returns\n * (value1|value2)\n * This format needed for using in complex regex with\n * template variables, for example\n * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait\n */\nexport function zabbixTemplateFormat(value) {\n if (typeof value === 'string') {\n return utils.escapeRegex(value);\n }\n\n var escapedValues = _.map(value, utils.escapeRegex);\n return '(' + escapedValues.join('|') + ')';\n}\n\nfunction zabbixItemIdsTemplateFormat(value) {\n if (typeof value === 'string') {\n return value;\n }\n return value.join(',');\n}\n\n/**\n * If template variables are used in request, replace it using regex format\n * and wrap with '/' for proper multi-value work. Example:\n * $variable selected as a, b, c\n * We use filter $variable\n * $variable -> a|b|c -> /a|b|c/\n * /$variable/ -> /a|b|c/ -> /a|b|c/\n */\nfunction replaceTemplateVars(templateSrv, target, scopedVars) {\n var replacedTarget = templateSrv.replace(target, scopedVars, zabbixTemplateFormat);\n if (target !== replacedTarget && !utils.isRegex(replacedTarget)) {\n replacedTarget = '/^' + replacedTarget + '$/';\n }\n return replacedTarget;\n}\n\nfunction filterEnabledTargets(targets) {\n return _.filter(targets, target => {\n return !(target.hide || !target.group || !target.host || !target.item);\n });\n}\n\nfunction getTriggerThreshold(expression) {\n let thresholdPattern = /.*[<>=]{1,2}([\\d\\.]+)/;\n let finded_thresholds = expression.match(thresholdPattern);\n if (finded_thresholds && finded_thresholds.length >= 2) {\n let threshold = finded_thresholds[1];\n threshold = Number(threshold);\n return threshold;\n } else {\n return null;\n }\n}\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {_.includes = _.contains;}\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/metric-function-editor.directive.js b/dist/datasource-zabbix/metric-function-editor.directive.js index 334e6d4..b8f060a 100644 --- a/dist/datasource-zabbix/metric-function-editor.directive.js +++ b/dist/datasource-zabbix/metric-function-editor.directive.js @@ -3,7 +3,7 @@ System.register(['angular', 'lodash', 'jquery'], function (_export, _context) { "use strict"; - var angular, _, $; + var angular, _, $, DOCS_FUNC_REF_URL; return { setters: [function (_angular) { @@ -14,9 +14,13 @@ System.register(['angular', 'lodash', 'jquery'], function (_export, _context) { $ = _jquery.default; }], execute: function () { + DOCS_FUNC_REF_URL = 'http://docs.grafana-zabbix.org/reference/functions/'; + + + angular.module('grafana.directives').directive('metricFunctionEditor', /** @ngInject */ - angular.module('grafana.directives').directive('metricFunctionEditor', function ($compile, templateSrv) { + function ($compile, templateSrv) { var funcSpanTemplate = '{{func.def.name}}('; var paramTemplate = ''; @@ -225,7 +229,7 @@ System.register(['angular', 'lodash', 'jquery'], function (_export, _context) { } if ($target.hasClass('fa-question-circle')) { - var docSite = "http://docs.grafana-zabbix.org/reference/functions/"; + var docSite = DOCS_FUNC_REF_URL; window.open(docSite + '#' + funcDef.name.toLowerCase(), '_blank'); return; } diff --git a/dist/datasource-zabbix/metric-function-editor.directive.js.map b/dist/datasource-zabbix/metric-function-editor.directive.js.map index ca5b8ba..1ef63d6 100644 --- a/dist/datasource-zabbix/metric-function-editor.directive.js.map +++ b/dist/datasource-zabbix/metric-function-editor.directive.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/metric-function-editor.directive.js"],"names":["angular","_","$","module","directive","$compile","templateSrv","funcSpanTemplate","paramTemplate","funcControlsTemplate","restrict","link","postLink","$scope","elem","$funcLink","$funcControls","ctrl","func","funcDef","def","scheduledRelink","paramCountAtLink","clickFuncParam","paramIndex","$link","$input","next","val","params","css","width","hide","show","focus","select","typeahead","data","lookup","scheduledRelinkIfNeeded","length","setTimeout","relink","inputBlur","prev","newValue","optional","html","highlightVariablesAsHtml","updateParam","$apply","targetChanged","inputKeyPress","e","which","call","inputKeyDown","style","value","addTypeahead","attr","options","type","map","toString","source","minLength","items","updater","query","$element","process","toggleFuncControls","targetDiv","closest","hasClass","removeClass","addClass","addElementsAndCompile","appendTo","each","param","index","paramValue","$paramLink","blur","partial","keyup","keypress","click","contents","ifJustAddedFocusFistParam","added","find","first","registerFuncControlsToggle","registerFuncControlsActions","$target","target","removeFunction","move","functions","$index","docSite","window","open","name","toLowerCase","children","remove"],"mappings":"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","file":"metric-function-editor.directive.js","sourcesContent":["import angular from 'angular';\nimport _ from 'lodash';\nimport $ from 'jquery';\n\n/** @ngInject */\nangular\n .module('grafana.directives')\n .directive('metricFunctionEditor', function($compile, templateSrv) {\n\n var funcSpanTemplate = '{{func.def.name}}(';\n var paramTemplate = '';\n\n var funcControlsTemplate =\n '
' +\n '' +\n '' +\n '' +\n '' +\n '
';\n\n return {\n restrict: 'A',\n link: function postLink($scope, elem) {\n var $funcLink = $(funcSpanTemplate);\n var $funcControls = $(funcControlsTemplate);\n var ctrl = $scope.ctrl;\n var func = $scope.func;\n var funcDef = func.def;\n var scheduledRelink = false;\n var paramCountAtLink = 0;\n\n function clickFuncParam(paramIndex) {\n /*jshint validthis:true */\n\n var $link = $(this);\n var $input = $link.next();\n\n $input.val(func.params[paramIndex]);\n $input.css('width', ($link.width() + 16) + 'px');\n\n $link.hide();\n $input.show();\n $input.focus();\n $input.select();\n\n var typeahead = $input.data('typeahead');\n if (typeahead) {\n $input.val('');\n typeahead.lookup();\n }\n }\n\n function scheduledRelinkIfNeeded() {\n if (paramCountAtLink === func.params.length) {\n return;\n }\n\n if (!scheduledRelink) {\n scheduledRelink = true;\n setTimeout(function() {\n relink();\n scheduledRelink = false;\n }, 200);\n }\n }\n\n function inputBlur(paramIndex) {\n /*jshint validthis:true */\n var $input = $(this);\n var $link = $input.prev();\n var newValue = $input.val();\n\n if (newValue !== '' || func.def.params[paramIndex].optional) {\n $link.html(templateSrv.highlightVariablesAsHtml(newValue));\n\n func.updateParam($input.val(), paramIndex);\n scheduledRelinkIfNeeded();\n\n $scope.$apply(function() {\n ctrl.targetChanged();\n });\n\n $input.hide();\n $link.show();\n }\n }\n\n function inputKeyPress(paramIndex, e) {\n /*jshint validthis:true */\n if(e.which === 13) {\n inputBlur.call(this, paramIndex);\n }\n }\n\n function inputKeyDown() {\n /*jshint validthis:true */\n this.style.width = (3 + this.value.length) * 8 + 'px';\n }\n\n function addTypeahead($input, paramIndex) {\n $input.attr('data-provide', 'typeahead');\n\n var options = funcDef.params[paramIndex].options;\n if (funcDef.params[paramIndex].type === 'int' ||\n funcDef.params[paramIndex].type === 'float') {\n options = _.map(options, function(val) { return val.toString(); });\n }\n\n $input.typeahead({\n source: options,\n minLength: 0,\n items: 20,\n updater: function (value) {\n setTimeout(function() {\n inputBlur.call($input[0], paramIndex);\n }, 0);\n return value;\n }\n });\n\n var typeahead = $input.data('typeahead');\n typeahead.lookup = function () {\n this.query = this.$element.val() || '';\n return this.process(this.source);\n };\n }\n\n function toggleFuncControls() {\n var targetDiv = elem.closest('.tight-form');\n\n if (elem.hasClass('show-function-controls')) {\n elem.removeClass('show-function-controls');\n targetDiv.removeClass('has-open-function');\n $funcControls.hide();\n return;\n }\n\n elem.addClass('show-function-controls');\n targetDiv.addClass('has-open-function');\n\n $funcControls.show();\n }\n\n function addElementsAndCompile() {\n $funcControls.appendTo(elem);\n $funcLink.appendTo(elem);\n\n _.each(funcDef.params, function(param, index) {\n if (param.optional && func.params.length <= index) {\n return;\n }\n\n if (index > 0) {\n $(', ').appendTo(elem);\n }\n\n var paramValue = templateSrv.highlightVariablesAsHtml(func.params[index]);\n var $paramLink = $('' + paramValue + '');\n var $input = $(paramTemplate);\n\n paramCountAtLink++;\n\n $paramLink.appendTo(elem);\n $input.appendTo(elem);\n\n $input.blur(_.partial(inputBlur, index));\n $input.keyup(inputKeyDown);\n $input.keypress(_.partial(inputKeyPress, index));\n $paramLink.click(_.partial(clickFuncParam, index));\n\n if (funcDef.params[index].options) {\n addTypeahead($input, index);\n }\n\n });\n\n $(')').appendTo(elem);\n\n $compile(elem.contents())($scope);\n }\n\n function ifJustAddedFocusFistParam() {\n if ($scope.func.added) {\n $scope.func.added = false;\n setTimeout(function() {\n elem.find('.graphite-func-param-link').first().click();\n }, 10);\n }\n }\n\n function registerFuncControlsToggle() {\n $funcLink.click(toggleFuncControls);\n }\n\n function registerFuncControlsActions() {\n $funcControls.click(function(e) {\n var $target = $(e.target);\n if ($target.hasClass('fa-remove')) {\n toggleFuncControls();\n $scope.$apply(function() {\n ctrl.removeFunction($scope.func);\n });\n return;\n }\n\n if ($target.hasClass('fa-arrow-left')) {\n $scope.$apply(function() {\n _.move($scope.target.functions, $scope.$index, $scope.$index - 1);\n ctrl.targetChanged();\n });\n return;\n }\n\n if ($target.hasClass('fa-arrow-right')) {\n $scope.$apply(function() {\n _.move($scope.target.functions, $scope.$index, $scope.$index + 1);\n ctrl.targetChanged();\n });\n return;\n }\n\n if ($target.hasClass('fa-question-circle')) {\n var docSite = \"http://docs.grafana-zabbix.org/reference/functions/\";\n window.open(docSite + '#' + funcDef.name.toLowerCase(),'_blank');\n return;\n }\n });\n }\n\n function relink() {\n elem.children().remove();\n\n addElementsAndCompile();\n ifJustAddedFocusFistParam();\n registerFuncControlsToggle();\n registerFuncControlsActions();\n }\n\n relink();\n }\n };\n\n });\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/metric-function-editor.directive.js"],"names":["angular","_","$","DOCS_FUNC_REF_URL","module","directive","$compile","templateSrv","funcSpanTemplate","paramTemplate","funcControlsTemplate","restrict","link","postLink","$scope","elem","$funcLink","$funcControls","ctrl","func","funcDef","def","scheduledRelink","paramCountAtLink","clickFuncParam","paramIndex","$link","$input","next","val","params","css","width","hide","show","focus","select","typeahead","data","lookup","scheduledRelinkIfNeeded","length","setTimeout","relink","inputBlur","prev","newValue","optional","html","highlightVariablesAsHtml","updateParam","$apply","targetChanged","inputKeyPress","e","which","call","inputKeyDown","style","value","addTypeahead","attr","options","type","map","toString","source","minLength","items","updater","query","$element","process","toggleFuncControls","targetDiv","closest","hasClass","removeClass","addClass","addElementsAndCompile","appendTo","each","param","index","paramValue","$paramLink","blur","partial","keyup","keypress","click","contents","ifJustAddedFocusFistParam","added","find","first","registerFuncControlsToggle","registerFuncControlsActions","$target","target","removeFunction","move","functions","$index","docSite","window","open","name","toLowerCase","children","remove"],"mappings":"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","file":"metric-function-editor.directive.js","sourcesContent":["import angular from 'angular';\nimport _ from 'lodash';\nimport $ from 'jquery';\n\nconst DOCS_FUNC_REF_URL = 'http://docs.grafana-zabbix.org/reference/functions/';\n\nangular\n .module('grafana.directives')\n .directive('metricFunctionEditor',\n\n /** @ngInject */\n function($compile, templateSrv) {\n\n var funcSpanTemplate = '{{func.def.name}}(';\n var paramTemplate = '';\n\n var funcControlsTemplate =\n '
' +\n '' +\n '' +\n '' +\n '' +\n '
';\n\n return {\n restrict: 'A',\n link: function postLink($scope, elem) {\n var $funcLink = $(funcSpanTemplate);\n var $funcControls = $(funcControlsTemplate);\n var ctrl = $scope.ctrl;\n var func = $scope.func;\n var funcDef = func.def;\n var scheduledRelink = false;\n var paramCountAtLink = 0;\n\n function clickFuncParam(paramIndex) {\n /*jshint validthis:true */\n\n var $link = $(this);\n var $input = $link.next();\n\n $input.val(func.params[paramIndex]);\n $input.css('width', ($link.width() + 16) + 'px');\n\n $link.hide();\n $input.show();\n $input.focus();\n $input.select();\n\n var typeahead = $input.data('typeahead');\n if (typeahead) {\n $input.val('');\n typeahead.lookup();\n }\n }\n\n function scheduledRelinkIfNeeded() {\n if (paramCountAtLink === func.params.length) {\n return;\n }\n\n if (!scheduledRelink) {\n scheduledRelink = true;\n setTimeout(function() {\n relink();\n scheduledRelink = false;\n }, 200);\n }\n }\n\n function inputBlur(paramIndex) {\n /*jshint validthis:true */\n var $input = $(this);\n var $link = $input.prev();\n var newValue = $input.val();\n\n if (newValue !== '' || func.def.params[paramIndex].optional) {\n $link.html(templateSrv.highlightVariablesAsHtml(newValue));\n\n func.updateParam($input.val(), paramIndex);\n scheduledRelinkIfNeeded();\n\n $scope.$apply(function() {\n ctrl.targetChanged();\n });\n\n $input.hide();\n $link.show();\n }\n }\n\n function inputKeyPress(paramIndex, e) {\n /*jshint validthis:true */\n if(e.which === 13) {\n inputBlur.call(this, paramIndex);\n }\n }\n\n function inputKeyDown() {\n /*jshint validthis:true */\n this.style.width = (3 + this.value.length) * 8 + 'px';\n }\n\n function addTypeahead($input, paramIndex) {\n $input.attr('data-provide', 'typeahead');\n\n var options = funcDef.params[paramIndex].options;\n if (funcDef.params[paramIndex].type === 'int' ||\n funcDef.params[paramIndex].type === 'float') {\n options = _.map(options, function(val) { return val.toString(); });\n }\n\n $input.typeahead({\n source: options,\n minLength: 0,\n items: 20,\n updater: function (value) {\n setTimeout(function() {\n inputBlur.call($input[0], paramIndex);\n }, 0);\n return value;\n }\n });\n\n var typeahead = $input.data('typeahead');\n typeahead.lookup = function () {\n this.query = this.$element.val() || '';\n return this.process(this.source);\n };\n }\n\n function toggleFuncControls() {\n var targetDiv = elem.closest('.tight-form');\n\n if (elem.hasClass('show-function-controls')) {\n elem.removeClass('show-function-controls');\n targetDiv.removeClass('has-open-function');\n $funcControls.hide();\n return;\n }\n\n elem.addClass('show-function-controls');\n targetDiv.addClass('has-open-function');\n\n $funcControls.show();\n }\n\n function addElementsAndCompile() {\n $funcControls.appendTo(elem);\n $funcLink.appendTo(elem);\n\n _.each(funcDef.params, function(param, index) {\n if (param.optional && func.params.length <= index) {\n return;\n }\n\n if (index > 0) {\n $(', ').appendTo(elem);\n }\n\n var paramValue = templateSrv.highlightVariablesAsHtml(func.params[index]);\n var $paramLink = $('' + paramValue + '');\n var $input = $(paramTemplate);\n\n paramCountAtLink++;\n\n $paramLink.appendTo(elem);\n $input.appendTo(elem);\n\n $input.blur(_.partial(inputBlur, index));\n $input.keyup(inputKeyDown);\n $input.keypress(_.partial(inputKeyPress, index));\n $paramLink.click(_.partial(clickFuncParam, index));\n\n if (funcDef.params[index].options) {\n addTypeahead($input, index);\n }\n\n });\n\n $(')').appendTo(elem);\n\n $compile(elem.contents())($scope);\n }\n\n function ifJustAddedFocusFistParam() {\n if ($scope.func.added) {\n $scope.func.added = false;\n setTimeout(function() {\n elem.find('.graphite-func-param-link').first().click();\n }, 10);\n }\n }\n\n function registerFuncControlsToggle() {\n $funcLink.click(toggleFuncControls);\n }\n\n function registerFuncControlsActions() {\n $funcControls.click(function(e) {\n var $target = $(e.target);\n if ($target.hasClass('fa-remove')) {\n toggleFuncControls();\n $scope.$apply(function() {\n ctrl.removeFunction($scope.func);\n });\n return;\n }\n\n if ($target.hasClass('fa-arrow-left')) {\n $scope.$apply(function() {\n _.move($scope.target.functions, $scope.$index, $scope.$index - 1);\n ctrl.targetChanged();\n });\n return;\n }\n\n if ($target.hasClass('fa-arrow-right')) {\n $scope.$apply(function() {\n _.move($scope.target.functions, $scope.$index, $scope.$index + 1);\n ctrl.targetChanged();\n });\n return;\n }\n\n if ($target.hasClass('fa-question-circle')) {\n var docSite = DOCS_FUNC_REF_URL;\n window.open(docSite + '#' + funcDef.name.toLowerCase(),'_blank');\n return;\n }\n });\n }\n\n function relink() {\n elem.children().remove();\n\n addElementsAndCompile();\n ifJustAddedFocusFistParam();\n registerFuncControlsToggle();\n registerFuncControlsActions();\n }\n\n relink();\n }\n };\n\n });\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/migrations.js b/dist/datasource-zabbix/migrations.js index e1f0be9..a360e8f 100644 --- a/dist/datasource-zabbix/migrations.js +++ b/dist/datasource-zabbix/migrations.js @@ -3,6 +3,7 @@ System.register([], function (_export, _context) { "use strict"; + var DS_CONFIG_SCHEMA; /** * Query format migration. * This module can detect query format version and make migration. @@ -48,9 +49,36 @@ System.register([], function (_export, _context) { } else { return '/.*/'; } - }return { + }function migrateDSConfig(jsonData) { + if (!jsonData) { + jsonData = {}; + } + var oldVersion = jsonData.schema || 1; + jsonData.schema = DS_CONFIG_SCHEMA; + + if (oldVersion === DS_CONFIG_SCHEMA) { + return jsonData; + } + + if (oldVersion < 2) { + var dbConnectionOptions = jsonData.dbConnection || {}; + jsonData.dbConnectionEnable = dbConnectionOptions.enable || false; + jsonData.dbConnectionDatasourceId = dbConnectionOptions.datasourceId || null; + delete jsonData.dbConnection; + } + + return jsonData; + } + + _export("migrateDSConfig", migrateDSConfig); + + return { setters: [], - execute: function () {} + execute: function () { + _export("DS_CONFIG_SCHEMA", DS_CONFIG_SCHEMA = 2); + + _export("DS_CONFIG_SCHEMA", DS_CONFIG_SCHEMA); + } }; }); //# sourceMappingURL=migrations.js.map diff --git a/dist/datasource-zabbix/migrations.js.map b/dist/datasource-zabbix/migrations.js.map index a10a69a..56fbda5 100644 --- a/dist/datasource-zabbix/migrations.js.map +++ b/dist/datasource-zabbix/migrations.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/migrations.js"],"names":["isGrafana2target","target","mode","hostFilter","itemFilter","downsampleFunction","host","item","filter","undefined","migrateFrom2To3version","group","name","convertToRegex","application","migrate","resultFormat","str"],"mappings":";;;;;AAAA;;;;;AAKO,WAASA,gBAAT,CAA0BC,MAA1B,EAAkC;AACvC,QAAI,CAACA,OAAOC,IAAR,IAAgBD,OAAOC,IAAP,KAAgB,CAAhC,IAAqCD,OAAOC,IAAP,KAAgB,CAAzD,EAA4D;AAC1D,UAAI,CAACD,OAAOE,UAAP,IAAqBF,OAAOG,UAA5B,IAA0CH,OAAOI,kBAAjD,IACAJ,OAAOK,IAAP,IAAeL,OAAOK,IAAP,CAAYA,IAD5B,KAECL,OAAOM,IAAP,CAAYC,MAAZ,KAAuBC,SAAvB,IAAoCR,OAAOK,IAAP,CAAYE,MAAZ,KAAuBC,SAFhE,EAE4E;AAC1E,eAAO,IAAP;AACD,OAJD,MAIO;AACL,eAAO,KAAP;AACD;AACF,KARD,MAQO;AACL,aAAO,KAAP;AACD;AACF;;8BAZeT,gB;;AAcT,WAASU,sBAAT,CAAgCT,MAAhC,EAAwC;AAC7CA,WAAOU,KAAP,CAAaH,MAAb,GAAsBP,OAAOU,KAAP,CAAaC,IAAb,KAAsB,GAAtB,GAA4B,MAA5B,GAAqCX,OAAOU,KAAP,CAAaC,IAAxE;AACAX,WAAOK,IAAP,CAAYE,MAAZ,GAAqBP,OAAOK,IAAP,CAAYM,IAAZ,KAAqB,GAArB,GAA2BC,eAAeZ,OAAOE,UAAtB,CAA3B,GAA+DF,OAAOK,IAAP,CAAYM,IAAhG;AACAX,WAAOa,WAAP,CAAmBN,MAAnB,GAA4BP,OAAOa,WAAP,CAAmBF,IAAnB,KAA4B,GAA5B,GAAkC,EAAlC,GAAuCX,OAAOa,WAAP,CAAmBF,IAAtF;AACAX,WAAOM,IAAP,CAAYC,MAAZ,GAAqBP,OAAOM,IAAP,CAAYK,IAAZ,KAAqB,KAArB,GAA6BC,eAAeZ,OAAOG,UAAtB,CAA7B,GAAiEH,OAAOM,IAAP,CAAYK,IAAlG;AACA,WAAOX,MAAP;AACD;oCANeS,sB;;AAQT,WAASK,OAAT,CAAiBd,MAAjB,EAAyB;AAC9BA,WAAOe,YAAP,GAAsBf,OAAOe,YAAP,IAAuB,aAA7C;AACA,QAAIhB,iBAAiBC,MAAjB,CAAJ,EAA8B;AAC5B,aAAOS,uBAAuBT,MAAvB,CAAP;AACD,KAFD,MAEO;AACL,aAAOA,MAAP;AACD;AACF;;qBAPec,O;;AAShB,WAASF,cAAT,CAAwBI,GAAxB,EAA6B;AAC3B,QAAIA,GAAJ,EAAS;AACP,aAAO,MAAMA,GAAN,GAAY,GAAnB;AACD,KAFD,MAEO;AACL,aAAO,MAAP;AACD;AACF,G","file":"migrations.js","sourcesContent":["/**\n * Query format migration.\n * This module can detect query format version and make migration.\n */\n\nexport function isGrafana2target(target) {\n if (!target.mode || target.mode === 0 || target.mode === 2) {\n if ((target.hostFilter || target.itemFilter || target.downsampleFunction ||\n (target.host && target.host.host)) &&\n (target.item.filter === undefined && target.host.filter === undefined)) {\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n}\n\nexport function migrateFrom2To3version(target) {\n target.group.filter = target.group.name === \"*\" ? \"/.*/\" : target.group.name;\n target.host.filter = target.host.name === \"*\" ? convertToRegex(target.hostFilter) : target.host.name;\n target.application.filter = target.application.name === \"*\" ? \"\" : target.application.name;\n target.item.filter = target.item.name === \"All\" ? convertToRegex(target.itemFilter) : target.item.name;\n return target;\n}\n\nexport function migrate(target) {\n target.resultFormat = target.resultFormat || 'time_series';\n if (isGrafana2target(target)) {\n return migrateFrom2To3version(target);\n } else {\n return target;\n }\n}\n\nfunction convertToRegex(str) {\n if (str) {\n return '/' + str + '/';\n } else {\n return '/.*/';\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/migrations.js"],"names":["isGrafana2target","target","mode","hostFilter","itemFilter","downsampleFunction","host","item","filter","undefined","migrateFrom2To3version","group","name","convertToRegex","application","migrate","resultFormat","str","migrateDSConfig","jsonData","oldVersion","schema","DS_CONFIG_SCHEMA","dbConnectionOptions","dbConnection","dbConnectionEnable","enable","dbConnectionDatasourceId","datasourceId"],"mappings":";;;;;;AAAA;;;;;AAKO,WAASA,gBAAT,CAA0BC,MAA1B,EAAkC;AACvC,QAAI,CAACA,OAAOC,IAAR,IAAgBD,OAAOC,IAAP,KAAgB,CAAhC,IAAqCD,OAAOC,IAAP,KAAgB,CAAzD,EAA4D;AAC1D,UAAI,CAACD,OAAOE,UAAP,IAAqBF,OAAOG,UAA5B,IAA0CH,OAAOI,kBAAjD,IACAJ,OAAOK,IAAP,IAAeL,OAAOK,IAAP,CAAYA,IAD5B,KAECL,OAAOM,IAAP,CAAYC,MAAZ,KAAuBC,SAAvB,IAAoCR,OAAOK,IAAP,CAAYE,MAAZ,KAAuBC,SAFhE,EAE4E;AAC1E,eAAO,IAAP;AACD,OAJD,MAIO;AACL,eAAO,KAAP;AACD;AACF,KARD,MAQO;AACL,aAAO,KAAP;AACD;AACF;;8BAZeT,gB;;AAcT,WAASU,sBAAT,CAAgCT,MAAhC,EAAwC;AAC7CA,WAAOU,KAAP,CAAaH,MAAb,GAAsBP,OAAOU,KAAP,CAAaC,IAAb,KAAsB,GAAtB,GAA4B,MAA5B,GAAqCX,OAAOU,KAAP,CAAaC,IAAxE;AACAX,WAAOK,IAAP,CAAYE,MAAZ,GAAqBP,OAAOK,IAAP,CAAYM,IAAZ,KAAqB,GAArB,GAA2BC,eAAeZ,OAAOE,UAAtB,CAA3B,GAA+DF,OAAOK,IAAP,CAAYM,IAAhG;AACAX,WAAOa,WAAP,CAAmBN,MAAnB,GAA4BP,OAAOa,WAAP,CAAmBF,IAAnB,KAA4B,GAA5B,GAAkC,EAAlC,GAAuCX,OAAOa,WAAP,CAAmBF,IAAtF;AACAX,WAAOM,IAAP,CAAYC,MAAZ,GAAqBP,OAAOM,IAAP,CAAYK,IAAZ,KAAqB,KAArB,GAA6BC,eAAeZ,OAAOG,UAAtB,CAA7B,GAAiEH,OAAOM,IAAP,CAAYK,IAAlG;AACA,WAAOX,MAAP;AACD;oCANeS,sB;;AAQT,WAASK,OAAT,CAAiBd,MAAjB,EAAyB;AAC9BA,WAAOe,YAAP,GAAsBf,OAAOe,YAAP,IAAuB,aAA7C;AACA,QAAIhB,iBAAiBC,MAAjB,CAAJ,EAA8B;AAC5B,aAAOS,uBAAuBT,MAAvB,CAAP;AACD,KAFD,MAEO;AACL,aAAOA,MAAP;AACD;AACF;;qBAPec,O;;AAShB,WAASF,cAAT,CAAwBI,GAAxB,EAA6B;AAC3B,QAAIA,GAAJ,EAAS;AACP,aAAO,MAAMA,GAAN,GAAY,GAAnB;AACD,KAFD,MAEO;AACL,aAAO,MAAP;AACD;AACF,GAGM,SAASC,eAAT,CAAyBC,QAAzB,EAAmC;AACxC,QAAI,CAACA,QAAL,EAAe;AACbA,iBAAW,EAAX;AACD;AACD,QAAMC,aAAaD,SAASE,MAAT,IAAmB,CAAtC;AACAF,aAASE,MAAT,GAAkBC,gBAAlB;;AAEA,QAAIF,eAAeE,gBAAnB,EAAqC;AACnC,aAAOH,QAAP;AACD;;AAED,QAAIC,aAAa,CAAjB,EAAoB;AAClB,UAAMG,sBAAsBJ,SAASK,YAAT,IAAyB,EAArD;AACAL,eAASM,kBAAT,GAA8BF,oBAAoBG,MAApB,IAA8B,KAA5D;AACAP,eAASQ,wBAAT,GAAoCJ,oBAAoBK,YAApB,IAAoC,IAAxE;AACA,aAAOT,SAASK,YAAhB;AACD;;AAED,WAAOL,QAAP;AACD;;6BAnBeD,e;;;;;kCADHI,gB,GAAmB,C","file":"migrations.js","sourcesContent":["/**\n * Query format migration.\n * This module can detect query format version and make migration.\n */\n\nexport function isGrafana2target(target) {\n if (!target.mode || target.mode === 0 || target.mode === 2) {\n if ((target.hostFilter || target.itemFilter || target.downsampleFunction ||\n (target.host && target.host.host)) &&\n (target.item.filter === undefined && target.host.filter === undefined)) {\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n}\n\nexport function migrateFrom2To3version(target) {\n target.group.filter = target.group.name === \"*\" ? \"/.*/\" : target.group.name;\n target.host.filter = target.host.name === \"*\" ? convertToRegex(target.hostFilter) : target.host.name;\n target.application.filter = target.application.name === \"*\" ? \"\" : target.application.name;\n target.item.filter = target.item.name === \"All\" ? convertToRegex(target.itemFilter) : target.item.name;\n return target;\n}\n\nexport function migrate(target) {\n target.resultFormat = target.resultFormat || 'time_series';\n if (isGrafana2target(target)) {\n return migrateFrom2To3version(target);\n } else {\n return target;\n }\n}\n\nfunction convertToRegex(str) {\n if (str) {\n return '/' + str + '/';\n } else {\n return '/.*/';\n }\n}\n\nexport const DS_CONFIG_SCHEMA = 2;\nexport function migrateDSConfig(jsonData) {\n if (!jsonData) {\n jsonData = {};\n }\n const oldVersion = jsonData.schema || 1;\n jsonData.schema = DS_CONFIG_SCHEMA;\n\n if (oldVersion === DS_CONFIG_SCHEMA) {\n return jsonData;\n }\n\n if (oldVersion < 2) {\n const dbConnectionOptions = jsonData.dbConnection || {};\n jsonData.dbConnectionEnable = dbConnectionOptions.enable || false;\n jsonData.dbConnectionDatasourceId = dbConnectionOptions.datasourceId || null;\n delete jsonData.dbConnection;\n }\n\n return jsonData;\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/module.js b/dist/datasource-zabbix/module.js index ba4a100..f789e0b 100644 --- a/dist/datasource-zabbix/module.js +++ b/dist/datasource-zabbix/module.js @@ -1,9 +1,9 @@ 'use strict'; -System.register(['app/plugins/sdk', './datasource', './query.controller', './config.controller'], function (_export, _context) { +System.register(['app/plugins/sdk', './datasource', './query.controller', './config.controller', './zabbixAlerting.service.js', './add-metric-function.directive', './metric-function-editor.directive'], function (_export, _context) { "use strict"; - var loadPluginCss, ZabbixAPIDatasource, ZabbixQueryController, ZabbixDSConfigController, ZabbixQueryOptionsController, ZabbixAnnotationsQueryController; + var loadPluginCss, ZabbixDatasource, ZabbixQueryController, ZabbixDSConfigController, ZabbixQueryOptionsController, ZabbixAnnotationsQueryController; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -15,12 +15,12 @@ System.register(['app/plugins/sdk', './datasource', './query.controller', './con setters: [function (_appPluginsSdk) { loadPluginCss = _appPluginsSdk.loadPluginCss; }, function (_datasource) { - ZabbixAPIDatasource = _datasource.ZabbixAPIDatasource; + ZabbixDatasource = _datasource.ZabbixDatasource; }, function (_queryController) { ZabbixQueryController = _queryController.ZabbixQueryController; }, function (_configController) { ZabbixDSConfigController = _configController.ZabbixDSConfigController; - }], + }, function (_zabbixAlertingServiceJs) {}, function (_addMetricFunctionDirective) {}, function (_metricFunctionEditorDirective) {}], execute: function () { loadPluginCss({ @@ -40,7 +40,10 @@ System.register(['app/plugins/sdk', './datasource', './query.controller', './con ZabbixAnnotationsQueryController.templateUrl = 'datasource-zabbix/partials/annotations.editor.html'; - _export('Datasource', ZabbixAPIDatasource); + ZabbixQueryController.templateUrl = 'datasource-zabbix/partials/query.editor.html'; + ZabbixDSConfigController.templateUrl = 'datasource-zabbix/partials/config.html'; + + _export('Datasource', ZabbixDatasource); _export('ConfigCtrl', ZabbixDSConfigController); diff --git a/dist/datasource-zabbix/module.js.map b/dist/datasource-zabbix/module.js.map index 20329e5..f31922e 100644 --- a/dist/datasource-zabbix/module.js.map +++ b/dist/datasource-zabbix/module.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/module.js"],"names":["loadPluginCss","ZabbixAPIDatasource","ZabbixQueryController","ZabbixDSConfigController","dark","light","ZabbixQueryOptionsController","templateUrl","ZabbixAnnotationsQueryController"],"mappings":";;;;;;;;;;;;;;;AAAQA,mB,kBAAAA,a;;AACAC,yB,eAAAA,mB;;AACAC,2B,oBAAAA,qB;;AACAC,8B,qBAAAA,wB;;;;AAERH,oBAAc;AACZI,cAAM,gEADM;AAEZC,eAAO;AAFK,OAAd;;kCAKMC,4B;;;;AACNA,mCAA6BC,WAA7B,GAA2C,+CAA3C;;sCAEMC,gC;;;;AACNA,uCAAiCD,WAAjC,GAA+C,oDAA/C;;4BAGEN,mB;;4BACAE,wB;;2BACAD,qB;;kCACAI,4B;;sCACAE,gC","file":"module.js","sourcesContent":["import {loadPluginCss} from 'app/plugins/sdk';\nimport {ZabbixAPIDatasource} from './datasource';\nimport {ZabbixQueryController} from './query.controller';\nimport {ZabbixDSConfigController} from './config.controller';\n\nloadPluginCss({\n dark: 'plugins/alexanderzobnin-zabbix-app/css/grafana-zabbix.dark.css',\n light: 'plugins/alexanderzobnin-zabbix-app/css/grafana-zabbix.light.css'\n});\n\nclass ZabbixQueryOptionsController {}\nZabbixQueryOptionsController.templateUrl = 'datasource-zabbix/partials/query.options.html';\n\nclass ZabbixAnnotationsQueryController {}\nZabbixAnnotationsQueryController.templateUrl = 'datasource-zabbix/partials/annotations.editor.html';\n\nexport {\n ZabbixAPIDatasource as Datasource,\n ZabbixDSConfigController as ConfigCtrl,\n ZabbixQueryController as QueryCtrl,\n ZabbixQueryOptionsController as QueryOptionsCtrl,\n ZabbixAnnotationsQueryController as AnnotationsQueryCtrl\n};\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/module.js"],"names":["loadPluginCss","ZabbixDatasource","ZabbixQueryController","ZabbixDSConfigController","dark","light","ZabbixQueryOptionsController","templateUrl","ZabbixAnnotationsQueryController"],"mappings":";;;;;;;;;;;;;;;AAASA,mB,kBAAAA,a;;AACAC,sB,eAAAA,gB;;AACAC,2B,oBAAAA,qB;;AACAC,8B,qBAAAA,wB;;;;AAKTH,oBAAc;AACZI,cAAM,gEADM;AAEZC,eAAO;AAFK,OAAd;;kCAKMC,4B;;;;AACNA,mCAA6BC,WAA7B,GAA2C,+CAA3C;;sCAEMC,gC;;;;AACNA,uCAAiCD,WAAjC,GAA+C,oDAA/C;;AAEAL,4BAAsBK,WAAtB,GAAoC,8CAApC;AACAJ,+BAAyBI,WAAzB,GAAuC,wCAAvC;;4BAGEN,gB;;4BACAE,wB;;2BACAD,qB;;kCACAI,4B;;sCACAE,gC","file":"module.js","sourcesContent":["import { loadPluginCss } from 'app/plugins/sdk';\nimport { ZabbixDatasource } from './datasource';\nimport { ZabbixQueryController } from './query.controller';\nimport { ZabbixDSConfigController } from './config.controller';\nimport './zabbixAlerting.service.js';\nimport './add-metric-function.directive';\nimport './metric-function-editor.directive';\n\nloadPluginCss({\n dark: 'plugins/alexanderzobnin-zabbix-app/css/grafana-zabbix.dark.css',\n light: 'plugins/alexanderzobnin-zabbix-app/css/grafana-zabbix.light.css'\n});\n\nclass ZabbixQueryOptionsController {}\nZabbixQueryOptionsController.templateUrl = 'datasource-zabbix/partials/query.options.html';\n\nclass ZabbixAnnotationsQueryController {}\nZabbixAnnotationsQueryController.templateUrl = 'datasource-zabbix/partials/annotations.editor.html';\n\nZabbixQueryController.templateUrl = 'datasource-zabbix/partials/query.editor.html';\nZabbixDSConfigController.templateUrl = 'datasource-zabbix/partials/config.html';\n\nexport {\n ZabbixDatasource as Datasource,\n ZabbixDSConfigController as ConfigCtrl,\n ZabbixQueryController as QueryCtrl,\n ZabbixQueryOptionsController as QueryOptionsCtrl,\n ZabbixAnnotationsQueryController as AnnotationsQueryCtrl\n};\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/partials/config.html b/dist/datasource-zabbix/partials/config.html index 0df7462..9854251 100644 --- a/dist/datasource-zabbix/partials/config.html +++ b/dist/datasource-zabbix/partials/config.html @@ -1,4 +1,4 @@ - +
@@ -79,9 +79,9 @@

Direct DB Connection

+ checked="ctrl.current.jsonData.dbConnectionEnable"> -
+
SQL Data Source @@ -94,7 +94,7 @@
-
diff --git a/dist/datasource-zabbix/query.controller.js b/dist/datasource-zabbix/query.controller.js index 6f1880c..c596e7e 100644 --- a/dist/datasource-zabbix/query.controller.js +++ b/dist/datasource-zabbix/query.controller.js @@ -1,6 +1,6 @@ 'use strict'; -System.register(['app/plugins/sdk', 'lodash', './constants', './utils', './metricFunctions', './migrations', './add-metric-function.directive', './metric-function-editor.directive'], function (_export, _context) { +System.register(['app/plugins/sdk', 'lodash', './constants', './utils', './metricFunctions', './migrations'], function (_export, _context) { "use strict"; var QueryCtrl, _, c, utils, metricFunctions, migrations, _createClass, ZabbixQueryController; @@ -48,7 +48,7 @@ System.register(['app/plugins/sdk', 'lodash', './constants', './utils', './metri metricFunctions = _metricFunctions; }, function (_migrations) { migrations = _migrations; - }, function (_addMetricFunctionDirective) {}, function (_metricFunctionEditorDirective) {}], + }], execute: function () { _createClass = function () { function defineProperties(target, props) { @@ -401,9 +401,6 @@ System.register(['app/plugins/sdk', 'lodash', './constants', './utils', './metri }(QueryCtrl)); _export('ZabbixQueryController', ZabbixQueryController); - - // Set templateUrl as static property - ZabbixQueryController.templateUrl = 'datasource-zabbix/partials/query.editor.html'; } }; }); diff --git a/dist/datasource-zabbix/query.controller.js.map b/dist/datasource-zabbix/query.controller.js.map index 2b80eb0..6a4a863 100644 --- a/dist/datasource-zabbix/query.controller.js.map +++ b/dist/datasource-zabbix/query.controller.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/query.controller.js"],"names":["QueryCtrl","_","c","utils","metricFunctions","migrations","ZabbixQueryController","$scope","$injector","$rootScope","$sce","templateSrv","zabbix","datasource","replaceTemplateVars","editorModes","value","text","mode","MODE_METRICS","MODE_TEXT","MODE_ITSERVICE","MODE_ITEMID","MODE_TRIGGERS","editorMode","METRICS","TEXT","ITSERVICE","ITEMID","TRIGGERS","slaPropertyList","name","property","ackFilters","resultFormats","triggerSeverity","TRIGGER_SEVERITY","getGroupNames","bind","getMetricNames","getHostNames","getApplicationNames","getItemNames","getITServices","getVariables","getTemplateVariables","$on","onVariableChange","onTargetBlur","init","target","migrate","scopeDefaults","metric","oldTarget","cloneDeep","queryOptionsText","renderQueryOptionsText","defaults","targetDefaults","functions","map","func","createFuncInstance","def","params","initFilters","slaProperty","suggestITServices","itemtype","find","Promise","all","suggestGroups","suggestHosts","suggestApps","suggestItems","metricList","addAllValue","metrics","uniq","forEach","variables","unshift","variable","getAllGroups","then","groupList","groups","groupFilter","group","filter","getAllHosts","hostList","hosts","hostFilter","host","getAllApps","appList","apps","appFilter","application","options","showDisabledItems","getAllItems","itemList","items","getITService","itServiceList","itservices","str","isRegex","isTemplateVariable","newTarget","isEqual","targetChanged","isContainsVariables","some","field","parseTarget","panelCtrl","refresh","funcDef","newFunc","added","push","moveAliasFuncLast","length","without","aliasFunc","showQueryOptions","optionsMap","skipEmptyValues","forOwn","key","join","templateUrl"],"mappings":"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","file":"query.controller.js","sourcesContent":["import {QueryCtrl} from 'app/plugins/sdk';\nimport _ from 'lodash';\nimport * as c from './constants';\nimport * as utils from './utils';\nimport * as metricFunctions from './metricFunctions';\nimport * as migrations from './migrations';\n\nimport './add-metric-function.directive';\nimport './metric-function-editor.directive';\n\nexport class ZabbixQueryController extends QueryCtrl {\n\n // ZabbixQueryCtrl constructor\n constructor($scope, $injector, $rootScope, $sce, templateSrv) {\n super($scope, $injector);\n this.zabbix = this.datasource.zabbix;\n\n // Use custom format for template variables\n this.replaceTemplateVars = this.datasource.replaceTemplateVars;\n this.templateSrv = templateSrv;\n\n this.editorModes = [\n {value: 'num', text: 'Metrics', mode: c.MODE_METRICS},\n {value: 'text', text: 'Text', mode: c.MODE_TEXT},\n {value: 'itservice', text: 'IT Services', mode: c.MODE_ITSERVICE},\n {value: 'itemid', text: 'Item ID', mode: c.MODE_ITEMID},\n {value: 'triggers', text: 'Triggers', mode: c.MODE_TRIGGERS}\n ];\n\n this.$scope.editorMode = {\n METRICS: c.MODE_METRICS,\n TEXT: c.MODE_TEXT,\n ITSERVICE: c.MODE_ITSERVICE,\n ITEMID: c.MODE_ITEMID,\n TRIGGERS: c.MODE_TRIGGERS\n };\n\n this.slaPropertyList = [\n {name: \"Status\", property: \"status\"},\n {name: \"SLA\", property: \"sla\"},\n {name: \"OK time\", property: \"okTime\"},\n {name: \"Problem time\", property: \"problemTime\"},\n {name: \"Down time\", property: \"downtimeTime\"}\n ];\n\n this.ackFilters = [\n {text: 'all triggers', value: 2},\n {text: 'unacknowledged', value: 0},\n {text: 'acknowledged', value: 1},\n ];\n\n this.resultFormats = [{ text: 'Time series', value: 'time_series' }, { text: 'Table', value: 'table' }];\n\n this.triggerSeverity = c.TRIGGER_SEVERITY;\n\n // Map functions for bs-typeahead\n this.getGroupNames = _.bind(this.getMetricNames, this, 'groupList');\n this.getHostNames = _.bind(this.getMetricNames, this, 'hostList', true);\n this.getApplicationNames = _.bind(this.getMetricNames, this, 'appList');\n this.getItemNames = _.bind(this.getMetricNames, this, 'itemList');\n this.getITServices = _.bind(this.getMetricNames, this, 'itServiceList');\n this.getVariables = _.bind(this.getTemplateVariables, this);\n\n // Update metric suggestion when template variable was changed\n $rootScope.$on('template-variable-value-updated', () => this.onVariableChange());\n\n // Update metrics when item selected from dropdown\n $scope.$on('typeahead-updated', () => {\n this.onTargetBlur();\n });\n\n this.init = function() {\n var target = this.target;\n\n // Migrate old targets\n target = migrations.migrate(target);\n\n var scopeDefaults = {\n metric: {},\n oldTarget: _.cloneDeep(this.target),\n queryOptionsText: this.renderQueryOptionsText()\n };\n _.defaults(this, scopeDefaults);\n\n // Load default values\n var targetDefaults = {\n 'mode': c.MODE_METRICS,\n 'group': { 'filter': \"\" },\n 'host': { 'filter': \"\" },\n 'application': { 'filter': \"\" },\n 'item': { 'filter': \"\" },\n 'functions': [],\n 'triggers': {\n 'count': true,\n 'minSeverity': 3,\n 'acknowledged': 2\n },\n 'options': {\n 'showDisabledItems': false,\n 'skipEmptyValues': false\n },\n 'table': {\n 'skipEmptyValues': false\n }\n };\n _.defaults(target, targetDefaults);\n\n // Create function instances from saved JSON\n target.functions = _.map(target.functions, function(func) {\n return metricFunctions.createFuncInstance(func.def, func.params);\n });\n\n if (target.mode === c.MODE_METRICS ||\n target.mode === c.MODE_TEXT ||\n target.mode === c.MODE_TRIGGERS) {\n this.initFilters();\n }\n else if (target.mode === c.MODE_ITSERVICE) {\n _.defaults(target, {slaProperty: {name: \"SLA\", property: \"sla\"}});\n this.suggestITServices();\n }\n };\n\n this.init();\n this.queryOptionsText = this.renderQueryOptionsText();\n }\n\n initFilters() {\n let itemtype = _.find(this.editorModes, {'mode': this.target.mode});\n itemtype = itemtype ? itemtype.value : null;\n return Promise.all([\n this.suggestGroups(),\n this.suggestHosts(),\n this.suggestApps(),\n this.suggestItems(itemtype)\n ]);\n }\n\n // Get list of metric names for bs-typeahead directive\n getMetricNames(metricList, addAllValue) {\n let metrics = _.uniq(_.map(this.metric[metricList], 'name'));\n\n // Add template variables\n _.forEach(this.templateSrv.variables, variable => {\n metrics.unshift('$' + variable.name);\n });\n\n if (addAllValue) {\n metrics.unshift('/.*/');\n }\n\n return metrics;\n }\n\n getTemplateVariables() {\n return _.map(this.templateSrv.variables, variable => {\n return '$' + variable.name;\n });\n }\n\n suggestGroups() {\n return this.zabbix.getAllGroups()\n .then(groups => {\n this.metric.groupList = groups;\n return groups;\n });\n }\n\n suggestHosts() {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n return this.zabbix.getAllHosts(groupFilter)\n .then(hosts => {\n this.metric.hostList = hosts;\n return hosts;\n });\n }\n\n suggestApps() {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n let hostFilter = this.replaceTemplateVars(this.target.host.filter);\n return this.zabbix.getAllApps(groupFilter, hostFilter)\n .then(apps => {\n this.metric.appList = apps;\n return apps;\n });\n }\n\n suggestItems(itemtype = 'num') {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n let hostFilter = this.replaceTemplateVars(this.target.host.filter);\n let appFilter = this.replaceTemplateVars(this.target.application.filter);\n let options = {\n itemtype: itemtype,\n showDisabledItems: this.target.options.showDisabledItems\n };\n\n return this.zabbix\n .getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => {\n this.metric.itemList = items;\n return items;\n });\n }\n\n suggestITServices() {\n return this.zabbix.getITService()\n .then(itservices => {\n this.metric.itServiceList = itservices;\n return itservices;\n });\n }\n\n isRegex(str) {\n return utils.isRegex(str);\n }\n\n isVariable(str) {\n return utils.isTemplateVariable(str, this.templateSrv.variables);\n }\n\n onTargetBlur() {\n var newTarget = _.cloneDeep(this.target);\n if (!_.isEqual(this.oldTarget, this.target)) {\n this.oldTarget = newTarget;\n this.targetChanged();\n }\n }\n\n onVariableChange() {\n if (this.isContainsVariables()) {\n this.targetChanged();\n }\n }\n\n /**\n * Check query for template variables\n */\n isContainsVariables() {\n return _.some(['group', 'host', 'application'], field => {\n if (this.target[field] && this.target[field].filter) {\n return utils.isTemplateVariable(this.target[field].filter, this.templateSrv.variables);\n } else {\n return false;\n }\n });\n }\n\n parseTarget() {\n // Parse target\n }\n\n // Validate target and set validation info\n validateTarget() {\n // validate\n }\n\n targetChanged() {\n this.initFilters();\n this.parseTarget();\n this.panelCtrl.refresh();\n }\n\n addFunction(funcDef) {\n var newFunc = metricFunctions.createFuncInstance(funcDef);\n newFunc.added = true;\n this.target.functions.push(newFunc);\n\n this.moveAliasFuncLast();\n\n if (newFunc.params.length && newFunc.added ||\n newFunc.def.params.length === 0) {\n this.targetChanged();\n }\n }\n\n removeFunction(func) {\n this.target.functions = _.without(this.target.functions, func);\n this.targetChanged();\n }\n\n moveAliasFuncLast() {\n var aliasFunc = _.find(this.target.functions, function(func) {\n return func.def.name === 'alias' ||\n func.def.name === 'aliasByNode' ||\n func.def.name === 'aliasByMetric';\n });\n\n if (aliasFunc) {\n this.target.functions = _.without(this.target.functions, aliasFunc);\n this.target.functions.push(aliasFunc);\n }\n }\n\n toggleQueryOptions() {\n this.showQueryOptions = !this.showQueryOptions;\n }\n\n onQueryOptionChange() {\n this.queryOptionsText = this.renderQueryOptionsText();\n this.onTargetBlur();\n }\n\n renderQueryOptionsText() {\n var optionsMap = {\n showDisabledItems: \"Show disabled items\",\n skipEmptyValues: \"Skip empty values\"\n };\n var options = [];\n _.forOwn(this.target.options, (value, key) => {\n if (value) {\n if (value === true) {\n // Show only option name (if enabled) for boolean options\n options.push(optionsMap[key]);\n } else {\n // Show \"option = value\" for another options\n options.push(optionsMap[key] + \" = \" + value);\n }\n }\n });\n return \"Options: \" + options.join(', ');\n }\n\n /**\n * Switch query editor to specified mode.\n * Modes:\n * 0 - items\n * 1 - IT services\n * 2 - Text metrics\n */\n switchEditorMode(mode) {\n this.target.mode = mode;\n this.init();\n this.targetChanged();\n }\n}\n\n// Set templateUrl as static property\nZabbixQueryController.templateUrl = 'datasource-zabbix/partials/query.editor.html';\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/query.controller.js"],"names":["QueryCtrl","_","c","utils","metricFunctions","migrations","ZabbixQueryController","$scope","$injector","$rootScope","$sce","templateSrv","zabbix","datasource","replaceTemplateVars","editorModes","value","text","mode","MODE_METRICS","MODE_TEXT","MODE_ITSERVICE","MODE_ITEMID","MODE_TRIGGERS","editorMode","METRICS","TEXT","ITSERVICE","ITEMID","TRIGGERS","slaPropertyList","name","property","ackFilters","resultFormats","triggerSeverity","TRIGGER_SEVERITY","getGroupNames","bind","getMetricNames","getHostNames","getApplicationNames","getItemNames","getITServices","getVariables","getTemplateVariables","$on","onVariableChange","onTargetBlur","init","target","migrate","scopeDefaults","metric","oldTarget","cloneDeep","queryOptionsText","renderQueryOptionsText","defaults","targetDefaults","functions","map","func","createFuncInstance","def","params","initFilters","slaProperty","suggestITServices","itemtype","find","Promise","all","suggestGroups","suggestHosts","suggestApps","suggestItems","metricList","addAllValue","metrics","uniq","forEach","variables","unshift","variable","getAllGroups","then","groupList","groups","groupFilter","group","filter","getAllHosts","hostList","hosts","hostFilter","host","getAllApps","appList","apps","appFilter","application","options","showDisabledItems","getAllItems","itemList","items","getITService","itServiceList","itservices","str","isRegex","isTemplateVariable","newTarget","isEqual","targetChanged","isContainsVariables","some","field","parseTarget","panelCtrl","refresh","funcDef","newFunc","added","push","moveAliasFuncLast","length","without","aliasFunc","showQueryOptions","optionsMap","skipEmptyValues","forOwn","key","join"],"mappings":"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","file":"query.controller.js","sourcesContent":["import { QueryCtrl } from 'app/plugins/sdk';\nimport _ from 'lodash';\nimport * as c from './constants';\nimport * as utils from './utils';\nimport * as metricFunctions from './metricFunctions';\nimport * as migrations from './migrations';\n\nexport class ZabbixQueryController extends QueryCtrl {\n\n // ZabbixQueryCtrl constructor\n constructor($scope, $injector, $rootScope, $sce, templateSrv) {\n super($scope, $injector);\n this.zabbix = this.datasource.zabbix;\n\n // Use custom format for template variables\n this.replaceTemplateVars = this.datasource.replaceTemplateVars;\n this.templateSrv = templateSrv;\n\n this.editorModes = [\n {value: 'num', text: 'Metrics', mode: c.MODE_METRICS},\n {value: 'text', text: 'Text', mode: c.MODE_TEXT},\n {value: 'itservice', text: 'IT Services', mode: c.MODE_ITSERVICE},\n {value: 'itemid', text: 'Item ID', mode: c.MODE_ITEMID},\n {value: 'triggers', text: 'Triggers', mode: c.MODE_TRIGGERS}\n ];\n\n this.$scope.editorMode = {\n METRICS: c.MODE_METRICS,\n TEXT: c.MODE_TEXT,\n ITSERVICE: c.MODE_ITSERVICE,\n ITEMID: c.MODE_ITEMID,\n TRIGGERS: c.MODE_TRIGGERS\n };\n\n this.slaPropertyList = [\n {name: \"Status\", property: \"status\"},\n {name: \"SLA\", property: \"sla\"},\n {name: \"OK time\", property: \"okTime\"},\n {name: \"Problem time\", property: \"problemTime\"},\n {name: \"Down time\", property: \"downtimeTime\"}\n ];\n\n this.ackFilters = [\n {text: 'all triggers', value: 2},\n {text: 'unacknowledged', value: 0},\n {text: 'acknowledged', value: 1},\n ];\n\n this.resultFormats = [{ text: 'Time series', value: 'time_series' }, { text: 'Table', value: 'table' }];\n\n this.triggerSeverity = c.TRIGGER_SEVERITY;\n\n // Map functions for bs-typeahead\n this.getGroupNames = _.bind(this.getMetricNames, this, 'groupList');\n this.getHostNames = _.bind(this.getMetricNames, this, 'hostList', true);\n this.getApplicationNames = _.bind(this.getMetricNames, this, 'appList');\n this.getItemNames = _.bind(this.getMetricNames, this, 'itemList');\n this.getITServices = _.bind(this.getMetricNames, this, 'itServiceList');\n this.getVariables = _.bind(this.getTemplateVariables, this);\n\n // Update metric suggestion when template variable was changed\n $rootScope.$on('template-variable-value-updated', () => this.onVariableChange());\n\n // Update metrics when item selected from dropdown\n $scope.$on('typeahead-updated', () => {\n this.onTargetBlur();\n });\n\n this.init = function() {\n var target = this.target;\n\n // Migrate old targets\n target = migrations.migrate(target);\n\n var scopeDefaults = {\n metric: {},\n oldTarget: _.cloneDeep(this.target),\n queryOptionsText: this.renderQueryOptionsText()\n };\n _.defaults(this, scopeDefaults);\n\n // Load default values\n var targetDefaults = {\n 'mode': c.MODE_METRICS,\n 'group': { 'filter': \"\" },\n 'host': { 'filter': \"\" },\n 'application': { 'filter': \"\" },\n 'item': { 'filter': \"\" },\n 'functions': [],\n 'triggers': {\n 'count': true,\n 'minSeverity': 3,\n 'acknowledged': 2\n },\n 'options': {\n 'showDisabledItems': false,\n 'skipEmptyValues': false\n },\n 'table': {\n 'skipEmptyValues': false\n }\n };\n _.defaults(target, targetDefaults);\n\n // Create function instances from saved JSON\n target.functions = _.map(target.functions, function(func) {\n return metricFunctions.createFuncInstance(func.def, func.params);\n });\n\n if (target.mode === c.MODE_METRICS ||\n target.mode === c.MODE_TEXT ||\n target.mode === c.MODE_TRIGGERS) {\n this.initFilters();\n }\n else if (target.mode === c.MODE_ITSERVICE) {\n _.defaults(target, {slaProperty: {name: \"SLA\", property: \"sla\"}});\n this.suggestITServices();\n }\n };\n\n this.init();\n this.queryOptionsText = this.renderQueryOptionsText();\n }\n\n initFilters() {\n let itemtype = _.find(this.editorModes, {'mode': this.target.mode});\n itemtype = itemtype ? itemtype.value : null;\n return Promise.all([\n this.suggestGroups(),\n this.suggestHosts(),\n this.suggestApps(),\n this.suggestItems(itemtype)\n ]);\n }\n\n // Get list of metric names for bs-typeahead directive\n getMetricNames(metricList, addAllValue) {\n let metrics = _.uniq(_.map(this.metric[metricList], 'name'));\n\n // Add template variables\n _.forEach(this.templateSrv.variables, variable => {\n metrics.unshift('$' + variable.name);\n });\n\n if (addAllValue) {\n metrics.unshift('/.*/');\n }\n\n return metrics;\n }\n\n getTemplateVariables() {\n return _.map(this.templateSrv.variables, variable => {\n return '$' + variable.name;\n });\n }\n\n suggestGroups() {\n return this.zabbix.getAllGroups()\n .then(groups => {\n this.metric.groupList = groups;\n return groups;\n });\n }\n\n suggestHosts() {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n return this.zabbix.getAllHosts(groupFilter)\n .then(hosts => {\n this.metric.hostList = hosts;\n return hosts;\n });\n }\n\n suggestApps() {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n let hostFilter = this.replaceTemplateVars(this.target.host.filter);\n return this.zabbix.getAllApps(groupFilter, hostFilter)\n .then(apps => {\n this.metric.appList = apps;\n return apps;\n });\n }\n\n suggestItems(itemtype = 'num') {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n let hostFilter = this.replaceTemplateVars(this.target.host.filter);\n let appFilter = this.replaceTemplateVars(this.target.application.filter);\n let options = {\n itemtype: itemtype,\n showDisabledItems: this.target.options.showDisabledItems\n };\n\n return this.zabbix\n .getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => {\n this.metric.itemList = items;\n return items;\n });\n }\n\n suggestITServices() {\n return this.zabbix.getITService()\n .then(itservices => {\n this.metric.itServiceList = itservices;\n return itservices;\n });\n }\n\n isRegex(str) {\n return utils.isRegex(str);\n }\n\n isVariable(str) {\n return utils.isTemplateVariable(str, this.templateSrv.variables);\n }\n\n onTargetBlur() {\n var newTarget = _.cloneDeep(this.target);\n if (!_.isEqual(this.oldTarget, this.target)) {\n this.oldTarget = newTarget;\n this.targetChanged();\n }\n }\n\n onVariableChange() {\n if (this.isContainsVariables()) {\n this.targetChanged();\n }\n }\n\n /**\n * Check query for template variables\n */\n isContainsVariables() {\n return _.some(['group', 'host', 'application'], field => {\n if (this.target[field] && this.target[field].filter) {\n return utils.isTemplateVariable(this.target[field].filter, this.templateSrv.variables);\n } else {\n return false;\n }\n });\n }\n\n parseTarget() {\n // Parse target\n }\n\n // Validate target and set validation info\n validateTarget() {\n // validate\n }\n\n targetChanged() {\n this.initFilters();\n this.parseTarget();\n this.panelCtrl.refresh();\n }\n\n addFunction(funcDef) {\n var newFunc = metricFunctions.createFuncInstance(funcDef);\n newFunc.added = true;\n this.target.functions.push(newFunc);\n\n this.moveAliasFuncLast();\n\n if (newFunc.params.length && newFunc.added ||\n newFunc.def.params.length === 0) {\n this.targetChanged();\n }\n }\n\n removeFunction(func) {\n this.target.functions = _.without(this.target.functions, func);\n this.targetChanged();\n }\n\n moveAliasFuncLast() {\n var aliasFunc = _.find(this.target.functions, function(func) {\n return func.def.name === 'alias' ||\n func.def.name === 'aliasByNode' ||\n func.def.name === 'aliasByMetric';\n });\n\n if (aliasFunc) {\n this.target.functions = _.without(this.target.functions, aliasFunc);\n this.target.functions.push(aliasFunc);\n }\n }\n\n toggleQueryOptions() {\n this.showQueryOptions = !this.showQueryOptions;\n }\n\n onQueryOptionChange() {\n this.queryOptionsText = this.renderQueryOptionsText();\n this.onTargetBlur();\n }\n\n renderQueryOptionsText() {\n var optionsMap = {\n showDisabledItems: \"Show disabled items\",\n skipEmptyValues: \"Skip empty values\"\n };\n var options = [];\n _.forOwn(this.target.options, (value, key) => {\n if (value) {\n if (value === true) {\n // Show only option name (if enabled) for boolean options\n options.push(optionsMap[key]);\n } else {\n // Show \"option = value\" for another options\n options.push(optionsMap[key] + \" = \" + value);\n }\n }\n });\n return \"Options: \" + options.join(', ');\n }\n\n /**\n * Switch query editor to specified mode.\n * Modes:\n * 0 - items\n * 1 - IT services\n * 2 - Text metrics\n */\n switchEditorMode(mode) {\n this.target.mode = mode;\n this.init();\n this.targetChanged();\n }\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/specs/datasource.spec.js b/dist/datasource-zabbix/specs/datasource.spec.js index 3679501..2a7ea3a 100644 --- a/dist/datasource-zabbix/specs/datasource.spec.js +++ b/dist/datasource-zabbix/specs/datasource.spec.js @@ -1,16 +1,13 @@ "use strict"; -System.register(["lodash", "q", "../module", "../datasource"], function (_export, _context) { +System.register(["lodash", "../module", "../datasource"], function (_export, _context) { "use strict"; - var _, Q, Promise, Datasource, zabbixTemplateFormat; + var _, Datasource, zabbixTemplateFormat; return { setters: [function (_lodash) { _ = _lodash.default; - }, function (_q) { - Q = _q.default; - Promise = _q.Promise; }, function (_module) { Datasource = _module.Datasource; }, function (_datasource) { @@ -24,27 +21,26 @@ System.register(["lodash", "q", "../module", "../datasource"], function (_export beforeEach(function () { ctx.instanceSettings = { jsonData: { - alerting: true, + alerting: false, username: 'zabbix', password: 'zabbix', trends: true, trendsFrom: '14d', trendsRange: '7d', - dbConnection: { - enabled: false - } + dbConnectionEnable: false } }; ctx.templateSrv = {}; - ctx.alertSrv = {}; - ctx.dashboardSrv = {}; + ctx.backendSrv = { + datasourceRequest: jest.fn() + }; + ctx.datasourceSrv = {}; ctx.zabbixAlertingSrv = { setPanelAlertState: jest.fn(), removeZabbixThreshold: jest.fn() }; - ctx.zabbix = function () {}; - ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix); + ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.backendSrv, ctx.datasourceSrv, ctx.zabbixAlertingSrv); }); describe('When querying data', function () { @@ -52,9 +48,6 @@ System.register(["lodash", "q", "../module", "../datasource"], function (_export ctx.ds.replaceTemplateVars = function (str) { return str; }; - ctx.ds.alertQuery = function () { - return Q.when([]); - }; }); ctx.options = { @@ -117,10 +110,7 @@ System.register(["lodash", "q", "../module", "../datasource"], function (_export ctx.ds.replaceTemplateVars = function (str) { return str; }; - ctx.ds.alertQuery = function () { - return Q.when([]); - }; - ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([{ clock: "1500010200", itemid: "10100", ns: "900111000", value: "Linux first" }, { clock: "1500010300", itemid: "10100", ns: "900111000", value: "Linux 2nd" }, { clock: "1500010400", itemid: "10100", ns: "900111000", value: "Linux last" }])); + ctx.ds.zabbix.zabbixAPI.getHistory = jest.fn().mockReturnValue(Promise.resolve([{ clock: "1500010200", itemid: "10100", ns: "900111000", value: "Linux first" }, { clock: "1500010300", itemid: "10100", ns: "900111000", value: "Linux 2nd" }, { clock: "1500010400", itemid: "10100", ns: "900111000", value: "Linux last" }])); ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([{ hosts: [{ hostid: "10001", name: "Zabbix server" }], @@ -244,10 +234,10 @@ System.register(["lodash", "q", "../module", "../datasource"], function (_export return str; }; ctx.ds.zabbix = { - getGroups: jest.fn().mockReturnValue(Q.when([])), - getHosts: jest.fn().mockReturnValue(Q.when([])), - getApps: jest.fn().mockReturnValue(Q.when([])), - getItems: jest.fn().mockReturnValue(Q.when([])) + getGroups: jest.fn().mockReturnValue(Promise.resolve([])), + getHosts: jest.fn().mockReturnValue(Promise.resolve([])), + getApps: jest.fn().mockReturnValue(Promise.resolve([])), + getItems: jest.fn().mockReturnValue(Promise.resolve([])) }; }); @@ -411,9 +401,7 @@ System.register(["lodash", "q", "../module", "../datasource"], function (_export "hosts": [{ "hostid": "10631", "name": "Test host" }], "item": "Test item" }]; - ctx.ds.zabbix.getItemsFromTarget = function () { - return Promise.resolve(targetItems); - }; + ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve(targetItems)); options = { "panelId": 10, @@ -434,9 +422,7 @@ System.register(["lodash", "q", "../module", "../datasource"], function (_export "expression": "{15915}<100" }]; - ctx.ds.zabbix.getAlerts = function () { - return Promise.resolve(itemTriggers); - }; + ctx.ds.zabbix.getAlerts = jest.fn().mockReturnValue(Promise.resolve(itemTriggers)); return ctx.ds.alertQuery(options).then(function (resp) { expect(resp.thresholds).toHaveLength(1); @@ -453,9 +439,7 @@ System.register(["lodash", "q", "../module", "../datasource"], function (_export "expression": "{15915}<=100" }]; - ctx.ds.zabbix.getAlerts = function () { - return Promise.resolve(itemTriggers); - }; + ctx.ds.zabbix.getAlerts = jest.fn().mockReturnValue(Promise.resolve(itemTriggers)); return ctx.ds.alertQuery(options).then(function (resp) { expect(resp.thresholds.length).toBe(1); @@ -472,9 +456,7 @@ System.register(["lodash", "q", "../module", "../datasource"], function (_export "expression": "{15915}>=30" }]; - ctx.ds.zabbix.getAlerts = function () { - return Promise.resolve(itemTriggers); - }; + ctx.ds.zabbix.getAlerts = jest.fn().mockReturnValue(Promise.resolve(itemTriggers)); return ctx.ds.alertQuery(options).then(function (resp) { expect(resp.thresholds.length).toBe(1); @@ -491,9 +473,7 @@ System.register(["lodash", "q", "../module", "../datasource"], function (_export "expression": "{15915}=50" }]; - ctx.ds.zabbix.getAlerts = function () { - return Promise.resolve(itemTriggers); - }; + ctx.ds.zabbix.getAlerts = jest.fn().mockReturnValue(Promise.resolve(itemTriggers)); return ctx.ds.alertQuery(options).then(function (resp) { expect(resp.thresholds.length).toBe(1); diff --git a/dist/datasource-zabbix/specs/datasource.spec.js.map b/dist/datasource-zabbix/specs/datasource.spec.js.map index c178bb2..9abf564 100644 --- a/dist/datasource-zabbix/specs/datasource.spec.js.map +++ b/dist/datasource-zabbix/specs/datasource.spec.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/datasource-zabbix/specs/datasource.spec.js"],"names":["_","Q","Promise","Datasource","zabbixTemplateFormat","describe","ctx","beforeEach","instanceSettings","jsonData","alerting","username","password","trends","trendsFrom","trendsRange","dbConnection","enabled","templateSrv","alertSrv","dashboardSrv","zabbixAlertingSrv","setPanelAlertState","jest","fn","removeZabbixThreshold","zabbix","ds","replaceTemplateVars","str","alertQuery","when","options","targets","group","filter","host","application","item","range","from","to","it","done","query","then","expect","result","data","length","toBe","ranges","forEach","queryNumericData","callArgs","mock","calls","mockClear","getHistory","mockReturnValue","resolve","clock","itemid","ns","value","getItemsFromTarget","hosts","hostid","name","key_","textFilter","useCaptureGroups","mode","resultFormat","skipEmptyValues","tableData","columns","toEqual","text","rows","testReplacingVariable","target","varValue","expectedResult","replace","template_var_value","expected_result","getGroups","getHosts","getApps","getItems","tests","test","metricFindQuery","toBeCalledWith","targetItems","itemTriggers","getAlerts","resp","thresholds","toHaveLength"],"mappings":"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","file":"datasource.spec.js","sourcesContent":["import _ from 'lodash';\nimport Q, { Promise } from \"q\";\nimport {Datasource} from \"../module\";\nimport {zabbixTemplateFormat} from \"../datasource\";\n\ndescribe('ZabbixDatasource', () => {\n let ctx = {};\n\n beforeEach(() => {\n ctx.instanceSettings = {\n jsonData: {\n alerting: true,\n username: 'zabbix',\n password: 'zabbix',\n trends: true,\n trendsFrom: '14d',\n trendsRange: '7d',\n dbConnection: {\n enabled: false\n }\n }\n };\n ctx.templateSrv = {};\n ctx.alertSrv = {};\n ctx.dashboardSrv = {};\n ctx.zabbixAlertingSrv = {\n setPanelAlertState: jest.fn(),\n removeZabbixThreshold: jest.fn(),\n };\n ctx.zabbix = () => {};\n\n ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix);\n });\n\n describe('When querying data', () => {\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n ctx.ds.alertQuery = () => Q.when([]);\n });\n\n ctx.options = {\n targets: [\n {\n group: {filter: \"\"},\n host: {filter: \"\"},\n application: {filter: \"\"},\n item: {filter: \"\"}\n }\n ],\n range: {from: 'now-7d', to: 'now'}\n };\n\n it('should return an empty array when no targets are set', (done) => {\n let options = {\n targets: [],\n range: {from: 'now-6h', to: 'now'}\n };\n ctx.ds.query(options).then(result => {\n expect(result.data.length).toBe(0);\n done();\n });\n });\n\n it('should use trends if it enabled and time more than trendsFrom', (done) => {\n let ranges = ['now-7d', 'now-168h', 'now-1M', 'now-1y'];\n\n _.forEach(ranges, range => {\n ctx.options.range.from = range;\n ctx.ds.queryNumericData = jest.fn();\n ctx.ds.query(ctx.options);\n\n // Check that useTrends options is true\n let callArgs = ctx.ds.queryNumericData.mock.calls[0];\n expect(callArgs[2]).toBe(true);\n ctx.ds.queryNumericData.mockClear();\n });\n\n done();\n });\n\n it('shouldnt use trends if it enabled and time less than trendsFrom', (done) => {\n let ranges = ['now-6d', 'now-167h', 'now-1h', 'now-30m', 'now-30s'];\n\n _.forEach(ranges, range => {\n ctx.options.range.from = range;\n ctx.ds.queryNumericData = jest.fn();\n ctx.ds.query(ctx.options);\n\n // Check that useTrends options is false\n let callArgs = ctx.ds.queryNumericData.mock.calls[0];\n expect(callArgs[2]).toBe(false);\n ctx.ds.queryNumericData.mockClear();\n });\n done();\n });\n\n });\n\n describe('When querying text data', () => {\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n ctx.ds.alertQuery = () => Q.when([]);\n ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([\n {clock: \"1500010200\", itemid:\"10100\", ns:\"900111000\", value:\"Linux first\"},\n {clock: \"1500010300\", itemid:\"10100\", ns:\"900111000\", value:\"Linux 2nd\"},\n {clock: \"1500010400\", itemid:\"10100\", ns:\"900111000\", value:\"Linux last\"}\n ]));\n\n ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([\n {\n hosts: [{hostid: \"10001\", name: \"Zabbix server\"}],\n itemid: \"10100\",\n name: \"System information\",\n key_: \"system.uname\",\n }\n ]));\n\n ctx.options = {\n range: {from: 'now-1h', to: 'now'},\n targets: [\n {\n group: {filter: \"\"},\n host: {filter: \"Zabbix server\"},\n application: {filter: \"\"},\n item: {filter: \"System information\"},\n textFilter: \"\",\n useCaptureGroups: true,\n mode: 2,\n resultFormat: \"table\",\n options: {\n skipEmptyValues: false\n }\n }\n ],\n };\n });\n\n it('should return data in table format', (done) => {\n ctx.ds.query(ctx.options).then(result => {\n expect(result.data.length).toBe(1);\n\n let tableData = result.data[0];\n expect(tableData.columns).toEqual([\n {text: 'Host'}, {text: 'Item'}, {text: 'Key'}, {text: 'Last value'}\n ]);\n expect(tableData.rows).toEqual([\n ['Zabbix server', 'System information', 'system.uname', 'Linux last']\n ]);\n done();\n });\n });\n\n it('should extract value if regex with capture group is used', (done) => {\n ctx.options.targets[0].textFilter = \"Linux (.*)\";\n ctx.ds.query(ctx.options).then(result => {\n let tableData = result.data[0];\n expect(tableData.rows[0][3]).toEqual('last');\n done();\n });\n });\n\n it('should skip item when last value is empty', () => {\n ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([\n {\n hosts: [{hostid: \"10001\", name: \"Zabbix server\"}],\n itemid: \"10100\", name: \"System information\", key_: \"system.uname\"\n },\n {\n hosts: [{hostid: \"10002\", name: \"Server02\"}],\n itemid: \"90109\", name: \"System information\", key_: \"system.uname\"\n }\n ]));\n\n ctx.options.targets[0].options.skipEmptyValues = true;\n ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([\n {clock: \"1500010200\", itemid:\"10100\", ns:\"900111000\", value:\"Linux first\"},\n {clock: \"1500010300\", itemid:\"10100\", ns:\"900111000\", value:\"Linux 2nd\"},\n {clock: \"1500010400\", itemid:\"10100\", ns:\"900111000\", value:\"Linux last\"},\n {clock: \"1500010200\", itemid:\"90109\", ns:\"900111000\", value:\"Non empty value\"},\n {clock: \"1500010500\", itemid:\"90109\", ns:\"900111000\", value:\"\"}\n ]));\n return ctx.ds.query(ctx.options).then(result => {\n let tableData = result.data[0];\n expect(tableData.rows.length).toBe(1);\n expect(tableData.rows[0][3]).toEqual('Linux last');\n });\n });\n });\n\n describe('When replacing template variables', () => {\n\n function testReplacingVariable(target, varValue, expectedResult, done) {\n ctx.ds.templateSrv.replace = () => {\n return zabbixTemplateFormat(varValue);\n };\n\n let result = ctx.ds.replaceTemplateVars(target);\n expect(result).toBe(expectedResult);\n done();\n }\n\n /*\n * Alphanumerics, spaces, dots, dashes and underscores\n * are allowed in Zabbix host name.\n * 'AaBbCc0123 .-_'\n */\n it('should return properly escaped regex', (done) => {\n let target = '$host';\n let template_var_value = 'AaBbCc0123 .-_';\n let expected_result = '/^AaBbCc0123 \\\\.-_$/';\n\n testReplacingVariable(target, template_var_value, expected_result, done);\n });\n\n /*\n * Single-value variable\n * $host = backend01\n * $host => /^backend01|backend01$/\n */\n it('should return proper regex for single value', (done) => {\n let target = '$host';\n let template_var_value = 'backend01';\n let expected_result = '/^backend01$/';\n\n testReplacingVariable(target, template_var_value, expected_result, done);\n });\n\n /*\n * Multi-value variable\n * $host = [backend01, backend02]\n * $host => /^(backend01|backend01)$/\n */\n it('should return proper regex for multi-value', (done) => {\n let target = '$host';\n let template_var_value = ['backend01', 'backend02'];\n let expected_result = '/^(backend01|backend02)$/';\n\n testReplacingVariable(target, template_var_value, expected_result, done);\n });\n });\n\n describe('When invoking metricFindQuery()', () => {\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n ctx.ds.zabbix = {\n getGroups: jest.fn().mockReturnValue(Q.when([])),\n getHosts: jest.fn().mockReturnValue(Q.when([])),\n getApps: jest.fn().mockReturnValue(Q.when([])),\n getItems: jest.fn().mockReturnValue(Q.when([]))\n };\n });\n\n it('should return groups', (done) => {\n const tests = [\n {query: '*', expect: '/.*/'},\n {query: '', expect: ''},\n {query: 'Backend', expect: 'Backend'},\n {query: 'Back*', expect: 'Back*'},\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getGroups).toBeCalledWith(test.expect);\n ctx.ds.zabbix.getGroups.mockClear();\n }\n done();\n });\n\n it('should return hosts', (done) => {\n const tests = [\n {query: '*.*', expect: ['/.*/', '/.*/']},\n {query: '.', expect: ['', '']},\n {query: 'Backend.*', expect: ['Backend', '/.*/']},\n {query: 'Back*.', expect: ['Back*', '']},\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getHosts).toBeCalledWith(test.expect[0], test.expect[1]);\n ctx.ds.zabbix.getHosts.mockClear();\n }\n done();\n });\n\n it('should return applications', (done) => {\n const tests = [\n {query: '*.*.*', expect: ['/.*/', '/.*/', '/.*/']},\n {query: '.*.', expect: ['', '/.*/', '']},\n {query: 'Backend.backend01.*', expect: ['Backend', 'backend01', '/.*/']},\n {query: 'Back*.*.', expect: ['Back*', '/.*/', '']}\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getApps).toBeCalledWith(test.expect[0], test.expect[1], test.expect[2]);\n ctx.ds.zabbix.getApps.mockClear();\n }\n done();\n });\n\n it('should return items', (done) => {\n const tests = [\n {query: '*.*.*.*', expect: ['/.*/', '/.*/', '', '/.*/']},\n {query: '.*.*.*', expect: ['', '/.*/', '', '/.*/']},\n {query: 'Backend.backend01.*.*', expect: ['Backend', 'backend01', '', '/.*/']},\n {query: 'Back*.*.cpu.*', expect: ['Back*', '/.*/', 'cpu', '/.*/']}\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getItems)\n .toBeCalledWith(test.expect[0], test.expect[1], test.expect[2], test.expect[3]);\n ctx.ds.zabbix.getItems.mockClear();\n }\n done();\n });\n\n it('should invoke method with proper arguments', (done) => {\n let query = '*.*';\n\n ctx.ds.metricFindQuery(query);\n expect(ctx.ds.zabbix.getHosts).toBeCalledWith('/.*/', '/.*/');\n done();\n });\n });\n\n describe('When querying alerts', () => {\n let options = {};\n\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n\n let targetItems = [{\n \"itemid\": \"1\",\n \"name\": \"test item\",\n \"key_\": \"test.key\",\n \"value_type\": \"3\",\n \"hostid\": \"10631\",\n \"status\": \"0\",\n \"state\": \"0\",\n \"hosts\": [{\"hostid\": \"10631\", \"name\": \"Test host\"}],\n \"item\": \"Test item\"\n }];\n ctx.ds.zabbix.getItemsFromTarget = () => Promise.resolve(targetItems);\n\n options = {\n \"panelId\": 10,\n \"targets\": [{\n \"application\": {\"filter\": \"\"},\n \"group\": {\"filter\": \"Test group\"},\n \"host\": {\"filter\": \"Test host\"},\n \"item\": {\"filter\": \"Test item\"},\n }]\n };\n });\n\n it('should return threshold when comparative symbol is `less than`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}<100\",\n }];\n\n ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers);\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds).toHaveLength(1);\n expect(resp.thresholds[0]).toBe(100);\n return resp;\n });\n });\n\n it('should return threshold when comparative symbol is `less than or equal`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}<=100\",\n }];\n\n ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers);\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds.length).toBe(1);\n expect(resp.thresholds[0]).toBe(100);\n return resp;\n });\n });\n\n it('should return threshold when comparative symbol is `greater than or equal`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}>=30\",\n }];\n\n ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers);\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds.length).toBe(1);\n expect(resp.thresholds[0]).toBe(30);\n return resp;\n });\n });\n\n it('should return threshold when comparative symbol is `equal`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}=50\",\n }];\n\n ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers);\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds.length).toBe(1);\n expect(resp.thresholds[0]).toBe(50);\n return resp;\n });\n });\n });\n});\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/datasource-zabbix/specs/datasource.spec.js"],"names":["_","Datasource","zabbixTemplateFormat","describe","ctx","beforeEach","instanceSettings","jsonData","alerting","username","password","trends","trendsFrom","trendsRange","dbConnectionEnable","templateSrv","backendSrv","datasourceRequest","jest","fn","datasourceSrv","zabbixAlertingSrv","setPanelAlertState","removeZabbixThreshold","ds","replaceTemplateVars","str","options","targets","group","filter","host","application","item","range","from","to","it","done","query","then","expect","result","data","length","toBe","ranges","forEach","queryNumericData","callArgs","mock","calls","mockClear","zabbix","zabbixAPI","getHistory","mockReturnValue","Promise","resolve","clock","itemid","ns","value","getItemsFromTarget","hosts","hostid","name","key_","textFilter","useCaptureGroups","mode","resultFormat","skipEmptyValues","tableData","columns","toEqual","text","rows","testReplacingVariable","target","varValue","expectedResult","replace","template_var_value","expected_result","getGroups","getHosts","getApps","getItems","tests","test","metricFindQuery","toBeCalledWith","targetItems","itemTriggers","getAlerts","alertQuery","resp","thresholds","toHaveLength"],"mappings":"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","file":"datasource.spec.js","sourcesContent":["import _ from 'lodash';\nimport { Datasource } from \"../module\";\nimport { zabbixTemplateFormat } from \"../datasource\";\n\ndescribe('ZabbixDatasource', () => {\n let ctx = {};\n\n beforeEach(() => {\n ctx.instanceSettings = {\n jsonData: {\n alerting: false,\n username: 'zabbix',\n password: 'zabbix',\n trends: true,\n trendsFrom: '14d',\n trendsRange: '7d',\n dbConnectionEnable: false\n }\n };\n ctx.templateSrv = {};\n ctx.backendSrv = {\n datasourceRequest: jest.fn()\n };\n ctx.datasourceSrv = {};\n ctx.zabbixAlertingSrv = {\n setPanelAlertState: jest.fn(),\n removeZabbixThreshold: jest.fn(),\n };\n\n ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.backendSrv, ctx.datasourceSrv, ctx.zabbixAlertingSrv);\n });\n\n describe('When querying data', () => {\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n });\n\n ctx.options = {\n targets: [\n {\n group: {filter: \"\"},\n host: {filter: \"\"},\n application: {filter: \"\"},\n item: {filter: \"\"}\n }\n ],\n range: {from: 'now-7d', to: 'now'}\n };\n\n it('should return an empty array when no targets are set', (done) => {\n let options = {\n targets: [],\n range: {from: 'now-6h', to: 'now'}\n };\n ctx.ds.query(options).then(result => {\n expect(result.data.length).toBe(0);\n done();\n });\n });\n\n it('should use trends if it enabled and time more than trendsFrom', (done) => {\n let ranges = ['now-7d', 'now-168h', 'now-1M', 'now-1y'];\n\n _.forEach(ranges, range => {\n ctx.options.range.from = range;\n ctx.ds.queryNumericData = jest.fn();\n ctx.ds.query(ctx.options);\n\n // Check that useTrends options is true\n let callArgs = ctx.ds.queryNumericData.mock.calls[0];\n expect(callArgs[2]).toBe(true);\n ctx.ds.queryNumericData.mockClear();\n });\n\n done();\n });\n\n it('shouldnt use trends if it enabled and time less than trendsFrom', (done) => {\n let ranges = ['now-6d', 'now-167h', 'now-1h', 'now-30m', 'now-30s'];\n\n _.forEach(ranges, range => {\n ctx.options.range.from = range;\n ctx.ds.queryNumericData = jest.fn();\n ctx.ds.query(ctx.options);\n\n // Check that useTrends options is false\n let callArgs = ctx.ds.queryNumericData.mock.calls[0];\n expect(callArgs[2]).toBe(false);\n ctx.ds.queryNumericData.mockClear();\n });\n done();\n });\n\n });\n\n describe('When querying text data', () => {\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n ctx.ds.zabbix.zabbixAPI.getHistory = jest.fn().mockReturnValue(Promise.resolve([\n {clock: \"1500010200\", itemid:\"10100\", ns:\"900111000\", value:\"Linux first\"},\n {clock: \"1500010300\", itemid:\"10100\", ns:\"900111000\", value:\"Linux 2nd\"},\n {clock: \"1500010400\", itemid:\"10100\", ns:\"900111000\", value:\"Linux last\"}\n ]));\n\n ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([\n {\n hosts: [{hostid: \"10001\", name: \"Zabbix server\"}],\n itemid: \"10100\",\n name: \"System information\",\n key_: \"system.uname\",\n }\n ]));\n\n ctx.options = {\n range: {from: 'now-1h', to: 'now'},\n targets: [\n {\n group: {filter: \"\"},\n host: {filter: \"Zabbix server\"},\n application: {filter: \"\"},\n item: {filter: \"System information\"},\n textFilter: \"\",\n useCaptureGroups: true,\n mode: 2,\n resultFormat: \"table\",\n options: {\n skipEmptyValues: false\n }\n }\n ],\n };\n });\n\n it('should return data in table format', (done) => {\n ctx.ds.query(ctx.options).then(result => {\n expect(result.data.length).toBe(1);\n\n let tableData = result.data[0];\n expect(tableData.columns).toEqual([\n {text: 'Host'}, {text: 'Item'}, {text: 'Key'}, {text: 'Last value'}\n ]);\n expect(tableData.rows).toEqual([\n ['Zabbix server', 'System information', 'system.uname', 'Linux last']\n ]);\n done();\n });\n });\n\n it('should extract value if regex with capture group is used', (done) => {\n ctx.options.targets[0].textFilter = \"Linux (.*)\";\n ctx.ds.query(ctx.options).then(result => {\n let tableData = result.data[0];\n expect(tableData.rows[0][3]).toEqual('last');\n done();\n });\n });\n\n it('should skip item when last value is empty', () => {\n ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([\n {\n hosts: [{hostid: \"10001\", name: \"Zabbix server\"}],\n itemid: \"10100\", name: \"System information\", key_: \"system.uname\"\n },\n {\n hosts: [{hostid: \"10002\", name: \"Server02\"}],\n itemid: \"90109\", name: \"System information\", key_: \"system.uname\"\n }\n ]));\n\n ctx.options.targets[0].options.skipEmptyValues = true;\n ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([\n {clock: \"1500010200\", itemid:\"10100\", ns:\"900111000\", value:\"Linux first\"},\n {clock: \"1500010300\", itemid:\"10100\", ns:\"900111000\", value:\"Linux 2nd\"},\n {clock: \"1500010400\", itemid:\"10100\", ns:\"900111000\", value:\"Linux last\"},\n {clock: \"1500010200\", itemid:\"90109\", ns:\"900111000\", value:\"Non empty value\"},\n {clock: \"1500010500\", itemid:\"90109\", ns:\"900111000\", value:\"\"}\n ]));\n return ctx.ds.query(ctx.options).then(result => {\n let tableData = result.data[0];\n expect(tableData.rows.length).toBe(1);\n expect(tableData.rows[0][3]).toEqual('Linux last');\n });\n });\n });\n\n describe('When replacing template variables', () => {\n\n function testReplacingVariable(target, varValue, expectedResult, done) {\n ctx.ds.templateSrv.replace = () => {\n return zabbixTemplateFormat(varValue);\n };\n\n let result = ctx.ds.replaceTemplateVars(target);\n expect(result).toBe(expectedResult);\n done();\n }\n\n /*\n * Alphanumerics, spaces, dots, dashes and underscores\n * are allowed in Zabbix host name.\n * 'AaBbCc0123 .-_'\n */\n it('should return properly escaped regex', (done) => {\n let target = '$host';\n let template_var_value = 'AaBbCc0123 .-_';\n let expected_result = '/^AaBbCc0123 \\\\.-_$/';\n\n testReplacingVariable(target, template_var_value, expected_result, done);\n });\n\n /*\n * Single-value variable\n * $host = backend01\n * $host => /^backend01|backend01$/\n */\n it('should return proper regex for single value', (done) => {\n let target = '$host';\n let template_var_value = 'backend01';\n let expected_result = '/^backend01$/';\n\n testReplacingVariable(target, template_var_value, expected_result, done);\n });\n\n /*\n * Multi-value variable\n * $host = [backend01, backend02]\n * $host => /^(backend01|backend01)$/\n */\n it('should return proper regex for multi-value', (done) => {\n let target = '$host';\n let template_var_value = ['backend01', 'backend02'];\n let expected_result = '/^(backend01|backend02)$/';\n\n testReplacingVariable(target, template_var_value, expected_result, done);\n });\n });\n\n describe('When invoking metricFindQuery()', () => {\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n ctx.ds.zabbix = {\n getGroups: jest.fn().mockReturnValue(Promise.resolve([])),\n getHosts: jest.fn().mockReturnValue(Promise.resolve([])),\n getApps: jest.fn().mockReturnValue(Promise.resolve([])),\n getItems: jest.fn().mockReturnValue(Promise.resolve([]))\n };\n });\n\n it('should return groups', (done) => {\n const tests = [\n {query: '*', expect: '/.*/'},\n {query: '', expect: ''},\n {query: 'Backend', expect: 'Backend'},\n {query: 'Back*', expect: 'Back*'},\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getGroups).toBeCalledWith(test.expect);\n ctx.ds.zabbix.getGroups.mockClear();\n }\n done();\n });\n\n it('should return hosts', (done) => {\n const tests = [\n {query: '*.*', expect: ['/.*/', '/.*/']},\n {query: '.', expect: ['', '']},\n {query: 'Backend.*', expect: ['Backend', '/.*/']},\n {query: 'Back*.', expect: ['Back*', '']},\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getHosts).toBeCalledWith(test.expect[0], test.expect[1]);\n ctx.ds.zabbix.getHosts.mockClear();\n }\n done();\n });\n\n it('should return applications', (done) => {\n const tests = [\n {query: '*.*.*', expect: ['/.*/', '/.*/', '/.*/']},\n {query: '.*.', expect: ['', '/.*/', '']},\n {query: 'Backend.backend01.*', expect: ['Backend', 'backend01', '/.*/']},\n {query: 'Back*.*.', expect: ['Back*', '/.*/', '']}\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getApps).toBeCalledWith(test.expect[0], test.expect[1], test.expect[2]);\n ctx.ds.zabbix.getApps.mockClear();\n }\n done();\n });\n\n it('should return items', (done) => {\n const tests = [\n {query: '*.*.*.*', expect: ['/.*/', '/.*/', '', '/.*/']},\n {query: '.*.*.*', expect: ['', '/.*/', '', '/.*/']},\n {query: 'Backend.backend01.*.*', expect: ['Backend', 'backend01', '', '/.*/']},\n {query: 'Back*.*.cpu.*', expect: ['Back*', '/.*/', 'cpu', '/.*/']}\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getItems)\n .toBeCalledWith(test.expect[0], test.expect[1], test.expect[2], test.expect[3]);\n ctx.ds.zabbix.getItems.mockClear();\n }\n done();\n });\n\n it('should invoke method with proper arguments', (done) => {\n let query = '*.*';\n\n ctx.ds.metricFindQuery(query);\n expect(ctx.ds.zabbix.getHosts).toBeCalledWith('/.*/', '/.*/');\n done();\n });\n });\n\n describe('When querying alerts', () => {\n let options = {};\n\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n\n let targetItems = [{\n \"itemid\": \"1\",\n \"name\": \"test item\",\n \"key_\": \"test.key\",\n \"value_type\": \"3\",\n \"hostid\": \"10631\",\n \"status\": \"0\",\n \"state\": \"0\",\n \"hosts\": [{\"hostid\": \"10631\", \"name\": \"Test host\"}],\n \"item\": \"Test item\"\n }];\n ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve(targetItems));\n\n options = {\n \"panelId\": 10,\n \"targets\": [{\n \"application\": {\"filter\": \"\"},\n \"group\": {\"filter\": \"Test group\"},\n \"host\": {\"filter\": \"Test host\"},\n \"item\": {\"filter\": \"Test item\"},\n }]\n };\n });\n\n it('should return threshold when comparative symbol is `less than`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}<100\",\n }];\n\n ctx.ds.zabbix.getAlerts = jest.fn().mockReturnValue(Promise.resolve(itemTriggers));\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds).toHaveLength(1);\n expect(resp.thresholds[0]).toBe(100);\n return resp;\n });\n });\n\n it('should return threshold when comparative symbol is `less than or equal`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}<=100\",\n }];\n\n ctx.ds.zabbix.getAlerts = jest.fn().mockReturnValue(Promise.resolve(itemTriggers));\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds.length).toBe(1);\n expect(resp.thresholds[0]).toBe(100);\n return resp;\n });\n });\n\n it('should return threshold when comparative symbol is `greater than or equal`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}>=30\",\n }];\n\n ctx.ds.zabbix.getAlerts = jest.fn().mockReturnValue(Promise.resolve(itemTriggers));\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds.length).toBe(1);\n expect(resp.thresholds[0]).toBe(30);\n return resp;\n });\n });\n\n it('should return threshold when comparative symbol is `equal`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}=50\",\n }];\n\n ctx.ds.zabbix.getAlerts = jest.fn().mockReturnValue(Promise.resolve(itemTriggers));\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds.length).toBe(1);\n expect(resp.thresholds[0]).toBe(50);\n return resp;\n });\n });\n });\n});\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/specs/migrations.test.js b/dist/datasource-zabbix/specs/migrations.test.js new file mode 100644 index 0000000..af40971 --- /dev/null +++ b/dist/datasource-zabbix/specs/migrations.test.js @@ -0,0 +1,56 @@ +'use strict'; + +System.register(['../migrations'], function (_export, _context) { + "use strict"; + + var migrateDSConfig, DS_CONFIG_SCHEMA; + return { + setters: [function (_migrations) { + migrateDSConfig = _migrations.migrateDSConfig; + DS_CONFIG_SCHEMA = _migrations.DS_CONFIG_SCHEMA; + }], + execute: function () { + + describe('Migrations', function () { + var ctx = {}; + + describe('When migrating datasource config', function () { + beforeEach(function () { + ctx.jsonData = { + dbConnection: { + enable: true, + datasourceId: 1 + } + }; + }); + + it('should change direct DB connection setting to flat style', function () { + migrateDSConfig(ctx.jsonData); + expect(ctx.jsonData).toMatchObject({ + dbConnectionEnable: true, + dbConnectionDatasourceId: 1, + schema: DS_CONFIG_SCHEMA + }); + }); + + it('should not touch anything if schema is up to date', function () { + ctx.jsonData = { + futureOptionOne: 'foo', + futureOptionTwo: 'bar', + schema: DS_CONFIG_SCHEMA + }; + migrateDSConfig(ctx.jsonData); + expect(ctx.jsonData).toMatchObject({ + futureOptionOne: 'foo', + futureOptionTwo: 'bar', + schema: DS_CONFIG_SCHEMA + }); + expect(ctx.jsonData.dbConnectionEnable).toBeUndefined(); + expect(ctx.jsonData.dbConnectionDatasourceId).toBeUndefined(); + }); + }); + }); + } + }; +}); +//# sourceMappingURL=migrations.test.js.map diff --git a/dist/datasource-zabbix/specs/migrations.test.js.map b/dist/datasource-zabbix/specs/migrations.test.js.map new file mode 100644 index 0000000..2f9d144 --- /dev/null +++ b/dist/datasource-zabbix/specs/migrations.test.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/datasource-zabbix/specs/migrations.test.js"],"names":["migrateDSConfig","DS_CONFIG_SCHEMA","describe","ctx","beforeEach","jsonData","dbConnection","enable","datasourceId","it","expect","toMatchObject","dbConnectionEnable","dbConnectionDatasourceId","schema","futureOptionOne","futureOptionTwo","toBeUndefined"],"mappings":";;;;;;;;AAASA,qB,eAAAA,e;AAAiBC,sB,eAAAA,gB;;;;AAE1BC,eAAS,YAAT,EAAuB,YAAM;AAC3B,YAAIC,MAAM,EAAV;;AAEAD,iBAAS,kCAAT,EAA6C,YAAM;AACjDE,qBAAW,YAAM;AACfD,gBAAIE,QAAJ,GAAe;AACbC,4BAAc;AACZC,wBAAQ,IADI;AAEZC,8BAAc;AAFF;AADD,aAAf;AAMD,WAPD;;AASAC,aAAG,0DAAH,EAA+D,YAAM;AACnET,4BAAgBG,IAAIE,QAApB;AACAK,mBAAOP,IAAIE,QAAX,EAAqBM,aAArB,CAAmC;AACjCC,kCAAoB,IADa;AAEjCC,wCAA0B,CAFO;AAGjCC,sBAAQb;AAHyB,aAAnC;AAKD,WAPD;;AASAQ,aAAG,mDAAH,EAAwD,YAAM;AAC5DN,gBAAIE,QAAJ,GAAe;AACbU,+BAAiB,KADJ;AAEbC,+BAAiB,KAFJ;AAGbF,sBAAQb;AAHK,aAAf;AAKAD,4BAAgBG,IAAIE,QAApB;AACAK,mBAAOP,IAAIE,QAAX,EAAqBM,aAArB,CAAmC;AACjCI,+BAAiB,KADgB;AAEjCC,+BAAiB,KAFgB;AAGjCF,sBAAQb;AAHyB,aAAnC;AAKAS,mBAAOP,IAAIE,QAAJ,CAAaO,kBAApB,EAAwCK,aAAxC;AACAP,mBAAOP,IAAIE,QAAJ,CAAaQ,wBAApB,EAA8CI,aAA9C;AACD,WAdD;AAeD,SAlCD;AAmCD,OAtCD","file":"migrations.test.js","sourcesContent":["import { migrateDSConfig, DS_CONFIG_SCHEMA } from '../migrations';\n\ndescribe('Migrations', () => {\n let ctx = {};\n\n describe('When migrating datasource config', () => {\n beforeEach(() => {\n ctx.jsonData = {\n dbConnection: {\n enable: true,\n datasourceId: 1\n }\n };\n });\n\n it('should change direct DB connection setting to flat style', () => {\n migrateDSConfig(ctx.jsonData);\n expect(ctx.jsonData).toMatchObject({\n dbConnectionEnable: true,\n dbConnectionDatasourceId: 1,\n schema: DS_CONFIG_SCHEMA\n });\n });\n\n it('should not touch anything if schema is up to date', () => {\n ctx.jsonData = {\n futureOptionOne: 'foo',\n futureOptionTwo: 'bar',\n schema: DS_CONFIG_SCHEMA\n };\n migrateDSConfig(ctx.jsonData);\n expect(ctx.jsonData).toMatchObject({\n futureOptionOne: 'foo',\n futureOptionTwo: 'bar',\n schema: DS_CONFIG_SCHEMA\n });\n expect(ctx.jsonData.dbConnectionEnable).toBeUndefined();\n expect(ctx.jsonData.dbConnectionDatasourceId).toBeUndefined();\n });\n });\n});\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/utils.js b/dist/datasource-zabbix/utils.js index 9f370a1..b19b068 100644 --- a/dist/datasource-zabbix/utils.js +++ b/dist/datasource-zabbix/utils.js @@ -250,10 +250,26 @@ System.register(['lodash', 'moment'], function (_export, _context) { }; } - // Fix for backward compatibility with lodash 2.4 + /** + * Apply function one by one: `sequence([a(), b(), c()]) = c(b(a()))` + * @param {*} funcsArray functions to apply + */ _export('callOnce', callOnce); + 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 + + _export('sequence', sequence); + return { setters: [function (_lodash) { _ = _lodash.default; diff --git a/dist/datasource-zabbix/utils.js.map b/dist/datasource-zabbix/utils.js.map index 94c6f0a..6293307 100644 --- a/dist/datasource-zabbix/utils.js.map +++ b/dist/datasource-zabbix/utils.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/utils.js"],"names":["expandItemName","name","key","key_params_str","substring","indexOf","lastIndexOf","key_params","splitKeyParams","i","length","replace","expandItems","items","_","forEach","item","key_","paramStr","params","quoted","in_array","split_symbol","param","symbol","push","containsMacro","itemName","MACRO_PATTERN","test","replaceMacro","macros","item_macros","match","host_macros","filter","m","hostid","macro_def","find","macro","value","macro_value","macro_regex","RegExp","escapeMacro","splitTemplateQuery","query","splitPattern","split","isContainsBraces","result","map","trim","part","bracesPattern","isRegex","str","regexPattern","isTemplateVariable","templateVariables","variablePattern","variables","variable","includes","buildRegex","matches","pattern","flags","undefined","escapeRegex","parseInterval","interval","intervalPattern","momentInterval","exec","moment","duration","Number","valueOf","parseTimeShiftInterval","formatAcknowledges","acknowledges","formatted_acknowledges","each","ack","timestamp","unix","clock","format","alias","surname","message","concat","convertToZabbixAPIUrl","url","zabbixAPIUrlPattern","trimSlashPattern","callOnce","func","promiseKeeper","Promise","resolve","apply","arguments","then","contains"],"mappings":"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","file":"utils.js","sourcesContent":["import _ from 'lodash';\nimport moment from 'moment';\n\n/**\n * Expand Zabbix item name\n *\n * @param {string} name item name, ie \"CPU $2 time\"\n * @param {string} key item key, ie system.cpu.util[,system,avg1]\n * @return {string} expanded name, ie \"CPU system time\"\n */\nexport function expandItemName(name, key) {\n\n // extract params from key:\n // \"system.cpu.util[,system,avg1]\" --> [\"\", \"system\", \"avg1\"]\n let key_params_str = key.substring(key.indexOf('[') + 1, key.lastIndexOf(']'));\n let key_params = splitKeyParams(key_params_str);\n\n // replace item parameters\n for (let i = key_params.length; i >= 1; i--) {\n name = name.replace('$' + i, key_params[i - 1]);\n }\n return name;\n}\n\nexport function expandItems(items) {\n _.forEach(items, item => {\n item.item = item.name;\n item.name = expandItemName(item.item, item.key_);\n return item;\n });\n return items;\n}\n\nfunction splitKeyParams(paramStr) {\n let params = [];\n let quoted = false;\n let in_array = false;\n let split_symbol = ',';\n let param = '';\n\n _.forEach(paramStr, symbol => {\n if (symbol === '\"' && in_array) {\n param += symbol;\n } else if (symbol === '\"' && quoted) {\n quoted = false;\n } else if (symbol === '\"' && !quoted) {\n quoted = true;\n } else if (symbol === '[' && !quoted) {\n in_array = true;\n } else if (symbol === ']' && !quoted) {\n in_array = false;\n } else if (symbol === split_symbol && !quoted && !in_array) {\n params.push(param);\n param = '';\n } else {\n param += symbol;\n }\n });\n\n params.push(param);\n return params;\n}\n\nconst MACRO_PATTERN = /{\\$[A-Z0-9_\\.]+}/g;\n\nexport function containsMacro(itemName) {\n return MACRO_PATTERN.test(itemName);\n}\n\nexport function replaceMacro(item, macros) {\n let itemName = item.name;\n let item_macros = itemName.match(MACRO_PATTERN);\n _.forEach(item_macros, macro => {\n let host_macros = _.filter(macros, m => {\n if (m.hostid) {\n return m.hostid === item.hostid;\n } else {\n // Add global macros\n return true;\n }\n });\n\n let macro_def = _.find(host_macros, { macro: macro });\n if (macro_def && macro_def.value) {\n let macro_value = macro_def.value;\n let macro_regex = new RegExp(escapeMacro(macro));\n itemName = itemName.replace(macro_regex, macro_value);\n }\n });\n\n return itemName;\n}\n\nfunction escapeMacro(macro) {\n macro = macro.replace(/\\$/, '\\\\\\$');\n return macro;\n}\n\n/**\n * Split template query to parts of zabbix entities\n * group.host.app.item -> [group, host, app, item]\n * {group}{host.com} -> [group, host.com]\n */\nexport function splitTemplateQuery(query) {\n let splitPattern = /\\{[^\\{\\}]*\\}|\\{\\/.*\\/\\}/g;\n let split;\n\n if (isContainsBraces(query)) {\n let result = query.match(splitPattern);\n split = _.map(result, part => {\n return _.trim(part, '{}');\n });\n } else {\n split = query.split('.');\n }\n\n return split;\n}\n\nfunction isContainsBraces(query) {\n let bracesPattern = /^\\{.+\\}$/;\n return bracesPattern.test(query);\n}\n\n// Pattern for testing regex\nexport const regexPattern = /^\\/(.*)\\/([gmi]*)$/m;\n\nexport function isRegex(str) {\n return regexPattern.test(str);\n}\n\nexport function isTemplateVariable(str, templateVariables) {\n var variablePattern = /^\\$\\w+/;\n if (variablePattern.test(str)) {\n var variables = _.map(templateVariables, variable => {\n return '$' + variable.name;\n });\n return _.includes(variables, str);\n } else {\n return false;\n }\n}\n\nexport function buildRegex(str) {\n var matches = str.match(regexPattern);\n var pattern = matches[1];\n var flags = matches[2] !== \"\" ? matches[2] : undefined;\n return new RegExp(pattern, flags);\n}\n\n// Need for template variables replace\n// From Grafana's templateSrv.js\nexport function escapeRegex(value) {\n return value.replace(/[\\\\^$*+?.()|[\\]{}\\/]/g, '\\\\$&');\n}\n\nexport function parseInterval(interval) {\n var intervalPattern = /(^[\\d]+)(y|M|w|d|h|m|s)/g;\n var momentInterval = intervalPattern.exec(interval);\n return moment.duration(Number(momentInterval[1]), momentInterval[2]).valueOf();\n}\n\nexport function parseTimeShiftInterval(interval) {\n let intervalPattern = /^([\\+\\-]*)([\\d]+)(y|M|w|d|h|m|s)/g;\n let momentInterval = intervalPattern.exec(interval);\n let duration = 0;\n\n if (momentInterval[1] === '+') {\n duration = 0 - moment.duration(Number(momentInterval[2]), momentInterval[3]).valueOf();\n } else {\n duration = moment.duration(Number(momentInterval[2]), momentInterval[3]).valueOf();\n }\n\n return duration;\n}\n\n/**\n * Format acknowledges.\n *\n * @param {array} acknowledges array of Zabbix acknowledge objects\n * @return {string} HTML-formatted table\n */\nexport function formatAcknowledges(acknowledges) {\n if (acknowledges.length) {\n var formatted_acknowledges = '

Acknowledges:
'\n + '';\n _.each(_.map(acknowledges, function (ack) {\n var timestamp = moment.unix(ack.clock);\n return '';\n }), function (ack) {\n formatted_acknowledges = formatted_acknowledges.concat(ack);\n });\n formatted_acknowledges = formatted_acknowledges.concat('
TimeUserComments
' + timestamp.format(\"DD MMM YYYY HH:mm:ss\") + '' + ack.alias\n + ' (' + ack.name + ' ' + ack.surname + ')' + '' + ack.message + '
');\n return formatted_acknowledges;\n } else {\n return '';\n }\n}\n\nexport function convertToZabbixAPIUrl(url) {\n var zabbixAPIUrlPattern = /.*api_jsonrpc.php$/;\n var trimSlashPattern = /(.*?)[\\/]*$/;\n if (url.match(zabbixAPIUrlPattern)) {\n return url;\n } else {\n return url.replace(trimSlashPattern, \"$1\");\n }\n}\n\n/**\n * Wrap function to prevent multiple calls\n * when waiting for result.\n */\nexport function callOnce(func, promiseKeeper) {\n return function() {\n if (!promiseKeeper) {\n promiseKeeper = Promise.resolve(\n func.apply(this, arguments)\n .then(result => {\n promiseKeeper = null;\n return result;\n })\n );\n }\n return promiseKeeper;\n };\n}\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {\n _.includes = _.contains;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/utils.js"],"names":["expandItemName","name","key","key_params_str","substring","indexOf","lastIndexOf","key_params","splitKeyParams","i","length","replace","expandItems","items","_","forEach","item","key_","paramStr","params","quoted","in_array","split_symbol","param","symbol","push","containsMacro","itemName","MACRO_PATTERN","test","replaceMacro","macros","item_macros","match","host_macros","filter","m","hostid","macro_def","find","macro","value","macro_value","macro_regex","RegExp","escapeMacro","splitTemplateQuery","query","splitPattern","split","isContainsBraces","result","map","trim","part","bracesPattern","isRegex","str","regexPattern","isTemplateVariable","templateVariables","variablePattern","variables","variable","includes","buildRegex","matches","pattern","flags","undefined","escapeRegex","parseInterval","interval","intervalPattern","momentInterval","exec","moment","duration","Number","valueOf","parseTimeShiftInterval","formatAcknowledges","acknowledges","formatted_acknowledges","each","ack","timestamp","unix","clock","format","alias","surname","message","concat","convertToZabbixAPIUrl","url","zabbixAPIUrlPattern","trimSlashPattern","callOnce","func","promiseKeeper","Promise","resolve","apply","arguments","then","sequence","funcsArray","call","contains"],"mappings":"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","file":"utils.js","sourcesContent":["import _ from 'lodash';\nimport moment from 'moment';\n\n/**\n * Expand Zabbix item name\n *\n * @param {string} name item name, ie \"CPU $2 time\"\n * @param {string} key item key, ie system.cpu.util[,system,avg1]\n * @return {string} expanded name, ie \"CPU system time\"\n */\nexport function expandItemName(name, key) {\n\n // extract params from key:\n // \"system.cpu.util[,system,avg1]\" --> [\"\", \"system\", \"avg1\"]\n let key_params_str = key.substring(key.indexOf('[') + 1, key.lastIndexOf(']'));\n let key_params = splitKeyParams(key_params_str);\n\n // replace item parameters\n for (let i = key_params.length; i >= 1; i--) {\n name = name.replace('$' + i, key_params[i - 1]);\n }\n return name;\n}\n\nexport function expandItems(items) {\n _.forEach(items, item => {\n item.item = item.name;\n item.name = expandItemName(item.item, item.key_);\n return item;\n });\n return items;\n}\n\nfunction splitKeyParams(paramStr) {\n let params = [];\n let quoted = false;\n let in_array = false;\n let split_symbol = ',';\n let param = '';\n\n _.forEach(paramStr, symbol => {\n if (symbol === '\"' && in_array) {\n param += symbol;\n } else if (symbol === '\"' && quoted) {\n quoted = false;\n } else if (symbol === '\"' && !quoted) {\n quoted = true;\n } else if (symbol === '[' && !quoted) {\n in_array = true;\n } else if (symbol === ']' && !quoted) {\n in_array = false;\n } else if (symbol === split_symbol && !quoted && !in_array) {\n params.push(param);\n param = '';\n } else {\n param += symbol;\n }\n });\n\n params.push(param);\n return params;\n}\n\nconst MACRO_PATTERN = /{\\$[A-Z0-9_\\.]+}/g;\n\nexport function containsMacro(itemName) {\n return MACRO_PATTERN.test(itemName);\n}\n\nexport function replaceMacro(item, macros) {\n let itemName = item.name;\n let item_macros = itemName.match(MACRO_PATTERN);\n _.forEach(item_macros, macro => {\n let host_macros = _.filter(macros, m => {\n if (m.hostid) {\n return m.hostid === item.hostid;\n } else {\n // Add global macros\n return true;\n }\n });\n\n let macro_def = _.find(host_macros, { macro: macro });\n if (macro_def && macro_def.value) {\n let macro_value = macro_def.value;\n let macro_regex = new RegExp(escapeMacro(macro));\n itemName = itemName.replace(macro_regex, macro_value);\n }\n });\n\n return itemName;\n}\n\nfunction escapeMacro(macro) {\n macro = macro.replace(/\\$/, '\\\\\\$');\n return macro;\n}\n\n/**\n * Split template query to parts of zabbix entities\n * group.host.app.item -> [group, host, app, item]\n * {group}{host.com} -> [group, host.com]\n */\nexport function splitTemplateQuery(query) {\n let splitPattern = /\\{[^\\{\\}]*\\}|\\{\\/.*\\/\\}/g;\n let split;\n\n if (isContainsBraces(query)) {\n let result = query.match(splitPattern);\n split = _.map(result, part => {\n return _.trim(part, '{}');\n });\n } else {\n split = query.split('.');\n }\n\n return split;\n}\n\nfunction isContainsBraces(query) {\n let bracesPattern = /^\\{.+\\}$/;\n return bracesPattern.test(query);\n}\n\n// Pattern for testing regex\nexport const regexPattern = /^\\/(.*)\\/([gmi]*)$/m;\n\nexport function isRegex(str) {\n return regexPattern.test(str);\n}\n\nexport function isTemplateVariable(str, templateVariables) {\n var variablePattern = /^\\$\\w+/;\n if (variablePattern.test(str)) {\n var variables = _.map(templateVariables, variable => {\n return '$' + variable.name;\n });\n return _.includes(variables, str);\n } else {\n return false;\n }\n}\n\nexport function buildRegex(str) {\n var matches = str.match(regexPattern);\n var pattern = matches[1];\n var flags = matches[2] !== \"\" ? matches[2] : undefined;\n return new RegExp(pattern, flags);\n}\n\n// Need for template variables replace\n// From Grafana's templateSrv.js\nexport function escapeRegex(value) {\n return value.replace(/[\\\\^$*+?.()|[\\]{}\\/]/g, '\\\\$&');\n}\n\nexport function parseInterval(interval) {\n var intervalPattern = /(^[\\d]+)(y|M|w|d|h|m|s)/g;\n var momentInterval = intervalPattern.exec(interval);\n return moment.duration(Number(momentInterval[1]), momentInterval[2]).valueOf();\n}\n\nexport function parseTimeShiftInterval(interval) {\n let intervalPattern = /^([\\+\\-]*)([\\d]+)(y|M|w|d|h|m|s)/g;\n let momentInterval = intervalPattern.exec(interval);\n let duration = 0;\n\n if (momentInterval[1] === '+') {\n duration = 0 - moment.duration(Number(momentInterval[2]), momentInterval[3]).valueOf();\n } else {\n duration = moment.duration(Number(momentInterval[2]), momentInterval[3]).valueOf();\n }\n\n return duration;\n}\n\n/**\n * Format acknowledges.\n *\n * @param {array} acknowledges array of Zabbix acknowledge objects\n * @return {string} HTML-formatted table\n */\nexport function formatAcknowledges(acknowledges) {\n if (acknowledges.length) {\n var formatted_acknowledges = '

Acknowledges:
'\n + '';\n _.each(_.map(acknowledges, function (ack) {\n var timestamp = moment.unix(ack.clock);\n return '';\n }), function (ack) {\n formatted_acknowledges = formatted_acknowledges.concat(ack);\n });\n formatted_acknowledges = formatted_acknowledges.concat('
TimeUserComments
' + timestamp.format(\"DD MMM YYYY HH:mm:ss\") + '' + ack.alias\n + ' (' + ack.name + ' ' + ack.surname + ')' + '' + ack.message + '
');\n return formatted_acknowledges;\n } else {\n return '';\n }\n}\n\nexport function convertToZabbixAPIUrl(url) {\n var zabbixAPIUrlPattern = /.*api_jsonrpc.php$/;\n var trimSlashPattern = /(.*?)[\\/]*$/;\n if (url.match(zabbixAPIUrlPattern)) {\n return url;\n } else {\n return url.replace(trimSlashPattern, \"$1\");\n }\n}\n\n/**\n * Wrap function to prevent multiple calls\n * when waiting for result.\n */\nexport function callOnce(func, promiseKeeper) {\n return function() {\n if (!promiseKeeper) {\n promiseKeeper = Promise.resolve(\n func.apply(this, arguments)\n .then(result => {\n promiseKeeper = null;\n return result;\n })\n );\n }\n return promiseKeeper;\n };\n}\n\n/**\n * Apply function one by one: `sequence([a(), b(), c()]) = c(b(a()))`\n * @param {*} funcsArray functions to apply\n */\nexport function sequence(funcsArray) {\n return function(result) {\n for (var i = 0; i < funcsArray.length; i++) {\n result = funcsArray[i].call(this, result);\n }\n return result;\n };\n}\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {\n _.includes = _.contains;\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/connectors/dbConnector.js b/dist/datasource-zabbix/zabbix/connectors/dbConnector.js index 2e5facb..4384617 100644 --- a/dist/datasource-zabbix/zabbix/connectors/dbConnector.js +++ b/dist/datasource-zabbix/zabbix/connectors/dbConnector.js @@ -3,7 +3,7 @@ System.register(['lodash'], function (_export, _context) { "use strict"; - var _, _createClass, NOT_IMPLEMENTED, DBConnector; + var _, _createClass, DBConnector, ZabbixNotImplemented; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -34,8 +34,6 @@ System.register(['lodash'], function (_export, _context) { }; }(); - NOT_IMPLEMENTED = 'Method should be implemented in subclass of DBConnector'; - DBConnector = function () { function DBConnector(options, backendSrv, datasourceSrv) { _classCallCheck(this, DBConnector); @@ -44,7 +42,8 @@ System.register(['lodash'], function (_export, _context) { this.datasourceSrv = datasourceSrv; this.datasourceId = options.datasourceId; this.datasourceName = options.datasourceName; - this.datasourceType = null; + this.datasourceTypeId = null; + this.datasourceTypeName = null; } _createClass(DBConnector, [{ @@ -55,7 +54,9 @@ System.register(['lodash'], function (_export, _context) { var ds = _.find(this.datasourceSrv.getAll(), { 'id': this.datasourceId }); if (ds) { return this.datasourceSrv.loadDatasource(ds.name).then(function (ds) { - _this.datasourceType = ds.meta.id; + _this.datasourceName = ds.name; + _this.datasourceTypeId = ds.meta.id; + _this.datasourceTypeName = ds.meta.name; return ds; }); } else { @@ -65,17 +66,17 @@ System.register(['lodash'], function (_export, _context) { }, { key: 'testDataSource', value: function testDataSource() { - throw NOT_IMPLEMENTED; + throw new ZabbixNotImplemented('testDataSource()'); } }, { key: 'getHistory', value: function getHistory() { - throw NOT_IMPLEMENTED; + throw new ZabbixNotImplemented('getHistory()'); } }, { key: 'getTrends', value: function getTrends() { - throw NOT_IMPLEMENTED; + throw new ZabbixNotImplemented('getTrends()'); } }]); @@ -83,6 +84,27 @@ System.register(['lodash'], function (_export, _context) { }(); _export('default', DBConnector); + + _export('ZabbixNotImplemented', ZabbixNotImplemented = function () { + function ZabbixNotImplemented(methodName) { + _classCallCheck(this, ZabbixNotImplemented); + + this.code = null; + this.name = 'ZabbixNotImplemented'; + this.message = 'Zabbix DB Connector Error: method ' + (methodName || '') + ' should be implemented in subclass of DBConnector'; + } + + _createClass(ZabbixNotImplemented, [{ + key: 'toString', + value: function toString() { + return this.message; + } + }]); + + return ZabbixNotImplemented; + }()); + + _export('ZabbixNotImplemented', ZabbixNotImplemented); } }; }); diff --git a/dist/datasource-zabbix/zabbix/connectors/dbConnector.js.map b/dist/datasource-zabbix/zabbix/connectors/dbConnector.js.map index bb80c45..9752319 100644 --- a/dist/datasource-zabbix/zabbix/connectors/dbConnector.js.map +++ b/dist/datasource-zabbix/zabbix/connectors/dbConnector.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../src/datasource-zabbix/zabbix/connectors/dbConnector.js"],"names":["_","NOT_IMPLEMENTED","DBConnector","options","backendSrv","datasourceSrv","datasourceId","datasourceName","datasourceType","ds","find","getAll","loadDatasource","name","then","meta","id","Promise","reject"],"mappings":";;;;;;;;;;;;;;;AAAOA,O;;;;;;;;;;;;;;;;;;;;;AAEDC,qB,GAAkB,yD;;AAEHC,iB;AACnB,6BAAYC,OAAZ,EAAqBC,UAArB,EAAiCC,aAAjC,EAAgD;AAAA;;AAC9C,eAAKD,UAAL,GAAkBA,UAAlB;AACA,eAAKC,aAAL,GAAqBA,aAArB;AACA,eAAKC,YAAL,GAAoBH,QAAQG,YAA5B;AACA,eAAKC,cAAL,GAAsBJ,QAAQI,cAA9B;AACA,eAAKC,cAAL,GAAsB,IAAtB;AACD;;;;6CAEkB;AAAA;;AACjB,gBAAIC,KAAKT,EAAEU,IAAF,CAAO,KAAKL,aAAL,CAAmBM,MAAnB,EAAP,EAAoC,EAAC,MAAM,KAAKL,YAAZ,EAApC,CAAT;AACA,gBAAIG,EAAJ,EAAQ;AACN,qBAAO,KAAKJ,aAAL,CAAmBO,cAAnB,CAAkCH,GAAGI,IAArC,EACNC,IADM,CACD,cAAM;AACV,sBAAKN,cAAL,GAAsBC,GAAGM,IAAH,CAAQC,EAA9B;AACA,uBAAOP,EAAP;AACD,eAJM,CAAP;AAKD,aAND,MAMO;AACL,qBAAOQ,QAAQC,MAAR,8BAA0C,KAAKZ,YAA/C,gBAAP;AACD;AACF;;;2CAEgB;AACf,kBAAML,eAAN;AACD;;;uCAEY;AACX,kBAAMA,eAAN;AACD;;;sCAEW;AACV,kBAAMA,eAAN;AACD;;;;;;yBAhCkBC,W","file":"dbConnector.js","sourcesContent":["import _ from 'lodash';\n\nconst NOT_IMPLEMENTED = 'Method should be implemented in subclass of DBConnector';\n\nexport default class DBConnector {\n constructor(options, backendSrv, datasourceSrv) {\n this.backendSrv = backendSrv;\n this.datasourceSrv = datasourceSrv;\n this.datasourceId = options.datasourceId;\n this.datasourceName = options.datasourceName;\n this.datasourceType = null;\n }\n\n loadDBDataSource() {\n let ds = _.find(this.datasourceSrv.getAll(), {'id': this.datasourceId});\n if (ds) {\n return this.datasourceSrv.loadDatasource(ds.name)\n .then(ds => {\n this.datasourceType = ds.meta.id;\n return ds;\n });\n } else {\n return Promise.reject(`SQL Data Source with ID ${this.datasourceId} not found`);\n }\n }\n\n testDataSource() {\n throw NOT_IMPLEMENTED;\n }\n\n getHistory() {\n throw NOT_IMPLEMENTED;\n }\n\n getTrends() {\n throw NOT_IMPLEMENTED;\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../../src/datasource-zabbix/zabbix/connectors/dbConnector.js"],"names":["_","DBConnector","options","backendSrv","datasourceSrv","datasourceId","datasourceName","datasourceTypeId","datasourceTypeName","ds","find","getAll","loadDatasource","name","then","meta","id","Promise","reject","ZabbixNotImplemented","methodName","code","message"],"mappings":";;;;;;;;;;;;;;;AAAOA,O;;;;;;;;;;;;;;;;;;;;;AAMcC,iB;AACnB,6BAAYC,OAAZ,EAAqBC,UAArB,EAAiCC,aAAjC,EAAgD;AAAA;;AAC9C,eAAKD,UAAL,GAAkBA,UAAlB;AACA,eAAKC,aAAL,GAAqBA,aAArB;AACA,eAAKC,YAAL,GAAoBH,QAAQG,YAA5B;AACA,eAAKC,cAAL,GAAsBJ,QAAQI,cAA9B;AACA,eAAKC,gBAAL,GAAwB,IAAxB;AACA,eAAKC,kBAAL,GAA0B,IAA1B;AACD;;;;6CAEkB;AAAA;;AACjB,gBAAIC,KAAKT,EAAEU,IAAF,CAAO,KAAKN,aAAL,CAAmBO,MAAnB,EAAP,EAAoC,EAAC,MAAM,KAAKN,YAAZ,EAApC,CAAT;AACA,gBAAII,EAAJ,EAAQ;AACN,qBAAO,KAAKL,aAAL,CAAmBQ,cAAnB,CAAkCH,GAAGI,IAArC,EACNC,IADM,CACD,cAAM;AACV,sBAAKR,cAAL,GAAsBG,GAAGI,IAAzB;AACA,sBAAKN,gBAAL,GAAwBE,GAAGM,IAAH,CAAQC,EAAhC;AACA,sBAAKR,kBAAL,GAA0BC,GAAGM,IAAH,CAAQF,IAAlC;AACA,uBAAOJ,EAAP;AACD,eANM,CAAP;AAOD,aARD,MAQO;AACL,qBAAOQ,QAAQC,MAAR,8BAA0C,KAAKb,YAA/C,gBAAP;AACD;AACF;;;2CAKgB;AACf,kBAAM,IAAIc,oBAAJ,CAAyB,kBAAzB,CAAN;AACD;;;uCAKY;AACX,kBAAM,IAAIA,oBAAJ,CAAyB,cAAzB,CAAN;AACD;;;sCAKW;AACV,kBAAM,IAAIA,oBAAJ,CAAyB,aAAzB,CAAN;AACD;;;;;;yBA5CkBlB,W;;sCAgDRkB,oB;AACX,sCAAYC,UAAZ,EAAwB;AAAA;;AACtB,eAAKC,IAAL,GAAY,IAAZ;AACA,eAAKR,IAAL,GAAY,sBAAZ;AACA,eAAKS,OAAL,2CAAoDF,cAAc,EAAlE;AACD;;;;qCAEU;AACT,mBAAO,KAAKE,OAAZ;AACD","file":"dbConnector.js","sourcesContent":["import _ from 'lodash';\n\n/**\n * Base class for external history database connectors. Subclasses should implement `getHistory()`, `getTrends()` and\n * `testDataSource()` methods, which describe how to fetch data from source other than Zabbix API.\n */\nexport default class DBConnector {\n constructor(options, backendSrv, datasourceSrv) {\n this.backendSrv = backendSrv;\n this.datasourceSrv = datasourceSrv;\n this.datasourceId = options.datasourceId;\n this.datasourceName = options.datasourceName;\n this.datasourceTypeId = null;\n this.datasourceTypeName = null;\n }\n\n loadDBDataSource() {\n let ds = _.find(this.datasourceSrv.getAll(), {'id': this.datasourceId});\n if (ds) {\n return this.datasourceSrv.loadDatasource(ds.name)\n .then(ds => {\n this.datasourceName = ds.name;\n this.datasourceTypeId = ds.meta.id;\n this.datasourceTypeName = ds.meta.name;\n return ds;\n });\n } else {\n return Promise.reject(`SQL Data Source with ID ${this.datasourceId} not found`);\n }\n }\n\n /**\n * Send test request to datasource in order to ensure it's working.\n */\n testDataSource() {\n throw new ZabbixNotImplemented('testDataSource()');\n }\n\n /**\n * Get history data from external sources.\n */\n getHistory() {\n throw new ZabbixNotImplemented('getHistory()');\n }\n\n /**\n * Get trends data from external sources.\n */\n getTrends() {\n throw new ZabbixNotImplemented('getTrends()');\n }\n}\n\n// Define Zabbix DB Connector exception type for non-implemented methods\nexport class ZabbixNotImplemented {\n constructor(methodName) {\n this.code = null;\n this.name = 'ZabbixNotImplemented';\n this.message = `Zabbix DB Connector Error: method ${methodName || ''} should be implemented in subclass of DBConnector`;\n }\n\n toString() {\n return this.message;\n }\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js b/dist/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js index 0ef5348..ea33a99 100644 --- a/dist/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js +++ b/dist/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js @@ -167,7 +167,7 @@ System.register(['lodash', './mysql', './postgres', '../dbConnector'], function _createClass(SQLConnector, [{ key: 'loadSQLDialect', value: function loadSQLDialect() { - if (this.datasourceType === supportedDatabases.postgres) { + if (this.datasourceTypeId === supportedDatabases.postgres) { this.sqlDialect = postgres; } else { this.sqlDialect = mysql; diff --git a/dist/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js.map b/dist/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js.map index c9e6ebe..240a01f 100644 --- a/dist/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js.map +++ b/dist/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js"],"names":["convertGrafanaTSResponse","time_series","items","addHostName","hosts","_","uniqBy","flatten","map","grafanaSeries","itemid","series","name","item","find","alias","keys","length","host","hostid","datapoints","cloneDeep","points","target","sortBy","compactSQLQuery","query","replace","mysql","postgres","DBConnector","supportedDatabases","DEFAULT_QUERY_LIMIT","HISTORY_TO_TABLE_MAP","TREND_TO_TABLE_MAP","consolidateByFunc","consolidateByTrendColumns","SQLConnector","options","backendSrv","datasourceSrv","limit","sqlDialect","then","loadSQLDialect","datasourceType","testQuery","invokeSQLQuery","timeFrom","timeTill","intervalMs","consolidateBy","intervalSec","Math","ceil","aggFunction","grouped_items","groupBy","promises","value_type","itemids","join","table","historyQuery","Promise","all","results","valueColumn","includes","trendsQuery","history","queryDef","refId","format","datasourceId","rawSql","maxDataPoints","datasourceRequest","url","method","data","queries","response"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgJA;;AAEA,WAASA,wBAAT,CAAkCC,WAAlC,EAA+CC,KAA/C,EAAsDC,WAAtD,EAAmE;AACjE;AACA,QAAIC,QAAQC,EAAEC,MAAF,CAASD,EAAEE,OAAF,CAAUF,EAAEG,GAAF,CAAMN,KAAN,EAAa,OAAb,CAAV,CAAT,EAA2C,QAA3C,CAAZ;AACA,QAAIO,gBAAgBJ,EAAEG,GAAF,CAAMP,WAAN,EAAmB,kBAAU;AAC/C,UAAIS,SAASC,OAAOC,IAApB;AACA,UAAIC,OAAOR,EAAES,IAAF,CAAOZ,KAAP,EAAc,EAAC,UAAUQ,MAAX,EAAd,CAAX;AACA,UAAIK,QAAQF,KAAKD,IAAjB;AACA;AACA,UAAIP,EAAEW,IAAF,CAAOZ,KAAP,EAAca,MAAd,GAAuB,CAAvB,IAA4Bd,WAAhC,EAA6C;AAC3C,YAAIe,OAAOb,EAAES,IAAF,CAAOV,KAAP,EAAc,EAAC,UAAUS,KAAKM,MAAhB,EAAd,CAAX;AACAJ,gBAAQG,KAAKN,IAAL,GAAY,IAAZ,GAAmBG,KAA3B;AACD;AACD;AACA;AACA,UAAIK,aAAaf,EAAEgB,SAAF,CAAYV,OAAOW,MAAnB,CAAjB;AACA,aAAO;AACLC,gBAAQR,KADH;AAELK,oBAAYA;AAFP,OAAP;AAID,KAhBmB,CAApB;;AAkBA,WAAOf,EAAEmB,MAAF,CAASf,aAAT,EAAwB,QAAxB,CAAP;AACD;;AAED,WAASgB,eAAT,CAAyBC,KAAzB,EAAgC;AAC9B,WAAOA,MAAMC,OAAN,CAAc,MAAd,EAAsB,GAAtB,CAAP;AACD;;;AA5KMtB,O;;AACAuB,W;;AACAC,c;;AACAC,iB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEDC,wB,GAAqB;AACzBH,eAAO,OADkB;AAEzBC,kBAAU;AAFe,O;AAKrBG,yB,GAAsB,K;AACtBC,0B,GAAuB;AAC3B,aAAK,SADsB;AAE3B,aAAK,aAFsB;AAG3B,aAAK,aAHsB;AAI3B,aAAK,cAJsB;AAK3B,aAAK;AALsB,O;AAQvBC,wB,GAAqB;AACzB,aAAK,QADoB;AAEzB,aAAK;AAFoB,O;AAKrBC,uB,GAAoB;AACxB,eAAO,KADiB;AAExB,eAAO,KAFiB;AAGxB,eAAO,KAHiB;AAIxB,eAAO,KAJiB;AAKxB,iBAAS;AALe,O;AAQpBC,+B,GAA4B;AAChC,eAAO,WADyB;AAEhC,eAAO,WAFyB;AAGhC,eAAO;AAHyB,O;;8BAMrBC,Y;;;AACX,8BAAYC,OAAZ,EAAqBC,UAArB,EAAiCC,aAAjC,EAAgD;AAAA;;AAAA,kIACxCF,OADwC,EAC/BC,UAD+B,EACnBC,aADmB;;AAG9C,gBAAKC,KAAL,GAAaH,QAAQG,KAAR,IAAiBT,mBAA9B;AACA,gBAAKU,UAAL,GAAkB,IAAlB;;AAEA,yIACCC,IADD,CACM;AAAA,mBAAM,MAAKC,cAAL,EAAN;AAAA,WADN;AAN8C;AAQ/C;;;;2CAEgB;AACf,gBAAI,KAAKC,cAAL,KAAwBd,mBAAmBF,QAA/C,EAAyD;AACvD,mBAAKa,UAAL,GAAkBb,QAAlB;AACD,aAFD,MAEO;AACL,mBAAKa,UAAL,GAAkBd,KAAlB;AACD;AACF;;;2CAKgB;AACf,gBAAIkB,YAAY,KAAKJ,UAAL,CAAgBI,SAAhB,EAAhB;AACA,mBAAO,KAAKC,cAAL,CAAoBD,SAApB,CAAP;AACD;;;qCAEU5C,K,EAAO8C,Q,EAAUC,Q,EAAUX,O,EAAS;AAAA;;AAAA,gBACxCY,UADwC,GACXZ,OADW,CACxCY,UADwC;AAAA,gBAC5BC,aAD4B,GACXb,OADW,CAC5Ba,aAD4B;;AAE7C,gBAAIC,cAAcC,KAAKC,IAAL,CAAUJ,aAAa,IAAvB,CAAlB;;AAEAC,4BAAgBA,iBAAiB,KAAjC;AACA,gBAAII,cAAcpB,kBAAkBgB,aAAlB,CAAlB;;AAEA;AACA,gBAAIK,gBAAgBnD,EAAEoD,OAAF,CAAUvD,KAAV,EAAiB,YAAjB,CAApB;AACA,gBAAIwD,WAAWrD,EAAEG,GAAF,CAAMgD,aAAN,EAAqB,UAACtD,KAAD,EAAQyD,UAAR,EAAuB;AACzD,kBAAIC,UAAUvD,EAAEG,GAAF,CAAMN,KAAN,EAAa,QAAb,EAAuB2D,IAAvB,CAA4B,IAA5B,CAAd;AACA,kBAAIC,QAAQ7B,qBAAqB0B,UAArB,CAAZ;AACA,kBAAIjC,QAAQ,OAAKgB,UAAL,CAAgBqB,YAAhB,CAA6BH,OAA7B,EAAsCE,KAAtC,EAA6Cd,QAA7C,EAAuDC,QAAvD,EAAiEG,WAAjE,EAA8EG,WAA9E,CAAZ;;AAEA7B,sBAAQD,gBAAgBC,KAAhB,CAAR;AACA,qBAAO,OAAKqB,cAAL,CAAoBrB,KAApB,CAAP;AACD,aAPc,CAAf;;AASA,mBAAOsC,QAAQC,GAAR,CAAYP,QAAZ,EAAsBf,IAAtB,CAA2B,mBAAW;AAC3C,qBAAOtC,EAAEE,OAAF,CAAU2D,OAAV,CAAP;AACD,aAFM,CAAP;AAGD;;;oCAEShE,K,EAAO8C,Q,EAAUC,Q,EAAUX,O,EAAS;AAAA;;AAAA,gBACtCY,UADsC,GACRZ,OADQ,CACtCY,UADsC;AAAA,gBAC1BC,aAD0B,GACRb,OADQ,CAC1Ba,aAD0B;;AAE5C,gBAAIC,cAAcC,KAAKC,IAAL,CAAUJ,aAAa,IAAvB,CAAlB;;AAEAC,4BAAgBA,iBAAiB,KAAjC;AACA,gBAAII,cAAcpB,kBAAkBgB,aAAlB,CAAlB;;AAEA;AACA,gBAAIK,gBAAgBnD,EAAEoD,OAAF,CAAUvD,KAAV,EAAiB,YAAjB,CAApB;AACA,gBAAIwD,WAAWrD,EAAEG,GAAF,CAAMgD,aAAN,EAAqB,UAACtD,KAAD,EAAQyD,UAAR,EAAuB;AACzD,kBAAIC,UAAUvD,EAAEG,GAAF,CAAMN,KAAN,EAAa,QAAb,EAAuB2D,IAAvB,CAA4B,IAA5B,CAAd;AACA,kBAAIC,QAAQ5B,mBAAmByB,UAAnB,CAAZ;AACA,kBAAIQ,cAAc9D,EAAE+D,QAAF,CAAW,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,CAAX,EAAkCjB,aAAlC,IAAmDA,aAAnD,GAAmE,KAArF;AACAgB,4BAAc/B,0BAA0B+B,WAA1B,CAAd;AACA,kBAAIzC,QAAQ,OAAKgB,UAAL,CAAgB2B,WAAhB,CAA4BT,OAA5B,EAAqCE,KAArC,EAA4Cd,QAA5C,EAAsDC,QAAtD,EAAgEG,WAAhE,EAA6EG,WAA7E,EAA0FY,WAA1F,CAAZ;;AAEAzC,sBAAQD,gBAAgBC,KAAhB,CAAR;AACA,qBAAO,OAAKqB,cAAL,CAAoBrB,KAApB,CAAP;AACD,aATc,CAAf;;AAWA,mBAAOsC,QAAQC,GAAR,CAAYP,QAAZ,EAAsBf,IAAtB,CAA2B,mBAAW;AAC3C,qBAAOtC,EAAEE,OAAF,CAAU2D,OAAV,CAAP;AACD,aAFM,CAAP;AAGD;;;kDAEuBI,O,EAASpE,K,EAA2B;AAAA,gBAApBC,WAAoB,uEAAN,IAAM;;AAC1D,mBAAOH,yBAAyBsE,OAAzB,EAAkCpE,KAAlC,EAAyCC,WAAzC,CAAP;AACD;;;yCAEcuB,K,EAAO;AACpB,gBAAI6C,WAAW;AACbC,qBAAO,GADM;AAEbC,sBAAQ,aAFK;AAGbC,4BAAc,KAAKA,YAHN;AAIbC,sBAAQjD,KAJK;AAKbkD,6BAAe,KAAKnC;AALP,aAAf;;AAQA,mBAAO,KAAKF,UAAL,CAAgBsC,iBAAhB,CAAkC;AACvCC,mBAAK,iBADkC;AAEvCC,sBAAQ,MAF+B;AAGvCC,oBAAM;AACJC,yBAAS,CAACV,QAAD;AADL;AAHiC,aAAlC,EAON5B,IAPM,CAOD,oBAAY;AAChB,kBAAIuB,UAAUgB,SAASF,IAAT,CAAcd,OAA5B;AACA,kBAAIA,QAAQ,GAAR,CAAJ,EAAkB;AAChB,uBAAOA,QAAQ,GAAR,EAAavD,MAApB;AACD,eAFD,MAEO;AACL,uBAAO,IAAP;AACD;AACF,aAdM,CAAP;AAeD;;;;QAvG+BmB,W","file":"sqlConnector.js","sourcesContent":["import _ from 'lodash';\nimport mysql from './mysql';\nimport postgres from './postgres';\nimport DBConnector from '../dbConnector';\n\nconst supportedDatabases = {\n mysql: 'mysql',\n postgres: 'postgres'\n};\n\nconst DEFAULT_QUERY_LIMIT = 10000;\nconst HISTORY_TO_TABLE_MAP = {\n '0': 'history',\n '1': 'history_str',\n '2': 'history_log',\n '3': 'history_uint',\n '4': 'history_text'\n};\n\nconst TREND_TO_TABLE_MAP = {\n '0': 'trends',\n '3': 'trends_uint'\n};\n\nconst consolidateByFunc = {\n 'avg': 'AVG',\n 'min': 'MIN',\n 'max': 'MAX',\n 'sum': 'SUM',\n 'count': 'COUNT'\n};\n\nconst consolidateByTrendColumns = {\n 'avg': 'value_avg',\n 'min': 'value_min',\n 'max': 'value_max'\n};\n\nexport class SQLConnector extends DBConnector {\n constructor(options, backendSrv, datasourceSrv) {\n super(options, backendSrv, datasourceSrv);\n\n this.limit = options.limit || DEFAULT_QUERY_LIMIT;\n this.sqlDialect = null;\n\n super.loadDBDataSource()\n .then(() => this.loadSQLDialect());\n }\n\n loadSQLDialect() {\n if (this.datasourceType === supportedDatabases.postgres) {\n this.sqlDialect = postgres;\n } else {\n this.sqlDialect = mysql;\n }\n }\n\n /**\n * Try to invoke test query for one of Zabbix database tables.\n */\n testDataSource() {\n let testQuery = this.sqlDialect.testQuery();\n return this.invokeSQLQuery(testQuery);\n }\n\n getHistory(items, timeFrom, timeTill, options) {\n let {intervalMs, consolidateBy} = options;\n let intervalSec = Math.ceil(intervalMs / 1000);\n\n consolidateBy = consolidateBy || 'avg';\n let aggFunction = consolidateByFunc[consolidateBy];\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid').join(', ');\n let table = HISTORY_TO_TABLE_MAP[value_type];\n let query = this.sqlDialect.historyQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);\n\n query = compactSQLQuery(query);\n return this.invokeSQLQuery(query);\n });\n\n return Promise.all(promises).then(results => {\n return _.flatten(results);\n });\n }\n\n getTrends(items, timeFrom, timeTill, options) {\n let { intervalMs, consolidateBy } = options;\n let intervalSec = Math.ceil(intervalMs / 1000);\n\n consolidateBy = consolidateBy || 'avg';\n let aggFunction = consolidateByFunc[consolidateBy];\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid').join(', ');\n let table = TREND_TO_TABLE_MAP[value_type];\n let valueColumn = _.includes(['avg', 'min', 'max'], consolidateBy) ? consolidateBy : 'avg';\n valueColumn = consolidateByTrendColumns[valueColumn];\n let query = this.sqlDialect.trendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);\n\n query = compactSQLQuery(query);\n return this.invokeSQLQuery(query);\n });\n\n return Promise.all(promises).then(results => {\n return _.flatten(results);\n });\n }\n\n handleGrafanaTSResponse(history, items, addHostName = true) {\n return convertGrafanaTSResponse(history, items, addHostName);\n }\n\n invokeSQLQuery(query) {\n let queryDef = {\n refId: 'A',\n format: 'time_series',\n datasourceId: this.datasourceId,\n rawSql: query,\n maxDataPoints: this.limit\n };\n\n return this.backendSrv.datasourceRequest({\n url: '/api/tsdb/query',\n method: 'POST',\n data: {\n queries: [queryDef],\n }\n })\n .then(response => {\n let results = response.data.results;\n if (results['A']) {\n return results['A'].series;\n } else {\n return null;\n }\n });\n }\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\nfunction convertGrafanaTSResponse(time_series, items, addHostName) {\n //uniqBy is needed to deduplicate\n var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid');\n let grafanaSeries = _.map(time_series, series => {\n let itemid = series.name;\n var item = _.find(items, {'itemid': itemid});\n var alias = item.name;\n //only when actual multi hosts selected\n if (_.keys(hosts).length > 1 && addHostName) {\n var host = _.find(hosts, {'hostid': item.hostid});\n alias = host.name + \": \" + alias;\n }\n // CachingProxy deduplicates requests and returns one time series for equal queries.\n // Clone is needed to prevent changing of series object shared between all targets.\n let datapoints = _.cloneDeep(series.points);\n return {\n target: alias,\n datapoints: datapoints\n };\n });\n\n return _.sortBy(grafanaSeries, 'target');\n}\n\nfunction compactSQLQuery(query) {\n return query.replace(/\\s+/g, ' ');\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/sql/sqlConnector.js"],"names":["convertGrafanaTSResponse","time_series","items","addHostName","hosts","_","uniqBy","flatten","map","grafanaSeries","itemid","series","name","item","find","alias","keys","length","host","hostid","datapoints","cloneDeep","points","target","sortBy","compactSQLQuery","query","replace","mysql","postgres","DBConnector","supportedDatabases","DEFAULT_QUERY_LIMIT","HISTORY_TO_TABLE_MAP","TREND_TO_TABLE_MAP","consolidateByFunc","consolidateByTrendColumns","SQLConnector","options","backendSrv","datasourceSrv","limit","sqlDialect","then","loadSQLDialect","datasourceTypeId","testQuery","invokeSQLQuery","timeFrom","timeTill","intervalMs","consolidateBy","intervalSec","Math","ceil","aggFunction","grouped_items","groupBy","promises","value_type","itemids","join","table","historyQuery","Promise","all","results","valueColumn","includes","trendsQuery","history","queryDef","refId","format","datasourceId","rawSql","maxDataPoints","datasourceRequest","url","method","data","queries","response"],"mappings":"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","file":"sqlConnector.js","sourcesContent":["import _ from 'lodash';\nimport mysql from './mysql';\nimport postgres from './postgres';\nimport DBConnector from '../dbConnector';\n\nconst supportedDatabases = {\n mysql: 'mysql',\n postgres: 'postgres'\n};\n\nconst DEFAULT_QUERY_LIMIT = 10000;\nconst HISTORY_TO_TABLE_MAP = {\n '0': 'history',\n '1': 'history_str',\n '2': 'history_log',\n '3': 'history_uint',\n '4': 'history_text'\n};\n\nconst TREND_TO_TABLE_MAP = {\n '0': 'trends',\n '3': 'trends_uint'\n};\n\nconst consolidateByFunc = {\n 'avg': 'AVG',\n 'min': 'MIN',\n 'max': 'MAX',\n 'sum': 'SUM',\n 'count': 'COUNT'\n};\n\nconst consolidateByTrendColumns = {\n 'avg': 'value_avg',\n 'min': 'value_min',\n 'max': 'value_max'\n};\n\nexport class SQLConnector extends DBConnector {\n constructor(options, backendSrv, datasourceSrv) {\n super(options, backendSrv, datasourceSrv);\n\n this.limit = options.limit || DEFAULT_QUERY_LIMIT;\n this.sqlDialect = null;\n\n super.loadDBDataSource()\n .then(() => this.loadSQLDialect());\n }\n\n loadSQLDialect() {\n if (this.datasourceTypeId === supportedDatabases.postgres) {\n this.sqlDialect = postgres;\n } else {\n this.sqlDialect = mysql;\n }\n }\n\n /**\n * Try to invoke test query for one of Zabbix database tables.\n */\n testDataSource() {\n let testQuery = this.sqlDialect.testQuery();\n return this.invokeSQLQuery(testQuery);\n }\n\n getHistory(items, timeFrom, timeTill, options) {\n let {intervalMs, consolidateBy} = options;\n let intervalSec = Math.ceil(intervalMs / 1000);\n\n consolidateBy = consolidateBy || 'avg';\n let aggFunction = consolidateByFunc[consolidateBy];\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid').join(', ');\n let table = HISTORY_TO_TABLE_MAP[value_type];\n let query = this.sqlDialect.historyQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);\n\n query = compactSQLQuery(query);\n return this.invokeSQLQuery(query);\n });\n\n return Promise.all(promises).then(results => {\n return _.flatten(results);\n });\n }\n\n getTrends(items, timeFrom, timeTill, options) {\n let { intervalMs, consolidateBy } = options;\n let intervalSec = Math.ceil(intervalMs / 1000);\n\n consolidateBy = consolidateBy || 'avg';\n let aggFunction = consolidateByFunc[consolidateBy];\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid').join(', ');\n let table = TREND_TO_TABLE_MAP[value_type];\n let valueColumn = _.includes(['avg', 'min', 'max'], consolidateBy) ? consolidateBy : 'avg';\n valueColumn = consolidateByTrendColumns[valueColumn];\n let query = this.sqlDialect.trendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);\n\n query = compactSQLQuery(query);\n return this.invokeSQLQuery(query);\n });\n\n return Promise.all(promises).then(results => {\n return _.flatten(results);\n });\n }\n\n handleGrafanaTSResponse(history, items, addHostName = true) {\n return convertGrafanaTSResponse(history, items, addHostName);\n }\n\n invokeSQLQuery(query) {\n let queryDef = {\n refId: 'A',\n format: 'time_series',\n datasourceId: this.datasourceId,\n rawSql: query,\n maxDataPoints: this.limit\n };\n\n return this.backendSrv.datasourceRequest({\n url: '/api/tsdb/query',\n method: 'POST',\n data: {\n queries: [queryDef],\n }\n })\n .then(response => {\n let results = response.data.results;\n if (results['A']) {\n return results['A'].series;\n } else {\n return null;\n }\n });\n }\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\nfunction convertGrafanaTSResponse(time_series, items, addHostName) {\n //uniqBy is needed to deduplicate\n var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid');\n let grafanaSeries = _.map(time_series, series => {\n let itemid = series.name;\n var item = _.find(items, {'itemid': itemid});\n var alias = item.name;\n //only when actual multi hosts selected\n if (_.keys(hosts).length > 1 && addHostName) {\n var host = _.find(hosts, {'hostid': item.hostid});\n alias = host.name + \": \" + alias;\n }\n // CachingProxy deduplicates requests and returns one time series for equal queries.\n // Clone is needed to prevent changing of series object shared between all targets.\n let datapoints = _.cloneDeep(series.points);\n return {\n target: alias,\n datapoints: datapoints\n };\n });\n\n return _.sortBy(grafanaSeries, 'target');\n}\n\nfunction compactSQLQuery(query) {\n return query.replace(/\\s+/g, ' ');\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/zabbix.js b/dist/datasource-zabbix/zabbix/zabbix.js index 9fd66f7..bd38c67 100644 --- a/dist/datasource-zabbix/zabbix/zabbix.js +++ b/dist/datasource-zabbix/zabbix/zabbix.js @@ -1,9 +1,9 @@ 'use strict'; -System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbix_api/zabbixAPIConnector', './connectors/sql/sqlConnector', './proxy/cachingProxy'], function (_export, _context) { +System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbix_api/zabbixAPIConnector', './connectors/sql/sqlConnector', './proxy/cachingProxy', './connectors/dbConnector'], function (_export, _context) { "use strict"; - var _, utils, responseHandler, ZabbixAPIConnector, SQLConnector, CachingProxy, _slicedToArray, _createClass, REQUESTS_TO_PROXYFY, REQUESTS_TO_CACHE, REQUESTS_TO_BIND, Zabbix; + var _, utils, responseHandler, ZabbixAPIConnector, SQLConnector, CachingProxy, ZabbixNotImplemented, _slicedToArray, _createClass, REQUESTS_TO_PROXYFY, REQUESTS_TO_CACHE, REQUESTS_TO_BIND, Zabbix; function _toConsumableArray(arr) { if (Array.isArray(arr)) { @@ -99,6 +99,8 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi SQLConnector = _connectorsSqlSqlConnector.SQLConnector; }, function (_proxyCachingProxy) { CachingProxy = _proxyCachingProxy.CachingProxy; + }, function (_connectorsDbConnector) { + ZabbixNotImplemented = _connectorsDbConnector.ZabbixNotImplemented; }], execute: function () { _slicedToArray = function () { @@ -282,6 +284,37 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi } } } + }, { + key: 'testDataSource', + value: function testDataSource() { + var _this = this; + + var zabbixVersion = void 0; + var dbConnectorStatus = void 0; + return this.getVersion().then(function (version) { + zabbixVersion = version; + return _this.login(); + }).then(function () { + if (_this.enableDirectDBConnection) { + return _this.dbConnector.testDataSource(); + } else { + return Promise.resolve(); + } + }).catch(function (error) { + if (error instanceof ZabbixNotImplemented) { + return Promise.resolve(); + } + return Promise.reject(error); + }).then(function (testResult) { + if (testResult) { + dbConnectorStatus = { + dsType: _this.dbConnector.datasourceTypeName, + dsName: _this.dbConnector.datasourceName + }; + } + return { zabbixVersion: zabbixVersion, dbConnectorStatus: dbConnectorStatus }; + }); + } }, { key: 'getItemsFromTarget', value: function getItemsFromTarget(target, options) { @@ -324,11 +357,11 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi }, { key: 'getAllHosts', value: function getAllHosts(groupFilter) { - var _this = this; + var _this2 = this; return this.getGroups(groupFilter).then(function (groups) { var groupids = _.map(groups, 'groupid'); - return _this.zabbixAPI.getHosts(groupids); + return _this2.zabbixAPI.getHosts(groupids); }); } }, { @@ -341,22 +374,22 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi }, { key: 'getAllApps', value: function getAllApps(groupFilter, hostFilter) { - var _this2 = this; + var _this3 = this; return this.getHosts(groupFilter, hostFilter).then(function (hosts) { var hostids = _.map(hosts, 'hostid'); - return _this2.zabbixAPI.getApps(hostids); + return _this3.zabbixAPI.getApps(hostids); }); } }, { key: 'getApps', value: function getApps(groupFilter, hostFilter, appFilter) { - var _this3 = this; + var _this4 = this; return this.getHosts(groupFilter, hostFilter).then(function (hosts) { var hostids = _.map(hosts, 'hostid'); if (appFilter) { - return _this3.zabbixAPI.getApps(hostids).then(function (apps) { + return _this4.zabbixAPI.getApps(hostids).then(function (apps) { return filterByQuery(apps, appFilter); }); } else { @@ -370,16 +403,16 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi }, { key: 'getAllItems', value: function getAllItems(groupFilter, hostFilter, appFilter) { - var _this4 = this; + var _this5 = this; var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; return this.getApps(groupFilter, hostFilter, appFilter).then(function (apps) { if (apps.appFilterEmpty) { - return _this4.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype); + return _this5.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype); } else { var appids = _.map(apps, 'applicationid'); - return _this4.zabbixAPI.getItems(undefined, appids, options.itemtype); + return _this5.zabbixAPI.getItems(undefined, appids, options.itemtype); } }).then(function (items) { if (!options.showDisabledItems) { @@ -421,7 +454,7 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi }, { key: 'getTriggers', value: function getTriggers(groupFilter, hostFilter, appFilter, options) { - var _this5 = this; + var _this6 = this; var promises = [this.getGroups(groupFilter), this.getHosts(groupFilter, hostFilter), this.getApps(groupFilter, hostFilter, appFilter)]; @@ -443,13 +476,13 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi return query; }).then(function (query) { - return _this5.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options); + return _this6.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options); }); } }, { key: 'getHistoryTS', value: function getHistoryTS(items, timeRange, options) { - var _this6 = this; + var _this7 = this; var _timeRange = _slicedToArray(timeRange, 2), timeFrom = _timeRange[0], @@ -457,7 +490,7 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi if (this.enableDirectDBConnection) { return this.getHistoryDB(items, timeFrom, timeTo, options).then(function (history) { - return _this6.dbConnector.handleGrafanaTSResponse(history, items); + return _this7.dbConnector.handleGrafanaTSResponse(history, items); }); } else { return this.zabbixAPI.getHistory(items, timeFrom, timeTo).then(function (history) { @@ -468,7 +501,7 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi }, { key: 'getTrends', value: function getTrends(items, timeRange, options) { - var _this7 = this; + var _this8 = this; var _timeRange2 = _slicedToArray(timeRange, 2), timeFrom = _timeRange2[0], @@ -476,7 +509,7 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi if (this.enableDirectDBConnection) { return this.getTrendsDB(items, timeFrom, timeTo, options).then(function (history) { - return _this7.dbConnector.handleGrafanaTSResponse(history, items); + return _this8.dbConnector.handleGrafanaTSResponse(history, items); }); } else { var valueType = options.consolidateBy || options.valueType; diff --git a/dist/datasource-zabbix/zabbix/zabbix.js.map b/dist/datasource-zabbix/zabbix/zabbix.js.map index c785a7f..dfa11b1 100644 --- a/dist/datasource-zabbix/zabbix/zabbix.js.map +++ b/dist/datasource-zabbix/zabbix/zabbix.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/datasource-zabbix/zabbix/zabbix.js"],"names":["findByName","list","name","finded","_","find","filterByName","filter","filterByRegex","regex","filterPattern","utils","buildRegex","zbx_obj","test","findByFilter","isRegex","filterByQuery","getHostIds","items","hostIds","map","item","hosts","uniq","flatten","responseHandler","ZabbixAPIConnector","SQLConnector","CachingProxy","REQUESTS_TO_PROXYFY","REQUESTS_TO_CACHE","REQUESTS_TO_BIND","Zabbix","options","backendSrv","datasourceSrv","url","username","password","basicAuth","withCredentials","cacheTTL","enableDirectDBConnection","datasourceId","cacheOptions","enabled","ttl","cachingProxy","zabbixAPI","dbConnectorOptions","dbConnector","getHistoryDB","proxyfyWithCache","getHistory","getTrendsDB","getTrends","proxyfyRequests","cacheRequests","bindRequests","request","proxyfy","cacheRequest","bind","target","parts","filters","p","getItems","Promise","all","getHosts","getApps","then","results","apps","appFilterEmpty","getGroups","groupFilter","getAllGroups","groups","groupids","hostFilter","getAllHosts","hostids","appFilter","undefined","itemtype","appids","showDisabledItems","expandUserMacro","getMacros","forEach","containsMacro","replaceMacro","macros","itemFilter","getAllItems","itServiceFilter","getITService","itServices","promises","filteredGroups","filteredHosts","filteredApps","query","applicationids","getTriggers","timeRange","timeFrom","timeTo","handleGrafanaTSResponse","history","handleHistory","valueType","consolidateBy","getTrend","handleTrends","sortTimeseries","length","resultFormat","handleHistoryAsTable","handleText","resolve","itservices","isOldVersion","itservice","serviceid","itServiceIds","getSLA","handleSLAResponse","slaProperty","slaResponse"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAwRA;;AAEA;;;;;;AAMA,WAASA,UAAT,CAAoBC,IAApB,EAA0BC,IAA1B,EAAgC;AAC9B,QAAIC,SAASC,EAAEC,IAAF,CAAOJ,IAAP,EAAa,EAAC,QAAQC,IAAT,EAAb,CAAb;AACA,QAAIC,MAAJ,EAAY;AACV,aAAO,CAACA,MAAD,CAAP;AACD,KAFD,MAEO;AACL,aAAO,EAAP;AACD;AACF;;AAED;;;;;;;;AAQA,WAASG,YAAT,CAAsBL,IAAtB,EAA4BC,IAA5B,EAAkC;AAChC,QAAIC,SAASC,EAAEG,MAAF,CAASN,IAAT,EAAe,EAAC,QAAQC,IAAT,EAAf,CAAb;AACA,QAAIC,MAAJ,EAAY;AACV,aAAOA,MAAP;AACD,KAFD,MAEO;AACL,aAAO,EAAP;AACD;AACF;;AAED,WAASK,aAAT,CAAuBP,IAAvB,EAA6BQ,KAA7B,EAAoC;AAClC,QAAIC,gBAAgBC,MAAMC,UAAN,CAAiBH,KAAjB,CAApB;AACA,WAAOL,EAAEG,MAAF,CAASN,IAAT,EAAe,UAAUY,OAAV,EAAmB;AACvC,aAAOH,cAAcI,IAAd,CAAmBD,QAAQX,IAA3B,CAAP;AACD,KAFM,CAAP;AAGD;;AAED,WAASa,YAAT,CAAsBd,IAAtB,EAA4BM,MAA5B,EAAoC;AAClC,QAAII,MAAMK,OAAN,CAAcT,MAAd,CAAJ,EAA2B;AACzB,aAAOC,cAAcP,IAAd,EAAoBM,MAApB,CAAP;AACD,KAFD,MAEO;AACL,aAAOP,WAAWC,IAAX,EAAiBM,MAAjB,CAAP;AACD;AACF;;AAED,WAASU,aAAT,CAAuBhB,IAAvB,EAA6BM,MAA7B,EAAqC;AACnC,QAAII,MAAMK,OAAN,CAAcT,MAAd,CAAJ,EAA2B;AACzB,aAAOC,cAAcP,IAAd,EAAoBM,MAApB,CAAP;AACD,KAFD,MAEO;AACL,aAAOD,aAAaL,IAAb,EAAmBM,MAAnB,CAAP;AACD;AACF;;AAED,WAASW,UAAT,CAAoBC,KAApB,EAA2B;AACzB,QAAIC,UAAUhB,EAAEiB,GAAF,CAAMF,KAAN,EAAa,gBAAQ;AACjC,aAAOf,EAAEiB,GAAF,CAAMC,KAAKC,KAAX,EAAkB,QAAlB,CAAP;AACD,KAFa,CAAd;AAGA,WAAOnB,EAAEoB,IAAF,CAAOpB,EAAEqB,OAAF,CAAUL,OAAV,CAAP,CAAP;AACD;;;AAtVMhB,O;;AACKO,W;;AACLe,qB;;AACEC,wB,2CAAAA,kB;;AACAC,kB,8BAAAA,Y;;AACAC,kB,sBAAAA,Y;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEHC,yB,GAAsB,CAC1B,YAD0B,EACZ,UADY,EACA,WADA,EACa,UADb,EACyB,SADzB,EACoC,UADpC,EACgD,WADhD,EAC6D,eAD7D,EAE1B,WAF0B,EAEb,WAFa,EAEA,eAFA,EAEiB,iBAFjB,EAEoC,cAFpC,EAEoD,QAFpD,EAE8D,YAF9D,C;AAKtBC,uB,GAAoB,CACxB,WADwB,EACX,UADW,EACC,SADD,EACY,UADZ,EACwB,WADxB,EACqC,eADrC,EACsD,cADtD,C;AAIpBC,sB,GAAmB,CACvB,YADuB,EACT,UADS,EACG,WADH,EACgB,eADhB,EACiC,WADjC,EAC8C,WAD9C,EAC2D,eAD3D,EAEvB,iBAFuB,EAEJ,cAFI,EAEY,YAFZ,EAE0B,OAF1B,C;;wBAKZC,M;AACX,wBAAYC,OAAZ,EAAqBC,UAArB,EAAiCC,aAAjC,EAAgD;AAAA;;AAAA,cAE5CC,GAF4C,GAU1CH,OAV0C,CAE5CG,GAF4C;AAAA,cAG5CC,QAH4C,GAU1CJ,OAV0C,CAG5CI,QAH4C;AAAA,cAI5CC,QAJ4C,GAU1CL,OAV0C,CAI5CK,QAJ4C;AAAA,cAK5CC,SAL4C,GAU1CN,OAV0C,CAK5CM,SAL4C;AAAA,cAM5CC,eAN4C,GAU1CP,OAV0C,CAM5CO,eAN4C;AAAA,cAO5CC,QAP4C,GAU1CR,OAV0C,CAO5CQ,QAP4C;AAAA,cAQ5CC,wBAR4C,GAU1CT,OAV0C,CAQ5CS,wBAR4C;AAAA,cAS5CC,YAT4C,GAU1CV,OAV0C,CAS5CU,YAT4C;;;AAY9C,eAAKD,wBAAL,GAAgCA,wBAAhC;;AAEA;AACA,cAAIE,eAAe;AACjBC,qBAAS,IADQ;AAEjBC,iBAAKL;AAFY,WAAnB;AAIA,eAAKM,YAAL,GAAoB,IAAInB,YAAJ,CAAiBgB,YAAjB,CAApB;;AAEA,eAAKI,SAAL,GAAiB,IAAItB,kBAAJ,CAAuBU,GAAvB,EAA4BC,QAA5B,EAAsCC,QAAtC,EAAgDC,SAAhD,EAA2DC,eAA3D,EAA4EN,UAA5E,CAAjB;;AAEA,cAAIQ,wBAAJ,EAA8B;AAC5B,gBAAIO,qBAAqB,EAAEN,0BAAF,EAAzB;AACA,iBAAKO,WAAL,GAAmB,IAAIvB,YAAJ,CAAiBsB,kBAAjB,EAAqCf,UAArC,EAAiDC,aAAjD,CAAnB;AACA,iBAAKgB,YAAL,GAAoB,KAAKJ,YAAL,CAAkBK,gBAAlB,CAAmC,KAAKF,WAAL,CAAiBG,UAApD,EAAgE,YAAhE,EAA8E,KAAKH,WAAnF,CAApB;AACA,iBAAKI,WAAL,GAAmB,KAAKP,YAAL,CAAkBK,gBAAlB,CAAmC,KAAKF,WAAL,CAAiBK,SAApD,EAA+D,WAA/D,EAA4E,KAAKL,WAAjF,CAAnB;AACD;;AAED,eAAKM,eAAL;AACA,eAAKC,aAAL;AACA,eAAKC,YAAL;AACD;;;;4CAEiB;AAAA;AAAA;AAAA;;AAAA;AAChB,mCAAoB7B,mBAApB,8HAAyC;AAAA,oBAAhC8B,OAAgC;;AACvC,qBAAKX,SAAL,CAAeW,OAAf,IAA0B,KAAKZ,YAAL,CAAkBa,OAAlB,CAA0B,KAAKZ,SAAL,CAAeW,OAAf,CAA1B,EAAmDA,OAAnD,EAA4D,KAAKX,SAAjE,CAA1B;AACD;AAHe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIjB;;;0CAEe;AAAA;AAAA;AAAA;;AAAA;AACd,oCAAoBlB,iBAApB,mIAAuC;AAAA,oBAA9B6B,OAA8B;;AACrC,qBAAKX,SAAL,CAAeW,OAAf,IAA0B,KAAKZ,YAAL,CAAkBc,YAAlB,CAA+B,KAAKb,SAAL,CAAeW,OAAf,CAA/B,EAAwDA,OAAxD,EAAiE,KAAKX,SAAtE,CAA1B;AACD;AAHa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIf;;;yCAEc;AAAA;AAAA;AAAA;;AAAA;AACb,oCAAoBjB,gBAApB,mIAAsC;AAAA,oBAA7B4B,OAA6B;;AACpC,qBAAKA,OAAL,IAAgB,KAAKX,SAAL,CAAeW,OAAf,EAAwBG,IAAxB,CAA6B,KAAKd,SAAlC,CAAhB;AACD;AAHY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAId;;;6CAEkBe,M,EAAQ9B,O,EAAS;AAClC,gBAAI+B,QAAQ,CAAC,OAAD,EAAU,MAAV,EAAkB,aAAlB,EAAiC,MAAjC,CAAZ;AACA,gBAAIC,UAAU9D,EAAEiB,GAAF,CAAM4C,KAAN,EAAa;AAAA,qBAAKD,OAAOG,CAAP,EAAU5D,MAAf;AAAA,aAAb,CAAd;AACA,mBAAO,KAAK6D,QAAL,gCAAiBF,OAAjB,UAA0BhC,OAA1B,GAAP;AACD;;;6CAEkB8B,M,EAAQ;AACzB,gBAAIC,QAAQ,CAAC,OAAD,EAAU,MAAV,EAAkB,aAAlB,CAAZ;AACA,gBAAIC,UAAU9D,EAAEiB,GAAF,CAAM4C,KAAN,EAAa;AAAA,qBAAKD,OAAOG,CAAP,EAAU5D,MAAf;AAAA,aAAb,CAAd;AACA,mBAAO8D,QAAQC,GAAR,CAAY,CACjB,KAAKC,QAAL,gCAAiBL,OAAjB,EADiB,EAEjB,KAAKM,OAAL,gCAAgBN,OAAhB,EAFiB,CAAZ,EAGJO,IAHI,CAGC,UAACC,OAAD,EAAa;AAAA,4CACCA,OADD;AAAA,kBACdnD,KADc;AAAA,kBACPoD,IADO;;AAEnB,kBAAIA,KAAKC,cAAT,EAAyB;AACvBD,uBAAO,EAAP;AACD;AACD,qBAAO,CAACpD,KAAD,EAAQoD,IAAR,CAAP;AACD,aATM,CAAP;AAUD;;;yCAEc;AACb,mBAAO,KAAK1B,SAAL,CAAe4B,SAAf,EAAP;AACD;;;oCAESC,W,EAAa;AACrB,mBAAO,KAAKC,YAAL,GACNN,IADM,CACD;AAAA,qBAAU1D,aAAaiE,MAAb,EAAqBF,WAArB,CAAV;AAAA,aADC,CAAP;AAED;;;sCAKWA,W,EAAa;AAAA;;AACvB,mBAAO,KAAKD,SAAL,CAAeC,WAAf,EACNL,IADM,CACD,kBAAU;AACd,kBAAIQ,WAAW7E,EAAEiB,GAAF,CAAM2D,MAAN,EAAc,SAAd,CAAf;AACA,qBAAO,MAAK/B,SAAL,CAAesB,QAAf,CAAwBU,QAAxB,CAAP;AACD,aAJM,CAAP;AAKD;;;mCAEQH,W,EAAaI,U,EAAY;AAChC,mBAAO,KAAKC,WAAL,CAAiBL,WAAjB,EACNL,IADM,CACD;AAAA,qBAAS1D,aAAaQ,KAAb,EAAoB2D,UAApB,CAAT;AAAA,aADC,CAAP;AAED;;;qCAKUJ,W,EAAaI,U,EAAY;AAAA;;AAClC,mBAAO,KAAKX,QAAL,CAAcO,WAAd,EAA2BI,UAA3B,EACNT,IADM,CACD,iBAAS;AACb,kBAAIW,UAAUhF,EAAEiB,GAAF,CAAME,KAAN,EAAa,QAAb,CAAd;AACA,qBAAO,OAAK0B,SAAL,CAAeuB,OAAf,CAAuBY,OAAvB,CAAP;AACD,aAJM,CAAP;AAKD;;;kCAEON,W,EAAaI,U,EAAYG,S,EAAW;AAAA;;AAC1C,mBAAO,KAAKd,QAAL,CAAcO,WAAd,EAA2BI,UAA3B,EACNT,IADM,CACD,iBAAS;AACb,kBAAIW,UAAUhF,EAAEiB,GAAF,CAAME,KAAN,EAAa,QAAb,CAAd;AACA,kBAAI8D,SAAJ,EAAe;AACb,uBAAO,OAAKpC,SAAL,CAAeuB,OAAf,CAAuBY,OAAvB,EACNX,IADM,CACD;AAAA,yBAAQxD,cAAc0D,IAAd,EAAoBU,SAApB,CAAR;AAAA,iBADC,CAAP;AAED,eAHD,MAGO;AACL,uBAAO;AACLT,kCAAgB,IADX;AAELQ,2BAASA;AAFJ,iBAAP;AAID;AACF,aAZM,CAAP;AAaD;;;sCAEWN,W,EAAaI,U,EAAYG,S,EAAyB;AAAA;;AAAA,gBAAdnD,OAAc,uEAAJ,EAAI;;AAC5D,mBAAO,KAAKsC,OAAL,CAAaM,WAAb,EAA0BI,UAA1B,EAAsCG,SAAtC,EACNZ,IADM,CACD,gBAAQ;AACZ,kBAAIE,KAAKC,cAAT,EAAyB;AACvB,uBAAO,OAAK3B,SAAL,CAAemB,QAAf,CAAwBO,KAAKS,OAA7B,EAAsCE,SAAtC,EAAiDpD,QAAQqD,QAAzD,CAAP;AACD,eAFD,MAEO;AACL,oBAAIC,SAASpF,EAAEiB,GAAF,CAAMsD,IAAN,EAAY,eAAZ,CAAb;AACA,uBAAO,OAAK1B,SAAL,CAAemB,QAAf,CAAwBkB,SAAxB,EAAmCE,MAAnC,EAA2CtD,QAAQqD,QAAnD,CAAP;AACD;AACF,aARM,EASNd,IATM,CASD,iBAAS;AACb,kBAAI,CAACvC,QAAQuD,iBAAb,EAAgC;AAC9BtE,wBAAQf,EAAEG,MAAF,CAASY,KAAT,EAAgB,EAAC,UAAU,GAAX,EAAhB,CAAR;AACD;;AAED,qBAAOA,KAAP;AACD,aAfM,EAgBNsD,IAhBM,CAgBD,KAAKiB,eAAL,CAAqB3B,IAArB,CAA0B,IAA1B,CAhBC,CAAP;AAiBD;;;0CAEe5C,K,EAAO;AACrB,gBAAIiE,UAAUlE,WAAWC,KAAX,CAAd;AACA,mBAAO,KAAKwE,SAAL,CAAeP,OAAf,EACNX,IADM,CACD,kBAAU;AACdrE,gBAAEwF,OAAF,CAAUzE,KAAV,EAAiB,gBAAQ;AACvB,oBAAIR,MAAMkF,aAAN,CAAoBvE,KAAKpB,IAAzB,CAAJ,EAAoC;AAClCoB,uBAAKpB,IAAL,GAAYS,MAAMmF,YAAN,CAAmBxE,IAAnB,EAAyByE,MAAzB,CAAZ;AACD;AACF,eAJD;AAKA,qBAAO5E,KAAP;AACD,aARM,CAAP;AASD;;;mCAEQ2D,W,EAAaI,U,EAAYG,S,EAAWW,U,EAA0B;AAAA,gBAAd9D,OAAc,uEAAJ,EAAI;;AACrE,mBAAO,KAAK+D,WAAL,CAAiBnB,WAAjB,EAA8BI,UAA9B,EAA0CG,SAA1C,EAAqDnD,OAArD,EACNuC,IADM,CACD;AAAA,qBAASxD,cAAcE,KAAd,EAAqB6E,UAArB,CAAT;AAAA,aADC,CAAP;AAED;;;wCAEaE,e,EAAiB;AAC7B,mBAAO,KAAKjD,SAAL,CAAekD,YAAf,GACN1B,IADM,CACD;AAAA,qBAAc1D,aAAaqF,UAAb,EAAyBF,eAAzB,CAAd;AAAA,aADC,CAAP;AAED;;;sCAKWpB,W,EAAaI,U,EAAYG,S,EAAWnD,O,EAAS;AAAA;;AACvD,gBAAImE,WAAW,CACb,KAAKxB,SAAL,CAAeC,WAAf,CADa,EAEb,KAAKP,QAAL,CAAcO,WAAd,EAA2BI,UAA3B,CAFa,EAGb,KAAKV,OAAL,CAAaM,WAAb,EAA0BI,UAA1B,EAAsCG,SAAtC,CAHa,CAAf;;AAMA,mBAAOhB,QAAQC,GAAR,CAAY+B,QAAZ,EACN5B,IADM,CACD,mBAAW;AACf,kBAAI6B,iBAAiB5B,QAAQ,CAAR,CAArB;AACA,kBAAI6B,gBAAgB7B,QAAQ,CAAR,CAApB;AACA,kBAAI8B,eAAe9B,QAAQ,CAAR,CAAnB;AACA,kBAAI+B,QAAQ,EAAZ;;AAEA,kBAAIpB,SAAJ,EAAe;AACboB,sBAAMC,cAAN,GAAuBtG,EAAEqB,OAAF,CAAUrB,EAAEiB,GAAF,CAAMmF,YAAN,EAAoB,eAApB,CAAV,CAAvB;AACD;AACD,kBAAItB,UAAJ,EAAgB;AACduB,sBAAMrB,OAAN,GAAgBhF,EAAEiB,GAAF,CAAMkF,aAAN,EAAqB,QAArB,CAAhB;AACD;AACD,kBAAIzB,WAAJ,EAAiB;AACf2B,sBAAMxB,QAAN,GAAiB7E,EAAEiB,GAAF,CAAMiF,cAAN,EAAsB,SAAtB,CAAjB;AACD;;AAED,qBAAOG,KAAP;AACD,aAlBM,EAkBJhC,IAlBI,CAkBC,iBAAS;AACf,qBAAO,OAAKxB,SAAL,CAAe0D,WAAf,CAA2BF,MAAMxB,QAAjC,EAA2CwB,MAAMrB,OAAjD,EAA0DqB,MAAMC,cAAhE,EAAgFxE,OAAhF,CAAP;AACD,aApBM,CAAP;AAqBD;;;uCAEYf,K,EAAOyF,S,EAAW1E,O,EAAS;AAAA;;AAAA,4CACb0E,SADa;AAAA,gBACjCC,QADiC;AAAA,gBACvBC,MADuB;;AAEtC,gBAAI,KAAKnE,wBAAT,EAAmC;AACjC,qBAAO,KAAKS,YAAL,CAAkBjC,KAAlB,EAAyB0F,QAAzB,EAAmCC,MAAnC,EAA2C5E,OAA3C,EACNuC,IADM,CACD;AAAA,uBAAW,OAAKtB,WAAL,CAAiB4D,uBAAjB,CAAyCC,OAAzC,EAAkD7F,KAAlD,CAAX;AAAA,eADC,CAAP;AAED,aAHD,MAGO;AACL,qBAAO,KAAK8B,SAAL,CAAeK,UAAf,CAA0BnC,KAA1B,EAAiC0F,QAAjC,EAA2CC,MAA3C,EACNrC,IADM,CACD;AAAA,uBAAW/C,gBAAgBuF,aAAhB,CAA8BD,OAA9B,EAAuC7F,KAAvC,CAAX;AAAA,eADC,CAAP;AAED;AACF;;;oCAESA,K,EAAOyF,S,EAAW1E,O,EAAS;AAAA;;AAAA,6CACV0E,SADU;AAAA,gBAC9BC,QAD8B;AAAA,gBACpBC,MADoB;;AAEnC,gBAAI,KAAKnE,wBAAT,EAAmC;AACjC,qBAAO,KAAKY,WAAL,CAAiBpC,KAAjB,EAAwB0F,QAAxB,EAAkCC,MAAlC,EAA0C5E,OAA1C,EACNuC,IADM,CACD;AAAA,uBAAW,OAAKtB,WAAL,CAAiB4D,uBAAjB,CAAyCC,OAAzC,EAAkD7F,KAAlD,CAAX;AAAA,eADC,CAAP;AAED,aAHD,MAGO;AACL,kBAAI+F,YAAYhF,QAAQiF,aAAR,IAAyBjF,QAAQgF,SAAjD;AACA,qBAAO,KAAKjE,SAAL,CAAemE,QAAf,CAAwBjG,KAAxB,EAA+B0F,QAA/B,EAAyCC,MAAzC,EACNrC,IADM,CACD;AAAA,uBAAW/C,gBAAgB2F,YAAhB,CAA6BL,OAA7B,EAAsC7F,KAAtC,EAA6C+F,SAA7C,CAAX;AAAA,eADC,EAENzC,IAFM,CAED/C,gBAAgB4F,cAFf,CAAP,CAFK,CAIkC;AACxC;AACF;;;yCAEcnG,K,EAAOyF,S,EAAW5C,M,EAAQ;AAAA,6CACd4C,SADc;AAAA,gBAClCC,QADkC;AAAA,gBACxBC,MADwB;;AAEvC,gBAAI3F,MAAMoG,MAAV,EAAkB;AAChB,qBAAO,KAAKtE,SAAL,CAAeK,UAAf,CAA0BnC,KAA1B,EAAiC0F,QAAjC,EAA2CC,MAA3C,EACNrC,IADM,CACD,mBAAW;AACf,oBAAIT,OAAOwD,YAAP,KAAwB,OAA5B,EAAqC;AACnC,yBAAO9F,gBAAgB+F,oBAAhB,CAAqCT,OAArC,EAA8C7F,KAA9C,EAAqD6C,MAArD,CAAP;AACD,iBAFD,MAEO;AACL,yBAAOtC,gBAAgBgG,UAAhB,CAA2BV,OAA3B,EAAoC7F,KAApC,EAA2C6C,MAA3C,CAAP;AACD;AACF,eAPM,CAAP;AAQD,aATD,MASO;AACL,qBAAOK,QAAQsD,OAAR,CAAgB,EAAhB,CAAP;AACD;AACF;;;iCAEMC,U,EAAYhB,S,EAAW5C,M,EAAQ9B,O,EAAS;AAC7C,gBAAIkE,aAAawB,UAAjB;AACA,gBAAI1F,QAAQ2F,YAAZ,EAA0B;AACxBzB,2BAAahG,EAAEG,MAAF,CAAS6F,UAAT,EAAqB,EAAC,aAAapC,OAAO8D,SAAP,CAAiBC,SAA/B,EAArB,CAAb;AACD;AACD,gBAAIC,eAAe5H,EAAEiB,GAAF,CAAM+E,UAAN,EAAkB,WAAlB,CAAnB;AACA,mBAAO,KAAKnD,SAAL,CAAegF,MAAf,CAAsBD,YAAtB,EAAoCpB,SAApC,EACNnC,IADM,CACD,uBAAe;AACnB,qBAAOrE,EAAEiB,GAAF,CAAM2G,YAAN,EAAoB,qBAAa;AACtC,oBAAIF,YAAY1H,EAAEC,IAAF,CAAO+F,UAAP,EAAmB,EAAC,aAAa2B,SAAd,EAAnB,CAAhB;AACA,uBAAOrG,gBAAgBwG,iBAAhB,CAAkCJ,SAAlC,EAA6C9D,OAAOmE,WAApD,EAAiEC,WAAjE,CAAP;AACD,eAHM,CAAP;AAID,aANM,CAAP;AAOD","file":"zabbix.js","sourcesContent":["import _ from 'lodash';\nimport * as utils from '../utils';\nimport responseHandler from '../responseHandler';\nimport { ZabbixAPIConnector } from './connectors/zabbix_api/zabbixAPIConnector';\nimport { SQLConnector } from './connectors/sql/sqlConnector';\nimport { CachingProxy } from './proxy/cachingProxy';\n\nconst REQUESTS_TO_PROXYFY = [\n 'getHistory', 'getTrend', 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs',\n 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion'\n];\n\nconst REQUESTS_TO_CACHE = [\n 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getITService'\n];\n\nconst REQUESTS_TO_BIND = [\n 'getHistory', 'getTrend', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts',\n 'getAcknowledges', 'getITService', 'getVersion', 'login'\n];\n\nexport class Zabbix {\n constructor(options, backendSrv, datasourceSrv) {\n let {\n url,\n username,\n password,\n basicAuth,\n withCredentials,\n cacheTTL,\n enableDirectDBConnection,\n datasourceId\n } = options;\n\n this.enableDirectDBConnection = enableDirectDBConnection;\n\n // Initialize caching proxy for requests\n let cacheOptions = {\n enabled: true,\n ttl: cacheTTL\n };\n this.cachingProxy = new CachingProxy(cacheOptions);\n\n this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);\n\n if (enableDirectDBConnection) {\n let dbConnectorOptions = { datasourceId };\n this.dbConnector = new SQLConnector(dbConnectorOptions, backendSrv, datasourceSrv);\n this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector);\n this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector);\n }\n\n this.proxyfyRequests();\n this.cacheRequests();\n this.bindRequests();\n }\n\n proxyfyRequests() {\n for (let request of REQUESTS_TO_PROXYFY) {\n this.zabbixAPI[request] = this.cachingProxy.proxyfy(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n cacheRequests() {\n for (let request of REQUESTS_TO_CACHE) {\n this.zabbixAPI[request] = this.cachingProxy.cacheRequest(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n bindRequests() {\n for (let request of REQUESTS_TO_BIND) {\n this[request] = this.zabbixAPI[request].bind(this.zabbixAPI);\n }\n }\n\n getItemsFromTarget(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n let filters = _.map(parts, p => target[p].filter);\n return this.getItems(...filters, options);\n }\n\n getHostsFromTarget(target) {\n let parts = ['group', 'host', 'application'];\n let filters = _.map(parts, p => target[p].filter);\n return Promise.all([\n this.getHosts(...filters),\n this.getApps(...filters),\n ]).then((results) => {\n let [hosts, apps] = results;\n if (apps.appFilterEmpty) {\n apps = [];\n }\n return [hosts, apps];\n });\n }\n\n getAllGroups() {\n return this.zabbixAPI.getGroups();\n }\n\n getGroups(groupFilter) {\n return this.getAllGroups()\n .then(groups => findByFilter(groups, groupFilter));\n }\n\n /**\n * Get list of host belonging to given groups.\n */\n getAllHosts(groupFilter) {\n return this.getGroups(groupFilter)\n .then(groups => {\n let groupids = _.map(groups, 'groupid');\n return this.zabbixAPI.getHosts(groupids);\n });\n }\n\n getHosts(groupFilter, hostFilter) {\n return this.getAllHosts(groupFilter)\n .then(hosts => findByFilter(hosts, hostFilter));\n }\n\n /**\n * Get list of applications belonging to given groups and hosts.\n */\n getAllApps(groupFilter, hostFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n return this.zabbixAPI.getApps(hostids);\n });\n }\n\n getApps(groupFilter, hostFilter, appFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n if (appFilter) {\n return this.zabbixAPI.getApps(hostids)\n .then(apps => filterByQuery(apps, appFilter));\n } else {\n return {\n appFilterEmpty: true,\n hostids: hostids\n };\n }\n });\n }\n\n getAllItems(groupFilter, hostFilter, appFilter, options = {}) {\n return this.getApps(groupFilter, hostFilter, appFilter)\n .then(apps => {\n if (apps.appFilterEmpty) {\n return this.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype);\n } else {\n let appids = _.map(apps, 'applicationid');\n return this.zabbixAPI.getItems(undefined, appids, options.itemtype);\n }\n })\n .then(items => {\n if (!options.showDisabledItems) {\n items = _.filter(items, {'status': '0'});\n }\n\n return items;\n })\n .then(this.expandUserMacro.bind(this));\n }\n\n expandUserMacro(items) {\n let hostids = getHostIds(items);\n return this.getMacros(hostids)\n .then(macros => {\n _.forEach(items, item => {\n if (utils.containsMacro(item.name)) {\n item.name = utils.replaceMacro(item, macros);\n }\n });\n return items;\n });\n }\n\n getItems(groupFilter, hostFilter, appFilter, itemFilter, options = {}) {\n return this.getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => filterByQuery(items, itemFilter));\n }\n\n getITServices(itServiceFilter) {\n return this.zabbixAPI.getITService()\n .then(itServices => findByFilter(itServices, itServiceFilter));\n }\n\n /**\n * Build query - convert target filters to array of Zabbix items\n */\n getTriggers(groupFilter, hostFilter, appFilter, options) {\n let promises = [\n this.getGroups(groupFilter),\n this.getHosts(groupFilter, hostFilter),\n this.getApps(groupFilter, hostFilter, appFilter)\n ];\n\n return Promise.all(promises)\n .then(results => {\n let filteredGroups = results[0];\n let filteredHosts = results[1];\n let filteredApps = results[2];\n let query = {};\n\n if (appFilter) {\n query.applicationids = _.flatten(_.map(filteredApps, 'applicationid'));\n }\n if (hostFilter) {\n query.hostids = _.map(filteredHosts, 'hostid');\n }\n if (groupFilter) {\n query.groupids = _.map(filteredGroups, 'groupid');\n }\n\n return query;\n }).then(query => {\n return this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options);\n });\n }\n\n getHistoryTS(items, timeRange, options) {\n let [timeFrom, timeTo] = timeRange;\n if (this.enableDirectDBConnection) {\n return this.getHistoryDB(items, timeFrom, timeTo, options)\n .then(history => this.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n return this.zabbixAPI.getHistory(items, timeFrom, timeTo)\n .then(history => responseHandler.handleHistory(history, items));\n }\n }\n\n getTrends(items, timeRange, options) {\n let [timeFrom, timeTo] = timeRange;\n if (this.enableDirectDBConnection) {\n return this.getTrendsDB(items, timeFrom, timeTo, options)\n .then(history => this.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n let valueType = options.consolidateBy || options.valueType;\n return this.zabbixAPI.getTrend(items, timeFrom, timeTo)\n .then(history => responseHandler.handleTrends(history, items, valueType))\n .then(responseHandler.sortTimeseries); // Sort trend data, issue #202\n }\n }\n\n getHistoryText(items, timeRange, target) {\n let [timeFrom, timeTo] = timeRange;\n if (items.length) {\n return this.zabbixAPI.getHistory(items, timeFrom, timeTo)\n .then(history => {\n if (target.resultFormat === 'table') {\n return responseHandler.handleHistoryAsTable(history, items, target);\n } else {\n return responseHandler.handleText(history, items, target);\n }\n });\n } else {\n return Promise.resolve([]);\n }\n }\n\n getSLA(itservices, timeRange, target, options) {\n let itServices = itservices;\n if (options.isOldVersion) {\n itServices = _.filter(itServices, {'serviceid': target.itservice.serviceid});\n }\n let itServiceIds = _.map(itServices, 'serviceid');\n return this.zabbixAPI.getSLA(itServiceIds, timeRange)\n .then(slaResponse => {\n return _.map(itServiceIds, serviceid => {\n let itservice = _.find(itServices, {'serviceid': serviceid});\n return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse);\n });\n });\n }\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Find group, host, app or item by given name.\n * @param list list of groups, apps or other\n * @param name visible name\n * @return array with finded element or empty array\n */\nfunction findByName(list, name) {\n var finded = _.find(list, {'name': name});\n if (finded) {\n return [finded];\n } else {\n return [];\n }\n}\n\n/**\n * Different hosts can contains applications and items with same name.\n * For this reason use _.filter, which return all elements instead _.find,\n * which return only first finded.\n * @param {[type]} list list of elements\n * @param {[type]} name app name\n * @return {[type]} array with finded element or empty array\n */\nfunction filterByName(list, name) {\n var finded = _.filter(list, {'name': name});\n if (finded) {\n return finded;\n } else {\n return [];\n }\n}\n\nfunction filterByRegex(list, regex) {\n var filterPattern = utils.buildRegex(regex);\n return _.filter(list, function (zbx_obj) {\n return filterPattern.test(zbx_obj.name);\n });\n}\n\nfunction findByFilter(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return findByName(list, filter);\n }\n}\n\nfunction filterByQuery(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return filterByName(list, filter);\n }\n}\n\nfunction getHostIds(items) {\n let hostIds = _.map(items, item => {\n return _.map(item.hosts, 'hostid');\n });\n return _.uniq(_.flatten(hostIds));\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/datasource-zabbix/zabbix/zabbix.js"],"names":["findByName","list","name","finded","_","find","filterByName","filter","filterByRegex","regex","filterPattern","utils","buildRegex","zbx_obj","test","findByFilter","isRegex","filterByQuery","getHostIds","items","hostIds","map","item","hosts","uniq","flatten","responseHandler","ZabbixAPIConnector","SQLConnector","CachingProxy","ZabbixNotImplemented","REQUESTS_TO_PROXYFY","REQUESTS_TO_CACHE","REQUESTS_TO_BIND","Zabbix","options","backendSrv","datasourceSrv","url","username","password","basicAuth","withCredentials","cacheTTL","enableDirectDBConnection","datasourceId","cacheOptions","enabled","ttl","cachingProxy","zabbixAPI","dbConnectorOptions","dbConnector","getHistoryDB","proxyfyWithCache","getHistory","getTrendsDB","getTrends","proxyfyRequests","cacheRequests","bindRequests","request","proxyfy","cacheRequest","bind","zabbixVersion","dbConnectorStatus","getVersion","then","version","login","testDataSource","Promise","resolve","catch","error","reject","testResult","dsType","datasourceTypeName","dsName","datasourceName","target","parts","filters","p","getItems","all","getHosts","getApps","results","apps","appFilterEmpty","getGroups","groupFilter","getAllGroups","groups","groupids","hostFilter","getAllHosts","hostids","appFilter","undefined","itemtype","appids","showDisabledItems","expandUserMacro","getMacros","forEach","containsMacro","replaceMacro","macros","itemFilter","getAllItems","itServiceFilter","getITService","itServices","promises","filteredGroups","filteredHosts","filteredApps","query","applicationids","getTriggers","timeRange","timeFrom","timeTo","handleGrafanaTSResponse","history","handleHistory","valueType","consolidateBy","getTrend","handleTrends","sortTimeseries","length","resultFormat","handleHistoryAsTable","handleText","itservices","isOldVersion","itservice","serviceid","itServiceIds","getSLA","handleSLAResponse","slaProperty","slaResponse"],"mappings":"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","file":"zabbix.js","sourcesContent":["import _ from 'lodash';\nimport * as utils from '../utils';\nimport responseHandler from '../responseHandler';\nimport { ZabbixAPIConnector } from './connectors/zabbix_api/zabbixAPIConnector';\nimport { SQLConnector } from './connectors/sql/sqlConnector';\nimport { CachingProxy } from './proxy/cachingProxy';\nimport { ZabbixNotImplemented } from './connectors/dbConnector';\n\nconst REQUESTS_TO_PROXYFY = [\n 'getHistory', 'getTrend', 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs',\n 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion'\n];\n\nconst REQUESTS_TO_CACHE = [\n 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getITService'\n];\n\nconst REQUESTS_TO_BIND = [\n 'getHistory', 'getTrend', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts',\n 'getAcknowledges', 'getITService', 'getVersion', 'login'\n];\n\nexport class Zabbix {\n constructor(options, backendSrv, datasourceSrv) {\n let {\n url,\n username,\n password,\n basicAuth,\n withCredentials,\n cacheTTL,\n enableDirectDBConnection,\n datasourceId\n } = options;\n\n this.enableDirectDBConnection = enableDirectDBConnection;\n\n // Initialize caching proxy for requests\n let cacheOptions = {\n enabled: true,\n ttl: cacheTTL\n };\n this.cachingProxy = new CachingProxy(cacheOptions);\n\n this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);\n\n if (enableDirectDBConnection) {\n let dbConnectorOptions = { datasourceId };\n this.dbConnector = new SQLConnector(dbConnectorOptions, backendSrv, datasourceSrv);\n this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector);\n this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector);\n }\n\n this.proxyfyRequests();\n this.cacheRequests();\n this.bindRequests();\n }\n\n proxyfyRequests() {\n for (let request of REQUESTS_TO_PROXYFY) {\n this.zabbixAPI[request] = this.cachingProxy.proxyfy(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n cacheRequests() {\n for (let request of REQUESTS_TO_CACHE) {\n this.zabbixAPI[request] = this.cachingProxy.cacheRequest(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n bindRequests() {\n for (let request of REQUESTS_TO_BIND) {\n this[request] = this.zabbixAPI[request].bind(this.zabbixAPI);\n }\n }\n\n /**\n * Perform test query for Zabbix API and external history DB.\n * @return {object} test result object:\n * ```\n {\n zabbixVersion,\n dbConnectorStatus: {\n dsType,\n dsName\n }\n }\n ```\n */\n testDataSource() {\n let zabbixVersion;\n let dbConnectorStatus;\n return this.getVersion()\n .then(version => {\n zabbixVersion = version;\n return this.login();\n })\n .then(() => {\n if (this.enableDirectDBConnection) {\n return this.dbConnector.testDataSource();\n } else {\n return Promise.resolve();\n }\n })\n .catch(error => {\n if (error instanceof ZabbixNotImplemented) {\n return Promise.resolve();\n }\n return Promise.reject(error);\n })\n .then(testResult => {\n if (testResult) {\n dbConnectorStatus = {\n dsType: this.dbConnector.datasourceTypeName,\n dsName: this.dbConnector.datasourceName\n };\n }\n return { zabbixVersion, dbConnectorStatus };\n });\n }\n\n getItemsFromTarget(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n let filters = _.map(parts, p => target[p].filter);\n return this.getItems(...filters, options);\n }\n\n getHostsFromTarget(target) {\n let parts = ['group', 'host', 'application'];\n let filters = _.map(parts, p => target[p].filter);\n return Promise.all([\n this.getHosts(...filters),\n this.getApps(...filters),\n ]).then((results) => {\n let [hosts, apps] = results;\n if (apps.appFilterEmpty) {\n apps = [];\n }\n return [hosts, apps];\n });\n }\n\n getAllGroups() {\n return this.zabbixAPI.getGroups();\n }\n\n getGroups(groupFilter) {\n return this.getAllGroups()\n .then(groups => findByFilter(groups, groupFilter));\n }\n\n /**\n * Get list of host belonging to given groups.\n */\n getAllHosts(groupFilter) {\n return this.getGroups(groupFilter)\n .then(groups => {\n let groupids = _.map(groups, 'groupid');\n return this.zabbixAPI.getHosts(groupids);\n });\n }\n\n getHosts(groupFilter, hostFilter) {\n return this.getAllHosts(groupFilter)\n .then(hosts => findByFilter(hosts, hostFilter));\n }\n\n /**\n * Get list of applications belonging to given groups and hosts.\n */\n getAllApps(groupFilter, hostFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n return this.zabbixAPI.getApps(hostids);\n });\n }\n\n getApps(groupFilter, hostFilter, appFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n if (appFilter) {\n return this.zabbixAPI.getApps(hostids)\n .then(apps => filterByQuery(apps, appFilter));\n } else {\n return {\n appFilterEmpty: true,\n hostids: hostids\n };\n }\n });\n }\n\n getAllItems(groupFilter, hostFilter, appFilter, options = {}) {\n return this.getApps(groupFilter, hostFilter, appFilter)\n .then(apps => {\n if (apps.appFilterEmpty) {\n return this.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype);\n } else {\n let appids = _.map(apps, 'applicationid');\n return this.zabbixAPI.getItems(undefined, appids, options.itemtype);\n }\n })\n .then(items => {\n if (!options.showDisabledItems) {\n items = _.filter(items, {'status': '0'});\n }\n\n return items;\n })\n .then(this.expandUserMacro.bind(this));\n }\n\n expandUserMacro(items) {\n let hostids = getHostIds(items);\n return this.getMacros(hostids)\n .then(macros => {\n _.forEach(items, item => {\n if (utils.containsMacro(item.name)) {\n item.name = utils.replaceMacro(item, macros);\n }\n });\n return items;\n });\n }\n\n getItems(groupFilter, hostFilter, appFilter, itemFilter, options = {}) {\n return this.getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => filterByQuery(items, itemFilter));\n }\n\n getITServices(itServiceFilter) {\n return this.zabbixAPI.getITService()\n .then(itServices => findByFilter(itServices, itServiceFilter));\n }\n\n /**\n * Build query - convert target filters to array of Zabbix items\n */\n getTriggers(groupFilter, hostFilter, appFilter, options) {\n let promises = [\n this.getGroups(groupFilter),\n this.getHosts(groupFilter, hostFilter),\n this.getApps(groupFilter, hostFilter, appFilter)\n ];\n\n return Promise.all(promises)\n .then(results => {\n let filteredGroups = results[0];\n let filteredHosts = results[1];\n let filteredApps = results[2];\n let query = {};\n\n if (appFilter) {\n query.applicationids = _.flatten(_.map(filteredApps, 'applicationid'));\n }\n if (hostFilter) {\n query.hostids = _.map(filteredHosts, 'hostid');\n }\n if (groupFilter) {\n query.groupids = _.map(filteredGroups, 'groupid');\n }\n\n return query;\n }).then(query => {\n return this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options);\n });\n }\n\n getHistoryTS(items, timeRange, options) {\n let [timeFrom, timeTo] = timeRange;\n if (this.enableDirectDBConnection) {\n return this.getHistoryDB(items, timeFrom, timeTo, options)\n .then(history => this.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n return this.zabbixAPI.getHistory(items, timeFrom, timeTo)\n .then(history => responseHandler.handleHistory(history, items));\n }\n }\n\n getTrends(items, timeRange, options) {\n let [timeFrom, timeTo] = timeRange;\n if (this.enableDirectDBConnection) {\n return this.getTrendsDB(items, timeFrom, timeTo, options)\n .then(history => this.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n let valueType = options.consolidateBy || options.valueType;\n return this.zabbixAPI.getTrend(items, timeFrom, timeTo)\n .then(history => responseHandler.handleTrends(history, items, valueType))\n .then(responseHandler.sortTimeseries); // Sort trend data, issue #202\n }\n }\n\n getHistoryText(items, timeRange, target) {\n let [timeFrom, timeTo] = timeRange;\n if (items.length) {\n return this.zabbixAPI.getHistory(items, timeFrom, timeTo)\n .then(history => {\n if (target.resultFormat === 'table') {\n return responseHandler.handleHistoryAsTable(history, items, target);\n } else {\n return responseHandler.handleText(history, items, target);\n }\n });\n } else {\n return Promise.resolve([]);\n }\n }\n\n getSLA(itservices, timeRange, target, options) {\n let itServices = itservices;\n if (options.isOldVersion) {\n itServices = _.filter(itServices, {'serviceid': target.itservice.serviceid});\n }\n let itServiceIds = _.map(itServices, 'serviceid');\n return this.zabbixAPI.getSLA(itServiceIds, timeRange)\n .then(slaResponse => {\n return _.map(itServiceIds, serviceid => {\n let itservice = _.find(itServices, {'serviceid': serviceid});\n return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse);\n });\n });\n }\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Find group, host, app or item by given name.\n * @param list list of groups, apps or other\n * @param name visible name\n * @return array with finded element or empty array\n */\nfunction findByName(list, name) {\n var finded = _.find(list, {'name': name});\n if (finded) {\n return [finded];\n } else {\n return [];\n }\n}\n\n/**\n * Different hosts can contains applications and items with same name.\n * For this reason use _.filter, which return all elements instead _.find,\n * which return only first finded.\n * @param {[type]} list list of elements\n * @param {[type]} name app name\n * @return {[type]} array with finded element or empty array\n */\nfunction filterByName(list, name) {\n var finded = _.filter(list, {'name': name});\n if (finded) {\n return finded;\n } else {\n return [];\n }\n}\n\nfunction filterByRegex(list, regex) {\n var filterPattern = utils.buildRegex(regex);\n return _.filter(list, function (zbx_obj) {\n return filterPattern.test(zbx_obj.name);\n });\n}\n\nfunction findByFilter(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return findByName(list, filter);\n }\n}\n\nfunction filterByQuery(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return filterByName(list, filter);\n }\n}\n\nfunction getHostIds(items) {\n let hostIds = _.map(items, item => {\n return _.map(item.hosts, 'hostid');\n });\n return _.uniq(_.flatten(hostIds));\n}\n"]} \ No newline at end of file diff --git a/dist/panel-triggers/triggers_panel_ctrl.js.map b/dist/panel-triggers/triggers_panel_ctrl.js.map index 5fea90a..b2fccfc 100644 --- a/dist/panel-triggers/triggers_panel_ctrl.js.map +++ b/dist/panel-triggers/triggers_panel_ctrl.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/panel-triggers/triggers_panel_ctrl.js"],"names":["filterTriggers","triggers","triggerFilter","utils","isRegex","_","filter","trigger","buildRegex","test","description","$","moment","PanelCtrl","triggerPanelOptionsTab","triggerPanelTriggersTab","migratePanelSchema","CURRENT_SCHEMA_VERSION","ZABBIX_DS_ID","DEFAULT_TARGET","group","host","application","tags","DEFAULT_SEVERITY","priority","severity","color","show","DEFAULT_TIME_FORMAT","PANEL_DEFAULTS","schemaVersion","datasources","targets","hostField","hostTechNameField","hostGroups","showTags","statusField","severityField","descriptionField","descriptionAtNewLine","hostsInMaintenance","showTriggers","sortTriggersBy","text","value","showEvents","limit","fontSize","pageSize","highlightBackground","highlightNewEvents","highlightNewerThan","customLastChangeFormat","lastChangeFormat","triggerSeverity","okEventColor","ackEventColor","triggerStatusMap","TriggerPanelCtrl","$scope","$injector","$timeout","datasourceSrv","templateSrv","contextSrv","dashboardSrv","scope","editorTabIndex","defaultTimeFormat","pageIndex","triggerList","currentTriggersPage","panel","defaultsDeep","cloneDeep","available_datasources","map","getZabbixDataSources","length","push","isEmpty","initDatasources","events","on","onInitEditMode","bind","onRefresh","promises","ds","get","then","datasource","Promise","all","getMetricSources","meta","id","addEditorTab","timing","queryStart","Date","getTime","queryEnd","otherPanelInFullscreenMode","error","loading","setTimeQueryStart","getTriggers","setTimeQueryEnd","render","zabbixTriggers","catch","err","cancelled","console","log","message","data","emit","triggerListUnfiltered","formatTrigger","filterTriggersPost","sortTriggers","slice","getCurrentTriggersPage","zabbix","groupFilter","replaceTemplateVars","hostFilter","appFilter","triggersOptions","getAcknowledges","setMaintenanceStatus","filterTriggersPre","addTriggerDataSource","flatten","results","eventids","lastEvent","eventid","each","event","find","acknowledges","formatAcknowledge","ack","timestamp","unix","clock","time","format","user","alias","name","surname","fullName","target","tagsFilter","replace","parseTags","every","tag","maintenance","maintenance_status","some","hosts","orderBy","zabbixTrigger","triggerObj","hostTechName","comments","lastchangeUnix","Number","lastchange","setTriggerLastChange","setTriggerSeverity","markAckEvents","age","fromNow","tagStr","split","trim","tagParts","join","tagFilter","targetTags","newTag","uniqWith","isEqual","newFilter","tagsToString","refresh","showComment","grafana_user","ack_message","userIsEditor","isEditor","isGrafanaAdmin","disableReadOnlyUsersAck","reject","zabbixAPI","acknowledgeEvent","startPos","endPos","Math","min","groupNames","groups","iconClass","isNewTrigger","statusClass","mainColor","secondColor","lightTheme","highlightIntervalMs","parseInterval","durationSec","now","e","elem","attrs","ctrl","pageCount","$watchGroup","renderPanel","switchPage","renderData","getContentHeight","panelHeight","height","el","currentTarget","parseInt","$apply","appendPaginationControls","footerElem","empty","ceil","startPage","max","endPage","paginationList","i","activeClass","pageLinkElem","append","setFontSize","triggerCardElem","css","rootElem","renderingCompleted","unbindDestroy","$on","off","templateUrl"],"mappings":"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","file":"triggers_panel_ctrl.js","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport * as utils from '../datasource-zabbix/utils';\nimport {PanelCtrl} from 'app/plugins/sdk';\nimport {triggerPanelOptionsTab} from './options_tab';\nimport {triggerPanelTriggersTab} from './triggers_tab';\nimport {migratePanelSchema, CURRENT_SCHEMA_VERSION} from './migrations';\n\nconst ZABBIX_DS_ID = 'alexanderzobnin-zabbix-datasource';\n\nexport const DEFAULT_TARGET = {\n group: {filter: \"\"},\n host: {filter: \"\"},\n application: {filter: \"\"},\n trigger: {filter: \"\"},\n tags: {filter: \"\"},\n};\n\nexport const DEFAULT_SEVERITY = [\n { priority: 0, severity: 'Not classified', color: 'rgb(108, 108, 108)', show: true},\n { priority: 1, severity: 'Information', color: 'rgb(120, 158, 183)', show: true},\n { priority: 2, severity: 'Warning', color: 'rgb(175, 180, 36)', show: true},\n { priority: 3, severity: 'Average', color: 'rgb(255, 137, 30)', show: true},\n { priority: 4, severity: 'High', color: 'rgb(255, 101, 72)', show: true},\n { priority: 5, severity: 'Disaster', color: 'rgb(215, 0, 0)', show: true},\n];\n\nconst DEFAULT_TIME_FORMAT = \"DD MMM YYYY HH:mm:ss\";\n\nexport const PANEL_DEFAULTS = {\n schemaVersion: CURRENT_SCHEMA_VERSION,\n datasources: [],\n targets: {},\n // Fields\n hostField: true,\n hostTechNameField: false,\n hostGroups: false,\n showTags: true,\n statusField: true,\n severityField: true,\n descriptionField: true,\n descriptionAtNewLine: false,\n // Options\n hostsInMaintenance: true,\n showTriggers: 'all triggers',\n sortTriggersBy: { text: 'last change', value: 'lastchange' },\n showEvents: { text: 'Problems', value: '1' },\n limit: 100,\n // View options\n fontSize: '100%',\n pageSize: 10,\n highlightBackground: false,\n highlightNewEvents: false,\n highlightNewerThan: '1h',\n customLastChangeFormat: false,\n lastChangeFormat: \"\",\n // Triggers severity and colors\n triggerSeverity: DEFAULT_SEVERITY,\n okEventColor: 'rgb(56, 189, 113)',\n ackEventColor: 'rgb(56, 219, 156)'\n};\n\nconst triggerStatusMap = {\n '0': 'OK',\n '1': 'PROBLEM'\n};\n\nexport class TriggerPanelCtrl extends PanelCtrl {\n\n /** @ngInject */\n constructor($scope, $injector, $timeout, datasourceSrv, templateSrv, contextSrv, dashboardSrv) {\n super($scope, $injector);\n this.datasourceSrv = datasourceSrv;\n this.templateSrv = templateSrv;\n this.contextSrv = contextSrv;\n this.dashboardSrv = dashboardSrv;\n this.scope = $scope;\n this.$timeout = $timeout;\n\n this.editorTabIndex = 1;\n this.triggerStatusMap = triggerStatusMap;\n this.defaultTimeFormat = DEFAULT_TIME_FORMAT;\n this.pageIndex = 0;\n this.triggerList = [];\n this.currentTriggersPage = [];\n this.datasources = {};\n\n this.panel = migratePanelSchema(this.panel);\n _.defaultsDeep(this.panel, _.cloneDeep(PANEL_DEFAULTS));\n\n this.available_datasources = _.map(this.getZabbixDataSources(), 'name');\n if (this.panel.datasources.length === 0) {\n this.panel.datasources.push(this.available_datasources[0]);\n }\n if (_.isEmpty(this.panel.targets)) {\n this.panel.targets[this.panel.datasources[0]] = DEFAULT_TARGET;\n }\n\n this.initDatasources();\n this.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n this.events.on('refresh', this.onRefresh.bind(this));\n }\n\n initDatasources() {\n let promises = _.map(this.panel.datasources, (ds) => {\n // Load datasource\n return this.datasourceSrv.get(ds)\n .then(datasource => {\n this.datasources[ds] = datasource;\n return datasource;\n });\n });\n return Promise.all(promises);\n }\n\n getZabbixDataSources() {\n return _.filter(this.datasourceSrv.getMetricSources(), datasource => {\n return datasource.meta.id === ZABBIX_DS_ID && datasource.value;\n });\n }\n\n onInitEditMode() {\n this.addEditorTab('Triggers', triggerPanelTriggersTab, 1);\n this.addEditorTab('Options', triggerPanelOptionsTab, 2);\n }\n\n setTimeQueryStart() {\n this.timing.queryStart = new Date().getTime();\n }\n\n setTimeQueryEnd() {\n this.timing.queryEnd = new Date().getTime();\n }\n\n onRefresh() {\n // ignore fetching data if another panel is in fullscreen\n if (this.otherPanelInFullscreenMode()) { return; }\n\n // clear loading/error state\n delete this.error;\n this.loading = true;\n this.setTimeQueryStart();\n this.pageIndex = 0;\n\n return this.getTriggers()\n .then(zabbixTriggers => {\n // Notify panel that request is finished\n this.loading = false;\n this.setTimeQueryEnd();\n\n this.render(zabbixTriggers);\n })\n .catch(err => {\n // if cancelled keep loading set to true\n if (err.cancelled) {\n console.log('Panel request cancelled', err);\n return;\n }\n\n this.loading = false;\n this.error = err.message || \"Request Error\";\n\n if (err.data) {\n if (err.data.message) {\n this.error = err.data.message;\n }\n if (err.data.error) {\n this.error = err.data.error;\n }\n }\n\n this.events.emit('data-error', err);\n console.log('Panel data error:', err);\n });\n }\n\n render(zabbixTriggers) {\n let triggers = _.cloneDeep(zabbixTriggers || this.triggerListUnfiltered);\n this.triggerListUnfiltered = _.cloneDeep(triggers);\n\n triggers = _.map(triggers, this.formatTrigger.bind(this));\n triggers = this.filterTriggersPost(triggers);\n triggers = this.sortTriggers(triggers);\n\n // Limit triggers number\n triggers = triggers.slice(0, this.panel.limit || PANEL_DEFAULTS.limit);\n\n this.triggerList = triggers;\n this.getCurrentTriggersPage();\n\n this.$timeout(() => {\n super.render(this.triggerList);\n });\n }\n\n getTriggers() {\n let promises = _.map(this.panel.datasources, (ds) => {\n return this.datasourceSrv.get(ds)\n .then(datasource => {\n var zabbix = datasource.zabbix;\n var showEvents = this.panel.showEvents.value;\n var triggerFilter = this.panel.targets[ds];\n\n // Replace template variables\n var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);\n var hostFilter = datasource.replaceTemplateVars(triggerFilter.host.filter);\n var appFilter = datasource.replaceTemplateVars(triggerFilter.application.filter);\n\n let triggersOptions = {\n showTriggers: showEvents\n };\n\n return zabbix.getTriggers(groupFilter, hostFilter, appFilter, triggersOptions);\n }).then((triggers) => {\n return this.getAcknowledges(triggers, ds);\n }).then((triggers) => {\n return this.setMaintenanceStatus(triggers);\n }).then((triggers) => {\n return this.filterTriggersPre(triggers, ds);\n }).then((triggers) => {\n return this.addTriggerDataSource(triggers, ds);\n });\n });\n\n return Promise.all(promises)\n .then(results => _.flatten(results));\n }\n\n getAcknowledges(triggerList, ds) {\n // Request acknowledges for trigger\n var eventids = _.map(triggerList, trigger => {\n return trigger.lastEvent.eventid;\n });\n\n return this.datasources[ds].zabbix.getAcknowledges(eventids)\n .then(events => {\n\n // Map events to triggers\n _.each(triggerList, trigger => {\n var event = _.find(events, event => {\n return event.eventid === trigger.lastEvent.eventid;\n });\n\n if (event) {\n trigger.acknowledges = _.map(event.acknowledges, this.formatAcknowledge.bind(this));\n }\n\n if (!trigger.lastEvent.eventid) {\n trigger.lastEvent = null;\n }\n });\n\n return triggerList;\n });\n }\n\n formatAcknowledge(ack) {\n let timestamp = moment.unix(ack.clock);\n if (this.panel.customLastChangeFormat) {\n ack.time = timestamp.format(this.panel.lastChangeFormat);\n } else {\n ack.time = timestamp.format(this.defaultTimeFormat);\n }\n ack.user = ack.alias || '';\n if (ack.name || ack.surname) {\n const fullName = `${ack.name || ''} ${ack.surname || ''}`;\n ack.user += ` (${fullName})`;\n }\n return ack;\n }\n\n filterTriggersPre(triggerList, ds) {\n // Filter triggers by description\n let triggerFilter = this.panel.targets[ds].trigger.filter;\n triggerFilter = this.datasources[ds].replaceTemplateVars(triggerFilter);\n if (triggerFilter) {\n triggerList = filterTriggers(triggerList, triggerFilter);\n }\n\n // Filter by tags\n const target = this.panel.targets[ds];\n if (target.tags.filter) {\n let tagsFilter = this.datasources[ds].replaceTemplateVars(target.tags.filter);\n // replaceTemplateVars() builds regex-like string, so we should trim it.\n tagsFilter = tagsFilter.replace('/^', '').replace('$/', '');\n const tags = this.parseTags(tagsFilter);\n triggerList = _.filter(triggerList, trigger => {\n return _.every(tags, (tag) => {\n return _.find(trigger.tags, {tag: tag.tag, value: tag.value});\n });\n });\n }\n\n return triggerList;\n }\n\n filterTriggersPost(triggers) {\n let triggerList = _.cloneDeep(triggers);\n\n // Filter acknowledged triggers\n if (this.panel.showTriggers === 'unacknowledged') {\n triggerList = _.filter(triggerList, trigger => {\n return !trigger.acknowledges;\n });\n } else if (this.panel.showTriggers === 'acknowledged') {\n triggerList = _.filter(triggerList, 'acknowledges');\n } else {\n triggerList = triggerList;\n }\n\n // Filter by maintenance status\n if (!this.panel.hostsInMaintenance) {\n triggerList = _.filter(triggerList, (trigger) => trigger.maintenance === false);\n }\n\n // Filter triggers by severity\n triggerList = _.filter(triggerList, trigger => {\n return this.panel.triggerSeverity[trigger.priority].show;\n });\n\n return triggerList;\n }\n\n setMaintenanceStatus(triggers) {\n _.each(triggers, (trigger) => {\n let maintenance_status = _.some(trigger.hosts, (host) => host.maintenance_status === '1');\n trigger.maintenance = maintenance_status;\n });\n return triggers;\n }\n\n addTriggerDataSource(triggers, ds) {\n _.each(triggers, (trigger) => {\n trigger.datasource = ds;\n });\n return triggers;\n }\n\n sortTriggers(triggerList) {\n if (this.panel.sortTriggersBy.value === 'priority') {\n triggerList = _.orderBy(triggerList, ['priority', 'lastchangeUnix', 'triggerid'], ['desc', 'desc', 'desc']);\n } else {\n triggerList = _.orderBy(triggerList, ['lastchangeUnix', 'priority', 'triggerid'], ['desc', 'desc', 'desc']);\n }\n return triggerList;\n }\n\n formatTrigger(zabbixTrigger) {\n let trigger = _.cloneDeep(zabbixTrigger);\n let triggerObj = trigger;\n\n // Set host that the trigger belongs\n if (trigger.hosts && trigger.hosts.length) {\n triggerObj.host = trigger.hosts[0].name;\n triggerObj.hostTechName = trigger.hosts[0].host;\n }\n\n // Set tags if present\n if (trigger.tags && trigger.tags.length === 0) {\n trigger.tags = null;\n }\n\n // Handle multi-line description\n if (trigger.comments) {\n trigger.comments = trigger.comments.replace('\\n', '
');\n }\n\n // Format last change and age\n trigger.lastchangeUnix = Number(trigger.lastchange);\n triggerObj = this.setTriggerLastChange(triggerObj);\n triggerObj = this.setTriggerSeverity(triggerObj);\n return triggerObj;\n }\n\n updateTriggerFormat(trigger) {\n trigger = this.setTriggerLastChange(trigger);\n trigger = this.setTriggerSeverity(trigger);\n return trigger;\n }\n\n setTriggerSeverity(trigger) {\n if (trigger.value === '1') {\n // Problem state\n trigger.color = this.panel.triggerSeverity[trigger.priority].color;\n } else {\n // OK state\n trigger.color = this.panel.okEventColor;\n }\n trigger.severity = this.panel.triggerSeverity[trigger.priority].severity;\n\n // Mark acknowledged triggers with different color\n if (this.panel.markAckEvents && trigger.acknowledges && trigger.acknowledges.length) {\n trigger.color = this.panel.ackEventColor;\n }\n\n return trigger;\n }\n\n setTriggerLastChange(trigger) {\n if (!trigger.lastchangeUnix) {\n trigger.lastchange = \"\";\n trigger.age = \"\";\n return trigger;\n }\n\n let timestamp = moment.unix(trigger.lastchangeUnix);\n if (this.panel.customLastChangeFormat) {\n // User defined format\n trigger.lastchange = timestamp.format(this.panel.lastChangeFormat);\n } else {\n trigger.lastchange = timestamp.format(this.defaultTimeFormat);\n }\n trigger.age = timestamp.fromNow(true);\n return trigger;\n }\n\n parseTags(tagStr) {\n if (!tagStr) {\n return [];\n }\n\n let tags = _.map(tagStr.split(','), (tag) => tag.trim());\n tags = _.map(tags, (tag) => {\n const tagParts = tag.split(':');\n return {tag: tagParts[0].trim(), value: tagParts[1].trim()};\n });\n return tags;\n }\n\n tagsToString(tags) {\n return _.map(tags, (tag) => `${tag.tag}:${tag.value}`).join(', ');\n }\n\n addTagFilter(tag, ds) {\n let tagFilter = this.panel.targets[ds].tags.filter;\n let targetTags = this.parseTags(tagFilter);\n let newTag = {tag: tag.tag, value: tag.value};\n targetTags.push(newTag);\n targetTags = _.uniqWith(targetTags, _.isEqual);\n let newFilter = this.tagsToString(targetTags);\n this.panel.targets[ds].tags.filter = newFilter;\n this.refresh();\n }\n\n switchComment(trigger) {\n trigger.showComment = !trigger.showComment;\n }\n\n acknowledgeTrigger(trigger, message) {\n let eventid = trigger.lastEvent ? trigger.lastEvent.eventid : null;\n let grafana_user = this.contextSrv.user.name;\n let ack_message = grafana_user + ' (Grafana): ' + message;\n return this.datasourceSrv.get(trigger.datasource)\n .then(datasource => {\n const userIsEditor = this.contextSrv.isEditor || this.contextSrv.isGrafanaAdmin;\n if (datasource.disableReadOnlyUsersAck && !userIsEditor) {\n return Promise.reject({message: 'You have no permissions to acknowledge events.'});\n }\n if (eventid) {\n return datasource.zabbix.zabbixAPI.acknowledgeEvent(eventid, ack_message);\n } else {\n return Promise.reject({message: 'Trigger has no events. Nothing to acknowledge.'});\n }\n })\n .then(this.onRefresh.bind(this))\n .catch((err) => {\n this.error = err.message || \"Acknowledge Error\";\n this.events.emit('data-error', err);\n console.log('Panel data error:', err);\n });\n }\n\n getCurrentTriggersPage() {\n let pageSize = this.panel.pageSize || PANEL_DEFAULTS.pageSize;\n let startPos = this.pageIndex * pageSize;\n let endPos = Math.min(startPos + pageSize, this.triggerList.length);\n this.currentTriggersPage = this.triggerList.slice(startPos, endPos);\n return this.currentTriggersPage;\n }\n\n formatHostName(trigger) {\n let host = \"\";\n if (this.panel.hostField && this.panel.hostTechNameField) {\n host = `${trigger.host} (${trigger.hostTechName})`;\n } else if (this.panel.hostField || this.panel.hostTechNameField) {\n host = this.panel.hostField ? trigger.host : trigger.hostTechName;\n }\n\n return host;\n }\n\n formatHostGroups(trigger) {\n let groupNames = \"\";\n if (this.panel.hostGroups) {\n let groups = _.map(trigger.groups, 'name').join(', ');\n groupNames += `[ ${groups} ]`;\n }\n\n return groupNames;\n }\n\n getAlertIconClass(trigger) {\n let iconClass = '';\n if (trigger.value === '1') {\n if (trigger.priority >= 3) {\n iconClass = 'icon-gf-critical';\n } else {\n iconClass = 'icon-gf-warning';\n }\n } else {\n iconClass = 'icon-gf-online';\n }\n\n if (this.panel.highlightNewEvents && this.isNewTrigger(trigger)) {\n iconClass += ' zabbix-trigger--blinked';\n }\n return iconClass;\n }\n\n getAlertIconClassBySeverity(triggerSeverity) {\n let iconClass = 'icon-gf-warning';\n if (triggerSeverity.priority >= 3) {\n iconClass = 'icon-gf-critical';\n }\n return iconClass;\n }\n\n getAlertStateClass(trigger) {\n let statusClass = '';\n\n if (trigger.value === '1') {\n statusClass = 'alert-state-critical';\n } else {\n statusClass = 'alert-state-ok';\n }\n\n if (this.panel.highlightNewEvents && this.isNewTrigger(trigger)) {\n statusClass += ' zabbix-trigger--blinked';\n }\n\n return statusClass;\n }\n\n getBackground(trigger) {\n const mainColor = trigger.color;\n const secondColor = this.contextSrv.user.lightTheme ? '#dde4ed' : '#262628';\n if (this.contextSrv.user.lightTheme) {\n return `linear-gradient(135deg, ${secondColor}, ${mainColor})`;\n }\n return `linear-gradient(135deg, ${mainColor}, ${secondColor})`;\n }\n\n isNewTrigger(trigger) {\n try {\n const highlightIntervalMs = utils.parseInterval(this.panel.highlightNewerThan || PANEL_DEFAULTS.highlightNewerThan);\n const durationSec = (Date.now() - trigger.lastchangeUnix * 1000);\n return durationSec < highlightIntervalMs;\n } catch (e) {\n return false;\n }\n }\n\n link(scope, elem, attrs, ctrl) {\n let panel = ctrl.panel;\n let pageCount = 0;\n let triggerList = ctrl.triggerList;\n\n scope.$watchGroup(['ctrl.currentTriggersPage', 'ctrl.triggerList'], renderPanel);\n elem.on('click', '.triggers-panel-page-link', switchPage);\n ctrl.events.on('render', (renderData) => {\n triggerList = renderData || triggerList;\n renderPanel();\n });\n\n function getContentHeight() {\n let panelHeight = ctrl.height;\n if (pageCount > 1) {\n panelHeight -= 36;\n }\n return panelHeight + 'px';\n }\n\n function switchPage(e) {\n let el = $(e.currentTarget);\n ctrl.pageIndex = (parseInt(el.text(), 10)-1);\n\n let pageSize = panel.pageSize || 10;\n let startPos = ctrl.pageIndex * pageSize;\n let endPos = Math.min(startPos + pageSize, triggerList.length);\n ctrl.currentTriggersPage = triggerList.slice(startPos, endPos);\n\n scope.$apply(() => {\n renderPanel();\n });\n }\n\n function appendPaginationControls(footerElem) {\n footerElem.empty();\n\n let pageSize = panel.pageSize || 5;\n pageCount = Math.ceil(triggerList.length / pageSize);\n if (pageCount === 1) {\n return;\n }\n\n let startPage = Math.max(ctrl.pageIndex - 3, 0);\n let endPage = Math.min(pageCount, startPage + 9);\n\n let paginationList = $('
    ');\n\n for (let i = startPage; i < endPage; i++) {\n let activeClass = i === ctrl.pageIndex ? 'active' : '';\n let pageLinkElem = $('
  • ' + (i+1) + '
  • ');\n paginationList.append(pageLinkElem);\n }\n\n footerElem.append(paginationList);\n }\n\n function setFontSize() {\n const fontSize = parseInt(panel.fontSize.slice(0, panel.fontSize.length - 1));\n let triggerCardElem = elem.find('.alert-rule-item');\n if (fontSize && fontSize !== 100) {\n triggerCardElem.find('.alert-rule-item__icon').css({\n 'font-size': fontSize + '%',\n 'margin': fontSize / 100 * 6 + 'px'\n });\n triggerCardElem.find('.alert-rule-item__name').css({'font-size': fontSize + '%'});\n triggerCardElem.find('.alert-rule-item__text').css({'font-size': fontSize * 0.8 + '%'});\n triggerCardElem.find('.zbx-trigger-lastchange').css({'font-size': fontSize * 0.8 + '%'});\n triggerCardElem.find('.zbx-tag').css({'font-size': fontSize * 0.6 + '%'});\n triggerCardElem.find('.zbx-tag').css({'line-height': fontSize / 100 * 16 + 'px'});\n } else {\n // remove css\n triggerCardElem.find('.alert-rule-item__icon').css({'font-size': '', 'margin-right': ''});\n triggerCardElem.find('.alert-rule-item__name').css({'font-size': ''});\n triggerCardElem.find('.alert-rule-item__text').css({'font-size': ''});\n triggerCardElem.find('.zbx-trigger-lastchange').css({'font-size': ''});\n triggerCardElem.find('.zbx-tag').css({'font-size': ''});\n triggerCardElem.find('.zbx-tag').css({'line-height': ''});\n }\n }\n\n function renderPanel() {\n let rootElem = elem.find('.triggers-panel-scroll');\n let footerElem = elem.find('.triggers-panel-footer');\n appendPaginationControls(footerElem);\n rootElem.css({'max-height': getContentHeight()});\n rootElem.css({'height': getContentHeight()});\n setFontSize();\n ctrl.renderingCompleted();\n }\n\n let unbindDestroy = scope.$on('$destroy', function() {\n elem.off('click', '.triggers-panel-page-link');\n unbindDestroy();\n });\n }\n}\n\nTriggerPanelCtrl.templateUrl = 'public/plugins/alexanderzobnin-zabbix-app/panel-triggers/partials/module.html';\n\nfunction filterTriggers(triggers, triggerFilter) {\n if (utils.isRegex(triggerFilter)) {\n return _.filter(triggers, function(trigger) {\n return utils.buildRegex(triggerFilter).test(trigger.description);\n });\n } else {\n return _.filter(triggers, function(trigger) {\n return trigger.description === triggerFilter;\n });\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/panel-triggers/triggers_panel_ctrl.js"],"names":["filterTriggers","triggers","triggerFilter","utils","isRegex","_","filter","trigger","buildRegex","test","description","$","moment","PanelCtrl","triggerPanelOptionsTab","triggerPanelTriggersTab","migratePanelSchema","CURRENT_SCHEMA_VERSION","ZABBIX_DS_ID","DEFAULT_TARGET","group","host","application","tags","DEFAULT_SEVERITY","priority","severity","color","show","DEFAULT_TIME_FORMAT","PANEL_DEFAULTS","schemaVersion","datasources","targets","hostField","hostTechNameField","hostGroups","showTags","statusField","severityField","descriptionField","descriptionAtNewLine","hostsInMaintenance","showTriggers","sortTriggersBy","text","value","showEvents","limit","fontSize","pageSize","highlightBackground","highlightNewEvents","highlightNewerThan","customLastChangeFormat","lastChangeFormat","triggerSeverity","okEventColor","ackEventColor","triggerStatusMap","TriggerPanelCtrl","$scope","$injector","$timeout","datasourceSrv","templateSrv","contextSrv","dashboardSrv","scope","editorTabIndex","defaultTimeFormat","pageIndex","triggerList","currentTriggersPage","panel","defaultsDeep","cloneDeep","available_datasources","map","getZabbixDataSources","length","push","isEmpty","initDatasources","events","on","onInitEditMode","bind","onRefresh","promises","ds","get","then","datasource","Promise","all","getMetricSources","meta","id","addEditorTab","timing","queryStart","Date","getTime","queryEnd","otherPanelInFullscreenMode","error","loading","setTimeQueryStart","getTriggers","setTimeQueryEnd","render","zabbixTriggers","catch","err","cancelled","console","log","message","data","emit","triggerListUnfiltered","formatTrigger","filterTriggersPost","sortTriggers","slice","getCurrentTriggersPage","zabbix","groupFilter","replaceTemplateVars","hostFilter","appFilter","triggersOptions","getAcknowledges","setMaintenanceStatus","filterTriggersPre","addTriggerDataSource","flatten","results","eventids","lastEvent","eventid","each","event","find","acknowledges","formatAcknowledge","ack","timestamp","unix","clock","time","format","user","alias","name","surname","fullName","target","tagsFilter","replace","parseTags","every","tag","maintenance","maintenance_status","some","hosts","orderBy","zabbixTrigger","triggerObj","hostTechName","comments","lastchangeUnix","Number","lastchange","setTriggerLastChange","setTriggerSeverity","markAckEvents","age","fromNow","tagStr","split","trim","tagParts","join","tagFilter","targetTags","newTag","uniqWith","isEqual","newFilter","tagsToString","refresh","showComment","grafana_user","ack_message","userIsEditor","isEditor","isGrafanaAdmin","disableReadOnlyUsersAck","reject","zabbixAPI","acknowledgeEvent","startPos","endPos","Math","min","groupNames","groups","iconClass","isNewTrigger","statusClass","mainColor","secondColor","lightTheme","highlightIntervalMs","parseInterval","durationSec","now","e","elem","attrs","ctrl","pageCount","$watchGroup","renderPanel","switchPage","renderData","getContentHeight","panelHeight","height","el","currentTarget","parseInt","$apply","appendPaginationControls","footerElem","empty","ceil","startPage","max","endPage","paginationList","i","activeClass","pageLinkElem","append","setFontSize","triggerCardElem","css","rootElem","renderingCompleted","unbindDestroy","$on","off","templateUrl"],"mappings":"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","file":"triggers_panel_ctrl.js","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport * as utils from '../datasource-zabbix/utils';\nimport {PanelCtrl} from 'app/plugins/sdk';\nimport {triggerPanelOptionsTab} from './options_tab';\nimport {triggerPanelTriggersTab} from './triggers_tab';\nimport {migratePanelSchema, CURRENT_SCHEMA_VERSION} from './migrations';\n\nconst ZABBIX_DS_ID = 'alexanderzobnin-zabbix-datasource';\n\nexport const DEFAULT_TARGET = {\n group: {filter: \"\"},\n host: {filter: \"\"},\n application: {filter: \"\"},\n trigger: {filter: \"\"},\n tags: {filter: \"\"},\n};\n\nexport const DEFAULT_SEVERITY = [\n { priority: 0, severity: 'Not classified', color: 'rgb(108, 108, 108)', show: true},\n { priority: 1, severity: 'Information', color: 'rgb(120, 158, 183)', show: true},\n { priority: 2, severity: 'Warning', color: 'rgb(175, 180, 36)', show: true},\n { priority: 3, severity: 'Average', color: 'rgb(255, 137, 30)', show: true},\n { priority: 4, severity: 'High', color: 'rgb(255, 101, 72)', show: true},\n { priority: 5, severity: 'Disaster', color: 'rgb(215, 0, 0)', show: true},\n];\n\nconst DEFAULT_TIME_FORMAT = \"DD MMM YYYY HH:mm:ss\";\n\nexport const PANEL_DEFAULTS = {\n schemaVersion: CURRENT_SCHEMA_VERSION,\n datasources: [],\n targets: {},\n // Fields\n hostField: true,\n hostTechNameField: false,\n hostGroups: false,\n showTags: true,\n statusField: true,\n severityField: true,\n descriptionField: true,\n descriptionAtNewLine: false,\n // Options\n hostsInMaintenance: true,\n showTriggers: 'all triggers',\n sortTriggersBy: { text: 'last change', value: 'lastchange' },\n showEvents: { text: 'Problems', value: '1' },\n limit: 100,\n // View options\n fontSize: '100%',\n pageSize: 10,\n highlightBackground: false,\n highlightNewEvents: false,\n highlightNewerThan: '1h',\n customLastChangeFormat: false,\n lastChangeFormat: \"\",\n // Triggers severity and colors\n triggerSeverity: DEFAULT_SEVERITY,\n okEventColor: 'rgb(56, 189, 113)',\n ackEventColor: 'rgb(56, 219, 156)'\n};\n\nconst triggerStatusMap = {\n '0': 'OK',\n '1': 'PROBLEM'\n};\n\nexport class TriggerPanelCtrl extends PanelCtrl {\n\n /** @ngInject */\n constructor($scope, $injector, $timeout, datasourceSrv, templateSrv, contextSrv, dashboardSrv) {\n super($scope, $injector);\n this.datasourceSrv = datasourceSrv;\n this.templateSrv = templateSrv;\n this.contextSrv = contextSrv;\n this.dashboardSrv = dashboardSrv;\n this.scope = $scope;\n this.$timeout = $timeout;\n\n this.editorTabIndex = 1;\n this.triggerStatusMap = triggerStatusMap;\n this.defaultTimeFormat = DEFAULT_TIME_FORMAT;\n this.pageIndex = 0;\n this.triggerList = [];\n this.currentTriggersPage = [];\n this.datasources = {};\n\n this.panel = migratePanelSchema(this.panel);\n _.defaultsDeep(this.panel, _.cloneDeep(PANEL_DEFAULTS));\n\n this.available_datasources = _.map(this.getZabbixDataSources(), 'name');\n if (this.panel.datasources.length === 0) {\n this.panel.datasources.push(this.available_datasources[0]);\n }\n if (_.isEmpty(this.panel.targets)) {\n this.panel.targets[this.panel.datasources[0]] = DEFAULT_TARGET;\n }\n\n this.initDatasources();\n this.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n this.events.on('refresh', this.onRefresh.bind(this));\n }\n\n initDatasources() {\n let promises = _.map(this.panel.datasources, (ds) => {\n // Load datasource\n return this.datasourceSrv.get(ds)\n .then(datasource => {\n this.datasources[ds] = datasource;\n return datasource;\n });\n });\n return Promise.all(promises);\n }\n\n getZabbixDataSources() {\n return _.filter(this.datasourceSrv.getMetricSources(), datasource => {\n return datasource.meta.id === ZABBIX_DS_ID && datasource.value;\n });\n }\n\n onInitEditMode() {\n this.addEditorTab('Triggers', triggerPanelTriggersTab, 1);\n this.addEditorTab('Options', triggerPanelOptionsTab, 2);\n }\n\n setTimeQueryStart() {\n this.timing.queryStart = new Date().getTime();\n }\n\n setTimeQueryEnd() {\n this.timing.queryEnd = new Date().getTime();\n }\n\n onRefresh() {\n // ignore fetching data if another panel is in fullscreen\n if (this.otherPanelInFullscreenMode()) { return; }\n\n // clear loading/error state\n delete this.error;\n this.loading = true;\n this.setTimeQueryStart();\n this.pageIndex = 0;\n\n return this.getTriggers()\n .then(zabbixTriggers => {\n // Notify panel that request is finished\n this.loading = false;\n this.setTimeQueryEnd();\n\n this.render(zabbixTriggers);\n })\n .catch(err => {\n // if cancelled keep loading set to true\n if (err.cancelled) {\n console.log('Panel request cancelled', err);\n return;\n }\n\n this.loading = false;\n this.error = err.message || \"Request Error\";\n\n if (err.data) {\n if (err.data.message) {\n this.error = err.data.message;\n }\n if (err.data.error) {\n this.error = err.data.error;\n }\n }\n\n this.events.emit('data-error', err);\n console.log('Panel data error:', err);\n });\n }\n\n render(zabbixTriggers) {\n let triggers = _.cloneDeep(zabbixTriggers || this.triggerListUnfiltered);\n this.triggerListUnfiltered = _.cloneDeep(triggers);\n\n triggers = _.map(triggers, this.formatTrigger.bind(this));\n triggers = this.filterTriggersPost(triggers);\n triggers = this.sortTriggers(triggers);\n\n // Limit triggers number\n triggers = triggers.slice(0, this.panel.limit || PANEL_DEFAULTS.limit);\n\n this.triggerList = triggers;\n this.getCurrentTriggersPage();\n\n this.$timeout(() => {\n super.render(this.triggerList);\n });\n }\n\n getTriggers() {\n let promises = _.map(this.panel.datasources, (ds) => {\n return this.datasourceSrv.get(ds)\n .then(datasource => {\n var zabbix = datasource.zabbix;\n var showEvents = this.panel.showEvents.value;\n var triggerFilter = this.panel.targets[ds];\n\n // Replace template variables\n var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);\n var hostFilter = datasource.replaceTemplateVars(triggerFilter.host.filter);\n var appFilter = datasource.replaceTemplateVars(triggerFilter.application.filter);\n\n let triggersOptions = {\n showTriggers: showEvents\n };\n\n return zabbix.getTriggers(groupFilter, hostFilter, appFilter, triggersOptions);\n }).then((triggers) => {\n return this.getAcknowledges(triggers, ds);\n }).then((triggers) => {\n return this.setMaintenanceStatus(triggers);\n }).then((triggers) => {\n return this.filterTriggersPre(triggers, ds);\n }).then((triggers) => {\n return this.addTriggerDataSource(triggers, ds);\n });\n });\n\n return Promise.all(promises)\n .then(results => _.flatten(results));\n }\n\n getAcknowledges(triggerList, ds) {\n // Request acknowledges for trigger\n var eventids = _.map(triggerList, trigger => {\n return trigger.lastEvent.eventid;\n });\n\n return this.datasources[ds].zabbix.getAcknowledges(eventids)\n .then(events => {\n\n // Map events to triggers\n _.each(triggerList, trigger => {\n var event = _.find(events, event => {\n return event.eventid === trigger.lastEvent.eventid;\n });\n\n if (event) {\n trigger.acknowledges = _.map(event.acknowledges, this.formatAcknowledge.bind(this));\n }\n\n if (!trigger.lastEvent.eventid) {\n trigger.lastEvent = null;\n }\n });\n\n return triggerList;\n });\n }\n\n formatAcknowledge(ack) {\n let timestamp = moment.unix(ack.clock);\n if (this.panel.customLastChangeFormat) {\n ack.time = timestamp.format(this.panel.lastChangeFormat);\n } else {\n ack.time = timestamp.format(this.defaultTimeFormat);\n }\n ack.user = ack.alias || '';\n if (ack.name || ack.surname) {\n const fullName = `${ack.name || ''} ${ack.surname || ''}`;\n ack.user += ` (${fullName})`;\n }\n return ack;\n }\n\n filterTriggersPre(triggerList, ds) {\n // Filter triggers by description\n let triggerFilter = this.panel.targets[ds].trigger.filter;\n triggerFilter = this.datasources[ds].replaceTemplateVars(triggerFilter);\n if (triggerFilter) {\n triggerList = filterTriggers(triggerList, triggerFilter);\n }\n\n // Filter by tags\n const target = this.panel.targets[ds];\n if (target.tags.filter) {\n let tagsFilter = this.datasources[ds].replaceTemplateVars(target.tags.filter);\n // replaceTemplateVars() builds regex-like string, so we should trim it.\n tagsFilter = tagsFilter.replace('/^', '').replace('$/', '');\n const tags = this.parseTags(tagsFilter);\n triggerList = _.filter(triggerList, trigger => {\n return _.every(tags, (tag) => {\n return _.find(trigger.tags, {tag: tag.tag, value: tag.value});\n });\n });\n }\n\n return triggerList;\n }\n\n filterTriggersPost(triggers) {\n let triggerList = _.cloneDeep(triggers);\n\n // Filter acknowledged triggers\n if (this.panel.showTriggers === 'unacknowledged') {\n triggerList = _.filter(triggerList, trigger => {\n return !trigger.acknowledges;\n });\n } else if (this.panel.showTriggers === 'acknowledged') {\n triggerList = _.filter(triggerList, 'acknowledges');\n } else {\n triggerList = triggerList;\n }\n\n // Filter by maintenance status\n if (!this.panel.hostsInMaintenance) {\n triggerList = _.filter(triggerList, (trigger) => trigger.maintenance === false);\n }\n\n // Filter triggers by severity\n triggerList = _.filter(triggerList, trigger => {\n return this.panel.triggerSeverity[trigger.priority].show;\n });\n\n return triggerList;\n }\n\n setMaintenanceStatus(triggers) {\n _.each(triggers, (trigger) => {\n let maintenance_status = _.some(trigger.hosts, (host) => host.maintenance_status === '1');\n trigger.maintenance = maintenance_status;\n });\n return triggers;\n }\n\n addTriggerDataSource(triggers, ds) {\n _.each(triggers, (trigger) => {\n trigger.datasource = ds;\n });\n return triggers;\n }\n\n sortTriggers(triggerList) {\n if (this.panel.sortTriggersBy.value === 'priority') {\n triggerList = _.orderBy(triggerList, ['priority', 'lastchangeUnix', 'triggerid'], ['desc', 'desc', 'desc']);\n } else {\n triggerList = _.orderBy(triggerList, ['lastchangeUnix', 'priority', 'triggerid'], ['desc', 'desc', 'desc']);\n }\n return triggerList;\n }\n\n formatTrigger(zabbixTrigger) {\n let trigger = _.cloneDeep(zabbixTrigger);\n let triggerObj = trigger;\n\n // Set host that the trigger belongs\n if (trigger.hosts && trigger.hosts.length) {\n triggerObj.host = trigger.hosts[0].name;\n triggerObj.hostTechName = trigger.hosts[0].host;\n }\n\n // Set tags if present\n if (trigger.tags && trigger.tags.length === 0) {\n trigger.tags = null;\n }\n\n // Handle multi-line description\n if (trigger.comments) {\n trigger.comments = trigger.comments.replace('\\n', '
    ');\n }\n\n // Format last change and age\n trigger.lastchangeUnix = Number(trigger.lastchange);\n triggerObj = this.setTriggerLastChange(triggerObj);\n triggerObj = this.setTriggerSeverity(triggerObj);\n return triggerObj;\n }\n\n updateTriggerFormat(trigger) {\n trigger = this.setTriggerLastChange(trigger);\n trigger = this.setTriggerSeverity(trigger);\n return trigger;\n }\n\n setTriggerSeverity(trigger) {\n if (trigger.value === '1') {\n // Problem state\n trigger.color = this.panel.triggerSeverity[trigger.priority].color;\n } else {\n // OK state\n trigger.color = this.panel.okEventColor;\n }\n trigger.severity = this.panel.triggerSeverity[trigger.priority].severity;\n\n // Mark acknowledged triggers with different color\n if (this.panel.markAckEvents && trigger.acknowledges && trigger.acknowledges.length) {\n trigger.color = this.panel.ackEventColor;\n }\n\n return trigger;\n }\n\n setTriggerLastChange(trigger) {\n if (!trigger.lastchangeUnix) {\n trigger.lastchange = \"\";\n trigger.age = \"\";\n return trigger;\n }\n\n let timestamp = moment.unix(trigger.lastchangeUnix);\n if (this.panel.customLastChangeFormat) {\n // User defined format\n trigger.lastchange = timestamp.format(this.panel.lastChangeFormat);\n } else {\n trigger.lastchange = timestamp.format(this.defaultTimeFormat);\n }\n trigger.age = timestamp.fromNow(true);\n return trigger;\n }\n\n parseTags(tagStr) {\n if (!tagStr) {\n return [];\n }\n\n let tags = _.map(tagStr.split(','), (tag) => tag.trim());\n tags = _.map(tags, (tag) => {\n const tagParts = tag.split(':');\n return {tag: tagParts[0].trim(), value: tagParts[1].trim()};\n });\n return tags;\n }\n\n tagsToString(tags) {\n return _.map(tags, (tag) => `${tag.tag}:${tag.value}`).join(', ');\n }\n\n addTagFilter(tag, ds) {\n let tagFilter = this.panel.targets[ds].tags.filter;\n let targetTags = this.parseTags(tagFilter);\n let newTag = {tag: tag.tag, value: tag.value};\n targetTags.push(newTag);\n targetTags = _.uniqWith(targetTags, _.isEqual);\n let newFilter = this.tagsToString(targetTags);\n this.panel.targets[ds].tags.filter = newFilter;\n this.refresh();\n }\n\n switchComment(trigger) {\n trigger.showComment = !trigger.showComment;\n }\n\n acknowledgeTrigger(trigger, message) {\n let eventid = trigger.lastEvent ? trigger.lastEvent.eventid : null;\n let grafana_user = this.contextSrv.user.name;\n let ack_message = grafana_user + ' (Grafana): ' + message;\n return this.datasourceSrv.get(trigger.datasource)\n .then(datasource => {\n const userIsEditor = this.contextSrv.isEditor || this.contextSrv.isGrafanaAdmin;\n if (datasource.disableReadOnlyUsersAck && !userIsEditor) {\n return Promise.reject({message: 'You have no permissions to acknowledge events.'});\n }\n if (eventid) {\n return datasource.zabbix.zabbixAPI.acknowledgeEvent(eventid, ack_message);\n } else {\n return Promise.reject({message: 'Trigger has no events. Nothing to acknowledge.'});\n }\n })\n .then(this.onRefresh.bind(this))\n .catch((err) => {\n this.error = err.message || \"Acknowledge Error\";\n this.events.emit('data-error', err);\n console.log('Panel data error:', err);\n });\n }\n\n getCurrentTriggersPage() {\n let pageSize = this.panel.pageSize || PANEL_DEFAULTS.pageSize;\n let startPos = this.pageIndex * pageSize;\n let endPos = Math.min(startPos + pageSize, this.triggerList.length);\n this.currentTriggersPage = this.triggerList.slice(startPos, endPos);\n return this.currentTriggersPage;\n }\n\n formatHostName(trigger) {\n let host = \"\";\n if (this.panel.hostField && this.panel.hostTechNameField) {\n host = `${trigger.host} (${trigger.hostTechName})`;\n } else if (this.panel.hostField || this.panel.hostTechNameField) {\n host = this.panel.hostField ? trigger.host : trigger.hostTechName;\n }\n\n return host;\n }\n\n formatHostGroups(trigger) {\n let groupNames = \"\";\n if (this.panel.hostGroups) {\n let groups = _.map(trigger.groups, 'name').join(', ');\n groupNames += `[ ${groups} ]`;\n }\n\n return groupNames;\n }\n\n getAlertIconClass(trigger) {\n let iconClass = '';\n if (trigger.value === '1') {\n if (trigger.priority >= 3) {\n iconClass = 'icon-gf-critical';\n } else {\n iconClass = 'icon-gf-warning';\n }\n } else {\n iconClass = 'icon-gf-online';\n }\n\n if (this.panel.highlightNewEvents && this.isNewTrigger(trigger)) {\n iconClass += ' zabbix-trigger--blinked';\n }\n return iconClass;\n }\n\n getAlertIconClassBySeverity(triggerSeverity) {\n let iconClass = 'icon-gf-warning';\n if (triggerSeverity.priority >= 3) {\n iconClass = 'icon-gf-critical';\n }\n return iconClass;\n }\n\n getAlertStateClass(trigger) {\n let statusClass = '';\n\n if (trigger.value === '1') {\n statusClass = 'alert-state-critical';\n } else {\n statusClass = 'alert-state-ok';\n }\n\n if (this.panel.highlightNewEvents && this.isNewTrigger(trigger)) {\n statusClass += ' zabbix-trigger--blinked';\n }\n\n return statusClass;\n }\n\n getBackground(trigger) {\n const mainColor = trigger.color;\n const secondColor = this.contextSrv.user.lightTheme ? '#dde4ed' : '#262628';\n if (this.contextSrv.user.lightTheme) {\n return `linear-gradient(135deg, ${secondColor}, ${mainColor})`;\n }\n return `linear-gradient(135deg, ${mainColor}, ${secondColor})`;\n }\n\n isNewTrigger(trigger) {\n try {\n const highlightIntervalMs = utils.parseInterval(this.panel.highlightNewerThan || PANEL_DEFAULTS.highlightNewerThan);\n const durationSec = (Date.now() - trigger.lastchangeUnix * 1000);\n return durationSec < highlightIntervalMs;\n } catch (e) {\n return false;\n }\n }\n\n link(scope, elem, attrs, ctrl) {\n let panel = ctrl.panel;\n let pageCount = 0;\n let triggerList = ctrl.triggerList;\n\n scope.$watchGroup(['ctrl.currentTriggersPage', 'ctrl.triggerList'], renderPanel);\n elem.on('click', '.triggers-panel-page-link', switchPage);\n ctrl.events.on('render', (renderData) => {\n triggerList = renderData || triggerList;\n renderPanel();\n });\n\n function getContentHeight() {\n let panelHeight = ctrl.height;\n if (pageCount > 1) {\n panelHeight -= 36;\n }\n return panelHeight + 'px';\n }\n\n function switchPage(e) {\n let el = $(e.currentTarget);\n ctrl.pageIndex = (parseInt(el.text(), 10)-1);\n\n let pageSize = panel.pageSize || 10;\n let startPos = ctrl.pageIndex * pageSize;\n let endPos = Math.min(startPos + pageSize, triggerList.length);\n ctrl.currentTriggersPage = triggerList.slice(startPos, endPos);\n\n scope.$apply(() => {\n renderPanel();\n });\n }\n\n function appendPaginationControls(footerElem) {\n footerElem.empty();\n\n let pageSize = panel.pageSize || 5;\n pageCount = Math.ceil(triggerList.length / pageSize);\n if (pageCount === 1) {\n return;\n }\n\n let startPage = Math.max(ctrl.pageIndex - 3, 0);\n let endPage = Math.min(pageCount, startPage + 9);\n\n let paginationList = $('
      ');\n\n for (let i = startPage; i < endPage; i++) {\n let activeClass = i === ctrl.pageIndex ? 'active' : '';\n let pageLinkElem = $('
    • ' + (i+1) + '
    • ');\n paginationList.append(pageLinkElem);\n }\n\n footerElem.append(paginationList);\n }\n\n function setFontSize() {\n const fontSize = parseInt(panel.fontSize.slice(0, panel.fontSize.length - 1));\n let triggerCardElem = elem.find('.alert-rule-item');\n if (fontSize && fontSize !== 100) {\n triggerCardElem.find('.alert-rule-item__icon').css({\n 'font-size': fontSize + '%',\n 'margin': fontSize / 100 * 6 + 'px'\n });\n triggerCardElem.find('.alert-rule-item__name').css({'font-size': fontSize + '%'});\n triggerCardElem.find('.alert-rule-item__text').css({'font-size': fontSize * 0.8 + '%'});\n triggerCardElem.find('.zbx-trigger-lastchange').css({'font-size': fontSize * 0.8 + '%'});\n triggerCardElem.find('.zbx-tag').css({'font-size': fontSize * 0.6 + '%'});\n triggerCardElem.find('.zbx-tag').css({'line-height': fontSize / 100 * 16 + 'px'});\n } else {\n // remove css\n triggerCardElem.find('.alert-rule-item__icon').css({'font-size': '', 'margin-right': ''});\n triggerCardElem.find('.alert-rule-item__name').css({'font-size': ''});\n triggerCardElem.find('.alert-rule-item__text').css({'font-size': ''});\n triggerCardElem.find('.zbx-trigger-lastchange').css({'font-size': ''});\n triggerCardElem.find('.zbx-tag').css({'font-size': ''});\n triggerCardElem.find('.zbx-tag').css({'line-height': ''});\n }\n }\n\n function renderPanel() {\n let rootElem = elem.find('.triggers-panel-scroll');\n let footerElem = elem.find('.triggers-panel-footer');\n appendPaginationControls(footerElem);\n rootElem.css({'max-height': getContentHeight()});\n rootElem.css({'height': getContentHeight()});\n setFontSize();\n ctrl.renderingCompleted();\n }\n\n let unbindDestroy = scope.$on('$destroy', function() {\n elem.off('click', '.triggers-panel-page-link');\n unbindDestroy();\n });\n }\n}\n\nTriggerPanelCtrl.templateUrl = 'public/plugins/alexanderzobnin-zabbix-app/panel-triggers/partials/module.html';\n\nfunction filterTriggers(triggers, triggerFilter) {\n if (utils.isRegex(triggerFilter)) {\n return _.filter(triggers, function(trigger) {\n return utils.buildRegex(triggerFilter).test(trigger.description);\n });\n } else {\n return _.filter(triggers, function(trigger) {\n return trigger.description === triggerFilter;\n });\n }\n}\n"]} \ No newline at end of file