diff --git a/CHANGELOG.md b/CHANGELOG.md
index be76306..d1db11d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,11 +6,22 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased]
+
+## [3.9.1] - 2018-05-02
+### Fixed
+- Datasource fails when "Direct DB connection" enabled [#564](https://github.com/alexanderzobnin/grafana-zabbix/issues/564)
+- Alerting and health icons on panels [#556](https://github.com/alexanderzobnin/grafana-zabbix/issues/556)
+- Alerting threshold error [#549](https://github.com/alexanderzobnin/grafana-zabbix/issues/549)
+
+## [3.9.0] - 2018-03-23
### Added
-- Table format support for text data, [#492](https://github.com/alexanderzobnin/grafana-zabbix/issues/492)
+- Table format support for text data [#492](https://github.com/alexanderzobnin/grafana-zabbix/issues/492)
+- Option to enable triggers background highlighting [#532](https://github.com/alexanderzobnin/grafana-zabbix/issues/532)
+- Option to disable acknowledges for read-only users [#481](https://github.com/alexanderzobnin/grafana-zabbix/issues/481)
### Fixed
- Triggers panel has broken styles in Grafana 5.0 [#522](https://github.com/alexanderzobnin/grafana-zabbix/issues/522)
+- Undefined username in acknowledges [#393](https://github.com/alexanderzobnin/grafana-zabbix/issues/393)
## [3.8.1] - 2017-12-21
### Fixed
diff --git a/dist/css/grafana-zabbix.dark.css b/dist/css/grafana-zabbix.dark.css
index cb8d8f5..9f1a9f8 100644
--- a/dist/css/grafana-zabbix.dark.css
+++ b/dist/css/grafana-zabbix.dark.css
@@ -24,8 +24,6 @@
margin-right: 4px;
padding: 1px 6px;
cursor: pointer; }
- .triggers-panel-container .alert-list-footer {
- justify-content: flex-start; }
.triggers-panel-container .trigger-info-block {
display: flex; }
.triggers-panel-container .trigger-info-block i, .triggers-panel-container .trigger-info-block a {
@@ -37,8 +35,6 @@
font-weight: 500; }
.triggers-panel-container .zabbix-trigger-source .gicon-datasources {
opacity: 0.4; }
- .triggers-panel-container .card-item-wrapper {
- padding-left: 4px; }
.zbx-trigger-card {
position: relative;
@@ -51,11 +47,19 @@
.zbx-maintenance-icon {
color: #eb7b18; }
-@keyframes zabbix-triggers-panel {
- 100% {
- opacity: 1;
- box-shadow: 0 0 10px 0px #d44a3a;
- border-bottom-color: rgba(212, 74, 58, 0.25); } }
+.zbx-trigger-highlighted {
+ color: #fff; }
+ .zbx-trigger-highlighted .alert-rule-item__body,
+ .zbx-trigger-highlighted .alert-rule-item__header,
+ .zbx-trigger-highlighted .alert-rule-item__time,
+ .zbx-trigger-highlighted .zabbix-hostname,
+ .zbx-trigger-highlighted .zbx-description {
+ color: #fff; }
+ .zbx-trigger-highlighted .alert-rule-item__text .zbx-trigger-state,
+ .zbx-trigger-highlighted .alert-rule-item__text .zbx-trigger-severity {
+ color: #fff; }
+ .zbx-trigger-highlighted .zbx-trigger-lastchange .trigger-info-block.zbx-status-icons a, .zbx-trigger-highlighted .zbx-trigger-lastchange .trigger-info-block.zbx-status-icons i {
+ color: #fff; }
@keyframes zabbix-triggers-icon {
100% {
@@ -107,8 +111,9 @@
margin-left: 1rem; }
.triggers-severity-config.gf-form-label {
- padding-top: 4px;
- padding-bottom: 4px; }
+ padding-top: 5px;
+ padding-bottom: 5px;
+ border-radius: 0px; }
.triggers-severity-config .icon-gf {
font-size: 200%; }
diff --git a/dist/css/grafana-zabbix.dark.css.map b/dist/css/grafana-zabbix.dark.css.map
index 1b669bc..bbee0ea 100644
--- a/dist/css/grafana-zabbix.dark.css.map
+++ b/dist/css/grafana-zabbix.dark.css.map
@@ -9,6 +9,6 @@
"../../src/sass/_panel-triggers.scss",
"../../src/sass/_query_editor.scss"
],
- "mappings": "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",
+ "mappings": "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",
"names": []
}
\ No newline at end of file
diff --git a/dist/css/grafana-zabbix.light.css b/dist/css/grafana-zabbix.light.css
index 10d4566..8febfb0 100644
--- a/dist/css/grafana-zabbix.light.css
+++ b/dist/css/grafana-zabbix.light.css
@@ -24,8 +24,6 @@
margin-right: 4px;
padding: 1px 6px;
cursor: pointer; }
- .triggers-panel-container .alert-list-footer {
- justify-content: flex-start; }
.triggers-panel-container .trigger-info-block {
display: flex; }
.triggers-panel-container .trigger-info-block i, .triggers-panel-container .trigger-info-block a {
@@ -37,8 +35,6 @@
font-weight: 500; }
.triggers-panel-container .zabbix-trigger-source .gicon-datasources {
opacity: 0.4; }
- .triggers-panel-container .card-item-wrapper {
- padding-left: 4px; }
.zbx-trigger-card {
position: relative;
@@ -51,11 +47,19 @@
.zbx-maintenance-icon {
color: #ff7941; }
-@keyframes zabbix-triggers-panel {
- 100% {
- opacity: 1;
- box-shadow: 0 0 10px 0px #d44939;
- border-bottom-color: rgba(212, 73, 57, 0.25); } }
+.zbx-trigger-highlighted {
+ color: #000; }
+ .zbx-trigger-highlighted .alert-rule-item__body,
+ .zbx-trigger-highlighted .alert-rule-item__header,
+ .zbx-trigger-highlighted .alert-rule-item__time,
+ .zbx-trigger-highlighted .zabbix-hostname,
+ .zbx-trigger-highlighted .zbx-description {
+ color: #000; }
+ .zbx-trigger-highlighted .alert-rule-item__text .zbx-trigger-state,
+ .zbx-trigger-highlighted .alert-rule-item__text .zbx-trigger-severity {
+ color: #000; }
+ .zbx-trigger-highlighted .zbx-trigger-lastchange .trigger-info-block.zbx-status-icons a, .zbx-trigger-highlighted .zbx-trigger-lastchange .trigger-info-block.zbx-status-icons i {
+ color: #000; }
@keyframes zabbix-triggers-icon {
100% {
@@ -107,8 +111,9 @@
margin-left: 1rem; }
.triggers-severity-config.gf-form-label {
- padding-top: 4px;
- padding-bottom: 4px; }
+ padding-top: 5px;
+ padding-bottom: 5px;
+ border-radius: 0px; }
.triggers-severity-config .icon-gf {
font-size: 200%; }
diff --git a/dist/css/grafana-zabbix.light.css.map b/dist/css/grafana-zabbix.light.css.map
index 654d90c..c8daf62 100644
--- a/dist/css/grafana-zabbix.light.css.map
+++ b/dist/css/grafana-zabbix.light.css.map
@@ -9,6 +9,6 @@
"../../src/sass/_panel-triggers.scss",
"../../src/sass/_query_editor.scss"
],
- "mappings": "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",
+ "mappings": "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",
"names": []
}
\ No newline at end of file
diff --git a/dist/datasource-zabbix/datasource.js b/dist/datasource-zabbix/datasource.js
deleted file mode 100644
index 75cbb42..0000000
--- a/dist/datasource-zabbix/datasource.js
+++ /dev/null
@@ -1,865 +0,0 @@
-'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) {
- "use strict";
-
- var _, dateMath, utils, migrations, metricFunctions, c, dataProcessor, responseHandler, Zabbix, ZabbixAPIError, _slicedToArray, _createClass, ZabbixAPIDatasource;
-
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
-
- function bindFunctionDefs(functionDefs, category) {
- var aggregationFunctions = _.map(metricFunctions.getCategories()[category], 'name');
- var aggFuncDefs = _.filter(functionDefs, function (func) {
- return _.includes(aggregationFunctions, func.def.name);
- });
-
- return _.map(aggFuncDefs, function (func) {
- var funcInstance = metricFunctions.createFuncInstance(func.def, func.params);
- return funcInstance.bindFunction(dataProcessor.metricFunctions);
- });
- }
-
- function getConsolidateBy(target) {
- var consolidateBy = 'avg';
- var funcDef = _.find(target.functions, function (func) {
- return func.def.name === 'consolidateBy';
- });
- if (funcDef && funcDef.params && funcDef.params.length) {
- consolidateBy = funcDef.params[0];
- }
- return consolidateBy;
- }
-
- function downsampleSeries(timeseries_data, options) {
- var defaultAgg = dataProcessor.aggregationFunctions['avg'];
- var consolidateByFunc = dataProcessor.aggregationFunctions[options.consolidateBy] || defaultAgg;
- return _.map(timeseries_data, function (timeseries) {
- if (timeseries.datapoints.length > options.maxDataPoints) {
- timeseries.datapoints = dataProcessor.groupBy(options.interval, consolidateByFunc, timeseries.datapoints);
- }
- return timeseries;
- });
- }
-
- function formatMetric(metricObj) {
- return {
- text: metricObj.name,
- expandable: false
- };
- }
-
- /**
- * Custom formatter for template variables.
- * Default Grafana "regex" formatter returns
- * value1|value2
- * This formatter returns
- * (value1|value2)
- * This format needed for using in complex regex with
- * template variables, for example
- * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait
- */
- function zabbixTemplateFormat(value) {
- if (typeof value === 'string') {
- return utils.escapeRegex(value);
- }
-
- var escapedValues = _.map(value, utils.escapeRegex);
- return '(' + escapedValues.join('|') + ')';
- }
-
- function zabbixItemIdsTemplateFormat(value) {
- if (typeof value === 'string') {
- return value;
- }
- return value.join(',');
- }
-
- /**
- * If template variables are used in request, replace it using regex format
- * and wrap with '/' for proper multi-value work. Example:
- * $variable selected as a, b, c
- * We use filter $variable
- * $variable -> a|b|c -> /a|b|c/
- * /$variable/ -> /a|b|c/ -> /a|b|c/
- */
- function replaceTemplateVars(templateSrv, target, scopedVars) {
- var replacedTarget = templateSrv.replace(target, scopedVars, zabbixTemplateFormat);
- if (target !== replacedTarget && !utils.isRegex(replacedTarget)) {
- replacedTarget = '/^' + replacedTarget + '$/';
- }
- 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);
- });
- }
-
- function getTriggerThreshold(expression) {
- var thresholdPattern = /.*[<>=]{1,2}([\d\.]+)/;
- var finded_thresholds = expression.match(thresholdPattern);
- if (finded_thresholds && finded_thresholds.length >= 2) {
- var threshold = finded_thresholds[1];
- threshold = Number(threshold);
- return threshold;
- } else {
- return null;
- }
- }
-
- return {
- setters: [function (_lodash) {
- _ = _lodash.default;
- }, function (_appCoreUtilsDatemath) {
- dateMath = _appCoreUtilsDatemath;
- }, function (_utils) {
- utils = _utils;
- }, function (_migrations) {
- migrations = _migrations;
- }, function (_metricFunctions) {
- metricFunctions = _metricFunctions;
- }, function (_constants) {
- c = _constants;
- }, function (_dataProcessor) {
- dataProcessor = _dataProcessor.default;
- }, function (_responseHandler) {
- responseHandler = _responseHandler.default;
- }, function (_zabbixAlertingServiceJs) {}, function (_zabbixZabbix) {
- Zabbix = _zabbixZabbix.Zabbix;
- }, function (_zabbixConnectorsZabbix_apiZabbixAPICore) {
- ZabbixAPIError = _zabbixConnectorsZabbix_apiZabbixAPICore.ZabbixAPIError;
- }],
- execute: function () {
- _slicedToArray = function () {
- function sliceIterator(arr, i) {
- var _arr = [];
- var _n = true;
- var _d = false;
- var _e = undefined;
-
- try {
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
- _arr.push(_s.value);
-
- if (i && _arr.length === i) break;
- }
- } catch (err) {
- _d = true;
- _e = err;
- } finally {
- try {
- if (!_n && _i["return"]) _i["return"]();
- } finally {
- if (_d) throw _e;
- }
- }
-
- return _arr;
- }
-
- return function (arr, i) {
- if (Array.isArray(arr)) {
- return arr;
- } else if (Symbol.iterator in Object(arr)) {
- return sliceIterator(arr, i);
- } else {
- throw new TypeError("Invalid attempt to destructure non-iterable instance");
- }
- };
- }();
-
- _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
-
- return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);
- if (staticProps) defineProperties(Constructor, staticProps);
- return Constructor;
- };
- }();
-
- _export('ZabbixAPIDatasource', ZabbixAPIDatasource = function () {
-
- /** @ngInject */
- function ZabbixAPIDatasource(instanceSettings, templateSrv, alertSrv, dashboardSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) {
- _classCallCheck(this, ZabbixAPIDatasource);
-
- this.templateSrv = templateSrv;
- this.alertSrv = alertSrv;
- this.dashboardSrv = dashboardSrv;
- this.zabbixAlertingSrv = zabbixAlertingSrv;
-
- // Use custom format for template variables
- this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);
-
- // General data source settings
- this.name = instanceSettings.name;
- this.url = instanceSettings.url;
- this.basicAuth = instanceSettings.basicAuth;
- this.withCredentials = instanceSettings.withCredentials;
-
- var jsonData = instanceSettings.jsonData;
-
- // Zabbix API credentials
- this.username = jsonData.username;
- this.password = jsonData.password;
-
- // Use trends instead history since specified time
- this.trends = jsonData.trends;
- this.trendsFrom = jsonData.trendsFrom || '7d';
- this.trendsRange = jsonData.trendsRange || '4d';
-
- // Set cache update interval
- var ttl = jsonData.cacheTTL || '1h';
- this.cacheTTL = utils.parseInterval(ttl);
-
- // Alerting options
- this.alertingEnabled = jsonData.alerting;
- this.addThresholds = jsonData.addThresholds;
- this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;
-
- // Direct DB Connection options
- var dbConnectionOptions = jsonData.dbConnection || {};
- this.enableDirectDBConnection = dbConnectionOptions.enable;
- this.sqlDatasourceId = dbConnectionOptions.datasourceId;
-
- var zabbixOptions = {
- username: this.username,
- password: this.password,
- basicAuth: this.basicAuth,
- withCredentials: this.withCredentials,
- cacheTTL: this.cacheTTL,
- enableDirectDBConnection: this.enableDirectDBConnection,
- sqlDatasourceId: this.sqlDatasourceId
- };
-
- this.zabbix = new Zabbix(this.url, zabbixOptions, backendSrv, datasourceSrv);
- }
-
- ////////////////////////
- // Datasource methods //
- ////////////////////////
-
- /**
- * Query panel data. Calls for each panel in dashboard.
- * @param {Object} options Contains time range, targets and other info.
- * @return {Object} Grafana metrics object with timeseries data for each target.
- */
-
-
- _createClass(ZabbixAPIDatasource, [{
- key: 'query',
- value: function query(options) {
- var _this = this;
-
- // Get alerts for current panel
- if (this.alertingEnabled) {
- this.alertQuery(options).then(function (alert) {
- _this.zabbixAlertingSrv.setPanelAlertState(options.panelId, alert.state);
-
- _this.zabbixAlertingSrv.removeZabbixThreshold(options.panelId);
- if (_this.addThresholds) {
- _.forEach(alert.thresholds, function (threshold) {
- _this.zabbixAlertingSrv.setPanelThreshold(options.panelId, threshold);
- });
- }
- });
- }
-
- // Create request for each target
- var promises = _.map(options.targets, function (t) {
- // Don't request undefined and hidden targets
- if (t.hide) {
- return [];
- }
-
- var timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);
- var timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);
-
- // Prevent changes of original object
- var target = _.cloneDeep(t);
- _this.replaceTargetVariables(target, options);
-
- // 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];
-
- timeFrom = time_from;
- timeTo = time_to;
- }
- var timeRange = [timeFrom, timeTo];
-
- var useTrends = _this.isUseTrends(timeRange);
-
- // Metrics or Text query mode
- if (!target.mode || target.mode === c.MODE_METRICS || target.mode === c.MODE_TEXT) {
- // Migrate old targets
- target = migrations.migrate(target);
-
- // Don't request undefined and hidden targets
- if (target.hide || !target.group || !target.host || !target.item) {
- return [];
- }
-
- if (!target.mode || target.mode === c.MODE_METRICS) {
- return _this.queryNumericData(target, timeRange, useTrends, options);
- } else if (target.mode === c.MODE_TEXT) {
- return _this.queryTextData(target, timeRange);
- }
- } else if (target.mode === c.MODE_ITEMID) {
- // Item ID mode
- if (!target.itemids) {
- return [];
- }
- return _this.queryItemIdData(target, timeRange, useTrends, options);
- } else if (target.mode === c.MODE_ITSERVICE) {
- // IT services mode
- return _this.queryITServiceData(target, timeRange, options);
- } else if (target.mode === c.MODE_TRIGGERS) {
- // Triggers mode
- return _this.queryTriggersData(target, timeRange);
- } else {
- return [];
- }
- });
-
- // Data for panel (all targets)
- return Promise.all(_.flatten(promises)).then(_.flatten).then(function (data) {
- return { data: data };
- });
- }
- }, {
- key: 'queryNumericData',
- value: function queryNumericData(target, timeRange, useTrends, options) {
- var _this2 = this;
-
- var getItemOptions = {
- itemtype: 'num'
- };
- return this.zabbix.getItemsFromTarget(target, getItemOptions).then(function (items) {
- return _this2.queryNumericDataForItems(items, target, timeRange, useTrends, options);
- });
- }
- }, {
- key: 'queryNumericDataForItems',
- value: function queryNumericDataForItems(items, target, timeRange, useTrends, options) {
- var _this3 = this;
-
- var _timeRange = _slicedToArray(timeRange, 2),
- timeFrom = _timeRange[0],
- timeTo = _timeRange[1];
-
- var getHistoryPromise = void 0;
- options.consolidateBy = getConsolidateBy(target);
-
- if (useTrends) {
- if (this.enableDirectDBConnection) {
- getHistoryPromise = this.zabbix.getTrendsDB(items, timeFrom, timeTo, options).then(function (history) {
- return _this3.zabbix.dbConnector.handleGrafanaTSResponse(history, items);
- });
- } else {
- var valueType = this.getTrendValueType(target);
- getHistoryPromise = this.zabbix.getTrend(items, timeFrom, timeTo).then(function (history) {
- return responseHandler.handleTrends(history, items, valueType);
- }).then(function (timeseries) {
- // Sort trend data, issue #202
- _.forEach(timeseries, function (series) {
- series.datapoints = _.sortBy(series.datapoints, function (point) {
- return point[c.DATAPOINT_TS];
- });
- });
- return timeseries;
- });
- }
- } else {
- // Use history
- if (this.enableDirectDBConnection) {
- getHistoryPromise = this.zabbix.getHistoryDB(items, timeFrom, timeTo, options).then(function (history) {
- return _this3.zabbix.dbConnector.handleGrafanaTSResponse(history, items);
- });
- } else {
- getHistoryPromise = this.zabbix.getHistory(items, timeFrom, timeTo).then(function (history) {
- return responseHandler.handleHistory(history, items);
- });
- }
- }
-
- return getHistoryPromise.then(function (timeseries) {
- return _this3.applyDataProcessingFunctions(timeseries, target);
- }).then(function (timeseries) {
- return downsampleSeries(timeseries, options);
- }).catch(function (error) {
- console.log(error);
- return [];
- });
- }
- }, {
- key: 'getTrendValueType',
- value: function getTrendValueType(target) {
- // Find trendValue() function and get specified trend value
- var trendFunctions = _.map(metricFunctions.getCategories()['Trends'], 'name');
- var trendValueFunc = _.find(target.functions, function (func) {
- return _.includes(trendFunctions, func.def.name);
- });
- return trendValueFunc ? trendValueFunc.params[0] : "avg";
- }
- }, {
- key: 'applyDataProcessingFunctions',
- value: function applyDataProcessingFunctions(timeseries_data, target) {
- var transformFunctions = bindFunctionDefs(target.functions, 'Transform');
- var aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');
- var filterFunctions = bindFunctionDefs(target.functions, 'Filter');
- var aliasFunctions = bindFunctionDefs(target.functions, 'Alias');
-
- // Apply transformation functions
- timeseries_data = _.cloneDeep(_.map(timeseries_data, function (timeseries) {
- timeseries.datapoints = sequence(transformFunctions)(timeseries.datapoints);
- return timeseries;
- }));
-
- // Apply filter functions
- if (filterFunctions.length) {
- timeseries_data = sequence(filterFunctions)(timeseries_data);
- }
-
- // Apply aggregations
- if (aggregationFunctions.length) {
- var dp = _.map(timeseries_data, 'datapoints');
- dp = sequence(aggregationFunctions)(dp);
-
- var aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name');
- var lastAgg = _.findLast(target.functions, function (func) {
- return _.includes(aggFuncNames, func.def.name);
- });
-
- timeseries_data = [{
- target: lastAgg.text,
- datapoints: dp
- }];
- }
-
- // Apply alias functions
- _.forEach(timeseries_data, sequence(aliasFunctions));
-
- // Apply Time-related functions (timeShift(), etc)
- // Find timeShift() function and get specified trend value
- this.applyTimeShiftFunction(timeseries_data, target);
-
- return timeseries_data;
- }
- }, {
- key: 'applyTimeShiftFunction',
- value: function applyTimeShiftFunction(timeseries_data, target) {
- // Find timeShift() function and get specified interval
- var timeShiftFunc = _.find(target.functions, function (func) {
- return func.def.name === 'timeShift';
- });
- if (timeShiftFunc) {
- var shift = timeShiftFunc.params[0];
- _.forEach(timeseries_data, function (series) {
- series.datapoints = dataProcessor.unShiftTimeSeries(shift, series.datapoints);
- });
- }
- }
- }, {
- key: 'queryTextData',
- value: function queryTextData(target, timeRange) {
- var _this4 = this;
-
- var _timeRange2 = _slicedToArray(timeRange, 2),
- timeFrom = _timeRange2[0],
- timeTo = _timeRange2[1];
-
- var options = {
- itemtype: 'text'
- };
- return this.zabbix.getItemsFromTarget(target, options).then(function (items) {
- if (items.length) {
- return _this4.zabbix.getHistory(items, timeFrom, timeTo).then(function (history) {
- if (target.resultFormat === 'table') {
- return responseHandler.handleHistoryAsTable(history, items, target);
- } else {
- return responseHandler.handleText(history, items, target);
- }
- });
- } else {
- return Promise.resolve([]);
- }
- });
- }
- }, {
- key: 'queryItemIdData',
- value: function queryItemIdData(target, timeRange, useTrends, options) {
- var _this5 = this;
-
- var itemids = target.itemids;
- itemids = this.templateSrv.replace(itemids, options.scopedVars, zabbixItemIdsTemplateFormat);
- itemids = _.map(itemids.split(','), function (itemid) {
- return itemid.trim();
- });
-
- if (!itemids) {
- return [];
- }
-
- return this.zabbix.getItemsByIDs(itemids).then(function (items) {
- return _this5.queryNumericDataForItems(items, target, timeRange, useTrends, options);
- });
- }
- }, {
- key: 'queryITServiceData',
- value: function queryITServiceData(target, timeRange, options) {
- var _this6 = this;
-
- // Don't show undefined and hidden targets
- if (target.hide || !target.itservice && !target.itServiceFilter || !target.slaProperty) {
- return [];
- }
-
- var itServiceIds = [];
- var itServices = [];
- var itServiceFilter = void 0;
- var isOldVersion = target.itservice && !target.itServiceFilter;
-
- if (isOldVersion) {
- // Backward compatibility
- itServiceFilter = '/.*/';
- } else {
- itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);
- }
-
- return this.zabbix.getITServices(itServiceFilter).then(function (itservices) {
- itServices = itservices;
- if (isOldVersion) {
- itServices = _.filter(itServices, { 'serviceid': target.itservice.serviceid });
- }
-
- itServiceIds = _.map(itServices, 'serviceid');
- return itServiceIds;
- }).then(function (serviceids) {
- return _this6.zabbix.getSLA(serviceids, timeRange);
- }).then(function (slaResponse) {
- return _.map(itServiceIds, function (serviceid) {
- var itservice = _.find(itServices, { 'serviceid': serviceid });
- return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse);
- });
- });
- }
- }, {
- key: 'queryTriggersData',
- value: function queryTriggersData(target, timeRange) {
- var _this7 = this;
-
- var _timeRange3 = _slicedToArray(timeRange, 2),
- timeFrom = _timeRange3[0],
- timeTo = _timeRange3[1];
-
- return this.zabbix.getHostsFromTarget(target).then(function (results) {
- var _results = _slicedToArray(results, 2),
- hosts = _results[0],
- apps = _results[1];
-
- if (hosts.length) {
- var hostids = _.map(hosts, 'hostid');
- var appids = _.map(apps, 'applicationid');
- var options = {
- minSeverity: target.triggers.minSeverity,
- acknowledged: target.triggers.acknowledged,
- count: target.triggers.count,
- timeFrom: timeFrom,
- timeTo: timeTo
- };
- return _this7.zabbix.getHostAlerts(hostids, appids, options).then(function (triggers) {
- return responseHandler.handleTriggersResponse(triggers, timeRange);
- });
- } else {
- return Promise.resolve([]);
- }
- });
- }
- }, {
- key: 'testDatasource',
- value: function testDatasource() {
- var _this8 = this;
-
- 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.testSQLDataSource();
- } else {
- return Promise.resolve();
- }
- }).then(function () {
- return {
- status: "success",
- title: "Success",
- message: "Zabbix API version: " + zabbixVersion
- };
- }).catch(function (error) {
- if (error instanceof ZabbixAPIError) {
- return {
- status: "error",
- title: error.message,
- message: error.message
- };
- } else if (error.data && error.data.message) {
- return {
- status: "error",
- title: "Connection failed",
- message: "Connection failed: " + error.data.message
- };
- } else {
- return {
- status: "error",
- title: "Connection failed",
- message: "Could not connect to given url"
- };
- }
- });
- }
- }, {
- key: 'metricFindQuery',
- value: function metricFindQuery(query) {
- var _this9 = 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, {});
-
- // Replace wildcard to regex
- if (part === '*') {
- part = '/.*/';
- }
- parts.push(part);
- });
- var template = _.zipObject(['group', 'host', 'app', 'item'], parts);
-
- // Get items
- if (parts.length === 4) {
- // Search for all items, even it's not belong to any application
- if (template.app === '/.*/') {
- template.app = '';
- }
- result = this.zabbix.getItems(template.group, template.host, template.app, template.item);
- } else if (parts.length === 3) {
- // Get applications
- result = this.zabbix.getApps(template.group, template.host, template.app);
- } else if (parts.length === 2) {
- // Get hosts
- result = this.zabbix.getHosts(template.group, template.host);
- } else if (parts.length === 1) {
- // Get groups
- result = this.zabbix.getGroups(template.group);
- } else {
- result = Promise.resolve([]);
- }
-
- return result.then(function (metrics) {
- return _.map(metrics, formatMetric);
- });
- }
- }, {
- key: 'annotationQuery',
- value: function annotationQuery(options) {
- var _this10 = this;
-
- var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);
- var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);
- var annotation = options.annotation;
- var showOkEvents = annotation.showOkEvents ? c.SHOW_ALL_EVENTS : c.SHOW_OK_EVENTS;
-
- // Show all triggers
- var triggersOptions = {
- showTriggers: c.SHOW_ALL_TRIGGERS,
- hideHostsInMaintenance: false
- };
-
- var getTriggers = this.zabbix.getTriggers(this.replaceTemplateVars(annotation.group, {}), this.replaceTemplateVars(annotation.host, {}), this.replaceTemplateVars(annotation.application, {}), triggersOptions);
-
- return getTriggers.then(function (triggers) {
-
- // Filter triggers by description
- var triggerName = _this10.replaceTemplateVars(annotation.trigger, {});
- if (utils.isRegex(triggerName)) {
- triggers = _.filter(triggers, function (trigger) {
- return utils.buildRegex(triggerName).test(trigger.description);
- });
- } else if (triggerName) {
- triggers = _.filter(triggers, function (trigger) {
- return trigger.description === triggerName;
- });
- }
-
- // Remove events below the chose severity
- triggers = _.filter(triggers, function (trigger) {
- return Number(trigger.priority) >= Number(annotation.minseverity);
- });
-
- var objectids = _.map(triggers, 'triggerid');
- return _this10.zabbix.getEvents(objectids, timeFrom, timeTo, showOkEvents).then(function (events) {
- var indexedTriggers = _.keyBy(triggers, 'triggerid');
-
- // Hide acknowledged events if option enabled
- if (annotation.hideAcknowledged) {
- events = _.filter(events, function (event) {
- return !event.acknowledges.length;
- });
- }
-
- return _.map(events, function (event) {
- var tags = void 0;
- if (annotation.showHostname) {
- tags = _.map(event.hosts, 'name');
- }
-
- // Show event type (OK or Problem)
- var title = Number(event.value) ? 'Problem' : 'OK';
-
- var formatted_acknowledges = utils.formatAcknowledges(event.acknowledges);
- return {
- annotation: annotation,
- time: event.clock * 1000,
- title: title,
- tags: tags,
- text: indexedTriggers[event.objectid].description + formatted_acknowledges
- };
- });
- });
- });
- }
- }, {
- key: 'alertQuery',
- value: function alertQuery(options) {
- var _this11 = 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' });
- });
-
- return Promise.all(getPanelItems).then(function (results) {
- var items = _.flatten(results);
- var itemids = _.map(items, 'itemid');
-
- if (itemids.length === 0) {
- return [];
- }
- return _this11.zabbix.getAlerts(itemids);
- }).then(function (triggers) {
- triggers = _.filter(triggers, function (trigger) {
- return trigger.priority >= _this11.alertingMinSeverity;
- });
-
- if (!triggers || triggers.length === 0) {
- return {};
- }
-
- var state = 'ok';
-
- var firedTriggers = _.filter(triggers, { value: '1' });
- if (firedTriggers.length) {
- state = 'alerting';
- }
-
- var thresholds = _.map(triggers, function (trigger) {
- return getTriggerThreshold(trigger.expression);
- });
-
- return {
- panelId: options.panelId,
- state: state,
- thresholds: thresholds
- };
- });
- }
- }, {
- key: 'replaceTargetVariables',
- value: function replaceTargetVariables(target, options) {
- var _this12 = 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.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars);
-
- _.forEach(target.functions, function (func) {
- func.params = _.map(func.params, function (param) {
- if (typeof param === 'number') {
- return +_this12.templateSrv.replace(param.toString(), options.scopedVars);
- } else {
- return _this12.templateSrv.replace(param, options.scopedVars);
- }
- });
- });
- }
- }, {
- key: 'isUseTrends',
- value: function isUseTrends(timeRange) {
- var _timeRange4 = _slicedToArray(timeRange, 2),
- timeFrom = _timeRange4[0],
- timeTo = _timeRange4[1];
-
- var useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);
- var useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);
- var useTrends = this.trends && (timeFrom <= useTrendsFrom || timeTo - timeFrom >= useTrendsRange);
- return useTrends;
- }
- }]);
-
- return ZabbixAPIDatasource;
- }());
-
- _export('ZabbixAPIDatasource', ZabbixAPIDatasource);
-
- _export('zabbixTemplateFormat', zabbixTemplateFormat);
-
- // Fix for backward compatibility with lodash 2.4
- if (!_.includes) {
- _.includes = _.contains;
- }
- if (!_.keyBy) {
- _.keyBy = _.indexBy;
- }
- }
- };
-});
-//# sourceMappingURL=datasource.js.map
diff --git a/dist/datasource-zabbix/datasource.js.map b/dist/datasource-zabbix/datasource.js.map
deleted file mode 100644
index 7e1e86c..0000000
--- a/dist/datasource-zabbix/datasource.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"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","dbConnectionOptions","dbConnection","enableDirectDBConnection","enable","sqlDatasourceId","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","getTrendsDB","dbConnector","handleGrafanaTSResponse","history","valueType","getTrendValueType","getTrend","handleTrends","series","sortBy","point","DATAPOINT_TS","getHistoryDB","getHistory","handleHistory","applyDataProcessingFunctions","catch","console","log","error","trendFunctions","trendValueFunc","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","unShiftTimeSeries","resultFormat","handleHistoryAsTable","handleText","resolve","split","itemid","trim","getItemsByIDs","itservice","itServiceFilter","slaProperty","itServiceIds","itServices","isOldVersion","getITServices","itservices","serviceid","getSLA","serviceids","handleSLAResponse","slaResponse","getHostsFromTarget","results","hosts","apps","hostids","appids","minSeverity","triggers","acknowledged","count","getHostAlerts","handleTriggersResponse","zabbixVersion","getVersion","version","login","testSQLDataSource","status","title","message","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 // Direct DB Connection options\n let dbConnectionOptions = jsonData.dbConnection || {};\n this.enableDirectDBConnection = dbConnectionOptions.enable;\n this.sqlDatasourceId = dbConnectionOptions.datasourceId;\n\n let zabbixOptions = {\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 sqlDatasourceId: this.sqlDatasourceId\n };\n\n this.zabbix = new Zabbix(this.url, 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 [timeFrom, timeTo] = timeRange;\n let getHistoryPromise;\n options.consolidateBy = getConsolidateBy(target);\n\n if (useTrends) {\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getTrendsDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n let valueType = this.getTrendValueType(target);\n getHistoryPromise = this.zabbix.getTrend(items, timeFrom, timeTo)\n .then(history => responseHandler.handleTrends(history, items, valueType))\n .then(timeseries => {\n // Sort trend data, issue #202\n _.forEach(timeseries, series => {\n series.datapoints = _.sortBy(series.datapoints, point => point[c.DATAPOINT_TS]);\n });\n return timeseries;\n });\n }\n } else {\n // Use history\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getHistoryDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n getHistoryPromise = this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => responseHandler.handleHistory(history, items));\n }\n }\n\n return getHistoryPromise\n .then(timeseries => this.applyDataProcessingFunctions(timeseries, target))\n .then(timeseries => downsampleSeries(timeseries, options))\n .catch(error => {\n console.log(error);\n return [];\n });\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 [timeFrom, timeTo] = timeRange;\n let options = {\n itemtype: 'text'\n };\n return this.zabbix.getItemsFromTarget(target, options)\n .then(items => {\n if (items.length) {\n return this.zabbix.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\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 itServiceIds = [];\n let itServices = [];\n let itServiceFilter;\n let isOldVersion = target.itservice && !target.itServiceFilter;\n\n if (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 itServices = itservices;\n if (isOldVersion) {\n itServices = _.filter(itServices, {'serviceid': target.itservice.serviceid});\n }\n\n itServiceIds = _.map(itServices, 'serviceid');\n return itServiceIds;\n })\n .then(serviceids => {\n return this.zabbix.getSLA(serviceids, timeRange);\n })\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 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.testSQLDataSource();\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 = 'avg';\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
diff --git a/dist/datasource-zabbix/partials/config.html b/dist/datasource-zabbix/partials/config.html
index 7f626c2..0df7462 100644
--- a/dist/datasource-zabbix/partials/config.html
+++ b/dist/datasource-zabbix/partials/config.html
@@ -126,3 +126,11 @@
+
+
+
Other
+
+
+
diff --git a/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js b/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js
deleted file mode 100644
index 90dd7e5..0000000
--- a/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js
+++ /dev/null
@@ -1,291 +0,0 @@
-'use strict';
-
-System.register(['lodash'], function (_export, _context) {
- "use strict";
-
- var _, _createClass, DEFAULT_QUERY_LIMIT, HISTORY_TO_TABLE_MAP, TREND_TO_TABLE_MAP, consolidateByFunc, consolidateByTrendColumns, ZabbixDBConnector, TEST_MYSQL_QUERY, itemid_format, TEST_POSTGRES_QUERY;
-
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
-
- ///////////////////////////////////////////////////////////////////////////////
-
- function convertGrafanaTSResponse(time_series, items, addHostName) {
- var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid'); //uniqBy is needed to deduplicate
- var grafanaSeries = _.map(time_series, function (series) {
- var itemid = series.name;
- var item = _.find(items, { 'itemid': itemid });
- var alias = item.name;
- if (_.keys(hosts).length > 1 && addHostName) {
- //only when actual multi hosts selected
- var host = _.find(hosts, { 'hostid': item.hostid });
- alias = host.name + ": " + alias;
- }
- // CachingProxy deduplicates requests and returns one time series for equal queries.
- // Clone is needed to prevent changing of series object shared between all targets.
- var datapoints = _.cloneDeep(series.points);
- return {
- target: alias,
- datapoints: datapoints
- };
- });
-
- return _.sortBy(grafanaSeries, 'target');
- }
-
- function compactSQLQuery(query) {
- return query.replace(/\s+/g, ' ');
- }
-
- function buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {
- var dialect = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 'mysql';
-
- if (dialect === 'postgres') {
- return buildPostgresHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);
- } else {
- return buildMysqlHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);
- }
- }
-
- function buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {
- var dialect = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 'mysql';
-
- if (dialect === 'postgres') {
- return buildPostgresTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);
- } else {
- return buildMysqlTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);
- }
- }
-
- ///////////
- // MySQL //
- ///////////
-
- function buildMysqlHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {
- var time_expression = 'clock DIV ' + intervalSec + ' * ' + intervalSec;
- var query = '\n SELECT itemid AS metric, ' + time_expression + ' AS time_sec, ' + aggFunction + '(value) AS value\n FROM ' + table + '\n WHERE itemid IN (' + itemids + ')\n AND clock > ' + timeFrom + ' AND clock < ' + timeTill + '\n GROUP BY ' + time_expression + ', metric\n ORDER BY time_sec ASC\n ';
- return query;
- }
-
- function buildMysqlTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {
- var time_expression = 'clock DIV ' + intervalSec + ' * ' + intervalSec;
- var query = '\n SELECT itemid AS metric, ' + time_expression + ' AS time_sec, ' + aggFunction + '(' + valueColumn + ') AS value\n FROM ' + table + '\n WHERE itemid IN (' + itemids + ')\n AND clock > ' + timeFrom + ' AND clock < ' + timeTill + '\n GROUP BY ' + time_expression + ', metric\n ORDER BY time_sec ASC\n ';
- return query;
- }
-
- function buildPostgresHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {
- var time_expression = 'clock / ' + intervalSec + ' * ' + intervalSec;
- var query = '\n SELECT to_char(itemid, \'' + itemid_format + '\') AS metric, ' + time_expression + ' AS time, ' + aggFunction + '(value) AS value\n FROM ' + table + '\n WHERE itemid IN (' + itemids + ')\n AND clock > ' + timeFrom + ' AND clock < ' + timeTill + '\n GROUP BY 1, 2\n ORDER BY time ASC\n ';
- return query;
- }
-
- function buildPostgresTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {
- var time_expression = 'clock / ' + intervalSec + ' * ' + intervalSec;
- var query = '\n SELECT to_char(itemid, \'' + itemid_format + '\') AS metric, ' + time_expression + ' AS time, ' + aggFunction + '(' + valueColumn + ') AS value\n FROM ' + table + '\n WHERE itemid IN (' + itemids + ')\n AND clock > ' + timeFrom + ' AND clock < ' + timeTill + '\n GROUP BY 1, 2\n ORDER BY time ASC\n ';
- return query;
- }
-
- return {
- setters: [function (_lodash) {
- _ = _lodash.default;
- }],
- execute: function () {
- _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];
- descriptor.enumerable = descriptor.enumerable || false;
- descriptor.configurable = true;
- if ("value" in descriptor) descriptor.writable = true;
- Object.defineProperty(target, descriptor.key, descriptor);
- }
- }
-
- return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);
- if (staticProps) defineProperties(Constructor, staticProps);
- return Constructor;
- };
- }();
-
- DEFAULT_QUERY_LIMIT = 10000;
- HISTORY_TO_TABLE_MAP = {
- '0': 'history',
- '1': 'history_str',
- '2': 'history_log',
- '3': 'history_uint',
- '4': 'history_text'
- };
- TREND_TO_TABLE_MAP = {
- '0': 'trends',
- '3': 'trends_uint'
- };
- consolidateByFunc = {
- 'avg': 'AVG',
- 'min': 'MIN',
- 'max': 'MAX',
- 'sum': 'SUM',
- 'count': 'COUNT'
- };
- consolidateByTrendColumns = {
- 'avg': 'value_avg',
- 'min': 'value_min',
- 'max': 'value_max'
- };
-
- _export('ZabbixDBConnector', ZabbixDBConnector = function () {
- function ZabbixDBConnector(sqlDataSourceId, options, backendSrv, datasourceSrv) {
- _classCallCheck(this, ZabbixDBConnector);
-
- this.backendSrv = backendSrv;
- this.datasourceSrv = datasourceSrv;
-
- var limit = options.limit;
- this.sqlDataSourceId = sqlDataSourceId;
- this.limit = limit || DEFAULT_QUERY_LIMIT;
-
- this.loadSQLDataSource(sqlDataSourceId);
- }
-
- /**
- * Try to load DS with given id to check it's exist.
- * @param {*} datasourceId ID of SQL data source
- */
-
-
- _createClass(ZabbixDBConnector, [{
- key: 'loadSQLDataSource',
- value: function loadSQLDataSource(datasourceId) {
- var _this = this;
-
- var ds = _.find(this.datasourceSrv.getAll(), { 'id': datasourceId });
- if (ds) {
- return this.datasourceSrv.loadDatasource(ds.name).then(function (ds) {
- _this.sqlDataSourceType = ds.meta.id;
- return ds;
- });
- } else {
- return Promise.reject('SQL Data Source with ID ' + datasourceId + ' not found');
- }
- }
- }, {
- key: 'testSQLDataSource',
- value: function testSQLDataSource() {
- var testQuery = TEST_MYSQL_QUERY;
- if (this.sqlDataSourceType === 'postgres') {
- testQuery = TEST_POSTGRES_QUERY;
- }
- return this.invokeSQLQuery(testQuery);
- }
- }, {
- key: 'getHistory',
- value: function getHistory(items, timeFrom, timeTill, options) {
- var _this2 = this;
-
- var intervalMs = options.intervalMs,
- consolidateBy = options.consolidateBy;
-
- var intervalSec = Math.ceil(intervalMs / 1000);
-
- consolidateBy = consolidateBy || 'avg';
- var aggFunction = consolidateByFunc[consolidateBy];
-
- // Group items by value type and perform request for each value type
- var grouped_items = _.groupBy(items, 'value_type');
- var promises = _.map(grouped_items, function (items, value_type) {
- var itemids = _.map(items, 'itemid').join(', ');
- var table = HISTORY_TO_TABLE_MAP[value_type];
-
- var dialect = _this2.sqlDataSourceType;
- var query = buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, dialect);
-
- query = compactSQLQuery(query);
- return _this2.invokeSQLQuery(query);
- });
-
- return Promise.all(promises).then(function (results) {
- return _.flatten(results);
- });
- }
- }, {
- key: 'getTrends',
- value: function getTrends(items, timeFrom, timeTill, options) {
- var _this3 = this;
-
- var intervalMs = options.intervalMs,
- consolidateBy = options.consolidateBy;
-
- var intervalSec = Math.ceil(intervalMs / 1000);
-
- consolidateBy = consolidateBy || 'avg';
- var aggFunction = consolidateByFunc[consolidateBy];
-
- // Group items by value type and perform request for each value type
- var grouped_items = _.groupBy(items, 'value_type');
- var promises = _.map(grouped_items, function (items, value_type) {
- var itemids = _.map(items, 'itemid').join(', ');
- var table = TREND_TO_TABLE_MAP[value_type];
- var valueColumn = _.includes(['avg', 'min', 'max'], consolidateBy) ? consolidateBy : 'avg';
- valueColumn = consolidateByTrendColumns[valueColumn];
-
- var dialect = _this3.sqlDataSourceType;
- var query = buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn, dialect);
-
- query = compactSQLQuery(query);
- return _this3.invokeSQLQuery(query);
- });
-
- return Promise.all(promises).then(function (results) {
- return _.flatten(results);
- });
- }
- }, {
- key: 'handleGrafanaTSResponse',
- value: function handleGrafanaTSResponse(history, items) {
- var addHostName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
-
- return convertGrafanaTSResponse(history, items, addHostName);
- }
- }, {
- key: 'invokeSQLQuery',
- value: function invokeSQLQuery(query) {
- var queryDef = {
- refId: 'A',
- format: 'time_series',
- datasourceId: this.sqlDataSourceId,
- rawSql: query,
- maxDataPoints: this.limit
- };
-
- return this.backendSrv.datasourceRequest({
- url: '/api/tsdb/query',
- method: 'POST',
- data: {
- queries: [queryDef]
- }
- }).then(function (response) {
- var results = response.data.results;
- if (results['A']) {
- return results['A'].series;
- } else {
- return null;
- }
- });
- }
- }]);
-
- return ZabbixDBConnector;
- }());
-
- _export('ZabbixDBConnector', ZabbixDBConnector);
-
- TEST_MYSQL_QUERY = 'SELECT itemid AS metric, clock AS time_sec, value_avg AS value FROM trends_uint LIMIT 1';
- itemid_format = 'FM99999999999999999999';
- TEST_POSTGRES_QUERY = '\n SELECT to_char(itemid, \'' + itemid_format + '\') AS metric, clock AS time, value_avg AS value\n FROM trends_uint LIMIT 1\n';
- }
- };
-});
-//# sourceMappingURL=zabbixDBConnector.js.map
diff --git a/dist/datasource-zabbix/zabbixAlerting.service.js b/dist/datasource-zabbix/zabbixAlerting.service.js
index dcb1c2e..d16b9e1 100644
--- a/dist/datasource-zabbix/zabbixAlerting.service.js
+++ b/dist/datasource-zabbix/zabbixAlerting.service.js
@@ -91,13 +91,9 @@ System.register(['lodash', 'jquery', 'angular'], function (_export, _context) {
}, {
key: 'getPanelModels',
value: function getPanelModels() {
- return _.flatten(_.map(this.dashboardSrv.dash.rows, function (row) {
- if (row.collapse) {
- return [];
- } else {
- return row.panels;
- }
- }));
+ return _.filter(this.dashboardSrv.dash.panels, function (panel) {
+ return panel.type !== 'row';
+ });
}
}, {
key: 'getPanelModel',
diff --git a/dist/datasource-zabbix/zabbixAlerting.service.js.map b/dist/datasource-zabbix/zabbixAlerting.service.js.map
index c368ec4..72524f6 100644
--- a/dist/datasource-zabbix/zabbixAlerting.service.js.map
+++ b/dist/datasource-zabbix/zabbixAlerting.service.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../src/datasource-zabbix/zabbixAlerting.service.js"],"names":["_","$","angular","ZabbixAlertingService","dashboardSrv","dash","meta","fullscreen","panelId","alertState","panelIndex","panelContainers","filter","elem","clientHeight","clientWidth","panelModels","getPanelModels","isFullScreen","findIndex","panel","id","alertClass","removeClass","addClass","flatten","map","rows","row","collapse","panels","find","threshold","getPanelModel","containsThreshold","thresholds","value","type","thresholdOptions","colorMode","fill","line","lineColor","op","source","push","module","service"],"mappings":"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","file":"zabbixAlerting.service.js","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport angular from 'angular';\n\nclass ZabbixAlertingService {\n\n /** @ngInject */\n constructor(dashboardSrv) {\n this.dashboardSrv = dashboardSrv;\n }\n\n isFullScreen() {\n return this.dashboardSrv.dash.meta.fullscreen;\n }\n\n setPanelAlertState(panelId, alertState) {\n let panelIndex;\n\n let panelContainers = _.filter($('.panel-container'), elem => {\n return elem.clientHeight && elem.clientWidth;\n });\n\n let panelModels = this.getPanelModels();\n\n if (this.isFullScreen()) {\n panelIndex = 0;\n } else {\n panelIndex = _.findIndex(panelModels, panel => {\n return panel.id === panelId;\n });\n }\n\n if (panelIndex >= 0) {\n let alertClass = \"panel-has-alert panel-alert-state--ok panel-alert-state--alerting\";\n $(panelContainers[panelIndex]).removeClass(alertClass);\n\n if (alertState) {\n if (alertState === 'alerting') {\n alertClass = \"panel-has-alert panel-alert-state--\" + alertState;\n $(panelContainers[panelIndex]).addClass(alertClass);\n }\n if (alertState === 'ok') {\n alertClass = \"panel-alert-state--\" + alertState;\n $(panelContainers[panelIndex]).addClass(alertClass);\n $(panelContainers[panelIndex]).removeClass(\"panel-has-alert\");\n }\n }\n }\n }\n\n getPanelModels() {\n return _.flatten(_.map(this.dashboardSrv.dash.rows, row => {\n if (row.collapse) {\n return [];\n } else {\n return row.panels;\n }\n }));\n }\n\n getPanelModel(panelId) {\n let panelModels = this.getPanelModels();\n\n return _.find(panelModels, panel => {\n return panel.id === panelId;\n });\n }\n\n setPanelThreshold(panelId, threshold) {\n let panel = this.getPanelModel(panelId);\n let containsThreshold = _.find(panel.thresholds, {value: threshold});\n\n if (panel && panel.type === \"graph\" && !containsThreshold) {\n let thresholdOptions = {\n colorMode : \"custom\",\n fill : false,\n line : true,\n lineColor: \"rgb(255, 0, 0)\",\n op: \"gt\",\n value: threshold,\n source: \"zabbix\"\n };\n\n panel.thresholds.push(thresholdOptions);\n }\n }\n\n removeZabbixThreshold(panelId) {\n let panel = this.getPanelModel(panelId);\n\n if (panel && panel.type === \"graph\") {\n panel.thresholds = _.filter(panel.thresholds, threshold => {\n return threshold.source !== \"zabbix\";\n });\n }\n }\n\n}\n\nangular\n .module('grafana.services')\n .service('zabbixAlertingSrv', ZabbixAlertingService);\n"]}
\ No newline at end of file
+{"version":3,"sources":["../../src/datasource-zabbix/zabbixAlerting.service.js"],"names":["_","$","angular","ZabbixAlertingService","dashboardSrv","dash","meta","fullscreen","panelId","alertState","panelIndex","panelContainers","filter","elem","clientHeight","clientWidth","panelModels","getPanelModels","isFullScreen","findIndex","panel","id","alertClass","removeClass","addClass","panels","type","find","threshold","getPanelModel","containsThreshold","thresholds","value","thresholdOptions","colorMode","fill","line","lineColor","op","source","push","module","service"],"mappings":"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","file":"zabbixAlerting.service.js","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport angular from 'angular';\n\nclass ZabbixAlertingService {\n\n /** @ngInject */\n constructor(dashboardSrv) {\n this.dashboardSrv = dashboardSrv;\n }\n\n isFullScreen() {\n return this.dashboardSrv.dash.meta.fullscreen;\n }\n\n setPanelAlertState(panelId, alertState) {\n let panelIndex;\n\n let panelContainers = _.filter($('.panel-container'), elem => {\n return elem.clientHeight && elem.clientWidth;\n });\n\n let panelModels = this.getPanelModels();\n\n if (this.isFullScreen()) {\n panelIndex = 0;\n } else {\n panelIndex = _.findIndex(panelModels, panel => {\n return panel.id === panelId;\n });\n }\n\n if (panelIndex >= 0) {\n let alertClass = \"panel-has-alert panel-alert-state--ok panel-alert-state--alerting\";\n $(panelContainers[panelIndex]).removeClass(alertClass);\n\n if (alertState) {\n if (alertState === 'alerting') {\n alertClass = \"panel-has-alert panel-alert-state--\" + alertState;\n $(panelContainers[panelIndex]).addClass(alertClass);\n }\n if (alertState === 'ok') {\n alertClass = \"panel-alert-state--\" + alertState;\n $(panelContainers[panelIndex]).addClass(alertClass);\n $(panelContainers[panelIndex]).removeClass(\"panel-has-alert\");\n }\n }\n }\n }\n\n getPanelModels() {\n return _.filter(this.dashboardSrv.dash.panels, panel => panel.type !== 'row');\n }\n\n getPanelModel(panelId) {\n let panelModels = this.getPanelModels();\n\n return _.find(panelModels, panel => {\n return panel.id === panelId;\n });\n }\n\n setPanelThreshold(panelId, threshold) {\n let panel = this.getPanelModel(panelId);\n let containsThreshold = _.find(panel.thresholds, {value: threshold});\n\n if (panel && panel.type === \"graph\" && !containsThreshold) {\n let thresholdOptions = {\n colorMode : \"custom\",\n fill : false,\n line : true,\n lineColor: \"rgb(255, 0, 0)\",\n op: \"gt\",\n value: threshold,\n source: \"zabbix\"\n };\n\n panel.thresholds.push(thresholdOptions);\n }\n }\n\n removeZabbixThreshold(panelId) {\n let panel = this.getPanelModel(panelId);\n\n if (panel && panel.type === \"graph\") {\n panel.thresholds = _.filter(panel.thresholds, threshold => {\n return threshold.source !== \"zabbix\";\n });\n }\n }\n\n}\n\nangular\n .module('grafana.services')\n .service('zabbixAlertingSrv', ZabbixAlertingService);\n"]}
\ No newline at end of file
diff --git a/dist/panel-triggers/partials/module.html b/dist/panel-triggers/partials/module.html
index 5829f00..ae77925 100644
--- a/dist/panel-triggers/partials/module.html
+++ b/dist/panel-triggers/partials/module.html
@@ -3,10 +3,12 @@
-
+
-
+
@@ -32,11 +34,13 @@
-
+
{{ctrl.triggerStatusMap[trigger.value]}}
-
+
{{trigger.severity}}
diff --git a/dist/panel-triggers/partials/options_tab.html b/dist/panel-triggers/partials/options_tab.html
index d88bbc1..72b695a 100644
--- a/dist/panel-triggers/partials/options_tab.html
+++ b/dist/panel-triggers/partials/options_tab.html
@@ -116,6 +116,12 @@
ng-model="ctrl.panel.pageSize"
ng-model-onblur ng-change="ctrl.render()">
+
+
{{ trigger.priority }}
-
+
{
});
});
});
+
+ describe('When formatting acknowledges', () => {
+ beforeEach(() => {
+ ctx.panelCtrl = createPanelCtrl();
+ });
+
+ it('should build proper user name', () => {
+ const ack = {
+ alias: 'alias', name: 'name', surname: 'surname'
+ };
+
+ const formatted = ctx.panelCtrl.formatAcknowledge(ack);
+ expect(formatted.user).toBe('alias (name surname)');
+ });
+
+ it('should return empty name if it is not defined', () => {
+ const formatted = ctx.panelCtrl.formatAcknowledge({});
+ expect(formatted.user).toBe('');
+ });
+ });
});
const defaultTrigger = {
diff --git a/dist/panel-triggers/triggers_panel_ctrl.js b/dist/panel-triggers/triggers_panel_ctrl.js
index 76b1290..8d8dc87 100644
--- a/dist/panel-triggers/triggers_panel_ctrl.js
+++ b/dist/panel-triggers/triggers_panel_ctrl.js
@@ -149,7 +149,8 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
// View options
fontSize: '100%',
pageSize: 10,
- highlightNewEvents: true,
+ highlightBackground: false,
+ highlightNewEvents: false,
highlightNewerThan: '1h',
customLastChangeFormat: false,
lastChangeFormat: "",
@@ -366,16 +367,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
});
if (event) {
- trigger.acknowledges = _.map(event.acknowledges, function (ack) {
- var timestamp = moment.unix(ack.clock);
- if (_this6.panel.customLastChangeFormat) {
- ack.time = timestamp.format(_this6.panel.lastChangeFormat);
- } else {
- ack.time = timestamp.format(_this6.defaultTimeFormat);
- }
- ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')';
- return ack;
- });
+ trigger.acknowledges = _.map(event.acknowledges, _this6.formatAcknowledge.bind(_this6));
}
if (!trigger.lastEvent.eventid) {
@@ -386,6 +378,22 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
return triggerList;
});
}
+ }, {
+ key: 'formatAcknowledge',
+ value: function formatAcknowledge(ack) {
+ var timestamp = moment.unix(ack.clock);
+ if (this.panel.customLastChangeFormat) {
+ ack.time = timestamp.format(this.panel.lastChangeFormat);
+ } else {
+ ack.time = timestamp.format(this.defaultTimeFormat);
+ }
+ ack.user = ack.alias || '';
+ if (ack.name || ack.surname) {
+ var fullName = (ack.name || '') + ' ' + (ack.surname || '');
+ ack.user += ' (' + fullName + ')';
+ }
+ return ack;
+ }
}, {
key: 'filterTriggersPre',
value: function filterTriggersPre(triggerList, ds) {
@@ -595,6 +603,10 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
var grafana_user = this.contextSrv.user.name;
var ack_message = grafana_user + ' (Grafana): ' + message;
return this.datasourceSrv.get(trigger.datasource).then(function (datasource) {
+ var userIsEditor = _this8.contextSrv.isEditor || _this8.contextSrv.isGrafanaAdmin;
+ if (datasource.disableReadOnlyUsersAck && !userIsEditor) {
+ return Promise.reject({ message: 'You have no permissions to acknowledge events.' });
+ }
if (eventid) {
return datasource.zabbix.zabbixAPI.acknowledgeEvent(eventid, ack_message);
} else {
@@ -641,9 +653,8 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
}, {
key: 'getAlertIconClass',
value: function getAlertIconClass(trigger) {
- var triggerValue = Number(trigger.value);
var iconClass = '';
- if (triggerValue || trigger.color) {
+ if (trigger.value === '1') {
if (trigger.priority >= 3) {
iconClass = 'icon-gf-critical';
} else {
@@ -658,6 +669,15 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
}
return iconClass;
}
+ }, {
+ key: 'getAlertIconClassBySeverity',
+ value: function getAlertIconClassBySeverity(triggerSeverity) {
+ var iconClass = 'icon-gf-warning';
+ if (triggerSeverity.priority >= 3) {
+ iconClass = 'icon-gf-critical';
+ }
+ return iconClass;
+ }
}, {
key: 'getAlertStateClass',
value: function getAlertStateClass(trigger) {
@@ -675,6 +695,16 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
return statusClass;
}
+ }, {
+ key: 'getBackground',
+ value: function getBackground(trigger) {
+ var mainColor = trigger.color;
+ var secondColor = this.contextSrv.user.lightTheme ? '#dde4ed' : '#262628';
+ if (this.contextSrv.user.lightTheme) {
+ return 'linear-gradient(135deg, ' + secondColor + ', ' + mainColor + ')';
+ }
+ return 'linear-gradient(135deg, ' + mainColor + ', ' + secondColor + ')';
+ }
}, {
key: 'isNewTrigger',
value: function isNewTrigger(trigger) {
diff --git a/dist/panel-triggers/triggers_panel_ctrl.js.map b/dist/panel-triggers/triggers_panel_ctrl.js.map
index 966d09f..5fea90a 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","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","timestamp","unix","ack","clock","time","format","user","alias","name","surname","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","zabbixAPI","acknowledgeEvent","reject","startPos","endPos","Math","min","groupNames","groups","triggerValue","iconClass","isNewTrigger","statusClass","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 highlightNewEvents: true,\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, 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 + ' (' + ack.name + ' ' + ack.surname + ')';\n return ack;\n });\n }\n\n if (!trigger.lastEvent.eventid) {\n trigger.lastEvent = null;\n }\n });\n\n return triggerList;\n });\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 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 const triggerValue = Number(trigger.value);\n let iconClass = '';\n if (triggerValue || trigger.color) {\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 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 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
diff --git a/dist/plugin.json b/dist/plugin.json
index fe0f02b..785d018 100644
--- a/dist/plugin.json
+++ b/dist/plugin.json
@@ -26,8 +26,8 @@
{"name": "Metric Editor", "path": "img/screenshot-metric_editor.png"},
{"name": "Triggers", "path": "img/screenshot-triggers.png"}
],
- "version": "3.8.1",
- "updated": "2017-12-21"
+ "version": "3.9.1",
+ "updated": "2018-05-02"
},
"includes": [
@@ -49,7 +49,7 @@
],
"dependencies": {
- "grafanaVersion": "3.x 4.x",
+ "grafanaVersion": "5.x",
"plugins": []
}
}
diff --git a/src/datasource-zabbix/datasource.js b/src/datasource-zabbix/datasource.js
index 4c8ca67..290eb3a 100644
--- a/src/datasource-zabbix/datasource.js
+++ b/src/datasource-zabbix/datasource.js
@@ -28,7 +28,7 @@ class ZabbixAPIDatasource {
this.basicAuth = instanceSettings.basicAuth;
this.withCredentials = instanceSettings.withCredentials;
- const jsonData = instanceSettings.jsonData;
+ const jsonData = instanceSettings.jsonData || {};
// Zabbix API credentials
this.username = jsonData.username;
@@ -48,6 +48,9 @@ class ZabbixAPIDatasource {
this.addThresholds = jsonData.addThresholds;
this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;
+ // Other options
+ this.disableReadOnlyUsersAck = jsonData.disableReadOnlyUsersAck;
+
// Direct DB Connection options
let dbConnectionOptions = jsonData.dbConnection || {};
this.enableDirectDBConnection = dbConnectionOptions.enable;
@@ -206,11 +209,7 @@ class ZabbixAPIDatasource {
return getHistoryPromise
.then(timeseries => this.applyDataProcessingFunctions(timeseries, target))
- .then(timeseries => downsampleSeries(timeseries, options))
- .catch(error => {
- console.log(error);
- return [];
- });
+ .then(timeseries => downsampleSeries(timeseries, options));
}
getTrendValueType(target) {
diff --git a/src/datasource-zabbix/partials/config.html b/src/datasource-zabbix/partials/config.html
index 7f626c2..0df7462 100644
--- a/src/datasource-zabbix/partials/config.html
+++ b/src/datasource-zabbix/partials/config.html
@@ -126,3 +126,11 @@
+
+
+
Other
+
+
+
diff --git a/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js b/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js
index d47ed4b..aee4daa 100644
--- a/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js
+++ b/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js
@@ -203,7 +203,7 @@ function buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, ag
function buildMysqlHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {
let time_expression = `clock DIV ${intervalSec} * ${intervalSec}`;
let query = `
- SELECT itemid AS metric, ${time_expression} AS time_sec, ${aggFunction}(value) AS value
+ SELECT CAST(itemid AS CHAR) AS metric, ${time_expression} AS time_sec, ${aggFunction}(value) AS value
FROM ${table}
WHERE itemid IN (${itemids})
AND clock > ${timeFrom} AND clock < ${timeTill}
@@ -216,7 +216,7 @@ function buildMysqlHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec,
function buildMysqlTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {
let time_expression = `clock DIV ${intervalSec} * ${intervalSec}`;
let query = `
- SELECT itemid AS metric, ${time_expression} AS time_sec, ${aggFunction}(${valueColumn}) AS value
+ SELECT CAST(itemid AS CHAR) AS metric, ${time_expression} AS time_sec, ${aggFunction}(${valueColumn}) AS value
FROM ${table}
WHERE itemid IN (${itemids})
AND clock > ${timeFrom} AND clock < ${timeTill}
@@ -226,7 +226,7 @@ function buildMysqlTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec,
return query;
}
-const TEST_MYSQL_QUERY = `SELECT itemid AS metric, clock AS time_sec, value_avg AS value FROM trends_uint LIMIT 1`;
+const TEST_MYSQL_QUERY = `SELECT CAST(itemid AS CHAR) AS metric, clock AS time_sec, value_avg AS value FROM trends_uint LIMIT 1`;
////////////////
// PostgreSQL //
diff --git a/src/datasource-zabbix/zabbixAlerting.service.js b/src/datasource-zabbix/zabbixAlerting.service.js
index 02e52b8..5e1ecfa 100644
--- a/src/datasource-zabbix/zabbixAlerting.service.js
+++ b/src/datasource-zabbix/zabbixAlerting.service.js
@@ -49,13 +49,7 @@ class ZabbixAlertingService {
}
getPanelModels() {
- return _.flatten(_.map(this.dashboardSrv.dash.rows, row => {
- if (row.collapse) {
- return [];
- } else {
- return row.panels;
- }
- }));
+ return _.filter(this.dashboardSrv.dash.panels, panel => panel.type !== 'row');
}
getPanelModel(panelId) {
diff --git a/src/panel-triggers/partials/module.html b/src/panel-triggers/partials/module.html
index 5829f00..ae77925 100644
--- a/src/panel-triggers/partials/module.html
+++ b/src/panel-triggers/partials/module.html
@@ -3,10 +3,12 @@
-
+
-
+
@@ -32,11 +34,13 @@
-
+
{{ctrl.triggerStatusMap[trigger.value]}}
-
+
{{trigger.severity}}
diff --git a/src/panel-triggers/partials/options_tab.html b/src/panel-triggers/partials/options_tab.html
index d88bbc1..72b695a 100644
--- a/src/panel-triggers/partials/options_tab.html
+++ b/src/panel-triggers/partials/options_tab.html
@@ -116,6 +116,12 @@
ng-model="ctrl.panel.pageSize"
ng-model-onblur ng-change="ctrl.render()">
+
+
{{ trigger.priority }}
-
+
{
});
});
});
+
+ describe('When formatting acknowledges', () => {
+ beforeEach(() => {
+ ctx.panelCtrl = createPanelCtrl();
+ });
+
+ it('should build proper user name', () => {
+ const ack = {
+ alias: 'alias', name: 'name', surname: 'surname'
+ };
+
+ const formatted = ctx.panelCtrl.formatAcknowledge(ack);
+ expect(formatted.user).toBe('alias (name surname)');
+ });
+
+ it('should return empty name if it is not defined', () => {
+ const formatted = ctx.panelCtrl.formatAcknowledge({});
+ expect(formatted.user).toBe('');
+ });
+ });
});
const defaultTrigger = {
diff --git a/src/panel-triggers/triggers_panel_ctrl.js b/src/panel-triggers/triggers_panel_ctrl.js
index a383291..ae938f1 100644
--- a/src/panel-triggers/triggers_panel_ctrl.js
+++ b/src/panel-triggers/triggers_panel_ctrl.js
@@ -50,7 +50,8 @@ export const PANEL_DEFAULTS = {
// View options
fontSize: '100%',
pageSize: 10,
- highlightNewEvents: true,
+ highlightBackground: false,
+ highlightNewEvents: false,
highlightNewerThan: '1h',
customLastChangeFormat: false,
lastChangeFormat: "",
@@ -242,16 +243,7 @@ export class TriggerPanelCtrl extends PanelCtrl {
});
if (event) {
- trigger.acknowledges = _.map(event.acknowledges, ack => {
- let timestamp = moment.unix(ack.clock);
- if (this.panel.customLastChangeFormat) {
- ack.time = timestamp.format(this.panel.lastChangeFormat);
- } else {
- ack.time = timestamp.format(this.defaultTimeFormat);
- }
- ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')';
- return ack;
- });
+ trigger.acknowledges = _.map(event.acknowledges, this.formatAcknowledge.bind(this));
}
if (!trigger.lastEvent.eventid) {
@@ -263,6 +255,21 @@ export class TriggerPanelCtrl extends PanelCtrl {
});
}
+ formatAcknowledge(ack) {
+ let timestamp = moment.unix(ack.clock);
+ if (this.panel.customLastChangeFormat) {
+ ack.time = timestamp.format(this.panel.lastChangeFormat);
+ } else {
+ ack.time = timestamp.format(this.defaultTimeFormat);
+ }
+ ack.user = ack.alias || '';
+ if (ack.name || ack.surname) {
+ const fullName = `${ack.name || ''} ${ack.surname || ''}`;
+ ack.user += ` (${fullName})`;
+ }
+ return ack;
+ }
+
filterTriggersPre(triggerList, ds) {
// Filter triggers by description
let triggerFilter = this.panel.targets[ds].trigger.filter;
@@ -446,6 +453,10 @@ export class TriggerPanelCtrl extends PanelCtrl {
let ack_message = grafana_user + ' (Grafana): ' + message;
return this.datasourceSrv.get(trigger.datasource)
.then(datasource => {
+ const userIsEditor = this.contextSrv.isEditor || this.contextSrv.isGrafanaAdmin;
+ if (datasource.disableReadOnlyUsersAck && !userIsEditor) {
+ return Promise.reject({message: 'You have no permissions to acknowledge events.'});
+ }
if (eventid) {
return datasource.zabbix.zabbixAPI.acknowledgeEvent(eventid, ack_message);
} else {
@@ -490,9 +501,8 @@ export class TriggerPanelCtrl extends PanelCtrl {
}
getAlertIconClass(trigger) {
- const triggerValue = Number(trigger.value);
let iconClass = '';
- if (triggerValue || trigger.color) {
+ if (trigger.value === '1') {
if (trigger.priority >= 3) {
iconClass = 'icon-gf-critical';
} else {
@@ -508,6 +518,14 @@ export class TriggerPanelCtrl extends PanelCtrl {
return iconClass;
}
+ getAlertIconClassBySeverity(triggerSeverity) {
+ let iconClass = 'icon-gf-warning';
+ if (triggerSeverity.priority >= 3) {
+ iconClass = 'icon-gf-critical';
+ }
+ return iconClass;
+ }
+
getAlertStateClass(trigger) {
let statusClass = '';
@@ -524,6 +542,15 @@ export class TriggerPanelCtrl extends PanelCtrl {
return statusClass;
}
+ getBackground(trigger) {
+ const mainColor = trigger.color;
+ const secondColor = this.contextSrv.user.lightTheme ? '#dde4ed' : '#262628';
+ if (this.contextSrv.user.lightTheme) {
+ return `linear-gradient(135deg, ${secondColor}, ${mainColor})`;
+ }
+ return `linear-gradient(135deg, ${mainColor}, ${secondColor})`;
+ }
+
isNewTrigger(trigger) {
try {
const highlightIntervalMs = utils.parseInterval(this.panel.highlightNewerThan || PANEL_DEFAULTS.highlightNewerThan);
diff --git a/src/plugin.json b/src/plugin.json
index fe0f02b..785d018 100644
--- a/src/plugin.json
+++ b/src/plugin.json
@@ -26,8 +26,8 @@
{"name": "Metric Editor", "path": "img/screenshot-metric_editor.png"},
{"name": "Triggers", "path": "img/screenshot-triggers.png"}
],
- "version": "3.8.1",
- "updated": "2017-12-21"
+ "version": "3.9.1",
+ "updated": "2018-05-02"
},
"includes": [
@@ -49,7 +49,7 @@
],
"dependencies": {
- "grafanaVersion": "3.x 4.x",
+ "grafanaVersion": "5.x",
"plugins": []
}
}
diff --git a/src/sass/_panel-triggers.scss b/src/sass/_panel-triggers.scss
index 463a9f0..5052ee9 100644
--- a/src/sass/_panel-triggers.scss
+++ b/src/sass/_panel-triggers.scss
@@ -38,10 +38,6 @@
}
}
- .alert-list-footer {
- justify-content: flex-start;
- }
-
.trigger-info-block {
display: flex;
@@ -59,10 +55,6 @@
opacity: 0.4;
}
}
-
- .card-item-wrapper {
- padding-left: 4px;
- }
}
.zbx-trigger-card {
@@ -81,12 +73,28 @@
color: $orange;
}
+.zbx-trigger-highlighted {
+ color: $zbx-text-highlighted;
-@keyframes zabbix-triggers-panel {
- 100% {
- opacity: 1;
- box-shadow: 0 0 10px 0px rgba($red, 1);
- border-bottom-color: rgba($red, 0.25);
+ .alert-rule-item__body,
+ .alert-rule-item__header,
+ .alert-rule-item__time,
+ .zabbix-hostname,
+ .zbx-description {
+ color: $zbx-text-highlighted;
+ }
+
+ .alert-rule-item__text {
+ .zbx-trigger-state,
+ .zbx-trigger-severity {
+ color: $zbx-text-highlighted;
+ }
+ }
+
+ .zbx-trigger-lastchange .trigger-info-block.zbx-status-icons {
+ a, i {
+ color: $zbx-text-highlighted;
+ }
}
}
@@ -164,8 +172,9 @@
.triggers-severity-config {
&.gf-form-label {
- padding-top: 4px;
- padding-bottom: 4px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ border-radius: 0px;
}
.icon-gf {
diff --git a/src/sass/_variables.dark.scss b/src/sass/_variables.dark.scss
index 95f6b5e..4b94817 100644
--- a/src/sass/_variables.dark.scss
+++ b/src/sass/_variables.dark.scss
@@ -37,3 +37,4 @@ $tight-form-func-bg: #333;
$grafanaListAccent: lighten($dark-2, 2%);
$zbx-tag-color: $gray-5;
+$zbx-text-highlighted: $white;
diff --git a/src/sass/_variables.light.scss b/src/sass/_variables.light.scss
index 5652967..d926d11 100644
--- a/src/sass/_variables.light.scss
+++ b/src/sass/_variables.light.scss
@@ -36,3 +36,4 @@ $tight-form-func-bg: $gray-5;
$grafanaListAccent: $gray-5;
$zbx-tag-color: $gray-6;
+$zbx-text-highlighted: $black;