diff --git a/dist/datasource-zabbix/datasource.js b/dist/datasource-zabbix/datasource.js index aab91db..c6bff14 100644 --- a/dist/datasource-zabbix/datasource.js +++ b/dist/datasource-zabbix/datasource.js @@ -237,7 +237,8 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', // Direct DB Connection options this.enableDirectDBConnection = jsonData.dbConnectionEnable || false; - this.datasourceId = jsonData.dbConnectionDatasourceId; + this.dbConnectionDatasourceId = jsonData.dbConnectionDatasourceId; + this.dbConnectionDatasourceName = jsonData.dbConnectionDatasourceName; var zabbixOptions = { url: this.url, @@ -247,7 +248,8 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', withCredentials: this.withCredentials, cacheTTL: this.cacheTTL, enableDirectDBConnection: this.enableDirectDBConnection, - datasourceId: this.datasourceId + dbConnectionDatasourceId: this.dbConnectionDatasourceId, + dbConnectionDatasourceName: this.dbConnectionDatasourceName }; this.zabbix = new Zabbix(zabbixOptions, backendSrv, datasourceSrv); diff --git a/dist/datasource-zabbix/datasource.js.map b/dist/datasource-zabbix/datasource.js.map index ec89ba1..be6a8dd 100644 --- a/dist/datasource-zabbix/datasource.js.map +++ b/dist/datasource-zabbix/datasource.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","getConsolidateBy","target","consolidateBy","funcDef","find","functions","length","downsampleSeries","timeseries_data","options","defaultAgg","consolidateByFunc","timeseries","datapoints","maxDataPoints","groupBy","interval","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","zabbixItemIdsTemplateFormat","replaceTemplateVars","templateSrv","scopedVars","replacedTarget","replace","isRegex","filterEnabledTargets","targets","hide","group","host","item","getTriggerThreshold","expression","thresholdPattern","finded_thresholds","match","threshold","Number","dateMath","migrations","c","responseHandler","Zabbix","ZabbixAPIError","ZabbixDatasource","instanceSettings","backendSrv","datasourceSrv","zabbixAlertingSrv","partial","url","basicAuth","withCredentials","jsonData","migrateDSConfig","username","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","disableReadOnlyUsersAck","enableDirectDBConnection","dbConnectionEnable","datasourceId","dbConnectionDatasourceId","zabbixOptions","zabbix","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","t","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","replaceTargetVariables","timeFunctions","sequence","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_METRICS","MODE_TEXT","migrate","queryNumericData","queryTextData","MODE_ITEMID","itemids","queryItemIdData","MODE_ITSERVICE","queryITServiceData","MODE_TRIGGERS","queryTriggersData","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","queryNumericDataForItems","items","getHistoryPromise","valueType","getTrendValueType","getTrends","getHistoryTS","applyDataProcessingFunctions","trendFunctions","trendValueFunc","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","series","unShiftTimeSeries","getHistoryText","split","itemid","trim","getItemsByIDs","itservice","itServiceFilter","slaProperty","isOldVersion","getITServices","getSLA","itservices","getHostsFromTarget","results","hosts","apps","hostids","appids","minSeverity","triggers","acknowledged","count","getHostAlerts","handleTriggersResponse","resolve","testDataSource","zabbixVersion","result","dbConnectorStatus","message","dsType","status","title","catch","error","console","log","query","parts","each","splitTemplateQuery","part","push","template","zipObject","app","getItems","getApps","getHosts","getGroups","metrics","rangeRaw","annotation","showOkEvents","SHOW_ALL_EVENTS","SHOW_OK_EVENTS","triggersOptions","showTriggers","SHOW_ALL_TRIGGERS","hideHostsInMaintenance","getTriggers","application","triggerName","trigger","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport { Zabbix } from './zabbix/zabbix';\nimport { ZabbixAPIError } from './zabbix/connectors/zabbix_api/zabbixAPICore';\n\nexport class ZabbixDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) {\n this.templateSrv = templateSrv;\n this.zabbixAlertingSrv = zabbixAlertingSrv;\n\n // Use custom format for template variables\n this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);\n\n // General data source settings\n this.name = instanceSettings.name;\n this.url = instanceSettings.url;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n\n const jsonData = migrations.migrateDSConfig(instanceSettings.jsonData);\n\n // Zabbix API credentials\n this.username = jsonData.username;\n this.password = jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = jsonData.trends;\n this.trendsFrom = jsonData.trendsFrom || '7d';\n this.trendsRange = jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = jsonData.alerting;\n this.addThresholds = jsonData.addThresholds;\n this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n // Other options\n this.disableReadOnlyUsersAck = jsonData.disableReadOnlyUsersAck;\n\n // Direct DB Connection options\n this.enableDirectDBConnection = jsonData.dbConnectionEnable || false;\n this.datasourceId = jsonData.dbConnectionDatasourceId;\n\n let zabbixOptions = {\n url: this.url,\n username: this.username,\n password: this.password,\n basicAuth: this.basicAuth,\n withCredentials: this.withCredentials,\n cacheTTL: this.cacheTTL,\n enableDirectDBConnection: this.enableDirectDBConnection,\n datasourceId: this.datasourceId\n };\n\n this.zabbix = new Zabbix(zabbixOptions, backendSrv, datasourceSrv);\n }\n\n ////////////////////////\n // Datasource methods //\n ////////////////////////\n\n /**\n * Query panel data. Calls for each panel in dashboard.\n * @param {Object} options Contains time range, targets and other info.\n * @return {Object} Grafana metrics object with timeseries data for each target.\n */\n query(options) {\n // Get alerts for current panel\n if (this.alertingEnabled) {\n this.alertQuery(options).then(alert => {\n this.zabbixAlertingSrv.setPanelAlertState(options.panelId, alert.state);\n\n this.zabbixAlertingSrv.removeZabbixThreshold(options.panelId);\n if (this.addThresholds) {\n _.forEach(alert.thresholds, threshold => {\n this.zabbixAlertingSrv.setPanelThreshold(options.panelId, threshold);\n });\n }\n });\n }\n\n // Create request for each target\n let promises = _.map(options.targets, t => {\n // Don't request for hidden targets\n if (t.hide) {\n return [];\n }\n\n let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);\n let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);\n\n // Prevent changes of original object\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n\n // Apply Time-related functions (timeShift(), etc)\n let timeFunctions = bindFunctionDefs(target.functions, 'Time');\n if (timeFunctions.length) {\n const [time_from, time_to] = utils.sequence(timeFunctions)([timeFrom, timeTo]);\n timeFrom = time_from;\n timeTo = time_to;\n }\n let timeRange = [timeFrom, timeTo];\n\n let useTrends = this.isUseTrends(timeRange);\n\n // Metrics or Text query mode\n if (!target.mode || target.mode === c.MODE_METRICS || target.mode === c.MODE_TEXT) {\n // Migrate old targets\n target = migrations.migrate(target);\n\n // Don't request undefined targets\n if (!target.group || !target.host || !target.item) {\n return [];\n }\n\n if (!target.mode || target.mode === c.MODE_METRICS) {\n return this.queryNumericData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_TEXT) {\n return this.queryTextData(target, timeRange);\n }\n } else if (target.mode === c.MODE_ITEMID) {\n // Item ID mode\n if (!target.itemids) {\n return [];\n }\n return this.queryItemIdData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_ITSERVICE) {\n // IT services mode\n return this.queryITServiceData(target, timeRange, options);\n } else if (target.mode === c.MODE_TRIGGERS) {\n // Triggers mode\n return this.queryTriggersData(target, timeRange);\n } else {\n return [];\n }\n });\n\n // Data for panel (all targets)\n return Promise.all(_.flatten(promises))\n .then(_.flatten)\n .then(data => {\n return { data: data };\n });\n }\n\n /**\n * Query target data for Metrics mode\n */\n queryNumericData(target, timeRange, useTrends, options) {\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => this.queryNumericDataForItems(items, target, timeRange, useTrends, options));\n }\n\n /**\n * Query history for numeric items\n */\n queryNumericDataForItems(items, target, timeRange, useTrends, options) {\n let getHistoryPromise;\n options.valueType = this.getTrendValueType(target);\n options.consolidateBy = getConsolidateBy(target) || options.valueType;\n\n if (useTrends) {\n getHistoryPromise = this.zabbix.getTrends(items, timeRange, options);\n } else {\n getHistoryPromise = this.zabbix.getHistoryTS(items, timeRange, options);\n }\n\n return getHistoryPromise\n .then(timeseries => this.applyDataProcessingFunctions(timeseries, target))\n .then(timeseries => downsampleSeries(timeseries, options));\n }\n\n getTrendValueType(target) {\n // Find trendValue() function and get specified trend value\n var trendFunctions = _.map(metricFunctions.getCategories()['Trends'], 'name');\n var trendValueFunc = _.find(target.functions, func => {\n return _.includes(trendFunctions, func.def.name);\n });\n return trendValueFunc ? trendValueFunc.params[0] : \"avg\";\n }\n\n applyDataProcessingFunctions(timeseries_data, target) {\n let transformFunctions = bindFunctionDefs(target.functions, 'Transform');\n let aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');\n let filterFunctions = bindFunctionDefs(target.functions, 'Filter');\n let aliasFunctions = bindFunctionDefs(target.functions, 'Alias');\n\n // Apply transformation functions\n timeseries_data = _.cloneDeep(_.map(timeseries_data, timeseries => {\n timeseries.datapoints = utils.sequence(transformFunctions)(timeseries.datapoints);\n return timeseries;\n }));\n\n // Apply filter functions\n if (filterFunctions.length) {\n timeseries_data = utils.sequence(filterFunctions)(timeseries_data);\n }\n\n // Apply aggregations\n if (aggregationFunctions.length) {\n let dp = _.map(timeseries_data, 'datapoints');\n dp = utils.sequence(aggregationFunctions)(dp);\n\n let aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name');\n let lastAgg = _.findLast(target.functions, func => {\n return _.includes(aggFuncNames, func.def.name);\n });\n\n timeseries_data = [{\n target: lastAgg.text,\n datapoints: dp\n }];\n }\n\n // Apply alias functions\n _.forEach(timeseries_data, utils.sequence(aliasFunctions));\n\n // Apply Time-related functions (timeShift(), etc)\n // Find timeShift() function and get specified trend value\n this.applyTimeShiftFunction(timeseries_data, target);\n\n return timeseries_data;\n }\n\n applyTimeShiftFunction(timeseries_data, target) {\n // Find timeShift() function and get specified interval\n let timeShiftFunc = _.find(target.functions, (func) => {\n return func.def.name === 'timeShift';\n });\n if (timeShiftFunc) {\n let shift = timeShiftFunc.params[0];\n _.forEach(timeseries_data, (series) => {\n series.datapoints = dataProcessor.unShiftTimeSeries(shift, series.datapoints);\n });\n }\n }\n\n /**\n * Query target data for Text mode\n */\n queryTextData(target, timeRange) {\n let options = {\n itemtype: 'text'\n };\n return this.zabbix.getItemsFromTarget(target, options)\n .then(items => {\n return this.zabbix.getHistoryText(items, timeRange, target);\n });\n }\n\n /**\n * Query target data for Item ID mode\n */\n queryItemIdData(target, timeRange, useTrends, options) {\n let itemids = target.itemids;\n itemids = this.templateSrv.replace(itemids, options.scopedVars, zabbixItemIdsTemplateFormat);\n itemids = _.map(itemids.split(','), itemid => itemid.trim());\n\n if (!itemids) {\n return [];\n }\n\n return this.zabbix.getItemsByIDs(itemids)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query target data for IT Services mode\n */\n queryITServiceData(target, timeRange, options) {\n // Don't show undefined and hidden targets\n if (target.hide || (!target.itservice && !target.itServiceFilter) || !target.slaProperty) {\n return [];\n }\n\n let itServiceFilter;\n options.isOldVersion = target.itservice && !target.itServiceFilter;\n\n if (options.isOldVersion) {\n // Backward compatibility\n itServiceFilter = '/.*/';\n } else {\n itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);\n }\n\n return this.zabbix.getITServices(itServiceFilter)\n .then(itservices => {\n return this.zabbix.getSLA(itservices, timeRange, target, options);\n });\n }\n\n queryTriggersData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n return this.zabbix.getHostsFromTarget(target)\n .then((results) => {\n let [hosts, apps] = results;\n if (hosts.length) {\n let hostids = _.map(hosts, 'hostid');\n let appids = _.map(apps, 'applicationid');\n let options = {\n minSeverity: target.triggers.minSeverity,\n acknowledged: target.triggers.acknowledged,\n count: target.triggers.count,\n timeFrom: timeFrom,\n timeTo: timeTo\n };\n return this.zabbix.getHostAlerts(hostids, appids, options)\n .then((triggers) => {\n return responseHandler.handleTriggersResponse(triggers, timeRange);\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Test connection to Zabbix API and external history DB.\n */\n testDatasource() {\n return this.zabbix.testDataSource()\n .then(result => {\n const { zabbixVersion, dbConnectorStatus } = result;\n let message = `Zabbix API version: ${zabbixVersion}`;\n if (dbConnectorStatus) {\n message += `, DB connector type: ${dbConnectorStatus.dsType}`;\n }\n return {\n status: \"success\",\n title: \"Success\",\n message: message\n };\n })\n .catch(error => {\n if (error instanceof ZabbixAPIError) {\n return {\n status: \"error\",\n title: error.message,\n message: error.message\n };\n } else if (error.data && error.data.message) {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error.data.message\n };\n } else if (typeof(error) === 'string') {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error\n };\n } else {\n console.log(error);\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Could not connect to given url\"\n };\n }\n });\n }\n\n ////////////////\n // Templating //\n ////////////////\n\n /**\n * Find metrics from templated request.\n *\n * @param {string} query Query from Templating\n * @return {string} Metric name - group, host, app or item or list\n * of metrics in \"{metric1,metcic2,...,metricN}\" format.\n */\n metricFindQuery(query) {\n let result;\n let parts = [];\n\n // Split query. Query structure: group.host.app.item\n _.each(utils.splitTemplateQuery(query), part => {\n part = this.replaceTemplateVars(part, {});\n\n // Replace wildcard to regex\n if (part === '*') {\n part = '/.*/';\n }\n parts.push(part);\n });\n let template = _.zipObject(['group', 'host', 'app', 'item'], parts);\n\n // Get items\n if (parts.length === 4) {\n // Search for all items, even it's not belong to any application\n if (template.app === '/.*/') {\n template.app = '';\n }\n result = this.zabbix.getItems(template.group, template.host, template.app, template.item);\n } else if (parts.length === 3) {\n // Get applications\n result = this.zabbix.getApps(template.group, template.host, template.app);\n } else if (parts.length === 2) {\n // Get hosts\n result = this.zabbix.getHosts(template.group, template.host);\n } else if (parts.length === 1) {\n // Get groups\n result = this.zabbix.getGroups(template.group);\n } else {\n result = Promise.resolve([]);\n }\n\n return result.then(metrics => {\n return _.map(metrics, formatMetric);\n });\n }\n\n /////////////////\n // Annotations //\n /////////////////\n\n annotationQuery(options) {\n var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);\n var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);\n var annotation = options.annotation;\n var showOkEvents = annotation.showOkEvents ? c.SHOW_ALL_EVENTS : c.SHOW_OK_EVENTS;\n\n // Show all triggers\n let triggersOptions = {\n showTriggers: c.SHOW_ALL_TRIGGERS,\n hideHostsInMaintenance: false\n };\n\n var getTriggers = this.zabbix.getTriggers(this.replaceTemplateVars(annotation.group, {}),\n this.replaceTemplateVars(annotation.host, {}),\n this.replaceTemplateVars(annotation.application, {}),\n triggersOptions);\n\n return getTriggers.then(triggers => {\n\n // Filter triggers by description\n let triggerName = this.replaceTemplateVars(annotation.trigger, {});\n if (utils.isRegex(triggerName)) {\n triggers = _.filter(triggers, trigger => {\n return utils.buildRegex(triggerName).test(trigger.description);\n });\n } else if (triggerName) {\n triggers = _.filter(triggers, trigger => {\n return trigger.description === triggerName;\n });\n }\n\n // Remove events below the chose severity\n triggers = _.filter(triggers, trigger => {\n return Number(trigger.priority) >= Number(annotation.minseverity);\n });\n\n var objectids = _.map(triggers, 'triggerid');\n return this.zabbix\n .getEvents(objectids, timeFrom, timeTo, showOkEvents)\n .then(events => {\n var indexedTriggers = _.keyBy(triggers, 'triggerid');\n\n // Hide acknowledged events if option enabled\n if (annotation.hideAcknowledged) {\n events = _.filter(events, event => {\n return !event.acknowledges.length;\n });\n }\n\n return _.map(events, event => {\n let tags;\n if (annotation.showHostname) {\n tags = _.map(event.hosts, 'name');\n }\n\n // Show event type (OK or Problem)\n let title = Number(event.value) ? 'Problem' : 'OK';\n\n let formatted_acknowledges = utils.formatAcknowledges(event.acknowledges);\n return {\n annotation: annotation,\n time: event.clock * 1000,\n title: title,\n tags: tags,\n text: indexedTriggers[event.objectid].description + formatted_acknowledges\n };\n });\n });\n });\n }\n\n /**\n * Get triggers and its details for panel's targets\n * Returns alert state ('ok' if no fired triggers, or 'alerting' if at least 1 trigger is fired)\n * or empty object if no related triggers are finded.\n */\n alertQuery(options) {\n let enabled_targets = filterEnabledTargets(options.targets);\n let getPanelItems = _.map(enabled_targets, t => {\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n return this.zabbix.getItemsFromTarget(target, {itemtype: 'num'});\n });\n\n return Promise.all(getPanelItems)\n .then(results => {\n let items = _.flatten(results);\n let itemids = _.map(items, 'itemid');\n\n if (itemids.length === 0) {\n return [];\n }\n return this.zabbix.getAlerts(itemids);\n })\n .then(triggers => {\n triggers = _.filter(triggers, trigger => {\n return trigger.priority >= this.alertingMinSeverity;\n });\n\n if (!triggers || triggers.length === 0) {\n return {};\n }\n\n let state = 'ok';\n\n let firedTriggers = _.filter(triggers, {value: '1'});\n if (firedTriggers.length) {\n state = 'alerting';\n }\n\n let thresholds = _.map(triggers, trigger => {\n return getTriggerThreshold(trigger.expression);\n });\n\n return {\n panelId: options.panelId,\n state: state,\n thresholds: thresholds\n };\n });\n }\n\n // Replace template variables\n replaceTargetVariables(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n _.forEach(parts, p => {\n if (target[p] && target[p].filter) {\n target[p].filter = this.replaceTemplateVars(target[p].filter, options.scopedVars);\n }\n });\n target.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars);\n\n _.forEach(target.functions, func => {\n func.params = _.map(func.params, param => {\n if (typeof param === 'number') {\n return +this.templateSrv.replace(param.toString(), options.scopedVars);\n } else {\n return this.templateSrv.replace(param, options.scopedVars);\n }\n });\n });\n }\n\n isUseTrends(timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);\n let useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);\n let useTrends = this.trends && (\n (timeFrom <= useTrendsFrom) ||\n (timeTo - timeFrom >= useTrendsRange)\n );\n return useTrends;\n }\n}\n\nfunction bindFunctionDefs(functionDefs, category) {\n var aggregationFunctions = _.map(metricFunctions.getCategories()[category], 'name');\n var aggFuncDefs = _.filter(functionDefs, function(func) {\n return _.includes(aggregationFunctions, func.def.name);\n });\n\n return _.map(aggFuncDefs, function(func) {\n var funcInstance = metricFunctions.createFuncInstance(func.def, func.params);\n return funcInstance.bindFunction(dataProcessor.metricFunctions);\n });\n}\n\nfunction getConsolidateBy(target) {\n let consolidateBy;\n let funcDef = _.find(target.functions, func => {\n return func.def.name === 'consolidateBy';\n });\n if (funcDef && funcDef.params && funcDef.params.length) {\n consolidateBy = funcDef.params[0];\n }\n return consolidateBy;\n}\n\nfunction downsampleSeries(timeseries_data, options) {\n let defaultAgg = dataProcessor.aggregationFunctions['avg'];\n let consolidateByFunc = dataProcessor.aggregationFunctions[options.consolidateBy] || defaultAgg;\n return _.map(timeseries_data, timeseries => {\n if (timeseries.datapoints.length > options.maxDataPoints) {\n timeseries.datapoints = dataProcessor\n .groupBy(options.interval, consolidateByFunc, timeseries.datapoints);\n }\n return timeseries;\n });\n}\n\nfunction formatMetric(metricObj) {\n return {\n text: metricObj.name,\n expandable: false\n };\n}\n\n/**\n * Custom formatter for template variables.\n * Default Grafana \"regex\" formatter returns\n * value1|value2\n * This formatter returns\n * (value1|value2)\n * This format needed for using in complex regex with\n * template variables, for example\n * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait\n */\nexport function zabbixTemplateFormat(value) {\n if (typeof value === 'string') {\n return utils.escapeRegex(value);\n }\n\n var escapedValues = _.map(value, utils.escapeRegex);\n return '(' + escapedValues.join('|') + ')';\n}\n\nfunction zabbixItemIdsTemplateFormat(value) {\n if (typeof value === 'string') {\n return value;\n }\n return value.join(',');\n}\n\n/**\n * If template variables are used in request, replace it using regex format\n * and wrap with '/' for proper multi-value work. Example:\n * $variable selected as a, b, c\n * We use filter $variable\n * $variable -> a|b|c -> /a|b|c/\n * /$variable/ -> /a|b|c/ -> /a|b|c/\n */\nfunction replaceTemplateVars(templateSrv, target, scopedVars) {\n var replacedTarget = templateSrv.replace(target, scopedVars, zabbixTemplateFormat);\n if (target !== replacedTarget && !utils.isRegex(replacedTarget)) {\n replacedTarget = '/^' + replacedTarget + '$/';\n }\n return replacedTarget;\n}\n\nfunction filterEnabledTargets(targets) {\n return _.filter(targets, target => {\n return !(target.hide || !target.group || !target.host || !target.item);\n });\n}\n\nfunction getTriggerThreshold(expression) {\n let thresholdPattern = /.*[<>=]{1,2}([\\d\\.]+)/;\n let finded_thresholds = expression.match(thresholdPattern);\n if (finded_thresholds && finded_thresholds.length >= 2) {\n let threshold = finded_thresholds[1];\n threshold = Number(threshold);\n return threshold;\n } else {\n return null;\n }\n}\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {_.includes = _.contains;}\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","getConsolidateBy","target","consolidateBy","funcDef","find","functions","length","downsampleSeries","timeseries_data","options","defaultAgg","consolidateByFunc","timeseries","datapoints","maxDataPoints","groupBy","interval","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","zabbixItemIdsTemplateFormat","replaceTemplateVars","templateSrv","scopedVars","replacedTarget","replace","isRegex","filterEnabledTargets","targets","hide","group","host","item","getTriggerThreshold","expression","thresholdPattern","finded_thresholds","match","threshold","Number","dateMath","migrations","c","responseHandler","Zabbix","ZabbixAPIError","ZabbixDatasource","instanceSettings","backendSrv","datasourceSrv","zabbixAlertingSrv","partial","url","basicAuth","withCredentials","jsonData","migrateDSConfig","username","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","disableReadOnlyUsersAck","enableDirectDBConnection","dbConnectionEnable","dbConnectionDatasourceId","dbConnectionDatasourceName","zabbixOptions","zabbix","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","t","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","replaceTargetVariables","timeFunctions","sequence","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_METRICS","MODE_TEXT","migrate","queryNumericData","queryTextData","MODE_ITEMID","itemids","queryItemIdData","MODE_ITSERVICE","queryITServiceData","MODE_TRIGGERS","queryTriggersData","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","queryNumericDataForItems","items","getHistoryPromise","valueType","getTrendValueType","getTrends","getHistoryTS","applyDataProcessingFunctions","trendFunctions","trendValueFunc","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","series","unShiftTimeSeries","getHistoryText","split","itemid","trim","getItemsByIDs","itservice","itServiceFilter","slaProperty","isOldVersion","getITServices","getSLA","itservices","getHostsFromTarget","results","hosts","apps","hostids","appids","minSeverity","triggers","acknowledged","count","getHostAlerts","handleTriggersResponse","resolve","testDataSource","zabbixVersion","result","dbConnectorStatus","message","dsType","status","title","catch","error","console","log","query","parts","each","splitTemplateQuery","part","push","template","zipObject","app","getItems","getApps","getHosts","getGroups","metrics","rangeRaw","annotation","showOkEvents","SHOW_ALL_EVENTS","SHOW_OK_EVENTS","triggersOptions","showTriggers","SHOW_ALL_TRIGGERS","hideHostsInMaintenance","getTriggers","application","triggerName","trigger","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport { Zabbix } from './zabbix/zabbix';\nimport { ZabbixAPIError } from './zabbix/connectors/zabbix_api/zabbixAPICore';\n\nexport class ZabbixDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) {\n this.templateSrv = templateSrv;\n this.zabbixAlertingSrv = zabbixAlertingSrv;\n\n // Use custom format for template variables\n this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);\n\n // General data source settings\n this.name = instanceSettings.name;\n this.url = instanceSettings.url;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n\n const jsonData = migrations.migrateDSConfig(instanceSettings.jsonData);\n\n // Zabbix API credentials\n this.username = jsonData.username;\n this.password = jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = jsonData.trends;\n this.trendsFrom = jsonData.trendsFrom || '7d';\n this.trendsRange = jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = jsonData.alerting;\n this.addThresholds = jsonData.addThresholds;\n this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n // Other options\n this.disableReadOnlyUsersAck = jsonData.disableReadOnlyUsersAck;\n\n // Direct DB Connection options\n this.enableDirectDBConnection = jsonData.dbConnectionEnable || false;\n this.dbConnectionDatasourceId = jsonData.dbConnectionDatasourceId;\n this.dbConnectionDatasourceName = jsonData.dbConnectionDatasourceName;\n\n let zabbixOptions = {\n url: this.url,\n username: this.username,\n password: this.password,\n basicAuth: this.basicAuth,\n withCredentials: this.withCredentials,\n cacheTTL: this.cacheTTL,\n enableDirectDBConnection: this.enableDirectDBConnection,\n dbConnectionDatasourceId: this.dbConnectionDatasourceId,\n dbConnectionDatasourceName: this.dbConnectionDatasourceName\n };\n\n this.zabbix = new Zabbix(zabbixOptions, backendSrv, datasourceSrv);\n }\n\n ////////////////////////\n // Datasource methods //\n ////////////////////////\n\n /**\n * Query panel data. Calls for each panel in dashboard.\n * @param {Object} options Contains time range, targets and other info.\n * @return {Object} Grafana metrics object with timeseries data for each target.\n */\n query(options) {\n // Get alerts for current panel\n if (this.alertingEnabled) {\n this.alertQuery(options).then(alert => {\n this.zabbixAlertingSrv.setPanelAlertState(options.panelId, alert.state);\n\n this.zabbixAlertingSrv.removeZabbixThreshold(options.panelId);\n if (this.addThresholds) {\n _.forEach(alert.thresholds, threshold => {\n this.zabbixAlertingSrv.setPanelThreshold(options.panelId, threshold);\n });\n }\n });\n }\n\n // Create request for each target\n let promises = _.map(options.targets, t => {\n // Don't request for hidden targets\n if (t.hide) {\n return [];\n }\n\n let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);\n let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);\n\n // Prevent changes of original object\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n\n // Apply Time-related functions (timeShift(), etc)\n let timeFunctions = bindFunctionDefs(target.functions, 'Time');\n if (timeFunctions.length) {\n const [time_from, time_to] = utils.sequence(timeFunctions)([timeFrom, timeTo]);\n timeFrom = time_from;\n timeTo = time_to;\n }\n let timeRange = [timeFrom, timeTo];\n\n let useTrends = this.isUseTrends(timeRange);\n\n // Metrics or Text query mode\n if (!target.mode || target.mode === c.MODE_METRICS || target.mode === c.MODE_TEXT) {\n // Migrate old targets\n target = migrations.migrate(target);\n\n // Don't request undefined targets\n if (!target.group || !target.host || !target.item) {\n return [];\n }\n\n if (!target.mode || target.mode === c.MODE_METRICS) {\n return this.queryNumericData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_TEXT) {\n return this.queryTextData(target, timeRange);\n }\n } else if (target.mode === c.MODE_ITEMID) {\n // Item ID mode\n if (!target.itemids) {\n return [];\n }\n return this.queryItemIdData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_ITSERVICE) {\n // IT services mode\n return this.queryITServiceData(target, timeRange, options);\n } else if (target.mode === c.MODE_TRIGGERS) {\n // Triggers mode\n return this.queryTriggersData(target, timeRange);\n } else {\n return [];\n }\n });\n\n // Data for panel (all targets)\n return Promise.all(_.flatten(promises))\n .then(_.flatten)\n .then(data => {\n return { data: data };\n });\n }\n\n /**\n * Query target data for Metrics mode\n */\n queryNumericData(target, timeRange, useTrends, options) {\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => this.queryNumericDataForItems(items, target, timeRange, useTrends, options));\n }\n\n /**\n * Query history for numeric items\n */\n queryNumericDataForItems(items, target, timeRange, useTrends, options) {\n let getHistoryPromise;\n options.valueType = this.getTrendValueType(target);\n options.consolidateBy = getConsolidateBy(target) || options.valueType;\n\n if (useTrends) {\n getHistoryPromise = this.zabbix.getTrends(items, timeRange, options);\n } else {\n getHistoryPromise = this.zabbix.getHistoryTS(items, timeRange, options);\n }\n\n return getHistoryPromise\n .then(timeseries => this.applyDataProcessingFunctions(timeseries, target))\n .then(timeseries => downsampleSeries(timeseries, options));\n }\n\n getTrendValueType(target) {\n // Find trendValue() function and get specified trend value\n var trendFunctions = _.map(metricFunctions.getCategories()['Trends'], 'name');\n var trendValueFunc = _.find(target.functions, func => {\n return _.includes(trendFunctions, func.def.name);\n });\n return trendValueFunc ? trendValueFunc.params[0] : \"avg\";\n }\n\n applyDataProcessingFunctions(timeseries_data, target) {\n let transformFunctions = bindFunctionDefs(target.functions, 'Transform');\n let aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');\n let filterFunctions = bindFunctionDefs(target.functions, 'Filter');\n let aliasFunctions = bindFunctionDefs(target.functions, 'Alias');\n\n // Apply transformation functions\n timeseries_data = _.cloneDeep(_.map(timeseries_data, timeseries => {\n timeseries.datapoints = utils.sequence(transformFunctions)(timeseries.datapoints);\n return timeseries;\n }));\n\n // Apply filter functions\n if (filterFunctions.length) {\n timeseries_data = utils.sequence(filterFunctions)(timeseries_data);\n }\n\n // Apply aggregations\n if (aggregationFunctions.length) {\n let dp = _.map(timeseries_data, 'datapoints');\n dp = utils.sequence(aggregationFunctions)(dp);\n\n let aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name');\n let lastAgg = _.findLast(target.functions, func => {\n return _.includes(aggFuncNames, func.def.name);\n });\n\n timeseries_data = [{\n target: lastAgg.text,\n datapoints: dp\n }];\n }\n\n // Apply alias functions\n _.forEach(timeseries_data, utils.sequence(aliasFunctions));\n\n // Apply Time-related functions (timeShift(), etc)\n // Find timeShift() function and get specified trend value\n this.applyTimeShiftFunction(timeseries_data, target);\n\n return timeseries_data;\n }\n\n applyTimeShiftFunction(timeseries_data, target) {\n // Find timeShift() function and get specified interval\n let timeShiftFunc = _.find(target.functions, (func) => {\n return func.def.name === 'timeShift';\n });\n if (timeShiftFunc) {\n let shift = timeShiftFunc.params[0];\n _.forEach(timeseries_data, (series) => {\n series.datapoints = dataProcessor.unShiftTimeSeries(shift, series.datapoints);\n });\n }\n }\n\n /**\n * Query target data for Text mode\n */\n queryTextData(target, timeRange) {\n let options = {\n itemtype: 'text'\n };\n return this.zabbix.getItemsFromTarget(target, options)\n .then(items => {\n return this.zabbix.getHistoryText(items, timeRange, target);\n });\n }\n\n /**\n * Query target data for Item ID mode\n */\n queryItemIdData(target, timeRange, useTrends, options) {\n let itemids = target.itemids;\n itemids = this.templateSrv.replace(itemids, options.scopedVars, zabbixItemIdsTemplateFormat);\n itemids = _.map(itemids.split(','), itemid => itemid.trim());\n\n if (!itemids) {\n return [];\n }\n\n return this.zabbix.getItemsByIDs(itemids)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query target data for IT Services mode\n */\n queryITServiceData(target, timeRange, options) {\n // Don't show undefined and hidden targets\n if (target.hide || (!target.itservice && !target.itServiceFilter) || !target.slaProperty) {\n return [];\n }\n\n let itServiceFilter;\n options.isOldVersion = target.itservice && !target.itServiceFilter;\n\n if (options.isOldVersion) {\n // Backward compatibility\n itServiceFilter = '/.*/';\n } else {\n itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);\n }\n\n return this.zabbix.getITServices(itServiceFilter)\n .then(itservices => {\n return this.zabbix.getSLA(itservices, timeRange, target, options);\n });\n }\n\n queryTriggersData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n return this.zabbix.getHostsFromTarget(target)\n .then((results) => {\n let [hosts, apps] = results;\n if (hosts.length) {\n let hostids = _.map(hosts, 'hostid');\n let appids = _.map(apps, 'applicationid');\n let options = {\n minSeverity: target.triggers.minSeverity,\n acknowledged: target.triggers.acknowledged,\n count: target.triggers.count,\n timeFrom: timeFrom,\n timeTo: timeTo\n };\n return this.zabbix.getHostAlerts(hostids, appids, options)\n .then((triggers) => {\n return responseHandler.handleTriggersResponse(triggers, timeRange);\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Test connection to Zabbix API and external history DB.\n */\n testDatasource() {\n return this.zabbix.testDataSource()\n .then(result => {\n const { zabbixVersion, dbConnectorStatus } = result;\n let message = `Zabbix API version: ${zabbixVersion}`;\n if (dbConnectorStatus) {\n message += `, DB connector type: ${dbConnectorStatus.dsType}`;\n }\n return {\n status: \"success\",\n title: \"Success\",\n message: message\n };\n })\n .catch(error => {\n if (error instanceof ZabbixAPIError) {\n return {\n status: \"error\",\n title: error.message,\n message: error.message\n };\n } else if (error.data && error.data.message) {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error.data.message\n };\n } else if (typeof(error) === 'string') {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error\n };\n } else {\n console.log(error);\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Could not connect to given url\"\n };\n }\n });\n }\n\n ////////////////\n // Templating //\n ////////////////\n\n /**\n * Find metrics from templated request.\n *\n * @param {string} query Query from Templating\n * @return {string} Metric name - group, host, app or item or list\n * of metrics in \"{metric1,metcic2,...,metricN}\" format.\n */\n metricFindQuery(query) {\n let result;\n let parts = [];\n\n // Split query. Query structure: group.host.app.item\n _.each(utils.splitTemplateQuery(query), part => {\n part = this.replaceTemplateVars(part, {});\n\n // Replace wildcard to regex\n if (part === '*') {\n part = '/.*/';\n }\n parts.push(part);\n });\n let template = _.zipObject(['group', 'host', 'app', 'item'], parts);\n\n // Get items\n if (parts.length === 4) {\n // Search for all items, even it's not belong to any application\n if (template.app === '/.*/') {\n template.app = '';\n }\n result = this.zabbix.getItems(template.group, template.host, template.app, template.item);\n } else if (parts.length === 3) {\n // Get applications\n result = this.zabbix.getApps(template.group, template.host, template.app);\n } else if (parts.length === 2) {\n // Get hosts\n result = this.zabbix.getHosts(template.group, template.host);\n } else if (parts.length === 1) {\n // Get groups\n result = this.zabbix.getGroups(template.group);\n } else {\n result = Promise.resolve([]);\n }\n\n return result.then(metrics => {\n return _.map(metrics, formatMetric);\n });\n }\n\n /////////////////\n // Annotations //\n /////////////////\n\n annotationQuery(options) {\n var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);\n var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);\n var annotation = options.annotation;\n var showOkEvents = annotation.showOkEvents ? c.SHOW_ALL_EVENTS : c.SHOW_OK_EVENTS;\n\n // Show all triggers\n let triggersOptions = {\n showTriggers: c.SHOW_ALL_TRIGGERS,\n hideHostsInMaintenance: false\n };\n\n var getTriggers = this.zabbix.getTriggers(this.replaceTemplateVars(annotation.group, {}),\n this.replaceTemplateVars(annotation.host, {}),\n this.replaceTemplateVars(annotation.application, {}),\n triggersOptions);\n\n return getTriggers.then(triggers => {\n\n // Filter triggers by description\n let triggerName = this.replaceTemplateVars(annotation.trigger, {});\n if (utils.isRegex(triggerName)) {\n triggers = _.filter(triggers, trigger => {\n return utils.buildRegex(triggerName).test(trigger.description);\n });\n } else if (triggerName) {\n triggers = _.filter(triggers, trigger => {\n return trigger.description === triggerName;\n });\n }\n\n // Remove events below the chose severity\n triggers = _.filter(triggers, trigger => {\n return Number(trigger.priority) >= Number(annotation.minseverity);\n });\n\n var objectids = _.map(triggers, 'triggerid');\n return this.zabbix\n .getEvents(objectids, timeFrom, timeTo, showOkEvents)\n .then(events => {\n var indexedTriggers = _.keyBy(triggers, 'triggerid');\n\n // Hide acknowledged events if option enabled\n if (annotation.hideAcknowledged) {\n events = _.filter(events, event => {\n return !event.acknowledges.length;\n });\n }\n\n return _.map(events, event => {\n let tags;\n if (annotation.showHostname) {\n tags = _.map(event.hosts, 'name');\n }\n\n // Show event type (OK or Problem)\n let title = Number(event.value) ? 'Problem' : 'OK';\n\n let formatted_acknowledges = utils.formatAcknowledges(event.acknowledges);\n return {\n annotation: annotation,\n time: event.clock * 1000,\n title: title,\n tags: tags,\n text: indexedTriggers[event.objectid].description + formatted_acknowledges\n };\n });\n });\n });\n }\n\n /**\n * Get triggers and its details for panel's targets\n * Returns alert state ('ok' if no fired triggers, or 'alerting' if at least 1 trigger is fired)\n * or empty object if no related triggers are finded.\n */\n alertQuery(options) {\n let enabled_targets = filterEnabledTargets(options.targets);\n let getPanelItems = _.map(enabled_targets, t => {\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n return this.zabbix.getItemsFromTarget(target, {itemtype: 'num'});\n });\n\n return Promise.all(getPanelItems)\n .then(results => {\n let items = _.flatten(results);\n let itemids = _.map(items, 'itemid');\n\n if (itemids.length === 0) {\n return [];\n }\n return this.zabbix.getAlerts(itemids);\n })\n .then(triggers => {\n triggers = _.filter(triggers, trigger => {\n return trigger.priority >= this.alertingMinSeverity;\n });\n\n if (!triggers || triggers.length === 0) {\n return {};\n }\n\n let state = 'ok';\n\n let firedTriggers = _.filter(triggers, {value: '1'});\n if (firedTriggers.length) {\n state = 'alerting';\n }\n\n let thresholds = _.map(triggers, trigger => {\n return getTriggerThreshold(trigger.expression);\n });\n\n return {\n panelId: options.panelId,\n state: state,\n thresholds: thresholds\n };\n });\n }\n\n // Replace template variables\n replaceTargetVariables(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n _.forEach(parts, p => {\n if (target[p] && target[p].filter) {\n target[p].filter = this.replaceTemplateVars(target[p].filter, options.scopedVars);\n }\n });\n target.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars);\n\n _.forEach(target.functions, func => {\n func.params = _.map(func.params, param => {\n if (typeof param === 'number') {\n return +this.templateSrv.replace(param.toString(), options.scopedVars);\n } else {\n return this.templateSrv.replace(param, options.scopedVars);\n }\n });\n });\n }\n\n isUseTrends(timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);\n let useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);\n let useTrends = this.trends && (\n (timeFrom <= useTrendsFrom) ||\n (timeTo - timeFrom >= useTrendsRange)\n );\n return useTrends;\n }\n}\n\nfunction bindFunctionDefs(functionDefs, category) {\n var aggregationFunctions = _.map(metricFunctions.getCategories()[category], 'name');\n var aggFuncDefs = _.filter(functionDefs, function(func) {\n return _.includes(aggregationFunctions, func.def.name);\n });\n\n return _.map(aggFuncDefs, function(func) {\n var funcInstance = metricFunctions.createFuncInstance(func.def, func.params);\n return funcInstance.bindFunction(dataProcessor.metricFunctions);\n });\n}\n\nfunction getConsolidateBy(target) {\n let consolidateBy;\n let funcDef = _.find(target.functions, func => {\n return func.def.name === 'consolidateBy';\n });\n if (funcDef && funcDef.params && funcDef.params.length) {\n consolidateBy = funcDef.params[0];\n }\n return consolidateBy;\n}\n\nfunction downsampleSeries(timeseries_data, options) {\n let defaultAgg = dataProcessor.aggregationFunctions['avg'];\n let consolidateByFunc = dataProcessor.aggregationFunctions[options.consolidateBy] || defaultAgg;\n return _.map(timeseries_data, timeseries => {\n if (timeseries.datapoints.length > options.maxDataPoints) {\n timeseries.datapoints = dataProcessor\n .groupBy(options.interval, consolidateByFunc, timeseries.datapoints);\n }\n return timeseries;\n });\n}\n\nfunction formatMetric(metricObj) {\n return {\n text: metricObj.name,\n expandable: false\n };\n}\n\n/**\n * Custom formatter for template variables.\n * Default Grafana \"regex\" formatter returns\n * value1|value2\n * This formatter returns\n * (value1|value2)\n * This format needed for using in complex regex with\n * template variables, for example\n * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait\n */\nexport function zabbixTemplateFormat(value) {\n if (typeof value === 'string') {\n return utils.escapeRegex(value);\n }\n\n var escapedValues = _.map(value, utils.escapeRegex);\n return '(' + escapedValues.join('|') + ')';\n}\n\nfunction zabbixItemIdsTemplateFormat(value) {\n if (typeof value === 'string') {\n return value;\n }\n return value.join(',');\n}\n\n/**\n * If template variables are used in request, replace it using regex format\n * and wrap with '/' for proper multi-value work. Example:\n * $variable selected as a, b, c\n * We use filter $variable\n * $variable -> a|b|c -> /a|b|c/\n * /$variable/ -> /a|b|c/ -> /a|b|c/\n */\nfunction replaceTemplateVars(templateSrv, target, scopedVars) {\n var replacedTarget = templateSrv.replace(target, scopedVars, zabbixTemplateFormat);\n if (target !== replacedTarget && !utils.isRegex(replacedTarget)) {\n replacedTarget = '/^' + replacedTarget + '$/';\n }\n return replacedTarget;\n}\n\nfunction filterEnabledTargets(targets) {\n return _.filter(targets, target => {\n return !(target.hide || !target.group || !target.host || !target.item);\n });\n}\n\nfunction getTriggerThreshold(expression) {\n let thresholdPattern = /.*[<>=]{1,2}([\\d\\.]+)/;\n let finded_thresholds = expression.match(thresholdPattern);\n if (finded_thresholds && finded_thresholds.length >= 2) {\n let threshold = finded_thresholds[1];\n threshold = Number(threshold);\n return threshold;\n } else {\n return null;\n }\n}\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {_.includes = _.contains;}\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/specs/dbConnector.test.js b/dist/datasource-zabbix/specs/dbConnector.test.js new file mode 100644 index 0000000..308d141 --- /dev/null +++ b/dist/datasource-zabbix/specs/dbConnector.test.js @@ -0,0 +1,62 @@ +'use strict'; + +System.register(['../zabbix/connectors/dbConnector'], function (_export, _context) { + "use strict"; + + var DBConnector; + return { + setters: [function (_zabbixConnectorsDbConnector) { + DBConnector = _zabbixConnectorsDbConnector.default; + }], + execute: function () { + + describe('DBConnector', function () { + var ctx = {}; + var backendSrvMock = {}; + var datasourceSrvMock = { + loadDatasource: jest.fn().mockResolvedValue({ id: 42, name: 'foo', meta: {} }), + getAll: jest.fn().mockReturnValue([{ id: 42, name: 'foo' }]) + }; + + describe('When init DB connector', function () { + beforeEach(function () { + ctx.options = { + datasourceId: 42, + datasourceName: undefined + }; + }); + + it('should load datasource by name by default', function () { + ctx.options = { + datasourceName: 'bar' + }; + var dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock); + dbConnector.loadDBDataSource(); + expect(datasourceSrvMock.getAll).not.toHaveBeenCalled(); + expect(datasourceSrvMock.loadDatasource).toHaveBeenCalledWith('bar'); + }); + + it('should load datasource by id if name not present', function () { + var dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock); + dbConnector.loadDBDataSource(); + expect(datasourceSrvMock.getAll).toHaveBeenCalled(); + expect(datasourceSrvMock.loadDatasource).toHaveBeenCalledWith('foo'); + }); + + it('should throw error if no name and id specified', function () { + ctx.options = {}; + var dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock); + return expect(dbConnector.loadDBDataSource()).rejects.toBe('SQL Data Source name should be specified'); + }); + + it('should throw error if datasource with given id is not found', function () { + ctx.options.datasourceId = 45; + var dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock); + return expect(dbConnector.loadDBDataSource()).rejects.toBe('SQL Data Source with ID 45 not found'); + }); + }); + }); + } + }; +}); +//# sourceMappingURL=dbConnector.test.js.map diff --git a/dist/datasource-zabbix/specs/dbConnector.test.js.map b/dist/datasource-zabbix/specs/dbConnector.test.js.map new file mode 100644 index 0000000..3762d36 --- /dev/null +++ b/dist/datasource-zabbix/specs/dbConnector.test.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/datasource-zabbix/specs/dbConnector.test.js"],"names":["DBConnector","describe","ctx","backendSrvMock","datasourceSrvMock","loadDatasource","jest","fn","mockResolvedValue","id","name","meta","getAll","mockReturnValue","beforeEach","options","datasourceId","datasourceName","undefined","it","dbConnector","loadDBDataSource","expect","not","toHaveBeenCalled","toHaveBeenCalledWith","rejects","toBe"],"mappings":";;;;;;;;AAAOA,iB;;;;AAEPC,eAAS,aAAT,EAAwB,YAAM;AAC5B,YAAIC,MAAM,EAAV;AACA,YAAMC,iBAAiB,EAAvB;AACA,YAAMC,oBAAoB;AACxBC,0BAAgBC,KAAKC,EAAL,GAAUC,iBAAV,CACd,EAAEC,IAAI,EAAN,EAAUC,MAAM,KAAhB,EAAuBC,MAAM,EAA7B,EADc,CADQ;AAIxBC,kBAAQN,KAAKC,EAAL,GAAUM,eAAV,CAA0B,CAChC,EAAEJ,IAAI,EAAN,EAAUC,MAAM,KAAhB,EADgC,CAA1B;AAJgB,SAA1B;;AASAT,iBAAS,wBAAT,EAAmC,YAAM;AACvCa,qBAAW,YAAM;AACfZ,gBAAIa,OAAJ,GAAc;AACZC,4BAAc,EADF;AAEZC,8BAAgBC;AAFJ,aAAd;AAID,WALD;;AAOAC,aAAG,2CAAH,EAAgD,YAAM;AACpDjB,gBAAIa,OAAJ,GAAc;AACZE,8BAAgB;AADJ,aAAd;AAGA,gBAAMG,cAAc,IAAIpB,WAAJ,CAAgBE,IAAIa,OAApB,EAA6BZ,cAA7B,EAA6CC,iBAA7C,CAApB;AACAgB,wBAAYC,gBAAZ;AACAC,mBAAOlB,kBAAkBQ,MAAzB,EAAiCW,GAAjC,CAAqCC,gBAArC;AACAF,mBAAOlB,kBAAkBC,cAAzB,EAAyCoB,oBAAzC,CAA8D,KAA9D;AACD,WARD;;AAUAN,aAAG,kDAAH,EAAuD,YAAM;AAC3D,gBAAMC,cAAc,IAAIpB,WAAJ,CAAgBE,IAAIa,OAApB,EAA6BZ,cAA7B,EAA6CC,iBAA7C,CAApB;AACAgB,wBAAYC,gBAAZ;AACAC,mBAAOlB,kBAAkBQ,MAAzB,EAAiCY,gBAAjC;AACAF,mBAAOlB,kBAAkBC,cAAzB,EAAyCoB,oBAAzC,CAA8D,KAA9D;AACD,WALD;;AAOAN,aAAG,gDAAH,EAAqD,YAAM;AACzDjB,gBAAIa,OAAJ,GAAc,EAAd;AACA,gBAAMK,cAAc,IAAIpB,WAAJ,CAAgBE,IAAIa,OAApB,EAA6BZ,cAA7B,EAA6CC,iBAA7C,CAApB;AACA,mBAAOkB,OAAOF,YAAYC,gBAAZ,EAAP,EAAuCK,OAAvC,CAA+CC,IAA/C,CAAoD,0CAApD,CAAP;AACD,WAJD;;AAMAR,aAAG,6DAAH,EAAkE,YAAM;AACtEjB,gBAAIa,OAAJ,CAAYC,YAAZ,GAA2B,EAA3B;AACA,gBAAMI,cAAc,IAAIpB,WAAJ,CAAgBE,IAAIa,OAApB,EAA6BZ,cAA7B,EAA6CC,iBAA7C,CAApB;AACA,mBAAOkB,OAAOF,YAAYC,gBAAZ,EAAP,EAAuCK,OAAvC,CAA+CC,IAA/C,CAAoD,sCAApD,CAAP;AACD,WAJD;AAKD,SApCD;AAqCD,OAjDD","file":"dbConnector.test.js","sourcesContent":["import DBConnector from '../zabbix/connectors/dbConnector';\n\ndescribe('DBConnector', () => {\n let ctx = {};\n const backendSrvMock = {};\n const datasourceSrvMock = {\n loadDatasource: jest.fn().mockResolvedValue(\n { id: 42, name: 'foo', meta: {} }\n ),\n getAll: jest.fn().mockReturnValue([\n { id: 42, name: 'foo' }\n ])\n };\n\n describe('When init DB connector', () => {\n beforeEach(() => {\n ctx.options = {\n datasourceId: 42,\n datasourceName: undefined\n };\n });\n\n it('should load datasource by name by default', () => {\n ctx.options = {\n datasourceName: 'bar'\n };\n const dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock);\n dbConnector.loadDBDataSource();\n expect(datasourceSrvMock.getAll).not.toHaveBeenCalled();\n expect(datasourceSrvMock.loadDatasource).toHaveBeenCalledWith('bar');\n });\n\n it('should load datasource by id if name not present', () => {\n const dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock);\n dbConnector.loadDBDataSource();\n expect(datasourceSrvMock.getAll).toHaveBeenCalled();\n expect(datasourceSrvMock.loadDatasource).toHaveBeenCalledWith('foo');\n });\n\n it('should throw error if no name and id specified', () => {\n ctx.options = {};\n const dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock);\n return expect(dbConnector.loadDBDataSource()).rejects.toBe('SQL Data Source name should be specified');\n });\n\n it('should throw error if datasource with given id is not found', () => {\n ctx.options.datasourceId = 45;\n const dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock);\n return expect(dbConnector.loadDBDataSource()).rejects.toBe('SQL Data Source with ID 45 not found');\n });\n });\n});\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/connectors/dbConnector.js b/dist/datasource-zabbix/zabbix/connectors/dbConnector.js index 4384617..f788761 100644 --- a/dist/datasource-zabbix/zabbix/connectors/dbConnector.js +++ b/dist/datasource-zabbix/zabbix/connectors/dbConnector.js @@ -51,16 +51,21 @@ System.register(['lodash'], function (_export, _context) { value: function loadDBDataSource() { var _this = this; - var ds = _.find(this.datasourceSrv.getAll(), { 'id': this.datasourceId }); - if (ds) { - return this.datasourceSrv.loadDatasource(ds.name).then(function (ds) { - _this.datasourceName = ds.name; + if (!this.datasourceName && this.datasourceId !== undefined) { + var ds = _.find(this.datasourceSrv.getAll(), { 'id': this.datasourceId }); + if (!ds) { + return Promise.reject('SQL Data Source with ID ' + this.datasourceId + ' not found'); + } + this.datasourceName = ds.name; + } + if (this.datasourceName) { + return this.datasourceSrv.loadDatasource(this.datasourceName).then(function (ds) { _this.datasourceTypeId = ds.meta.id; _this.datasourceTypeName = ds.meta.name; return ds; }); } else { - return Promise.reject('SQL Data Source with ID ' + this.datasourceId + ' not found'); + return Promise.reject('SQL Data Source name should be specified'); } } }, { diff --git a/dist/datasource-zabbix/zabbix/connectors/dbConnector.js.map b/dist/datasource-zabbix/zabbix/connectors/dbConnector.js.map index 9752319..eaa7f73 100644 --- a/dist/datasource-zabbix/zabbix/connectors/dbConnector.js.map +++ b/dist/datasource-zabbix/zabbix/connectors/dbConnector.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../src/datasource-zabbix/zabbix/connectors/dbConnector.js"],"names":["_","DBConnector","options","backendSrv","datasourceSrv","datasourceId","datasourceName","datasourceTypeId","datasourceTypeName","ds","find","getAll","loadDatasource","name","then","meta","id","Promise","reject","ZabbixNotImplemented","methodName","code","message"],"mappings":";;;;;;;;;;;;;;;AAAOA,O;;;;;;;;;;;;;;;;;;;;;AAMcC,iB;AACnB,6BAAYC,OAAZ,EAAqBC,UAArB,EAAiCC,aAAjC,EAAgD;AAAA;;AAC9C,eAAKD,UAAL,GAAkBA,UAAlB;AACA,eAAKC,aAAL,GAAqBA,aAArB;AACA,eAAKC,YAAL,GAAoBH,QAAQG,YAA5B;AACA,eAAKC,cAAL,GAAsBJ,QAAQI,cAA9B;AACA,eAAKC,gBAAL,GAAwB,IAAxB;AACA,eAAKC,kBAAL,GAA0B,IAA1B;AACD;;;;6CAEkB;AAAA;;AACjB,gBAAIC,KAAKT,EAAEU,IAAF,CAAO,KAAKN,aAAL,CAAmBO,MAAnB,EAAP,EAAoC,EAAC,MAAM,KAAKN,YAAZ,EAApC,CAAT;AACA,gBAAII,EAAJ,EAAQ;AACN,qBAAO,KAAKL,aAAL,CAAmBQ,cAAnB,CAAkCH,GAAGI,IAArC,EACNC,IADM,CACD,cAAM;AACV,sBAAKR,cAAL,GAAsBG,GAAGI,IAAzB;AACA,sBAAKN,gBAAL,GAAwBE,GAAGM,IAAH,CAAQC,EAAhC;AACA,sBAAKR,kBAAL,GAA0BC,GAAGM,IAAH,CAAQF,IAAlC;AACA,uBAAOJ,EAAP;AACD,eANM,CAAP;AAOD,aARD,MAQO;AACL,qBAAOQ,QAAQC,MAAR,8BAA0C,KAAKb,YAA/C,gBAAP;AACD;AACF;;;2CAKgB;AACf,kBAAM,IAAIc,oBAAJ,CAAyB,kBAAzB,CAAN;AACD;;;uCAKY;AACX,kBAAM,IAAIA,oBAAJ,CAAyB,cAAzB,CAAN;AACD;;;sCAKW;AACV,kBAAM,IAAIA,oBAAJ,CAAyB,aAAzB,CAAN;AACD;;;;;;yBA5CkBlB,W;;sCAgDRkB,oB;AACX,sCAAYC,UAAZ,EAAwB;AAAA;;AACtB,eAAKC,IAAL,GAAY,IAAZ;AACA,eAAKR,IAAL,GAAY,sBAAZ;AACA,eAAKS,OAAL,2CAAoDF,cAAc,EAAlE;AACD;;;;qCAEU;AACT,mBAAO,KAAKE,OAAZ;AACD","file":"dbConnector.js","sourcesContent":["import _ from 'lodash';\n\n/**\n * Base class for external history database connectors. Subclasses should implement `getHistory()`, `getTrends()` and\n * `testDataSource()` methods, which describe how to fetch data from source other than Zabbix API.\n */\nexport default class DBConnector {\n constructor(options, backendSrv, datasourceSrv) {\n this.backendSrv = backendSrv;\n this.datasourceSrv = datasourceSrv;\n this.datasourceId = options.datasourceId;\n this.datasourceName = options.datasourceName;\n this.datasourceTypeId = null;\n this.datasourceTypeName = null;\n }\n\n loadDBDataSource() {\n let ds = _.find(this.datasourceSrv.getAll(), {'id': this.datasourceId});\n if (ds) {\n return this.datasourceSrv.loadDatasource(ds.name)\n .then(ds => {\n this.datasourceName = ds.name;\n this.datasourceTypeId = ds.meta.id;\n this.datasourceTypeName = ds.meta.name;\n return ds;\n });\n } else {\n return Promise.reject(`SQL Data Source with ID ${this.datasourceId} not found`);\n }\n }\n\n /**\n * Send test request to datasource in order to ensure it's working.\n */\n testDataSource() {\n throw new ZabbixNotImplemented('testDataSource()');\n }\n\n /**\n * Get history data from external sources.\n */\n getHistory() {\n throw new ZabbixNotImplemented('getHistory()');\n }\n\n /**\n * Get trends data from external sources.\n */\n getTrends() {\n throw new ZabbixNotImplemented('getTrends()');\n }\n}\n\n// Define Zabbix DB Connector exception type for non-implemented methods\nexport class ZabbixNotImplemented {\n constructor(methodName) {\n this.code = null;\n this.name = 'ZabbixNotImplemented';\n this.message = `Zabbix DB Connector Error: method ${methodName || ''} should be implemented in subclass of DBConnector`;\n }\n\n toString() {\n return this.message;\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../../src/datasource-zabbix/zabbix/connectors/dbConnector.js"],"names":["_","DBConnector","options","backendSrv","datasourceSrv","datasourceId","datasourceName","datasourceTypeId","datasourceTypeName","undefined","ds","find","getAll","Promise","reject","name","loadDatasource","then","meta","id","ZabbixNotImplemented","methodName","code","message"],"mappings":";;;;;;;;;;;;;;;AAAOA,O;;;;;;;;;;;;;;;;;;;;;AAMcC,iB;AACnB,6BAAYC,OAAZ,EAAqBC,UAArB,EAAiCC,aAAjC,EAAgD;AAAA;;AAC9C,eAAKD,UAAL,GAAkBA,UAAlB;AACA,eAAKC,aAAL,GAAqBA,aAArB;AACA,eAAKC,YAAL,GAAoBH,QAAQG,YAA5B;AACA,eAAKC,cAAL,GAAsBJ,QAAQI,cAA9B;AACA,eAAKC,gBAAL,GAAwB,IAAxB;AACA,eAAKC,kBAAL,GAA0B,IAA1B;AACD;;;;6CAEkB;AAAA;;AACjB,gBAAI,CAAC,KAAKF,cAAN,IAAwB,KAAKD,YAAL,KAAsBI,SAAlD,EAA6D;AAC3D,kBAAIC,KAAKV,EAAEW,IAAF,CAAO,KAAKP,aAAL,CAAmBQ,MAAnB,EAAP,EAAoC,EAAC,MAAM,KAAKP,YAAZ,EAApC,CAAT;AACA,kBAAI,CAACK,EAAL,EAAS;AACP,uBAAOG,QAAQC,MAAR,8BAA0C,KAAKT,YAA/C,gBAAP;AACD;AACD,mBAAKC,cAAL,GAAsBI,GAAGK,IAAzB;AACD;AACD,gBAAI,KAAKT,cAAT,EAAyB;AACvB,qBAAO,KAAKF,aAAL,CAAmBY,cAAnB,CAAkC,KAAKV,cAAvC,EACNW,IADM,CACD,cAAM;AACV,sBAAKV,gBAAL,GAAwBG,GAAGQ,IAAH,CAAQC,EAAhC;AACA,sBAAKX,kBAAL,GAA0BE,GAAGQ,IAAH,CAAQH,IAAlC;AACA,uBAAOL,EAAP;AACD,eALM,CAAP;AAMD,aAPD,MAOO;AACL,qBAAOG,QAAQC,MAAR,4CAAP;AACD;AACF;;;2CAKgB;AACf,kBAAM,IAAIM,oBAAJ,CAAyB,kBAAzB,CAAN;AACD;;;uCAKY;AACX,kBAAM,IAAIA,oBAAJ,CAAyB,cAAzB,CAAN;AACD;;;sCAKW;AACV,kBAAM,IAAIA,oBAAJ,CAAyB,aAAzB,CAAN;AACD;;;;;;yBAjDkBnB,W;;sCAqDRmB,oB;AACX,sCAAYC,UAAZ,EAAwB;AAAA;;AACtB,eAAKC,IAAL,GAAY,IAAZ;AACA,eAAKP,IAAL,GAAY,sBAAZ;AACA,eAAKQ,OAAL,2CAAoDF,cAAc,EAAlE;AACD;;;;qCAEU;AACT,mBAAO,KAAKE,OAAZ;AACD","file":"dbConnector.js","sourcesContent":["import _ from 'lodash';\n\n/**\n * Base class for external history database connectors. Subclasses should implement `getHistory()`, `getTrends()` and\n * `testDataSource()` methods, which describe how to fetch data from source other than Zabbix API.\n */\nexport default class DBConnector {\n constructor(options, backendSrv, datasourceSrv) {\n this.backendSrv = backendSrv;\n this.datasourceSrv = datasourceSrv;\n this.datasourceId = options.datasourceId;\n this.datasourceName = options.datasourceName;\n this.datasourceTypeId = null;\n this.datasourceTypeName = null;\n }\n\n loadDBDataSource() {\n if (!this.datasourceName && this.datasourceId !== undefined) {\n let ds = _.find(this.datasourceSrv.getAll(), {'id': this.datasourceId});\n if (!ds) {\n return Promise.reject(`SQL Data Source with ID ${this.datasourceId} not found`);\n }\n this.datasourceName = ds.name;\n }\n if (this.datasourceName) {\n return this.datasourceSrv.loadDatasource(this.datasourceName)\n .then(ds => {\n this.datasourceTypeId = ds.meta.id;\n this.datasourceTypeName = ds.meta.name;\n return ds;\n });\n } else {\n return Promise.reject(`SQL Data Source name should be specified`);\n }\n }\n\n /**\n * Send test request to datasource in order to ensure it's working.\n */\n testDataSource() {\n throw new ZabbixNotImplemented('testDataSource()');\n }\n\n /**\n * Get history data from external sources.\n */\n getHistory() {\n throw new ZabbixNotImplemented('getHistory()');\n }\n\n /**\n * Get trends data from external sources.\n */\n getTrends() {\n throw new ZabbixNotImplemented('getTrends()');\n }\n}\n\n// Define Zabbix DB Connector exception type for non-implemented methods\nexport class ZabbixNotImplemented {\n constructor(methodName) {\n this.code = null;\n this.name = 'ZabbixNotImplemented';\n this.message = `Zabbix DB Connector Error: method ${methodName || ''} should be implemented in subclass of DBConnector`;\n }\n\n toString() {\n return this.message;\n }\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/zabbix.js b/dist/datasource-zabbix/zabbix/zabbix.js index bd38c67..171b206 100644 --- a/dist/datasource-zabbix/zabbix/zabbix.js +++ b/dist/datasource-zabbix/zabbix/zabbix.js @@ -174,7 +174,8 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi withCredentials = options.withCredentials, cacheTTL = options.cacheTTL, enableDirectDBConnection = options.enableDirectDBConnection, - datasourceId = options.datasourceId; + dbConnectionDatasourceId = options.dbConnectionDatasourceId, + dbConnectionDatasourceName = options.dbConnectionDatasourceName; this.enableDirectDBConnection = enableDirectDBConnection; @@ -189,7 +190,10 @@ System.register(['lodash', '../utils', '../responseHandler', './connectors/zabbi this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv); if (enableDirectDBConnection) { - var dbConnectorOptions = { datasourceId: datasourceId }; + var dbConnectorOptions = { + datasourceId: dbConnectionDatasourceId, + datasourceName: dbConnectionDatasourceName + }; this.dbConnector = new SQLConnector(dbConnectorOptions, backendSrv, datasourceSrv); this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector); this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector); diff --git a/dist/datasource-zabbix/zabbix/zabbix.js.map b/dist/datasource-zabbix/zabbix/zabbix.js.map index dfa11b1..58c12fa 100644 --- a/dist/datasource-zabbix/zabbix/zabbix.js.map +++ b/dist/datasource-zabbix/zabbix/zabbix.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/datasource-zabbix/zabbix/zabbix.js"],"names":["findByName","list","name","finded","_","find","filterByName","filter","filterByRegex","regex","filterPattern","utils","buildRegex","zbx_obj","test","findByFilter","isRegex","filterByQuery","getHostIds","items","hostIds","map","item","hosts","uniq","flatten","responseHandler","ZabbixAPIConnector","SQLConnector","CachingProxy","ZabbixNotImplemented","REQUESTS_TO_PROXYFY","REQUESTS_TO_CACHE","REQUESTS_TO_BIND","Zabbix","options","backendSrv","datasourceSrv","url","username","password","basicAuth","withCredentials","cacheTTL","enableDirectDBConnection","datasourceId","cacheOptions","enabled","ttl","cachingProxy","zabbixAPI","dbConnectorOptions","dbConnector","getHistoryDB","proxyfyWithCache","getHistory","getTrendsDB","getTrends","proxyfyRequests","cacheRequests","bindRequests","request","proxyfy","cacheRequest","bind","zabbixVersion","dbConnectorStatus","getVersion","then","version","login","testDataSource","Promise","resolve","catch","error","reject","testResult","dsType","datasourceTypeName","dsName","datasourceName","target","parts","filters","p","getItems","all","getHosts","getApps","results","apps","appFilterEmpty","getGroups","groupFilter","getAllGroups","groups","groupids","hostFilter","getAllHosts","hostids","appFilter","undefined","itemtype","appids","showDisabledItems","expandUserMacro","getMacros","forEach","containsMacro","replaceMacro","macros","itemFilter","getAllItems","itServiceFilter","getITService","itServices","promises","filteredGroups","filteredHosts","filteredApps","query","applicationids","getTriggers","timeRange","timeFrom","timeTo","handleGrafanaTSResponse","history","handleHistory","valueType","consolidateBy","getTrend","handleTrends","sortTimeseries","length","resultFormat","handleHistoryAsTable","handleText","itservices","isOldVersion","itservice","serviceid","itServiceIds","getSLA","handleSLAResponse","slaProperty","slaResponse"],"mappings":"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","file":"zabbix.js","sourcesContent":["import _ from 'lodash';\nimport * as utils from '../utils';\nimport responseHandler from '../responseHandler';\nimport { ZabbixAPIConnector } from './connectors/zabbix_api/zabbixAPIConnector';\nimport { SQLConnector } from './connectors/sql/sqlConnector';\nimport { CachingProxy } from './proxy/cachingProxy';\nimport { ZabbixNotImplemented } from './connectors/dbConnector';\n\nconst REQUESTS_TO_PROXYFY = [\n 'getHistory', 'getTrend', 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs',\n 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion'\n];\n\nconst REQUESTS_TO_CACHE = [\n 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getITService'\n];\n\nconst REQUESTS_TO_BIND = [\n 'getHistory', 'getTrend', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts',\n 'getAcknowledges', 'getITService', 'getVersion', 'login'\n];\n\nexport class Zabbix {\n constructor(options, backendSrv, datasourceSrv) {\n let {\n url,\n username,\n password,\n basicAuth,\n withCredentials,\n cacheTTL,\n enableDirectDBConnection,\n datasourceId\n } = options;\n\n this.enableDirectDBConnection = enableDirectDBConnection;\n\n // Initialize caching proxy for requests\n let cacheOptions = {\n enabled: true,\n ttl: cacheTTL\n };\n this.cachingProxy = new CachingProxy(cacheOptions);\n\n this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);\n\n if (enableDirectDBConnection) {\n let dbConnectorOptions = { datasourceId };\n this.dbConnector = new SQLConnector(dbConnectorOptions, backendSrv, datasourceSrv);\n this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector);\n this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector);\n }\n\n this.proxyfyRequests();\n this.cacheRequests();\n this.bindRequests();\n }\n\n proxyfyRequests() {\n for (let request of REQUESTS_TO_PROXYFY) {\n this.zabbixAPI[request] = this.cachingProxy.proxyfy(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n cacheRequests() {\n for (let request of REQUESTS_TO_CACHE) {\n this.zabbixAPI[request] = this.cachingProxy.cacheRequest(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n bindRequests() {\n for (let request of REQUESTS_TO_BIND) {\n this[request] = this.zabbixAPI[request].bind(this.zabbixAPI);\n }\n }\n\n /**\n * Perform test query for Zabbix API and external history DB.\n * @return {object} test result object:\n * ```\n {\n zabbixVersion,\n dbConnectorStatus: {\n dsType,\n dsName\n }\n }\n ```\n */\n testDataSource() {\n let zabbixVersion;\n let dbConnectorStatus;\n return this.getVersion()\n .then(version => {\n zabbixVersion = version;\n return this.login();\n })\n .then(() => {\n if (this.enableDirectDBConnection) {\n return this.dbConnector.testDataSource();\n } else {\n return Promise.resolve();\n }\n })\n .catch(error => {\n if (error instanceof ZabbixNotImplemented) {\n return Promise.resolve();\n }\n return Promise.reject(error);\n })\n .then(testResult => {\n if (testResult) {\n dbConnectorStatus = {\n dsType: this.dbConnector.datasourceTypeName,\n dsName: this.dbConnector.datasourceName\n };\n }\n return { zabbixVersion, dbConnectorStatus };\n });\n }\n\n getItemsFromTarget(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n let filters = _.map(parts, p => target[p].filter);\n return this.getItems(...filters, options);\n }\n\n getHostsFromTarget(target) {\n let parts = ['group', 'host', 'application'];\n let filters = _.map(parts, p => target[p].filter);\n return Promise.all([\n this.getHosts(...filters),\n this.getApps(...filters),\n ]).then((results) => {\n let [hosts, apps] = results;\n if (apps.appFilterEmpty) {\n apps = [];\n }\n return [hosts, apps];\n });\n }\n\n getAllGroups() {\n return this.zabbixAPI.getGroups();\n }\n\n getGroups(groupFilter) {\n return this.getAllGroups()\n .then(groups => findByFilter(groups, groupFilter));\n }\n\n /**\n * Get list of host belonging to given groups.\n */\n getAllHosts(groupFilter) {\n return this.getGroups(groupFilter)\n .then(groups => {\n let groupids = _.map(groups, 'groupid');\n return this.zabbixAPI.getHosts(groupids);\n });\n }\n\n getHosts(groupFilter, hostFilter) {\n return this.getAllHosts(groupFilter)\n .then(hosts => findByFilter(hosts, hostFilter));\n }\n\n /**\n * Get list of applications belonging to given groups and hosts.\n */\n getAllApps(groupFilter, hostFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n return this.zabbixAPI.getApps(hostids);\n });\n }\n\n getApps(groupFilter, hostFilter, appFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n if (appFilter) {\n return this.zabbixAPI.getApps(hostids)\n .then(apps => filterByQuery(apps, appFilter));\n } else {\n return {\n appFilterEmpty: true,\n hostids: hostids\n };\n }\n });\n }\n\n getAllItems(groupFilter, hostFilter, appFilter, options = {}) {\n return this.getApps(groupFilter, hostFilter, appFilter)\n .then(apps => {\n if (apps.appFilterEmpty) {\n return this.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype);\n } else {\n let appids = _.map(apps, 'applicationid');\n return this.zabbixAPI.getItems(undefined, appids, options.itemtype);\n }\n })\n .then(items => {\n if (!options.showDisabledItems) {\n items = _.filter(items, {'status': '0'});\n }\n\n return items;\n })\n .then(this.expandUserMacro.bind(this));\n }\n\n expandUserMacro(items) {\n let hostids = getHostIds(items);\n return this.getMacros(hostids)\n .then(macros => {\n _.forEach(items, item => {\n if (utils.containsMacro(item.name)) {\n item.name = utils.replaceMacro(item, macros);\n }\n });\n return items;\n });\n }\n\n getItems(groupFilter, hostFilter, appFilter, itemFilter, options = {}) {\n return this.getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => filterByQuery(items, itemFilter));\n }\n\n getITServices(itServiceFilter) {\n return this.zabbixAPI.getITService()\n .then(itServices => findByFilter(itServices, itServiceFilter));\n }\n\n /**\n * Build query - convert target filters to array of Zabbix items\n */\n getTriggers(groupFilter, hostFilter, appFilter, options) {\n let promises = [\n this.getGroups(groupFilter),\n this.getHosts(groupFilter, hostFilter),\n this.getApps(groupFilter, hostFilter, appFilter)\n ];\n\n return Promise.all(promises)\n .then(results => {\n let filteredGroups = results[0];\n let filteredHosts = results[1];\n let filteredApps = results[2];\n let query = {};\n\n if (appFilter) {\n query.applicationids = _.flatten(_.map(filteredApps, 'applicationid'));\n }\n if (hostFilter) {\n query.hostids = _.map(filteredHosts, 'hostid');\n }\n if (groupFilter) {\n query.groupids = _.map(filteredGroups, 'groupid');\n }\n\n return query;\n }).then(query => {\n return this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options);\n });\n }\n\n getHistoryTS(items, timeRange, options) {\n let [timeFrom, timeTo] = timeRange;\n if (this.enableDirectDBConnection) {\n return this.getHistoryDB(items, timeFrom, timeTo, options)\n .then(history => this.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n return this.zabbixAPI.getHistory(items, timeFrom, timeTo)\n .then(history => responseHandler.handleHistory(history, items));\n }\n }\n\n getTrends(items, timeRange, options) {\n let [timeFrom, timeTo] = timeRange;\n if (this.enableDirectDBConnection) {\n return this.getTrendsDB(items, timeFrom, timeTo, options)\n .then(history => this.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n let valueType = options.consolidateBy || options.valueType;\n return this.zabbixAPI.getTrend(items, timeFrom, timeTo)\n .then(history => responseHandler.handleTrends(history, items, valueType))\n .then(responseHandler.sortTimeseries); // Sort trend data, issue #202\n }\n }\n\n getHistoryText(items, timeRange, target) {\n let [timeFrom, timeTo] = timeRange;\n if (items.length) {\n return this.zabbixAPI.getHistory(items, timeFrom, timeTo)\n .then(history => {\n if (target.resultFormat === 'table') {\n return responseHandler.handleHistoryAsTable(history, items, target);\n } else {\n return responseHandler.handleText(history, items, target);\n }\n });\n } else {\n return Promise.resolve([]);\n }\n }\n\n getSLA(itservices, timeRange, target, options) {\n let itServices = itservices;\n if (options.isOldVersion) {\n itServices = _.filter(itServices, {'serviceid': target.itservice.serviceid});\n }\n let itServiceIds = _.map(itServices, 'serviceid');\n return this.zabbixAPI.getSLA(itServiceIds, timeRange)\n .then(slaResponse => {\n return _.map(itServiceIds, serviceid => {\n let itservice = _.find(itServices, {'serviceid': serviceid});\n return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse);\n });\n });\n }\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Find group, host, app or item by given name.\n * @param list list of groups, apps or other\n * @param name visible name\n * @return array with finded element or empty array\n */\nfunction findByName(list, name) {\n var finded = _.find(list, {'name': name});\n if (finded) {\n return [finded];\n } else {\n return [];\n }\n}\n\n/**\n * Different hosts can contains applications and items with same name.\n * For this reason use _.filter, which return all elements instead _.find,\n * which return only first finded.\n * @param {[type]} list list of elements\n * @param {[type]} name app name\n * @return {[type]} array with finded element or empty array\n */\nfunction filterByName(list, name) {\n var finded = _.filter(list, {'name': name});\n if (finded) {\n return finded;\n } else {\n return [];\n }\n}\n\nfunction filterByRegex(list, regex) {\n var filterPattern = utils.buildRegex(regex);\n return _.filter(list, function (zbx_obj) {\n return filterPattern.test(zbx_obj.name);\n });\n}\n\nfunction findByFilter(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return findByName(list, filter);\n }\n}\n\nfunction filterByQuery(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return filterByName(list, filter);\n }\n}\n\nfunction getHostIds(items) {\n let hostIds = _.map(items, item => {\n return _.map(item.hosts, 'hostid');\n });\n return _.uniq(_.flatten(hostIds));\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/datasource-zabbix/zabbix/zabbix.js"],"names":["findByName","list","name","finded","_","find","filterByName","filter","filterByRegex","regex","filterPattern","utils","buildRegex","zbx_obj","test","findByFilter","isRegex","filterByQuery","getHostIds","items","hostIds","map","item","hosts","uniq","flatten","responseHandler","ZabbixAPIConnector","SQLConnector","CachingProxy","ZabbixNotImplemented","REQUESTS_TO_PROXYFY","REQUESTS_TO_CACHE","REQUESTS_TO_BIND","Zabbix","options","backendSrv","datasourceSrv","url","username","password","basicAuth","withCredentials","cacheTTL","enableDirectDBConnection","dbConnectionDatasourceId","dbConnectionDatasourceName","cacheOptions","enabled","ttl","cachingProxy","zabbixAPI","dbConnectorOptions","datasourceId","datasourceName","dbConnector","getHistoryDB","proxyfyWithCache","getHistory","getTrendsDB","getTrends","proxyfyRequests","cacheRequests","bindRequests","request","proxyfy","cacheRequest","bind","zabbixVersion","dbConnectorStatus","getVersion","then","version","login","testDataSource","Promise","resolve","catch","error","reject","testResult","dsType","datasourceTypeName","dsName","target","parts","filters","p","getItems","all","getHosts","getApps","results","apps","appFilterEmpty","getGroups","groupFilter","getAllGroups","groups","groupids","hostFilter","getAllHosts","hostids","appFilter","undefined","itemtype","appids","showDisabledItems","expandUserMacro","getMacros","forEach","containsMacro","replaceMacro","macros","itemFilter","getAllItems","itServiceFilter","getITService","itServices","promises","filteredGroups","filteredHosts","filteredApps","query","applicationids","getTriggers","timeRange","timeFrom","timeTo","handleGrafanaTSResponse","history","handleHistory","valueType","consolidateBy","getTrend","handleTrends","sortTimeseries","length","resultFormat","handleHistoryAsTable","handleText","itservices","isOldVersion","itservice","serviceid","itServiceIds","getSLA","handleSLAResponse","slaProperty","slaResponse"],"mappings":"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","file":"zabbix.js","sourcesContent":["import _ from 'lodash';\nimport * as utils from '../utils';\nimport responseHandler from '../responseHandler';\nimport { ZabbixAPIConnector } from './connectors/zabbix_api/zabbixAPIConnector';\nimport { SQLConnector } from './connectors/sql/sqlConnector';\nimport { CachingProxy } from './proxy/cachingProxy';\nimport { ZabbixNotImplemented } from './connectors/dbConnector';\n\nconst REQUESTS_TO_PROXYFY = [\n 'getHistory', 'getTrend', 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs',\n 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion'\n];\n\nconst REQUESTS_TO_CACHE = [\n 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getITService'\n];\n\nconst REQUESTS_TO_BIND = [\n 'getHistory', 'getTrend', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts',\n 'getAcknowledges', 'getITService', 'getVersion', 'login'\n];\n\nexport class Zabbix {\n constructor(options, backendSrv, datasourceSrv) {\n let {\n url,\n username,\n password,\n basicAuth,\n withCredentials,\n cacheTTL,\n enableDirectDBConnection,\n dbConnectionDatasourceId,\n dbConnectionDatasourceName,\n } = options;\n\n this.enableDirectDBConnection = enableDirectDBConnection;\n\n // Initialize caching proxy for requests\n let cacheOptions = {\n enabled: true,\n ttl: cacheTTL\n };\n this.cachingProxy = new CachingProxy(cacheOptions);\n\n this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);\n\n if (enableDirectDBConnection) {\n let dbConnectorOptions = {\n datasourceId: dbConnectionDatasourceId,\n datasourceName: dbConnectionDatasourceName\n };\n this.dbConnector = new SQLConnector(dbConnectorOptions, backendSrv, datasourceSrv);\n this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector);\n this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector);\n }\n\n this.proxyfyRequests();\n this.cacheRequests();\n this.bindRequests();\n }\n\n proxyfyRequests() {\n for (let request of REQUESTS_TO_PROXYFY) {\n this.zabbixAPI[request] = this.cachingProxy.proxyfy(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n cacheRequests() {\n for (let request of REQUESTS_TO_CACHE) {\n this.zabbixAPI[request] = this.cachingProxy.cacheRequest(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n bindRequests() {\n for (let request of REQUESTS_TO_BIND) {\n this[request] = this.zabbixAPI[request].bind(this.zabbixAPI);\n }\n }\n\n /**\n * Perform test query for Zabbix API and external history DB.\n * @return {object} test result object:\n * ```\n {\n zabbixVersion,\n dbConnectorStatus: {\n dsType,\n dsName\n }\n }\n ```\n */\n testDataSource() {\n let zabbixVersion;\n let dbConnectorStatus;\n return this.getVersion()\n .then(version => {\n zabbixVersion = version;\n return this.login();\n })\n .then(() => {\n if (this.enableDirectDBConnection) {\n return this.dbConnector.testDataSource();\n } else {\n return Promise.resolve();\n }\n })\n .catch(error => {\n if (error instanceof ZabbixNotImplemented) {\n return Promise.resolve();\n }\n return Promise.reject(error);\n })\n .then(testResult => {\n if (testResult) {\n dbConnectorStatus = {\n dsType: this.dbConnector.datasourceTypeName,\n dsName: this.dbConnector.datasourceName\n };\n }\n return { zabbixVersion, dbConnectorStatus };\n });\n }\n\n getItemsFromTarget(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n let filters = _.map(parts, p => target[p].filter);\n return this.getItems(...filters, options);\n }\n\n getHostsFromTarget(target) {\n let parts = ['group', 'host', 'application'];\n let filters = _.map(parts, p => target[p].filter);\n return Promise.all([\n this.getHosts(...filters),\n this.getApps(...filters),\n ]).then((results) => {\n let [hosts, apps] = results;\n if (apps.appFilterEmpty) {\n apps = [];\n }\n return [hosts, apps];\n });\n }\n\n getAllGroups() {\n return this.zabbixAPI.getGroups();\n }\n\n getGroups(groupFilter) {\n return this.getAllGroups()\n .then(groups => findByFilter(groups, groupFilter));\n }\n\n /**\n * Get list of host belonging to given groups.\n */\n getAllHosts(groupFilter) {\n return this.getGroups(groupFilter)\n .then(groups => {\n let groupids = _.map(groups, 'groupid');\n return this.zabbixAPI.getHosts(groupids);\n });\n }\n\n getHosts(groupFilter, hostFilter) {\n return this.getAllHosts(groupFilter)\n .then(hosts => findByFilter(hosts, hostFilter));\n }\n\n /**\n * Get list of applications belonging to given groups and hosts.\n */\n getAllApps(groupFilter, hostFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n return this.zabbixAPI.getApps(hostids);\n });\n }\n\n getApps(groupFilter, hostFilter, appFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n if (appFilter) {\n return this.zabbixAPI.getApps(hostids)\n .then(apps => filterByQuery(apps, appFilter));\n } else {\n return {\n appFilterEmpty: true,\n hostids: hostids\n };\n }\n });\n }\n\n getAllItems(groupFilter, hostFilter, appFilter, options = {}) {\n return this.getApps(groupFilter, hostFilter, appFilter)\n .then(apps => {\n if (apps.appFilterEmpty) {\n return this.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype);\n } else {\n let appids = _.map(apps, 'applicationid');\n return this.zabbixAPI.getItems(undefined, appids, options.itemtype);\n }\n })\n .then(items => {\n if (!options.showDisabledItems) {\n items = _.filter(items, {'status': '0'});\n }\n\n return items;\n })\n .then(this.expandUserMacro.bind(this));\n }\n\n expandUserMacro(items) {\n let hostids = getHostIds(items);\n return this.getMacros(hostids)\n .then(macros => {\n _.forEach(items, item => {\n if (utils.containsMacro(item.name)) {\n item.name = utils.replaceMacro(item, macros);\n }\n });\n return items;\n });\n }\n\n getItems(groupFilter, hostFilter, appFilter, itemFilter, options = {}) {\n return this.getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => filterByQuery(items, itemFilter));\n }\n\n getITServices(itServiceFilter) {\n return this.zabbixAPI.getITService()\n .then(itServices => findByFilter(itServices, itServiceFilter));\n }\n\n /**\n * Build query - convert target filters to array of Zabbix items\n */\n getTriggers(groupFilter, hostFilter, appFilter, options) {\n let promises = [\n this.getGroups(groupFilter),\n this.getHosts(groupFilter, hostFilter),\n this.getApps(groupFilter, hostFilter, appFilter)\n ];\n\n return Promise.all(promises)\n .then(results => {\n let filteredGroups = results[0];\n let filteredHosts = results[1];\n let filteredApps = results[2];\n let query = {};\n\n if (appFilter) {\n query.applicationids = _.flatten(_.map(filteredApps, 'applicationid'));\n }\n if (hostFilter) {\n query.hostids = _.map(filteredHosts, 'hostid');\n }\n if (groupFilter) {\n query.groupids = _.map(filteredGroups, 'groupid');\n }\n\n return query;\n }).then(query => {\n return this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options);\n });\n }\n\n getHistoryTS(items, timeRange, options) {\n let [timeFrom, timeTo] = timeRange;\n if (this.enableDirectDBConnection) {\n return this.getHistoryDB(items, timeFrom, timeTo, options)\n .then(history => this.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n return this.zabbixAPI.getHistory(items, timeFrom, timeTo)\n .then(history => responseHandler.handleHistory(history, items));\n }\n }\n\n getTrends(items, timeRange, options) {\n let [timeFrom, timeTo] = timeRange;\n if (this.enableDirectDBConnection) {\n return this.getTrendsDB(items, timeFrom, timeTo, options)\n .then(history => this.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n let valueType = options.consolidateBy || options.valueType;\n return this.zabbixAPI.getTrend(items, timeFrom, timeTo)\n .then(history => responseHandler.handleTrends(history, items, valueType))\n .then(responseHandler.sortTimeseries); // Sort trend data, issue #202\n }\n }\n\n getHistoryText(items, timeRange, target) {\n let [timeFrom, timeTo] = timeRange;\n if (items.length) {\n return this.zabbixAPI.getHistory(items, timeFrom, timeTo)\n .then(history => {\n if (target.resultFormat === 'table') {\n return responseHandler.handleHistoryAsTable(history, items, target);\n } else {\n return responseHandler.handleText(history, items, target);\n }\n });\n } else {\n return Promise.resolve([]);\n }\n }\n\n getSLA(itservices, timeRange, target, options) {\n let itServices = itservices;\n if (options.isOldVersion) {\n itServices = _.filter(itServices, {'serviceid': target.itservice.serviceid});\n }\n let itServiceIds = _.map(itServices, 'serviceid');\n return this.zabbixAPI.getSLA(itServiceIds, timeRange)\n .then(slaResponse => {\n return _.map(itServiceIds, serviceid => {\n let itservice = _.find(itServices, {'serviceid': serviceid});\n return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse);\n });\n });\n }\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Find group, host, app or item by given name.\n * @param list list of groups, apps or other\n * @param name visible name\n * @return array with finded element or empty array\n */\nfunction findByName(list, name) {\n var finded = _.find(list, {'name': name});\n if (finded) {\n return [finded];\n } else {\n return [];\n }\n}\n\n/**\n * Different hosts can contains applications and items with same name.\n * For this reason use _.filter, which return all elements instead _.find,\n * which return only first finded.\n * @param {[type]} list list of elements\n * @param {[type]} name app name\n * @return {[type]} array with finded element or empty array\n */\nfunction filterByName(list, name) {\n var finded = _.filter(list, {'name': name});\n if (finded) {\n return finded;\n } else {\n return [];\n }\n}\n\nfunction filterByRegex(list, regex) {\n var filterPattern = utils.buildRegex(regex);\n return _.filter(list, function (zbx_obj) {\n return filterPattern.test(zbx_obj.name);\n });\n}\n\nfunction findByFilter(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return findByName(list, filter);\n }\n}\n\nfunction filterByQuery(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return filterByName(list, filter);\n }\n}\n\nfunction getHostIds(items) {\n let hostIds = _.map(items, item => {\n return _.map(item.hosts, 'hostid');\n });\n return _.uniq(_.flatten(hostIds));\n}\n"]} \ No newline at end of file diff --git a/src/datasource-zabbix/datasource.js b/src/datasource-zabbix/datasource.js index df7544a..3e2c6a1 100644 --- a/src/datasource-zabbix/datasource.js +++ b/src/datasource-zabbix/datasource.js @@ -50,7 +50,8 @@ export class ZabbixDatasource { // Direct DB Connection options this.enableDirectDBConnection = jsonData.dbConnectionEnable || false; - this.datasourceId = jsonData.dbConnectionDatasourceId; + this.dbConnectionDatasourceId = jsonData.dbConnectionDatasourceId; + this.dbConnectionDatasourceName = jsonData.dbConnectionDatasourceName; let zabbixOptions = { url: this.url, @@ -60,7 +61,8 @@ export class ZabbixDatasource { withCredentials: this.withCredentials, cacheTTL: this.cacheTTL, enableDirectDBConnection: this.enableDirectDBConnection, - datasourceId: this.datasourceId + dbConnectionDatasourceId: this.dbConnectionDatasourceId, + dbConnectionDatasourceName: this.dbConnectionDatasourceName }; this.zabbix = new Zabbix(zabbixOptions, backendSrv, datasourceSrv); diff --git a/src/datasource-zabbix/specs/dbConnector.test.js b/src/datasource-zabbix/specs/dbConnector.test.js new file mode 100644 index 0000000..31d5d08 --- /dev/null +++ b/src/datasource-zabbix/specs/dbConnector.test.js @@ -0,0 +1,52 @@ +import DBConnector from '../zabbix/connectors/dbConnector'; + +describe('DBConnector', () => { + let ctx = {}; + const backendSrvMock = {}; + const datasourceSrvMock = { + loadDatasource: jest.fn().mockResolvedValue( + { id: 42, name: 'foo', meta: {} } + ), + getAll: jest.fn().mockReturnValue([ + { id: 42, name: 'foo' } + ]) + }; + + describe('When init DB connector', () => { + beforeEach(() => { + ctx.options = { + datasourceId: 42, + datasourceName: undefined + }; + }); + + it('should load datasource by name by default', () => { + ctx.options = { + datasourceName: 'bar' + }; + const dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock); + dbConnector.loadDBDataSource(); + expect(datasourceSrvMock.getAll).not.toHaveBeenCalled(); + expect(datasourceSrvMock.loadDatasource).toHaveBeenCalledWith('bar'); + }); + + it('should load datasource by id if name not present', () => { + const dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock); + dbConnector.loadDBDataSource(); + expect(datasourceSrvMock.getAll).toHaveBeenCalled(); + expect(datasourceSrvMock.loadDatasource).toHaveBeenCalledWith('foo'); + }); + + it('should throw error if no name and id specified', () => { + ctx.options = {}; + const dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock); + return expect(dbConnector.loadDBDataSource()).rejects.toBe('SQL Data Source name should be specified'); + }); + + it('should throw error if datasource with given id is not found', () => { + ctx.options.datasourceId = 45; + const dbConnector = new DBConnector(ctx.options, backendSrvMock, datasourceSrvMock); + return expect(dbConnector.loadDBDataSource()).rejects.toBe('SQL Data Source with ID 45 not found'); + }); + }); +}); diff --git a/src/datasource-zabbix/zabbix/connectors/dbConnector.js b/src/datasource-zabbix/zabbix/connectors/dbConnector.js index d723515..28fa264 100644 --- a/src/datasource-zabbix/zabbix/connectors/dbConnector.js +++ b/src/datasource-zabbix/zabbix/connectors/dbConnector.js @@ -15,17 +15,22 @@ export default class DBConnector { } loadDBDataSource() { - let ds = _.find(this.datasourceSrv.getAll(), {'id': this.datasourceId}); - if (ds) { - return this.datasourceSrv.loadDatasource(ds.name) + if (!this.datasourceName && this.datasourceId !== undefined) { + let ds = _.find(this.datasourceSrv.getAll(), {'id': this.datasourceId}); + if (!ds) { + return Promise.reject(`SQL Data Source with ID ${this.datasourceId} not found`); + } + this.datasourceName = ds.name; + } + if (this.datasourceName) { + return this.datasourceSrv.loadDatasource(this.datasourceName) .then(ds => { - this.datasourceName = ds.name; this.datasourceTypeId = ds.meta.id; this.datasourceTypeName = ds.meta.name; return ds; }); } else { - return Promise.reject(`SQL Data Source with ID ${this.datasourceId} not found`); + return Promise.reject(`SQL Data Source name should be specified`); } } diff --git a/src/datasource-zabbix/zabbix/zabbix.js b/src/datasource-zabbix/zabbix/zabbix.js index 6698b0a..5afed8c 100644 --- a/src/datasource-zabbix/zabbix/zabbix.js +++ b/src/datasource-zabbix/zabbix/zabbix.js @@ -30,7 +30,8 @@ export class Zabbix { withCredentials, cacheTTL, enableDirectDBConnection, - datasourceId + dbConnectionDatasourceId, + dbConnectionDatasourceName, } = options; this.enableDirectDBConnection = enableDirectDBConnection; @@ -45,7 +46,10 @@ export class Zabbix { this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv); if (enableDirectDBConnection) { - let dbConnectorOptions = { datasourceId }; + let dbConnectorOptions = { + datasourceId: dbConnectionDatasourceId, + datasourceName: dbConnectionDatasourceName + }; this.dbConnector = new SQLConnector(dbConnectorOptions, backendSrv, datasourceSrv); this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector); this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector);