diff --git a/dist/datasource-zabbix/config.controller.js b/dist/datasource-zabbix/config.controller.js new file mode 100644 index 0000000..9b753aa --- /dev/null +++ b/dist/datasource-zabbix/config.controller.js @@ -0,0 +1,74 @@ +'use strict'; + +System.register(['lodash'], function (_export, _context) { + "use strict"; + + var _, _createClass, SUPPORTED_SQL_DS, defaultConfig, ZabbixDSConfigController; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + 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; + }; + }(); + + SUPPORTED_SQL_DS = ['mysql']; + defaultConfig = { + dbConnection: { + enable: false + } + }; + + _export('ZabbixDSConfigController', ZabbixDSConfigController = function () { + /** @ngInject */ + function ZabbixDSConfigController($scope, $injector, datasourceSrv) { + _classCallCheck(this, ZabbixDSConfigController); + + this.datasourceSrv = datasourceSrv; + + _.defaults(this.current.jsonData, defaultConfig); + this.sqlDataSources = this.getSupportedSQLDataSources(); + } + + _createClass(ZabbixDSConfigController, [{ + key: 'getSupportedSQLDataSources', + value: function getSupportedSQLDataSources() { + var datasources = this.datasourceSrv.getAll(); + return _.filter(datasources, function (ds) { + return _.includes(SUPPORTED_SQL_DS, ds.type); + }); + } + }]); + + return ZabbixDSConfigController; + }()); + + _export('ZabbixDSConfigController', ZabbixDSConfigController); + + ZabbixDSConfigController.templateUrl = 'datasource-zabbix/partials/config.html'; + } + }; +}); +//# sourceMappingURL=config.controller.js.map diff --git a/dist/datasource-zabbix/config.controller.js.map b/dist/datasource-zabbix/config.controller.js.map new file mode 100644 index 0000000..afc3a6b --- /dev/null +++ b/dist/datasource-zabbix/config.controller.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/datasource-zabbix/config.controller.js"],"names":["_","SUPPORTED_SQL_DS","defaultConfig","dbConnection","enable","ZabbixDSConfigController","$scope","$injector","datasourceSrv","defaults","current","jsonData","sqlDataSources","getSupportedSQLDataSources","datasources","getAll","filter","includes","ds","type","templateUrl"],"mappings":";;;;;;;;;;;;;;;AAAOA,O;;;;;;;;;;;;;;;;;;;;;AAEDC,sB,GAAmB,CAAC,OAAD,C;AAEnBC,mB,GAAgB;AACpBC,sBAAc;AACZC,kBAAQ;AADI;AADM,O;;0CAMTC,wB;AACX;AACA,0CAAYC,MAAZ,EAAoBC,SAApB,EAA+BC,aAA/B,EAA8C;AAAA;;AAC5C,eAAKA,aAAL,GAAqBA,aAArB;;AAEAR,YAAES,QAAF,CAAW,KAAKC,OAAL,CAAaC,QAAxB,EAAkCT,aAAlC;AACA,eAAKU,cAAL,GAAsB,KAAKC,0BAAL,EAAtB;AACD;;;;uDAE4B;AAC3B,gBAAIC,cAAc,KAAKN,aAAL,CAAmBO,MAAnB,EAAlB;AACA,mBAAOf,EAAEgB,MAAF,CAASF,WAAT,EAAsB,cAAM;AACjC,qBAAOd,EAAEiB,QAAF,CAAWhB,gBAAX,EAA6BiB,GAAGC,IAAhC,CAAP;AACD,aAFM,CAAP;AAGD;;;;;;;;AAGHd,+BAAyBe,WAAzB,GAAuC,wCAAvC","file":"config.controller.js","sourcesContent":["import _ from 'lodash';\n\nconst SUPPORTED_SQL_DS = ['mysql'];\n\nconst defaultConfig = {\n dbConnection: {\n enable: false,\n }\n};\n\nexport class ZabbixDSConfigController {\n /** @ngInject */\n constructor($scope, $injector, datasourceSrv) {\n this.datasourceSrv = datasourceSrv;\n\n _.defaults(this.current.jsonData, defaultConfig);\n this.sqlDataSources = this.getSupportedSQLDataSources();\n }\n\n getSupportedSQLDataSources() {\n let datasources = this.datasourceSrv.getAll();\n return _.filter(datasources, ds => {\n return _.includes(SUPPORTED_SQL_DS, ds.type);\n });\n }\n}\n\nZabbixDSConfigController.templateUrl = 'datasource-zabbix/partials/config.html';\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/datasource.js b/dist/datasource-zabbix/datasource.js index 505a619..bc8e398 100644 --- a/dist/datasource-zabbix/datasource.js +++ b/dist/datasource-zabbix/datasource.js @@ -23,10 +23,23 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', }); } + 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, dataProcessor.AVERAGE, timeseries.datapoints); + timeseries.datapoints = dataProcessor.groupBy(options.interval, consolidateByFunc, timeseries.datapoints); } return timeseries; }); @@ -191,6 +204,9 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', 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; @@ -215,10 +231,21 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', this.addThresholds = instanceSettings.jsonData.addThresholds; this.alertingMinSeverity = instanceSettings.jsonData.alertingMinSeverity || c.SEV_WARNING; - this.zabbix = new Zabbix(this.url, this.username, this.password, this.basicAuth, this.withCredentials, this.cacheTTL); + // Direct DB Connection options + this.enableDirectDBConnection = instanceSettings.jsonData.dbConnection.enable; + this.sqlDatasourceId = instanceSettings.jsonData.dbConnection.datasourceId; - // Use custom format for template variables - this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv); + 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); } //////////////////////// @@ -324,26 +351,38 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', }; return this.zabbix.getItemsFromTarget(target, getItemOptions).then(function (items) { var getHistoryPromise = void 0; + options.consolidateBy = getConsolidateBy(target); if (useTrends) { - var valueType = _this2.getTrendValueType(target); - getHistoryPromise = _this2.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]; - }); + if (_this2.enableDirectDBConnection) { + getHistoryPromise = _this2.zabbix.getTrendsDB(items, timeFrom, timeTo, options).then(function (history) { + return _this2.zabbix.dbConnector.handleGrafanaTSResponse(history, items); }); - - return timeseries; - }); + } else { + var valueType = _this2.getTrendValueType(target); + getHistoryPromise = _this2.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 - getHistoryPromise = _this2.zabbix.getHistory(items, timeFrom, timeTo).then(function (history) { - return responseHandler.handleHistory(history, items); - }); + if (_this2.enableDirectDBConnection) { + getHistoryPromise = _this2.zabbix.getHistoryDB(items, timeFrom, timeTo, options).then(function (history) { + return _this2.zabbix.dbConnector.handleGrafanaTSResponse(history, items); + }); + } else { + getHistoryPromise = _this2.zabbix.getHistory(items, timeFrom, timeTo).then(function (history) { + return responseHandler.handleHistory(history, items); + }); + } } return getHistoryPromise; diff --git a/dist/datasource-zabbix/datasource.js.map b/dist/datasource-zabbix/datasource.js.map index 6d4e9c2..338081b 100644 --- a/dist/datasource-zabbix/datasource.js.map +++ b/dist/datasource-zabbix/datasource.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","downsampleSeries","timeseries_data","options","timeseries","datapoints","length","maxDataPoints","groupBy","interval","AVERAGE","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","replaceTemplateVars","templateSrv","target","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","ZabbixAPIError","ZabbixAPIDatasource","instanceSettings","alertSrv","dashboardSrv","zabbixAlertingSrv","Zabbix","url","basicAuth","withCredentials","username","jsonData","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","zabbix","partial","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","t","replaceTargetVariables","timeFunctions","functions","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_ITSERVICE","migrate","MODE_METRICS","queryNumericData","MODE_TEXT","queryTextData","itservice","slaProperty","getSLA","serviceid","handleSLAResponse","slaObject","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","getHistoryPromise","valueType","getTrendValueType","getTrend","items","handleTrends","history","series","sortBy","point","DATAPOINT_TS","getHistory","handleHistory","applyDataProcessingFunctions","catch","console","log","error","trendFunctions","trendValueFunc","find","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","unShiftTimeSeries","handleText","resolve","zabbixVersion","getVersion","version","login","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","triggers","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","hosts","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","results","itemids","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport './zabbix.js';\nimport './zabbixAlerting.service.js';\nimport {ZabbixAPIError} from './zabbixAPICore.service.js';\n\nclass ZabbixAPIDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, zabbixAlertingSrv, Zabbix) {\n this.templateSrv = templateSrv;\n this.alertSrv = alertSrv;\n this.dashboardSrv = dashboardSrv;\n this.zabbixAlertingSrv = zabbixAlertingSrv;\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 // Zabbix API credentials\n this.username = instanceSettings.jsonData.username;\n this.password = instanceSettings.jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = instanceSettings.jsonData.trends;\n this.trendsFrom = instanceSettings.jsonData.trendsFrom || '7d';\n this.trendsRange = instanceSettings.jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = instanceSettings.jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = instanceSettings.jsonData.alerting;\n this.addThresholds = instanceSettings.jsonData.addThresholds;\n this.alertingMinSeverity = instanceSettings.jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n this.zabbix = new Zabbix(this.url, this.username, this.password, this.basicAuth, this.withCredentials, this.cacheTTL);\n\n // Use custom format for template variables\n this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);\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 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 !== c.MODE_ITSERVICE) {\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 }\n\n // IT services mode\n else if (target.mode === c.MODE_ITSERVICE) {\n // Don't show undefined and hidden targets\n if (target.hide || !target.itservice || !target.slaProperty) {\n return [];\n }\n\n return this.zabbix.getSLA(target.itservice.serviceid, timeRange)\n .then(slaObject => {\n return responseHandler.handleSLAResponse(target.itservice, target.slaProperty, slaObject);\n });\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 queryNumericData(target, timeRange, useTrends, options) {\n let [timeFrom, timeTo] = timeRange;\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => {\n let getHistoryPromise;\n\n if (useTrends) {\n let valueType = this.getTrendValueType(target);\n getHistoryPromise = this.zabbix.getTrend(items, timeFrom, timeTo)\n .then(history => {\n return responseHandler.handleTrends(history, items, valueType);\n })\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\n return timeseries;\n });\n } else {\n // Use history\n getHistoryPromise = this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => {\n return responseHandler.handleHistory(history, items);\n });\n }\n\n return getHistoryPromise;\n })\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 = _.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 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 return responseHandler.handleText(history, items, target);\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 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.data\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 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 downsampleSeries(timeseries_data, options) {\n return _.map(timeseries_data, timeseries => {\n if (timeseries.datapoints.length > options.maxDataPoints) {\n timeseries.datapoints = dataProcessor\n .groupBy(options.interval, dataProcessor.AVERAGE, 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\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 = /.*[<>]([\\d\\.]+)/;\n let finded_thresholds = expression.match(thresholdPattern);\n if (finded_thresholds && finded_thresholds.length >= 2) {\n let threshold = finded_thresholds[1];\n threshold = Number(threshold);\n return threshold;\n } else {\n return null;\n }\n}\n\nexport {ZabbixAPIDatasource, zabbixTemplateFormat};\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {_.includes = _.contains;}\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","getConsolidateBy","target","consolidateBy","funcDef","find","functions","length","downsampleSeries","timeseries_data","options","defaultAgg","consolidateByFunc","timeseries","datapoints","maxDataPoints","groupBy","interval","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","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","ZabbixAPIError","ZabbixAPIDatasource","instanceSettings","alertSrv","dashboardSrv","zabbixAlertingSrv","Zabbix","partial","url","basicAuth","withCredentials","username","jsonData","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","enableDirectDBConnection","dbConnection","enable","sqlDatasourceId","datasourceId","zabbixOptions","zabbix","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","t","replaceTargetVariables","timeFunctions","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_ITSERVICE","migrate","MODE_METRICS","queryNumericData","MODE_TEXT","queryTextData","itservice","slaProperty","getSLA","serviceid","handleSLAResponse","slaObject","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","getHistoryPromise","getTrendsDB","items","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","handleText","resolve","zabbixVersion","getVersion","version","login","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","triggers","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","hosts","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","results","itemids","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport './zabbix.js';\nimport './zabbixAlerting.service.js';\nimport {ZabbixAPIError} from './zabbixAPICore.service.js';\n\nclass ZabbixAPIDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, zabbixAlertingSrv, Zabbix) {\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 // Zabbix API credentials\n this.username = instanceSettings.jsonData.username;\n this.password = instanceSettings.jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = instanceSettings.jsonData.trends;\n this.trendsFrom = instanceSettings.jsonData.trendsFrom || '7d';\n this.trendsRange = instanceSettings.jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = instanceSettings.jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = instanceSettings.jsonData.alerting;\n this.addThresholds = instanceSettings.jsonData.addThresholds;\n this.alertingMinSeverity = instanceSettings.jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n // Direct DB Connection options\n this.enableDirectDBConnection = instanceSettings.jsonData.dbConnection.enable;\n this.sqlDatasourceId = instanceSettings.jsonData.dbConnection.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);\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 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 !== c.MODE_ITSERVICE) {\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 }\n\n // IT services mode\n else if (target.mode === c.MODE_ITSERVICE) {\n // Don't show undefined and hidden targets\n if (target.hide || !target.itservice || !target.slaProperty) {\n return [];\n }\n\n return this.zabbix.getSLA(target.itservice.serviceid, timeRange)\n .then(slaObject => {\n return responseHandler.handleSLAResponse(target.itservice, target.slaProperty, slaObject);\n });\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 queryNumericData(target, timeRange, useTrends, options) {\n let [timeFrom, timeTo] = timeRange;\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => {\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 })\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 = _.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 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 return responseHandler.handleText(history, items, target);\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 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.data\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 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\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 = /.*[<>]([\\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/metricFunctions.js b/dist/datasource-zabbix/metricFunctions.js index 9016453..d9f8158 100644 --- a/dist/datasource-zabbix/metricFunctions.js +++ b/dist/datasource-zabbix/metricFunctions.js @@ -80,7 +80,8 @@ System.register(['lodash', 'jquery'], function (_export, _context) { Filter: [], Trends: [], Time: [], - Alias: [] + Alias: [], + Special: [] }; addFuncDef({ name: 'groupBy', @@ -225,6 +226,14 @@ System.register(['lodash', 'jquery'], function (_export, _context) { defaultParams: ['/(.*)/', '$1'] }); + // Special + addFuncDef({ + name: 'consolidateBy', + category: 'Special', + params: [{ name: 'type', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count'] }], + defaultParams: ['avg'] + }); + _.each(categories, function (funcList, catName) { categories[catName] = _.sortBy(funcList, 'name'); }); diff --git a/dist/datasource-zabbix/metricFunctions.js.map b/dist/datasource-zabbix/metricFunctions.js.map index e80e9fc..8e9375d 100644 --- a/dist/datasource-zabbix/metricFunctions.js.map +++ b/dist/datasource-zabbix/metricFunctions.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/metricFunctions.js"],"names":["addFuncDef","funcDef","params","defaultParams","category","categories","push","index","name","shortName","createFuncInstance","_","isString","message","FuncInstance","getFuncDef","getCategories","$","Transform","Aggregate","Filter","Trends","Time","Alias","type","options","each","funcList","catName","sortBy","def","slice","updateText","metricFunctions","func","bindedFunc","param","i","length","Number","partial","metricExp","str","parameters","map","value","paramType","isNumeric","unshift","join","strValue","indexOf","optional","_hasMultipleParamsInString","split","partVal","idx","updateParam","trim","splice","text"],"mappings":"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","file":"metricFunctions.js","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\n\nvar index = [];\nvar categories = {\n Transform: [],\n Aggregate: [],\n Filter: [],\n Trends: [],\n Time: [],\n Alias: []\n};\n\nfunction addFuncDef(funcDef) {\n funcDef.params = funcDef.params || [];\n funcDef.defaultParams = funcDef.defaultParams || [];\n\n if (funcDef.category) {\n categories[funcDef.category].push(funcDef);\n }\n index[funcDef.name] = funcDef;\n index[funcDef.shortName || funcDef.name] = funcDef;\n}\n\n// Transform\n\naddFuncDef({\n name: 'groupBy',\n category: 'Transform',\n params: [\n { name: 'interval', type: 'string'},\n { name: 'function', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count', 'median'] }\n ],\n defaultParams: ['1m', 'avg'],\n});\n\naddFuncDef({\n name: 'scale',\n category: 'Transform',\n params: [\n { name: 'factor', type: 'float', options: [100, 0.01, 10, -1]}\n ],\n defaultParams: [100],\n});\n\naddFuncDef({\n name: 'delta',\n category: 'Transform',\n params: [],\n defaultParams: [],\n});\n\naddFuncDef({\n name: 'rate',\n category: 'Transform',\n params: [],\n defaultParams: [],\n});\n\n// Aggregate\n\naddFuncDef({\n name: 'sumSeries',\n category: 'Aggregate',\n params: [],\n defaultParams: [],\n});\n\naddFuncDef({\n name: 'median',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string'}\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'average',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'min',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'max',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'sum',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'count',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'aggregateBy',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' },\n { name: 'function', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count', 'median'] }\n ],\n defaultParams: ['1m', 'avg'],\n});\n\n// Filter\n\naddFuncDef({\n name: 'top',\n category: 'Filter',\n params: [\n { name: 'number', type: 'int' },\n { name: 'value', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count', 'median'] }\n ],\n defaultParams: [5, 'avg'],\n});\n\naddFuncDef({\n name: 'bottom',\n category: 'Filter',\n params: [\n { name: 'number', type: 'int' },\n { name: 'value', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count', 'median'] }\n ],\n defaultParams: [5, 'avg'],\n});\n\n// Trends\n\naddFuncDef({\n name: 'trendValue',\n category: 'Trends',\n params: [\n { name: 'type', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count'] }\n ],\n defaultParams: ['avg'],\n});\n\n// Time\n\naddFuncDef({\n name: 'timeShift',\n category: 'Time',\n params: [\n { name: 'interval', type: 'string', options: ['24h', '7d', '1M', '+24h', '-24h']}\n ],\n defaultParams: ['24h'],\n});\n\n//Alias\n\naddFuncDef({\n name: 'setAlias',\n category: 'Alias',\n params: [\n { name: 'alias', type: 'string' }\n ],\n defaultParams: []\n});\n\naddFuncDef({\n name: 'setAliasByRegex',\n category: 'Alias',\n params: [\n { name: 'aliasByRegex', type: 'string' }\n ],\n defaultParams: []\n});\n\naddFuncDef({\n name: 'replaceAlias',\n category: 'Alias',\n params: [\n { name: 'regexp', type: 'string' },\n { name: 'newAlias', type: 'string' }\n ],\n defaultParams: ['/(.*)/', '$1']\n});\n\n_.each(categories, function(funcList, catName) {\n categories[catName] = _.sortBy(funcList, 'name');\n});\n\nclass FuncInstance {\n constructor(funcDef, params) {\n this.def = funcDef;\n\n if (params) {\n this.params = params;\n } else {\n // Create with default params\n this.params = [];\n this.params = funcDef.defaultParams.slice(0);\n }\n\n this.updateText();\n }\n\n bindFunction(metricFunctions) {\n var func = metricFunctions[this.def.name];\n if (func) {\n\n // Bind function arguments\n var bindedFunc = func;\n var param;\n for (var i = 0; i < this.params.length; i++) {\n param = this.params[i];\n\n // Convert numeric params\n if (this.def.params[i].type === 'int' ||\n this.def.params[i].type === 'float') {\n param = Number(param);\n }\n bindedFunc = _.partial(bindedFunc, param);\n }\n return bindedFunc;\n } else {\n throw { message: 'Method not found ' + this.def.name };\n }\n }\n\n render(metricExp) {\n var str = this.def.name + '(';\n var parameters = _.map(this.params, function(value, index) {\n\n var paramType = this.def.params[index].type;\n if (paramType === 'int' ||\n paramType === 'float' ||\n paramType === 'value_or_series' ||\n paramType === 'boolean') {\n return value;\n }\n else if (paramType === 'int_or_interval' && $.isNumeric(value)) {\n return value;\n }\n\n return \"'\" + value + \"'\";\n\n }, this);\n\n if (metricExp) {\n parameters.unshift(metricExp);\n }\n\n return str + parameters.join(', ') + ')';\n }\n\n _hasMultipleParamsInString(strValue, index) {\n if (strValue.indexOf(',') === -1) {\n return false;\n }\n\n return this.def.params[index + 1] && this.def.params[index + 1].optional;\n }\n\n updateParam(strValue, index) {\n // handle optional parameters\n // if string contains ',' and next param is optional, split and update both\n if (this._hasMultipleParamsInString(strValue, index)) {\n _.each(strValue.split(','), function(partVal, idx) {\n this.updateParam(partVal.trim(), idx);\n }, this);\n return;\n }\n\n if (strValue === '' && this.def.params[index].optional) {\n this.params.splice(index, 1);\n }\n else {\n this.params[index] = strValue;\n }\n\n this.updateText();\n }\n\n updateText() {\n if (this.params.length === 0) {\n this.text = this.def.name + '()';\n return;\n }\n\n var text = this.def.name + '(';\n text += this.params.join(', ');\n text += ')';\n this.text = text;\n }\n}\n\nexport function createFuncInstance(funcDef, params) {\n if (_.isString(funcDef)) {\n if (!index[funcDef]) {\n throw { message: 'Method not found ' + name };\n }\n funcDef = index[funcDef];\n }\n return new FuncInstance(funcDef, params);\n}\n\nexport function getFuncDef(name) {\n return index[name];\n}\n\nexport function getCategories() {\n return categories;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/metricFunctions.js"],"names":["addFuncDef","funcDef","params","defaultParams","category","categories","push","index","name","shortName","createFuncInstance","_","isString","message","FuncInstance","getFuncDef","getCategories","$","Transform","Aggregate","Filter","Trends","Time","Alias","Special","type","options","each","funcList","catName","sortBy","def","slice","updateText","metricFunctions","func","bindedFunc","param","i","length","Number","partial","metricExp","str","parameters","map","value","paramType","isNumeric","unshift","join","strValue","indexOf","optional","_hasMultipleParamsInString","split","partVal","idx","updateParam","trim","splice","text"],"mappings":";;;;;;;;;;;;;AAcA,WAASA,UAAT,CAAoBC,OAApB,EAA6B;AAC3BA,YAAQC,MAAR,GAAiBD,QAAQC,MAAR,IAAkB,EAAnC;AACAD,YAAQE,aAAR,GAAwBF,QAAQE,aAAR,IAAyB,EAAjD;;AAEA,QAAIF,QAAQG,QAAZ,EAAsB;AACpBC,iBAAWJ,QAAQG,QAAnB,EAA6BE,IAA7B,CAAkCL,OAAlC;AACD;AACDM,UAAMN,QAAQO,IAAd,IAAsBP,OAAtB;AACAM,UAAMN,QAAQQ,SAAR,IAAqBR,QAAQO,IAAnC,IAA2CP,OAA3C;AACD;;AAED;;AA6SO,WAASS,kBAAT,CAA4BT,OAA5B,EAAqCC,MAArC,EAA6C;AAClD,QAAIS,EAAEC,QAAF,CAAWX,OAAX,CAAJ,EAAyB;AACvB,UAAI,CAACM,MAAMN,OAAN,CAAL,EAAqB;AACnB,cAAM,EAAEY,SAAS,sBAAsBL,IAAjC,EAAN;AACD;AACDP,gBAAUM,MAAMN,OAAN,CAAV;AACD;AACD,WAAO,IAAIa,YAAJ,CAAiBb,OAAjB,EAA0BC,MAA1B,CAAP;AACD;;gCAReQ,kB;;AAUT,WAASK,UAAT,CAAoBP,IAApB,EAA0B;AAC/B,WAAOD,MAAMC,IAAN,CAAP;AACD;;wBAFeO,U;;AAIT,WAASC,aAAT,GAAyB;AAC9B,WAAOX,UAAP;AACD;;2BAFeW,a;;;;AApVTL,O;;AACAM,O;;;;;;;;;;;;;;;;;;;;;AAEHV,W,GAAQ,E;AACRF,gB,GAAa;AACfa,mBAAW,EADI;AAEfC,mBAAW,EAFI;AAGfC,gBAAQ,EAHO;AAIfC,gBAAQ,EAJO;AAKfC,cAAM,EALS;AAMfC,eAAO,EANQ;AAOfC,iBAAS;AAPM,O;AAuBjBxB,iBAAW;AACTQ,cAAM,SADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EADM,EAEN,EAAEjB,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EAAoCC,SAAS,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,EAA6B,OAA7B,EAAsC,QAAtC,CAA7C,EAFM,CAHC;AAOTvB,uBAAe,CAAC,IAAD,EAAO,KAAP;AAPN,OAAX;;AAUAH,iBAAW;AACTQ,cAAM,OADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,QAAR,EAAkBiB,MAAM,OAAxB,EAAiCC,SAAS,CAAC,GAAD,EAAM,IAAN,EAAY,EAAZ,EAAgB,CAAC,CAAjB,CAA1C,EADM,CAHC;AAMTvB,uBAAe,CAAC,GAAD;AANN,OAAX;;AASAH,iBAAW;AACTQ,cAAM,OADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,EAHC;AAITC,uBAAe;AAJN,OAAX;;AAOAH,iBAAW;AACTQ,cAAM,MADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,EAHC;AAITC,uBAAe;AAJN,OAAX;;AAOA;;AAEAH,iBAAW;AACTQ,cAAM,WADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,EAHC;AAITC,uBAAe;AAJN,OAAX;;AAOAH,iBAAW;AACTQ,cAAM,QADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EADM,CAHC;AAMTtB,uBAAe,CAAC,IAAD;AANN,OAAX;;AASAH,iBAAW;AACTQ,cAAM,SADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EADM,CAHC;AAMTtB,uBAAe,CAAC,IAAD;AANN,OAAX;;AASAH,iBAAW;AACTQ,cAAM,KADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EADM,CAHC;AAMTtB,uBAAe,CAAC,IAAD;AANN,OAAX;;AASAH,iBAAW;AACTQ,cAAM,KADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EADM,CAHC;AAMTtB,uBAAe,CAAC,IAAD;AANN,OAAX;;AASAH,iBAAW;AACTQ,cAAM,KADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EADM,CAHC;AAMTtB,uBAAe,CAAC,IAAD;AANN,OAAX;;AASAH,iBAAW;AACTQ,cAAM,OADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EADM,CAHC;AAMTtB,uBAAe,CAAC,IAAD;AANN,OAAX;;AASAH,iBAAW;AACTQ,cAAM,aADG;AAETJ,kBAAU,WAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EADM,EAEN,EAAEjB,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EAAoCC,SAAS,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,EAA6B,OAA7B,EAAsC,QAAtC,CAA7C,EAFM,CAHC;AAOTvB,uBAAe,CAAC,IAAD,EAAO,KAAP;AAPN,OAAX;;AAUA;;AAEAH,iBAAW;AACTQ,cAAM,KADG;AAETJ,kBAAU,QAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,QAAR,EAAkBiB,MAAM,KAAxB,EADM,EAEN,EAAEjB,MAAM,OAAR,EAAiBiB,MAAM,QAAvB,EAAiCC,SAAS,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,EAA6B,OAA7B,EAAsC,QAAtC,CAA1C,EAFM,CAHC;AAOTvB,uBAAe,CAAC,CAAD,EAAI,KAAJ;AAPN,OAAX;;AAUAH,iBAAW;AACTQ,cAAM,QADG;AAETJ,kBAAU,QAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,QAAR,EAAkBiB,MAAM,KAAxB,EADM,EAEN,EAAEjB,MAAM,OAAR,EAAiBiB,MAAM,QAAvB,EAAiCC,SAAS,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,EAA6B,OAA7B,EAAsC,QAAtC,CAA1C,EAFM,CAHC;AAOTvB,uBAAe,CAAC,CAAD,EAAI,KAAJ;AAPN,OAAX;;AAUA;;AAEAH,iBAAW;AACTQ,cAAM,YADG;AAETJ,kBAAU,QAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,MAAR,EAAgBiB,MAAM,QAAtB,EAAgCC,SAAS,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,EAA6B,OAA7B,CAAzC,EADM,CAHC;AAMTvB,uBAAe,CAAC,KAAD;AANN,OAAX;;AASA;;AAEAH,iBAAW;AACTQ,cAAM,WADG;AAETJ,kBAAU,MAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EAAoCC,SAAS,CAAC,KAAD,EAAQ,IAAR,EAAc,IAAd,EAAoB,MAApB,EAA4B,MAA5B,CAA7C,EADM,CAHC;AAMTvB,uBAAe,CAAC,KAAD;AANN,OAAX;;AASA;;AAEAH,iBAAW;AACTQ,cAAM,UADG;AAETJ,kBAAU,OAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,OAAR,EAAiBiB,MAAM,QAAvB,EADM,CAHC;AAMTtB,uBAAe;AANN,OAAX;;AASAH,iBAAW;AACTQ,cAAM,iBADG;AAETJ,kBAAU,OAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,cAAR,EAAwBiB,MAAM,QAA9B,EADM,CAHC;AAMTtB,uBAAe;AANN,OAAX;;AASAH,iBAAW;AACTQ,cAAM,cADG;AAETJ,kBAAU,OAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,QAAR,EAAkBiB,MAAM,QAAxB,EADM,EAEN,EAAEjB,MAAM,UAAR,EAAoBiB,MAAM,QAA1B,EAFM,CAHC;AAOTtB,uBAAe,CAAC,QAAD,EAAW,IAAX;AAPN,OAAX;;AAUA;AACAH,iBAAW;AACTQ,cAAM,eADG;AAETJ,kBAAU,SAFD;AAGTF,gBAAQ,CACN,EAAEM,MAAM,MAAR,EAAgBiB,MAAM,QAAtB,EAAgCC,SAAS,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,EAA6B,OAA7B,CAAzC,EADM,CAHC;AAMTvB,uBAAe,CAAC,KAAD;AANN,OAAX;;AASAQ,QAAEgB,IAAF,CAAOtB,UAAP,EAAmB,UAASuB,QAAT,EAAmBC,OAAnB,EAA4B;AAC7CxB,mBAAWwB,OAAX,IAAsBlB,EAAEmB,MAAF,CAASF,QAAT,EAAmB,MAAnB,CAAtB;AACD,OAFD;;AAIMd,kB;AACJ,8BAAYb,OAAZ,EAAqBC,MAArB,EAA6B;AAAA;;AAC3B,eAAK6B,GAAL,GAAW9B,OAAX;;AAEA,cAAIC,MAAJ,EAAY;AACV,iBAAKA,MAAL,GAAcA,MAAd;AACD,WAFD,MAEO;AACL;AACA,iBAAKA,MAAL,GAAc,EAAd;AACA,iBAAKA,MAAL,GAAcD,QAAQE,aAAR,CAAsB6B,KAAtB,CAA4B,CAA5B,CAAd;AACD;;AAED,eAAKC,UAAL;AACD;;;;uCAEYC,e,EAAiB;AAC5B,gBAAIC,OAAOD,gBAAgB,KAAKH,GAAL,CAASvB,IAAzB,CAAX;AACA,gBAAI2B,IAAJ,EAAU;;AAER;AACA,kBAAIC,aAAaD,IAAjB;AACA,kBAAIE,KAAJ;AACA,mBAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAI,KAAKpC,MAAL,CAAYqC,MAAhC,EAAwCD,GAAxC,EAA6C;AAC3CD,wBAAQ,KAAKnC,MAAL,CAAYoC,CAAZ,CAAR;;AAEA;AACA,oBAAI,KAAKP,GAAL,CAAS7B,MAAT,CAAgBoC,CAAhB,EAAmBb,IAAnB,KAA4B,KAA5B,IACA,KAAKM,GAAL,CAAS7B,MAAT,CAAgBoC,CAAhB,EAAmBb,IAAnB,KAA4B,OADhC,EACyC;AACvCY,0BAAQG,OAAOH,KAAP,CAAR;AACD;AACDD,6BAAazB,EAAE8B,OAAF,CAAUL,UAAV,EAAsBC,KAAtB,CAAb;AACD;AACD,qBAAOD,UAAP;AACD,aAhBD,MAgBO;AACL,oBAAM,EAAEvB,SAAS,sBAAsB,KAAKkB,GAAL,CAASvB,IAA1C,EAAN;AACD;AACF;;;iCAEMkC,S,EAAW;AAChB,gBAAIC,MAAM,KAAKZ,GAAL,CAASvB,IAAT,GAAgB,GAA1B;AACA,gBAAIoC,aAAajC,EAAEkC,GAAF,CAAM,KAAK3C,MAAX,EAAmB,UAAS4C,KAAT,EAAgBvC,KAAhB,EAAuB;;AAEzD,kBAAIwC,YAAY,KAAKhB,GAAL,CAAS7B,MAAT,CAAgBK,KAAhB,EAAuBkB,IAAvC;AACA,kBAAIsB,cAAc,KAAd,IACAA,cAAc,OADd,IAEAA,cAAc,iBAFd,IAGAA,cAAc,SAHlB,EAG6B;AAC3B,uBAAOD,KAAP;AACD,eALD,MAMK,IAAIC,cAAc,iBAAd,IAAmC9B,EAAE+B,SAAF,CAAYF,KAAZ,CAAvC,EAA2D;AAC9D,uBAAOA,KAAP;AACD;;AAED,qBAAO,MAAMA,KAAN,GAAc,GAArB;AAED,aAfgB,EAed,IAfc,CAAjB;;AAiBA,gBAAIJ,SAAJ,EAAe;AACbE,yBAAWK,OAAX,CAAmBP,SAAnB;AACD;;AAED,mBAAOC,MAAMC,WAAWM,IAAX,CAAgB,IAAhB,CAAN,GAA8B,GAArC;AACD;;;qDAE0BC,Q,EAAU5C,K,EAAO;AAC1C,gBAAI4C,SAASC,OAAT,CAAiB,GAAjB,MAA0B,CAAC,CAA/B,EAAkC;AAChC,qBAAO,KAAP;AACD;;AAED,mBAAO,KAAKrB,GAAL,CAAS7B,MAAT,CAAgBK,QAAQ,CAAxB,KAA8B,KAAKwB,GAAL,CAAS7B,MAAT,CAAgBK,QAAQ,CAAxB,EAA2B8C,QAAhE;AACD;;;sCAEWF,Q,EAAU5C,K,EAAO;AAC3B;AACA;AACA,gBAAI,KAAK+C,0BAAL,CAAgCH,QAAhC,EAA0C5C,KAA1C,CAAJ,EAAsD;AACpDI,gBAAEgB,IAAF,CAAOwB,SAASI,KAAT,CAAe,GAAf,CAAP,EAA4B,UAASC,OAAT,EAAkBC,GAAlB,EAAuB;AACjD,qBAAKC,WAAL,CAAiBF,QAAQG,IAAR,EAAjB,EAAiCF,GAAjC;AACD,eAFD,EAEG,IAFH;AAGA;AACD;;AAED,gBAAIN,aAAa,EAAb,IAAmB,KAAKpB,GAAL,CAAS7B,MAAT,CAAgBK,KAAhB,EAAuB8C,QAA9C,EAAwD;AACtD,mBAAKnD,MAAL,CAAY0D,MAAZ,CAAmBrD,KAAnB,EAA0B,CAA1B;AACD,aAFD,MAGK;AACH,mBAAKL,MAAL,CAAYK,KAAZ,IAAqB4C,QAArB;AACD;;AAED,iBAAKlB,UAAL;AACD;;;uCAEY;AACX,gBAAI,KAAK/B,MAAL,CAAYqC,MAAZ,KAAuB,CAA3B,EAA8B;AAC5B,mBAAKsB,IAAL,GAAY,KAAK9B,GAAL,CAASvB,IAAT,GAAgB,IAA5B;AACA;AACD;;AAED,gBAAIqD,OAAO,KAAK9B,GAAL,CAASvB,IAAT,GAAgB,GAA3B;AACAqD,oBAAQ,KAAK3D,MAAL,CAAYgD,IAAZ,CAAiB,IAAjB,CAAR;AACAW,oBAAQ,GAAR;AACA,iBAAKA,IAAL,GAAYA,IAAZ;AACD","file":"metricFunctions.js","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\n\nvar index = [];\nvar categories = {\n Transform: [],\n Aggregate: [],\n Filter: [],\n Trends: [],\n Time: [],\n Alias: [],\n Special: []\n};\n\nfunction addFuncDef(funcDef) {\n funcDef.params = funcDef.params || [];\n funcDef.defaultParams = funcDef.defaultParams || [];\n\n if (funcDef.category) {\n categories[funcDef.category].push(funcDef);\n }\n index[funcDef.name] = funcDef;\n index[funcDef.shortName || funcDef.name] = funcDef;\n}\n\n// Transform\n\naddFuncDef({\n name: 'groupBy',\n category: 'Transform',\n params: [\n { name: 'interval', type: 'string'},\n { name: 'function', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count', 'median'] }\n ],\n defaultParams: ['1m', 'avg'],\n});\n\naddFuncDef({\n name: 'scale',\n category: 'Transform',\n params: [\n { name: 'factor', type: 'float', options: [100, 0.01, 10, -1]}\n ],\n defaultParams: [100],\n});\n\naddFuncDef({\n name: 'delta',\n category: 'Transform',\n params: [],\n defaultParams: [],\n});\n\naddFuncDef({\n name: 'rate',\n category: 'Transform',\n params: [],\n defaultParams: [],\n});\n\n// Aggregate\n\naddFuncDef({\n name: 'sumSeries',\n category: 'Aggregate',\n params: [],\n defaultParams: [],\n});\n\naddFuncDef({\n name: 'median',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string'}\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'average',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'min',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'max',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'sum',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'count',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' }\n ],\n defaultParams: ['1m'],\n});\n\naddFuncDef({\n name: 'aggregateBy',\n category: 'Aggregate',\n params: [\n { name: 'interval', type: 'string' },\n { name: 'function', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count', 'median'] }\n ],\n defaultParams: ['1m', 'avg'],\n});\n\n// Filter\n\naddFuncDef({\n name: 'top',\n category: 'Filter',\n params: [\n { name: 'number', type: 'int' },\n { name: 'value', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count', 'median'] }\n ],\n defaultParams: [5, 'avg'],\n});\n\naddFuncDef({\n name: 'bottom',\n category: 'Filter',\n params: [\n { name: 'number', type: 'int' },\n { name: 'value', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count', 'median'] }\n ],\n defaultParams: [5, 'avg'],\n});\n\n// Trends\n\naddFuncDef({\n name: 'trendValue',\n category: 'Trends',\n params: [\n { name: 'type', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count'] }\n ],\n defaultParams: ['avg'],\n});\n\n// Time\n\naddFuncDef({\n name: 'timeShift',\n category: 'Time',\n params: [\n { name: 'interval', type: 'string', options: ['24h', '7d', '1M', '+24h', '-24h']}\n ],\n defaultParams: ['24h'],\n});\n\n//Alias\n\naddFuncDef({\n name: 'setAlias',\n category: 'Alias',\n params: [\n { name: 'alias', type: 'string' }\n ],\n defaultParams: []\n});\n\naddFuncDef({\n name: 'setAliasByRegex',\n category: 'Alias',\n params: [\n { name: 'aliasByRegex', type: 'string' }\n ],\n defaultParams: []\n});\n\naddFuncDef({\n name: 'replaceAlias',\n category: 'Alias',\n params: [\n { name: 'regexp', type: 'string' },\n { name: 'newAlias', type: 'string' }\n ],\n defaultParams: ['/(.*)/', '$1']\n});\n\n// Special\naddFuncDef({\n name: 'consolidateBy',\n category: 'Special',\n params: [\n { name: 'type', type: 'string', options: ['avg', 'min', 'max', 'sum', 'count'] }\n ],\n defaultParams: ['avg'],\n});\n\n_.each(categories, function(funcList, catName) {\n categories[catName] = _.sortBy(funcList, 'name');\n});\n\nclass FuncInstance {\n constructor(funcDef, params) {\n this.def = funcDef;\n\n if (params) {\n this.params = params;\n } else {\n // Create with default params\n this.params = [];\n this.params = funcDef.defaultParams.slice(0);\n }\n\n this.updateText();\n }\n\n bindFunction(metricFunctions) {\n var func = metricFunctions[this.def.name];\n if (func) {\n\n // Bind function arguments\n var bindedFunc = func;\n var param;\n for (var i = 0; i < this.params.length; i++) {\n param = this.params[i];\n\n // Convert numeric params\n if (this.def.params[i].type === 'int' ||\n this.def.params[i].type === 'float') {\n param = Number(param);\n }\n bindedFunc = _.partial(bindedFunc, param);\n }\n return bindedFunc;\n } else {\n throw { message: 'Method not found ' + this.def.name };\n }\n }\n\n render(metricExp) {\n var str = this.def.name + '(';\n var parameters = _.map(this.params, function(value, index) {\n\n var paramType = this.def.params[index].type;\n if (paramType === 'int' ||\n paramType === 'float' ||\n paramType === 'value_or_series' ||\n paramType === 'boolean') {\n return value;\n }\n else if (paramType === 'int_or_interval' && $.isNumeric(value)) {\n return value;\n }\n\n return \"'\" + value + \"'\";\n\n }, this);\n\n if (metricExp) {\n parameters.unshift(metricExp);\n }\n\n return str + parameters.join(', ') + ')';\n }\n\n _hasMultipleParamsInString(strValue, index) {\n if (strValue.indexOf(',') === -1) {\n return false;\n }\n\n return this.def.params[index + 1] && this.def.params[index + 1].optional;\n }\n\n updateParam(strValue, index) {\n // handle optional parameters\n // if string contains ',' and next param is optional, split and update both\n if (this._hasMultipleParamsInString(strValue, index)) {\n _.each(strValue.split(','), function(partVal, idx) {\n this.updateParam(partVal.trim(), idx);\n }, this);\n return;\n }\n\n if (strValue === '' && this.def.params[index].optional) {\n this.params.splice(index, 1);\n }\n else {\n this.params[index] = strValue;\n }\n\n this.updateText();\n }\n\n updateText() {\n if (this.params.length === 0) {\n this.text = this.def.name + '()';\n return;\n }\n\n var text = this.def.name + '(';\n text += this.params.join(', ');\n text += ')';\n this.text = text;\n }\n}\n\nexport function createFuncInstance(funcDef, params) {\n if (_.isString(funcDef)) {\n if (!index[funcDef]) {\n throw { message: 'Method not found ' + name };\n }\n funcDef = index[funcDef];\n }\n return new FuncInstance(funcDef, params);\n}\n\nexport function getFuncDef(name) {\n return index[name];\n}\n\nexport function getCategories() {\n return categories;\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/module.js b/dist/datasource-zabbix/module.js index 2b772d3..32693a5 100644 --- a/dist/datasource-zabbix/module.js +++ b/dist/datasource-zabbix/module.js @@ -1,9 +1,9 @@ 'use strict'; -System.register(['./datasource', './query.controller'], function (_export, _context) { +System.register(['./datasource', './query.controller', './config.controller'], function (_export, _context) { "use strict"; - var ZabbixAPIDatasource, ZabbixQueryController, ZabbixConfigController, ZabbixQueryOptionsController, ZabbixAnnotationsQueryController; + var ZabbixAPIDatasource, ZabbixQueryController, ZabbixDSConfigController, ZabbixQueryOptionsController, ZabbixAnnotationsQueryController; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -16,14 +16,10 @@ System.register(['./datasource', './query.controller'], function (_export, _cont ZabbixAPIDatasource = _datasource.ZabbixAPIDatasource; }, function (_queryController) { ZabbixQueryController = _queryController.ZabbixQueryController; + }, function (_configController) { + ZabbixDSConfigController = _configController.ZabbixDSConfigController; }], execute: function () { - _export('ConfigCtrl', ZabbixConfigController = function ZabbixConfigController() { - _classCallCheck(this, ZabbixConfigController); - }); - - ZabbixConfigController.templateUrl = 'datasource-zabbix/partials/config.html'; - _export('QueryOptionsCtrl', ZabbixQueryOptionsController = function ZabbixQueryOptionsController() { _classCallCheck(this, ZabbixQueryOptionsController); }); @@ -38,7 +34,7 @@ System.register(['./datasource', './query.controller'], function (_export, _cont _export('Datasource', ZabbixAPIDatasource); - _export('ConfigCtrl', ZabbixConfigController); + _export('ConfigCtrl', ZabbixDSConfigController); _export('QueryCtrl', ZabbixQueryController); diff --git a/dist/datasource-zabbix/module.js.map b/dist/datasource-zabbix/module.js.map index 776f7e4..bf4adfe 100644 --- a/dist/datasource-zabbix/module.js.map +++ b/dist/datasource-zabbix/module.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/module.js"],"names":["ZabbixAPIDatasource","ZabbixQueryController","ZabbixConfigController","templateUrl","ZabbixQueryOptionsController","ZabbixAnnotationsQueryController"],"mappings":";;;;;;;;;;;;;;;AAAQA,yB,eAAAA,mB;;AACAC,2B,oBAAAA,qB;;;4BAEFC,sB;;;;AACNA,6BAAuBC,WAAvB,GAAqC,wCAArC;;kCAEMC,4B;;;;AACNA,mCAA6BD,WAA7B,GAA2C,+CAA3C;;sCAEME,gC;;;;AACNA,uCAAiCF,WAAjC,GAA+C,oDAA/C;;4BAGEH,mB;;4BACAE,sB;;2BACAD,qB;;kCACAG,4B;;sCACAC,gC","file":"module.js","sourcesContent":["import {ZabbixAPIDatasource} from './datasource';\nimport {ZabbixQueryController} from './query.controller';\n\nclass ZabbixConfigController {}\nZabbixConfigController.templateUrl = 'datasource-zabbix/partials/config.html';\n\nclass ZabbixQueryOptionsController {}\nZabbixQueryOptionsController.templateUrl = 'datasource-zabbix/partials/query.options.html';\n\nclass ZabbixAnnotationsQueryController {}\nZabbixAnnotationsQueryController.templateUrl = 'datasource-zabbix/partials/annotations.editor.html';\n\nexport {\n ZabbixAPIDatasource as Datasource,\n ZabbixConfigController as ConfigCtrl,\n ZabbixQueryController as QueryCtrl,\n ZabbixQueryOptionsController as QueryOptionsCtrl,\n ZabbixAnnotationsQueryController as AnnotationsQueryCtrl\n};\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/module.js"],"names":["ZabbixAPIDatasource","ZabbixQueryController","ZabbixDSConfigController","ZabbixQueryOptionsController","templateUrl","ZabbixAnnotationsQueryController"],"mappings":";;;;;;;;;;;;;;;AAAQA,yB,eAAAA,mB;;AACAC,2B,oBAAAA,qB;;AACAC,8B,qBAAAA,wB;;;kCAEFC,4B;;;;AACNA,mCAA6BC,WAA7B,GAA2C,+CAA3C;;sCAEMC,gC;;;;AACNA,uCAAiCD,WAAjC,GAA+C,oDAA/C;;4BAGEJ,mB;;4BACAE,wB;;2BACAD,qB;;kCACAE,4B;;sCACAE,gC","file":"module.js","sourcesContent":["import {ZabbixAPIDatasource} from './datasource';\nimport {ZabbixQueryController} from './query.controller';\nimport {ZabbixDSConfigController} from './config.controller';\n\nclass ZabbixQueryOptionsController {}\nZabbixQueryOptionsController.templateUrl = 'datasource-zabbix/partials/query.options.html';\n\nclass ZabbixAnnotationsQueryController {}\nZabbixAnnotationsQueryController.templateUrl = 'datasource-zabbix/partials/annotations.editor.html';\n\nexport {\n ZabbixAPIDatasource as Datasource,\n ZabbixDSConfigController as ConfigCtrl,\n ZabbixQueryController as QueryCtrl,\n ZabbixQueryOptionsController as QueryOptionsCtrl,\n ZabbixAnnotationsQueryController as AnnotationsQueryCtrl\n};\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/partials/config.html b/dist/datasource-zabbix/partials/config.html index 49e18b8..7f626c2 100644 --- a/dist/datasource-zabbix/partials/config.html +++ b/dist/datasource-zabbix/partials/config.html @@ -76,24 +76,53 @@