diff --git a/dist/datasource-zabbix/datasource.js b/dist/datasource-zabbix/datasource.js index ba75972..b122271 100644 --- a/dist/datasource-zabbix/datasource.js +++ b/dist/datasource-zabbix/datasource.js @@ -502,7 +502,11 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', return this.zabbix.getItemsFromTarget(target, options).then(function (items) { if (items.length) { return _this4.zabbix.getHistory(items, timeFrom, timeTo).then(function (history) { - return responseHandler.handleText(history, items, target); + if (target.resultFormat === 'table') { + return responseHandler.handleHistoryAsTable(history, items); + } else { + return responseHandler.handleText(history, items, target); + } }); } else { return Promise.resolve([]); diff --git a/dist/datasource-zabbix/datasource.js.map b/dist/datasource-zabbix/datasource.js.map index 4586ad6..0246e56 100644 --- a/dist/datasource-zabbix/datasource.js.map +++ b/dist/datasource-zabbix/datasource.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","getConsolidateBy","target","consolidateBy","funcDef","find","functions","length","downsampleSeries","timeseries_data","options","defaultAgg","consolidateByFunc","timeseries","datapoints","maxDataPoints","groupBy","interval","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","zabbixItemIdsTemplateFormat","replaceTemplateVars","templateSrv","scopedVars","replacedTarget","replace","isRegex","sequence","funcsArray","result","i","call","filterEnabledTargets","targets","hide","group","host","item","getTriggerThreshold","expression","thresholdPattern","finded_thresholds","match","threshold","Number","dateMath","migrations","c","responseHandler","ZabbixAPIError","ZabbixAPIDatasource","instanceSettings","alertSrv","dashboardSrv","zabbixAlertingSrv","Zabbix","partial","url","basicAuth","withCredentials","jsonData","username","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","dbConnectionOptions","dbConnection","enableDirectDBConnection","enable","sqlDatasourceId","datasourceId","zabbixOptions","zabbix","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","t","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","replaceTargetVariables","timeFunctions","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_METRICS","MODE_TEXT","migrate","queryNumericData","queryTextData","MODE_ITEMID","itemids","queryItemIdData","MODE_ITSERVICE","queryITServiceData","MODE_TRIGGERS","queryTriggersData","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","queryNumericDataForItems","items","getHistoryPromise","getTrendsDB","dbConnector","handleGrafanaTSResponse","history","valueType","getTrendValueType","getTrend","handleTrends","series","sortBy","point","DATAPOINT_TS","getHistoryDB","getHistory","handleHistory","applyDataProcessingFunctions","catch","console","log","error","trendFunctions","trendValueFunc","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","unShiftTimeSeries","handleText","resolve","split","itemid","trim","getItemsByIDs","itservice","itServiceFilter","slaProperty","itServiceIds","itServices","isOldVersion","getITServices","itservices","serviceid","getSLA","serviceids","handleSLAResponse","slaResponse","getHostsFromTarget","results","hosts","apps","hostids","appids","minSeverity","triggers","acknowledged","count","getHostAlerts","handleTriggersResponse","zabbixVersion","getVersion","version","login","testSQLDataSource","status","title","message","query","parts","each","splitTemplateQuery","part","push","template","zipObject","app","getItems","getApps","getHosts","getGroups","metrics","rangeRaw","annotation","showOkEvents","SHOW_ALL_EVENTS","SHOW_OK_EVENTS","triggersOptions","showTriggers","SHOW_ALL_TRIGGERS","hideHostsInMaintenance","getTriggers","application","triggerName","trigger","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport './zabbix.js';\nimport './zabbixAlerting.service.js';\nimport {ZabbixAPIError} from './zabbixAPICore.service.js';\n\nclass ZabbixAPIDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, zabbixAlertingSrv, Zabbix) {\n this.templateSrv = templateSrv;\n this.alertSrv = alertSrv;\n this.dashboardSrv = dashboardSrv;\n this.zabbixAlertingSrv = zabbixAlertingSrv;\n\n // Use custom format for template variables\n this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);\n\n // General data source settings\n this.name = instanceSettings.name;\n this.url = instanceSettings.url;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n\n const jsonData = instanceSettings.jsonData;\n\n // Zabbix API credentials\n this.username = jsonData.username;\n this.password = jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = jsonData.trends;\n this.trendsFrom = jsonData.trendsFrom || '7d';\n this.trendsRange = jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = jsonData.alerting;\n this.addThresholds = jsonData.addThresholds;\n this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n // Direct DB Connection options\n let dbConnectionOptions = jsonData.dbConnection || {};\n this.enableDirectDBConnection = dbConnectionOptions.enable;\n this.sqlDatasourceId = dbConnectionOptions.datasourceId;\n\n let zabbixOptions = {\n username: this.username,\n password: this.password,\n basicAuth: this.basicAuth,\n withCredentials: this.withCredentials,\n cacheTTL: this.cacheTTL,\n enableDirectDBConnection: this.enableDirectDBConnection,\n sqlDatasourceId: this.sqlDatasourceId\n };\n\n this.zabbix = new Zabbix(this.url, zabbixOptions);\n }\n\n ////////////////////////\n // Datasource methods //\n ////////////////////////\n\n /**\n * Query panel data. Calls for each panel in dashboard.\n * @param {Object} options Contains time range, targets and other info.\n * @return {Object} Grafana metrics object with timeseries data for each target.\n */\n query(options) {\n // Get alerts for current panel\n if (this.alertingEnabled) {\n this.alertQuery(options).then(alert => {\n this.zabbixAlertingSrv.setPanelAlertState(options.panelId, alert.state);\n\n this.zabbixAlertingSrv.removeZabbixThreshold(options.panelId);\n if (this.addThresholds) {\n _.forEach(alert.thresholds, threshold => {\n this.zabbixAlertingSrv.setPanelThreshold(options.panelId, threshold);\n });\n }\n });\n }\n\n // Create request for each target\n let promises = _.map(options.targets, t => {\n // Don't request undefined and hidden targets\n if (t.hide) {\n return [];\n }\n\n let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);\n let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);\n\n // Prevent changes of original object\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n\n // Apply Time-related functions (timeShift(), etc)\n let timeFunctions = bindFunctionDefs(target.functions, 'Time');\n if (timeFunctions.length) {\n const [time_from, time_to] = sequence(timeFunctions)([timeFrom, timeTo]);\n timeFrom = time_from;\n timeTo = time_to;\n }\n let timeRange = [timeFrom, timeTo];\n\n let useTrends = this.isUseTrends(timeRange);\n\n // Metrics or Text query mode\n if (!target.mode || target.mode === c.MODE_METRICS || target.mode === c.MODE_TEXT) {\n // Migrate old targets\n target = migrations.migrate(target);\n\n // Don't request undefined and hidden targets\n if (target.hide || !target.group || !target.host || !target.item) {\n return [];\n }\n\n if (!target.mode || target.mode === c.MODE_METRICS) {\n return this.queryNumericData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_TEXT) {\n return this.queryTextData(target, timeRange);\n }\n } else if (target.mode === c.MODE_ITEMID) {\n // Item ID mode\n if (!target.itemids) {\n return [];\n }\n return this.queryItemIdData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_ITSERVICE) {\n // IT services mode\n return this.queryITServiceData(target, timeRange, options);\n } else if (target.mode === c.MODE_TRIGGERS) {\n // Triggers mode\n return this.queryTriggersData(target, timeRange);\n } else {\n return [];\n }\n });\n\n // Data for panel (all targets)\n return Promise.all(_.flatten(promises))\n .then(_.flatten)\n .then(data => {\n return { data: data };\n });\n }\n\n /**\n * Query target data for Metrics mode\n */\n queryNumericData(target, timeRange, useTrends, options) {\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query history for numeric items\n */\n queryNumericDataForItems(items, target, timeRange, useTrends, options) {\n let [timeFrom, timeTo] = timeRange;\n let getHistoryPromise;\n options.consolidateBy = getConsolidateBy(target);\n\n if (useTrends) {\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getTrendsDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n let valueType = this.getTrendValueType(target);\n getHistoryPromise = this.zabbix.getTrend(items, timeFrom, timeTo)\n .then(history => responseHandler.handleTrends(history, items, valueType))\n .then(timeseries => {\n // Sort trend data, issue #202\n _.forEach(timeseries, series => {\n series.datapoints = _.sortBy(series.datapoints, point => point[c.DATAPOINT_TS]);\n });\n return timeseries;\n });\n }\n } else {\n // Use history\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getHistoryDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n getHistoryPromise = this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => responseHandler.handleHistory(history, items));\n }\n }\n\n return getHistoryPromise\n .then(timeseries => this.applyDataProcessingFunctions(timeseries, target))\n .then(timeseries => downsampleSeries(timeseries, options))\n .catch(error => {\n console.log(error);\n return [];\n });\n }\n\n getTrendValueType(target) {\n // Find trendValue() function and get specified trend value\n var trendFunctions = _.map(metricFunctions.getCategories()['Trends'], 'name');\n var trendValueFunc = _.find(target.functions, func => {\n return _.includes(trendFunctions, func.def.name);\n });\n return trendValueFunc ? trendValueFunc.params[0] : \"avg\";\n }\n\n applyDataProcessingFunctions(timeseries_data, target) {\n let transformFunctions = bindFunctionDefs(target.functions, 'Transform');\n let aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');\n let filterFunctions = bindFunctionDefs(target.functions, 'Filter');\n let aliasFunctions = bindFunctionDefs(target.functions, 'Alias');\n\n // Apply transformation functions\n timeseries_data = _.cloneDeep(_.map(timeseries_data, timeseries => {\n timeseries.datapoints = sequence(transformFunctions)(timeseries.datapoints);\n return timeseries;\n }));\n\n // Apply filter functions\n if (filterFunctions.length) {\n timeseries_data = sequence(filterFunctions)(timeseries_data);\n }\n\n // Apply aggregations\n if (aggregationFunctions.length) {\n let dp = _.map(timeseries_data, 'datapoints');\n dp = sequence(aggregationFunctions)(dp);\n\n let aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name');\n let lastAgg = _.findLast(target.functions, func => {\n return _.includes(aggFuncNames, func.def.name);\n });\n\n timeseries_data = [{\n target: lastAgg.text,\n datapoints: dp\n }];\n }\n\n // Apply alias functions\n _.forEach(timeseries_data, sequence(aliasFunctions));\n\n // Apply Time-related functions (timeShift(), etc)\n // Find timeShift() function and get specified trend value\n this.applyTimeShiftFunction(timeseries_data, target);\n\n return timeseries_data;\n }\n\n applyTimeShiftFunction(timeseries_data, target) {\n // Find timeShift() function and get specified interval\n let timeShiftFunc = _.find(target.functions, (func) => {\n return func.def.name === 'timeShift';\n });\n if (timeShiftFunc) {\n let shift = timeShiftFunc.params[0];\n _.forEach(timeseries_data, (series) => {\n series.datapoints = dataProcessor.unShiftTimeSeries(shift, series.datapoints);\n });\n }\n }\n\n /**\n * Query target data for Text mode\n */\n queryTextData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let options = {\n itemtype: 'text'\n };\n return this.zabbix.getItemsFromTarget(target, options)\n .then(items => {\n if (items.length) {\n return this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => {\n return responseHandler.handleText(history, items, target);\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Query target data for Item ID mode\n */\n queryItemIdData(target, timeRange, useTrends, options) {\n let itemids = target.itemids;\n itemids = this.templateSrv.replace(itemids, options.scopedVars, zabbixItemIdsTemplateFormat);\n itemids = _.map(itemids.split(','), itemid => itemid.trim());\n\n if (!itemids) {\n return [];\n }\n\n return this.zabbix.getItemsByIDs(itemids)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query target data for IT Services mode\n */\n queryITServiceData(target, timeRange, options) {\n // Don't show undefined and hidden targets\n if (target.hide || (!target.itservice && !target.itServiceFilter) || !target.slaProperty) {\n return [];\n }\n\n let itServiceIds = [];\n let itServices = [];\n let itServiceFilter;\n let isOldVersion = target.itservice && !target.itServiceFilter;\n\n if (isOldVersion) {\n // Backward compatibility\n itServiceFilter = '/.*/';\n } else {\n itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);\n }\n\n return this.zabbix.getITServices(itServiceFilter)\n .then(itservices => {\n itServices = itservices;\n if (isOldVersion) {\n itServices = _.filter(itServices, {'serviceid': target.itservice.serviceid});\n }\n\n itServiceIds = _.map(itServices, 'serviceid');\n return itServiceIds;\n })\n .then(serviceids => {\n return this.zabbix.getSLA(serviceids, timeRange);\n })\n .then(slaResponse => {\n return _.map(itServiceIds, serviceid => {\n let itservice = _.find(itServices, {'serviceid': serviceid});\n return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse);\n });\n });\n }\n\n queryTriggersData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n return this.zabbix.getHostsFromTarget(target)\n .then((results) => {\n let [hosts, apps] = results;\n if (hosts.length) {\n let hostids = _.map(hosts, 'hostid');\n let appids = _.map(apps, 'applicationid');\n let options = {\n minSeverity: target.triggers.minSeverity,\n acknowledged: target.triggers.acknowledged,\n count: target.triggers.count,\n timeFrom: timeFrom,\n timeTo: timeTo\n };\n return this.zabbix.getHostAlerts(hostids, appids, options)\n .then((triggers) => {\n return responseHandler.handleTriggersResponse(triggers, timeRange);\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Test connection to Zabbix API\n * @return {object} Connection status and Zabbix API version\n */\n testDatasource() {\n let zabbixVersion;\n return this.zabbix.getVersion()\n .then(version => {\n zabbixVersion = version;\n return this.zabbix.login();\n })\n .then(() => {\n if (this.enableDirectDBConnection) {\n return this.zabbix.dbConnector.testSQLDataSource();\n } else {\n return Promise.resolve();\n }\n })\n .then(() => {\n return {\n status: \"success\",\n title: \"Success\",\n message: \"Zabbix API version: \" + zabbixVersion\n };\n })\n .catch(error => {\n if (error instanceof ZabbixAPIError) {\n return {\n status: \"error\",\n title: error.message,\n message: error.message\n };\n } else if (error.data && error.data.message) {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error.data.message\n };\n } else {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Could not connect to given url\"\n };\n }\n });\n }\n\n ////////////////\n // Templating //\n ////////////////\n\n /**\n * Find metrics from templated request.\n *\n * @param {string} query Query from Templating\n * @return {string} Metric name - group, host, app or item or list\n * of metrics in \"{metric1,metcic2,...,metricN}\" format.\n */\n metricFindQuery(query) {\n let result;\n let parts = [];\n\n // Split query. Query structure: group.host.app.item\n _.each(utils.splitTemplateQuery(query), part => {\n part = this.replaceTemplateVars(part, {});\n\n // Replace wildcard to regex\n if (part === '*') {\n part = '/.*/';\n }\n parts.push(part);\n });\n let template = _.zipObject(['group', 'host', 'app', 'item'], parts);\n\n // Get items\n if (parts.length === 4) {\n // Search for all items, even it's not belong to any application\n if (template.app === '/.*/') {\n template.app = '';\n }\n result = this.zabbix.getItems(template.group, template.host, template.app, template.item);\n } else if (parts.length === 3) {\n // Get applications\n result = this.zabbix.getApps(template.group, template.host, template.app);\n } else if (parts.length === 2) {\n // Get hosts\n result = this.zabbix.getHosts(template.group, template.host);\n } else if (parts.length === 1) {\n // Get groups\n result = this.zabbix.getGroups(template.group);\n } else {\n result = Promise.resolve([]);\n }\n\n return result.then(metrics => {\n return _.map(metrics, formatMetric);\n });\n }\n\n /////////////////\n // Annotations //\n /////////////////\n\n annotationQuery(options) {\n var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);\n var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);\n var annotation = options.annotation;\n var showOkEvents = annotation.showOkEvents ? c.SHOW_ALL_EVENTS : c.SHOW_OK_EVENTS;\n\n // Show all triggers\n let triggersOptions = {\n showTriggers: c.SHOW_ALL_TRIGGERS,\n hideHostsInMaintenance: false\n };\n\n var getTriggers = this.zabbix.getTriggers(this.replaceTemplateVars(annotation.group, {}),\n this.replaceTemplateVars(annotation.host, {}),\n this.replaceTemplateVars(annotation.application, {}),\n triggersOptions);\n\n return getTriggers.then(triggers => {\n\n // Filter triggers by description\n let triggerName = this.replaceTemplateVars(annotation.trigger, {});\n if (utils.isRegex(triggerName)) {\n triggers = _.filter(triggers, trigger => {\n return utils.buildRegex(triggerName).test(trigger.description);\n });\n } else if (triggerName) {\n triggers = _.filter(triggers, trigger => {\n return trigger.description === triggerName;\n });\n }\n\n // Remove events below the chose severity\n triggers = _.filter(triggers, trigger => {\n return Number(trigger.priority) >= Number(annotation.minseverity);\n });\n\n var objectids = _.map(triggers, 'triggerid');\n return this.zabbix\n .getEvents(objectids, timeFrom, timeTo, showOkEvents)\n .then(events => {\n var indexedTriggers = _.keyBy(triggers, 'triggerid');\n\n // Hide acknowledged events if option enabled\n if (annotation.hideAcknowledged) {\n events = _.filter(events, event => {\n return !event.acknowledges.length;\n });\n }\n\n return _.map(events, event => {\n let tags;\n if (annotation.showHostname) {\n tags = _.map(event.hosts, 'name');\n }\n\n // Show event type (OK or Problem)\n let title = Number(event.value) ? 'Problem' : 'OK';\n\n let formatted_acknowledges = utils.formatAcknowledges(event.acknowledges);\n return {\n annotation: annotation,\n time: event.clock * 1000,\n title: title,\n tags: tags,\n text: indexedTriggers[event.objectid].description + formatted_acknowledges\n };\n });\n });\n });\n }\n\n /**\n * Get triggers and its details for panel's targets\n * Returns alert state ('ok' if no fired triggers, or 'alerting' if at least 1 trigger is fired)\n * or empty object if no related triggers are finded.\n */\n alertQuery(options) {\n let enabled_targets = filterEnabledTargets(options.targets);\n let getPanelItems = _.map(enabled_targets, t => {\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n return this.zabbix.getItemsFromTarget(target, {itemtype: 'num'});\n });\n\n return Promise.all(getPanelItems)\n .then(results => {\n let items = _.flatten(results);\n let itemids = _.map(items, 'itemid');\n\n if (itemids.length === 0) {\n return [];\n }\n return this.zabbix.getAlerts(itemids);\n })\n .then(triggers => {\n triggers = _.filter(triggers, trigger => {\n return trigger.priority >= this.alertingMinSeverity;\n });\n\n if (!triggers || triggers.length === 0) {\n return {};\n }\n\n let state = 'ok';\n\n let firedTriggers = _.filter(triggers, {value: '1'});\n if (firedTriggers.length) {\n state = 'alerting';\n }\n\n let thresholds = _.map(triggers, trigger => {\n return getTriggerThreshold(trigger.expression);\n });\n\n return {\n panelId: options.panelId,\n state: state,\n thresholds: thresholds\n };\n });\n }\n\n // Replace template variables\n replaceTargetVariables(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n _.forEach(parts, p => {\n if (target[p] && target[p].filter) {\n target[p].filter = this.replaceTemplateVars(target[p].filter, options.scopedVars);\n }\n });\n target.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars);\n\n _.forEach(target.functions, func => {\n func.params = _.map(func.params, param => {\n if (typeof param === 'number') {\n return +this.templateSrv.replace(param.toString(), options.scopedVars);\n } else {\n return this.templateSrv.replace(param, options.scopedVars);\n }\n });\n });\n }\n\n isUseTrends(timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);\n let useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);\n let useTrends = this.trends && (\n (timeFrom <= useTrendsFrom) ||\n (timeTo - timeFrom >= useTrendsRange)\n );\n return useTrends;\n }\n}\n\nfunction bindFunctionDefs(functionDefs, category) {\n var aggregationFunctions = _.map(metricFunctions.getCategories()[category], 'name');\n var aggFuncDefs = _.filter(functionDefs, function(func) {\n return _.includes(aggregationFunctions, func.def.name);\n });\n\n return _.map(aggFuncDefs, function(func) {\n var funcInstance = metricFunctions.createFuncInstance(func.def, func.params);\n return funcInstance.bindFunction(dataProcessor.metricFunctions);\n });\n}\n\nfunction getConsolidateBy(target) {\n let consolidateBy = 'avg';\n let funcDef = _.find(target.functions, func => {\n return func.def.name === 'consolidateBy';\n });\n if (funcDef && funcDef.params && funcDef.params.length) {\n consolidateBy = funcDef.params[0];\n }\n return consolidateBy;\n}\n\nfunction downsampleSeries(timeseries_data, options) {\n let defaultAgg = dataProcessor.aggregationFunctions['avg'];\n let consolidateByFunc = dataProcessor.aggregationFunctions[options.consolidateBy] || defaultAgg;\n return _.map(timeseries_data, timeseries => {\n if (timeseries.datapoints.length > options.maxDataPoints) {\n timeseries.datapoints = dataProcessor\n .groupBy(options.interval, consolidateByFunc, timeseries.datapoints);\n }\n return timeseries;\n });\n}\n\nfunction formatMetric(metricObj) {\n return {\n text: metricObj.name,\n expandable: false\n };\n}\n\n/**\n * Custom formatter for template variables.\n * Default Grafana \"regex\" formatter returns\n * value1|value2\n * This formatter returns\n * (value1|value2)\n * This format needed for using in complex regex with\n * template variables, for example\n * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait\n */\nfunction zabbixTemplateFormat(value) {\n if (typeof value === 'string') {\n return utils.escapeRegex(value);\n }\n\n var escapedValues = _.map(value, utils.escapeRegex);\n return '(' + escapedValues.join('|') + ')';\n}\n\nfunction zabbixItemIdsTemplateFormat(value) {\n if (typeof value === 'string') {\n return value;\n }\n return value.join(',');\n}\n\n/**\n * If template variables are used in request, replace it using regex format\n * and wrap with '/' for proper multi-value work. Example:\n * $variable selected as a, b, c\n * We use filter $variable\n * $variable -> a|b|c -> /a|b|c/\n * /$variable/ -> /a|b|c/ -> /a|b|c/\n */\nfunction replaceTemplateVars(templateSrv, target, scopedVars) {\n var replacedTarget = templateSrv.replace(target, scopedVars, zabbixTemplateFormat);\n if (target !== replacedTarget && !utils.isRegex(replacedTarget)) {\n replacedTarget = '/^' + replacedTarget + '$/';\n }\n return replacedTarget;\n}\n\n// Apply function one by one:\n// sequence([a(), b(), c()]) = c(b(a()));\nfunction sequence(funcsArray) {\n return function(result) {\n for (var i = 0; i < funcsArray.length; i++) {\n result = funcsArray[i].call(this, result);\n }\n return result;\n };\n}\n\nfunction filterEnabledTargets(targets) {\n return _.filter(targets, target => {\n return !(target.hide || !target.group || !target.host || !target.item);\n });\n}\n\nfunction getTriggerThreshold(expression) {\n let thresholdPattern = /.*[<>=]{1,2}([\\d\\.]+)/;\n let finded_thresholds = expression.match(thresholdPattern);\n if (finded_thresholds && finded_thresholds.length >= 2) {\n let threshold = finded_thresholds[1];\n threshold = Number(threshold);\n return threshold;\n } else {\n return null;\n }\n}\n\nexport {ZabbixAPIDatasource, zabbixTemplateFormat};\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {_.includes = _.contains;}\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","getConsolidateBy","target","consolidateBy","funcDef","find","functions","length","downsampleSeries","timeseries_data","options","defaultAgg","consolidateByFunc","timeseries","datapoints","maxDataPoints","groupBy","interval","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","zabbixItemIdsTemplateFormat","replaceTemplateVars","templateSrv","scopedVars","replacedTarget","replace","isRegex","sequence","funcsArray","result","i","call","filterEnabledTargets","targets","hide","group","host","item","getTriggerThreshold","expression","thresholdPattern","finded_thresholds","match","threshold","Number","dateMath","migrations","c","responseHandler","ZabbixAPIError","ZabbixAPIDatasource","instanceSettings","alertSrv","dashboardSrv","zabbixAlertingSrv","Zabbix","partial","url","basicAuth","withCredentials","jsonData","username","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","dbConnectionOptions","dbConnection","enableDirectDBConnection","enable","sqlDatasourceId","datasourceId","zabbixOptions","zabbix","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","t","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","replaceTargetVariables","timeFunctions","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_METRICS","MODE_TEXT","migrate","queryNumericData","queryTextData","MODE_ITEMID","itemids","queryItemIdData","MODE_ITSERVICE","queryITServiceData","MODE_TRIGGERS","queryTriggersData","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","queryNumericDataForItems","items","getHistoryPromise","getTrendsDB","dbConnector","handleGrafanaTSResponse","history","valueType","getTrendValueType","getTrend","handleTrends","series","sortBy","point","DATAPOINT_TS","getHistoryDB","getHistory","handleHistory","applyDataProcessingFunctions","catch","console","log","error","trendFunctions","trendValueFunc","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","unShiftTimeSeries","resultFormat","handleHistoryAsTable","handleText","resolve","split","itemid","trim","getItemsByIDs","itservice","itServiceFilter","slaProperty","itServiceIds","itServices","isOldVersion","getITServices","itservices","serviceid","getSLA","serviceids","handleSLAResponse","slaResponse","getHostsFromTarget","results","hosts","apps","hostids","appids","minSeverity","triggers","acknowledged","count","getHostAlerts","handleTriggersResponse","zabbixVersion","getVersion","version","login","testSQLDataSource","status","title","message","query","parts","each","splitTemplateQuery","part","push","template","zipObject","app","getItems","getApps","getHosts","getGroups","metrics","rangeRaw","annotation","showOkEvents","SHOW_ALL_EVENTS","SHOW_OK_EVENTS","triggersOptions","showTriggers","SHOW_ALL_TRIGGERS","hideHostsInMaintenance","getTriggers","application","triggerName","trigger","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport './zabbix.js';\nimport './zabbixAlerting.service.js';\nimport {ZabbixAPIError} from './zabbixAPICore.service.js';\n\nclass ZabbixAPIDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, zabbixAlertingSrv, Zabbix) {\n this.templateSrv = templateSrv;\n this.alertSrv = alertSrv;\n this.dashboardSrv = dashboardSrv;\n this.zabbixAlertingSrv = zabbixAlertingSrv;\n\n // Use custom format for template variables\n this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);\n\n // General data source settings\n this.name = instanceSettings.name;\n this.url = instanceSettings.url;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n\n const jsonData = instanceSettings.jsonData;\n\n // Zabbix API credentials\n this.username = jsonData.username;\n this.password = jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = jsonData.trends;\n this.trendsFrom = jsonData.trendsFrom || '7d';\n this.trendsRange = jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = jsonData.alerting;\n this.addThresholds = jsonData.addThresholds;\n this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n // Direct DB Connection options\n let dbConnectionOptions = jsonData.dbConnection || {};\n this.enableDirectDBConnection = dbConnectionOptions.enable;\n this.sqlDatasourceId = dbConnectionOptions.datasourceId;\n\n let zabbixOptions = {\n username: this.username,\n password: this.password,\n basicAuth: this.basicAuth,\n withCredentials: this.withCredentials,\n cacheTTL: this.cacheTTL,\n enableDirectDBConnection: this.enableDirectDBConnection,\n sqlDatasourceId: this.sqlDatasourceId\n };\n\n this.zabbix = new Zabbix(this.url, zabbixOptions);\n }\n\n ////////////////////////\n // Datasource methods //\n ////////////////////////\n\n /**\n * Query panel data. Calls for each panel in dashboard.\n * @param {Object} options Contains time range, targets and other info.\n * @return {Object} Grafana metrics object with timeseries data for each target.\n */\n query(options) {\n // Get alerts for current panel\n if (this.alertingEnabled) {\n this.alertQuery(options).then(alert => {\n this.zabbixAlertingSrv.setPanelAlertState(options.panelId, alert.state);\n\n this.zabbixAlertingSrv.removeZabbixThreshold(options.panelId);\n if (this.addThresholds) {\n _.forEach(alert.thresholds, threshold => {\n this.zabbixAlertingSrv.setPanelThreshold(options.panelId, threshold);\n });\n }\n });\n }\n\n // Create request for each target\n let promises = _.map(options.targets, t => {\n // Don't request undefined and hidden targets\n if (t.hide) {\n return [];\n }\n\n let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);\n let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);\n\n // Prevent changes of original object\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n\n // Apply Time-related functions (timeShift(), etc)\n let timeFunctions = bindFunctionDefs(target.functions, 'Time');\n if (timeFunctions.length) {\n const [time_from, time_to] = sequence(timeFunctions)([timeFrom, timeTo]);\n timeFrom = time_from;\n timeTo = time_to;\n }\n let timeRange = [timeFrom, timeTo];\n\n let useTrends = this.isUseTrends(timeRange);\n\n // Metrics or Text query mode\n if (!target.mode || target.mode === c.MODE_METRICS || target.mode === c.MODE_TEXT) {\n // Migrate old targets\n target = migrations.migrate(target);\n\n // Don't request undefined and hidden targets\n if (target.hide || !target.group || !target.host || !target.item) {\n return [];\n }\n\n if (!target.mode || target.mode === c.MODE_METRICS) {\n return this.queryNumericData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_TEXT) {\n return this.queryTextData(target, timeRange);\n }\n } else if (target.mode === c.MODE_ITEMID) {\n // Item ID mode\n if (!target.itemids) {\n return [];\n }\n return this.queryItemIdData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_ITSERVICE) {\n // IT services mode\n return this.queryITServiceData(target, timeRange, options);\n } else if (target.mode === c.MODE_TRIGGERS) {\n // Triggers mode\n return this.queryTriggersData(target, timeRange);\n } else {\n return [];\n }\n });\n\n // Data for panel (all targets)\n return Promise.all(_.flatten(promises))\n .then(_.flatten)\n .then(data => {\n return { data: data };\n });\n }\n\n /**\n * Query target data for Metrics mode\n */\n queryNumericData(target, timeRange, useTrends, options) {\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query history for numeric items\n */\n queryNumericDataForItems(items, target, timeRange, useTrends, options) {\n let [timeFrom, timeTo] = timeRange;\n let getHistoryPromise;\n options.consolidateBy = getConsolidateBy(target);\n\n if (useTrends) {\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getTrendsDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n let valueType = this.getTrendValueType(target);\n getHistoryPromise = this.zabbix.getTrend(items, timeFrom, timeTo)\n .then(history => responseHandler.handleTrends(history, items, valueType))\n .then(timeseries => {\n // Sort trend data, issue #202\n _.forEach(timeseries, series => {\n series.datapoints = _.sortBy(series.datapoints, point => point[c.DATAPOINT_TS]);\n });\n return timeseries;\n });\n }\n } else {\n // Use history\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getHistoryDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n getHistoryPromise = this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => responseHandler.handleHistory(history, items));\n }\n }\n\n return getHistoryPromise\n .then(timeseries => this.applyDataProcessingFunctions(timeseries, target))\n .then(timeseries => downsampleSeries(timeseries, options))\n .catch(error => {\n console.log(error);\n return [];\n });\n }\n\n getTrendValueType(target) {\n // Find trendValue() function and get specified trend value\n var trendFunctions = _.map(metricFunctions.getCategories()['Trends'], 'name');\n var trendValueFunc = _.find(target.functions, func => {\n return _.includes(trendFunctions, func.def.name);\n });\n return trendValueFunc ? trendValueFunc.params[0] : \"avg\";\n }\n\n applyDataProcessingFunctions(timeseries_data, target) {\n let transformFunctions = bindFunctionDefs(target.functions, 'Transform');\n let aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');\n let filterFunctions = bindFunctionDefs(target.functions, 'Filter');\n let aliasFunctions = bindFunctionDefs(target.functions, 'Alias');\n\n // Apply transformation functions\n timeseries_data = _.cloneDeep(_.map(timeseries_data, timeseries => {\n timeseries.datapoints = sequence(transformFunctions)(timeseries.datapoints);\n return timeseries;\n }));\n\n // Apply filter functions\n if (filterFunctions.length) {\n timeseries_data = sequence(filterFunctions)(timeseries_data);\n }\n\n // Apply aggregations\n if (aggregationFunctions.length) {\n let dp = _.map(timeseries_data, 'datapoints');\n dp = sequence(aggregationFunctions)(dp);\n\n let aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name');\n let lastAgg = _.findLast(target.functions, func => {\n return _.includes(aggFuncNames, func.def.name);\n });\n\n timeseries_data = [{\n target: lastAgg.text,\n datapoints: dp\n }];\n }\n\n // Apply alias functions\n _.forEach(timeseries_data, sequence(aliasFunctions));\n\n // Apply Time-related functions (timeShift(), etc)\n // Find timeShift() function and get specified trend value\n this.applyTimeShiftFunction(timeseries_data, target);\n\n return timeseries_data;\n }\n\n applyTimeShiftFunction(timeseries_data, target) {\n // Find timeShift() function and get specified interval\n let timeShiftFunc = _.find(target.functions, (func) => {\n return func.def.name === 'timeShift';\n });\n if (timeShiftFunc) {\n let shift = timeShiftFunc.params[0];\n _.forEach(timeseries_data, (series) => {\n series.datapoints = dataProcessor.unShiftTimeSeries(shift, series.datapoints);\n });\n }\n }\n\n /**\n * Query target data for Text mode\n */\n queryTextData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let options = {\n itemtype: 'text'\n };\n return this.zabbix.getItemsFromTarget(target, options)\n .then(items => {\n if (items.length) {\n return this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => {\n if (target.resultFormat === 'table') {\n return responseHandler.handleHistoryAsTable(history, items);\n } else {\n return responseHandler.handleText(history, items, target);\n }\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Query target data for Item ID mode\n */\n queryItemIdData(target, timeRange, useTrends, options) {\n let itemids = target.itemids;\n itemids = this.templateSrv.replace(itemids, options.scopedVars, zabbixItemIdsTemplateFormat);\n itemids = _.map(itemids.split(','), itemid => itemid.trim());\n\n if (!itemids) {\n return [];\n }\n\n return this.zabbix.getItemsByIDs(itemids)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query target data for IT Services mode\n */\n queryITServiceData(target, timeRange, options) {\n // Don't show undefined and hidden targets\n if (target.hide || (!target.itservice && !target.itServiceFilter) || !target.slaProperty) {\n return [];\n }\n\n let itServiceIds = [];\n let itServices = [];\n let itServiceFilter;\n let isOldVersion = target.itservice && !target.itServiceFilter;\n\n if (isOldVersion) {\n // Backward compatibility\n itServiceFilter = '/.*/';\n } else {\n itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);\n }\n\n return this.zabbix.getITServices(itServiceFilter)\n .then(itservices => {\n itServices = itservices;\n if (isOldVersion) {\n itServices = _.filter(itServices, {'serviceid': target.itservice.serviceid});\n }\n\n itServiceIds = _.map(itServices, 'serviceid');\n return itServiceIds;\n })\n .then(serviceids => {\n return this.zabbix.getSLA(serviceids, timeRange);\n })\n .then(slaResponse => {\n return _.map(itServiceIds, serviceid => {\n let itservice = _.find(itServices, {'serviceid': serviceid});\n return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse);\n });\n });\n }\n\n queryTriggersData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n return this.zabbix.getHostsFromTarget(target)\n .then((results) => {\n let [hosts, apps] = results;\n if (hosts.length) {\n let hostids = _.map(hosts, 'hostid');\n let appids = _.map(apps, 'applicationid');\n let options = {\n minSeverity: target.triggers.minSeverity,\n acknowledged: target.triggers.acknowledged,\n count: target.triggers.count,\n timeFrom: timeFrom,\n timeTo: timeTo\n };\n return this.zabbix.getHostAlerts(hostids, appids, options)\n .then((triggers) => {\n return responseHandler.handleTriggersResponse(triggers, timeRange);\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Test connection to Zabbix API\n * @return {object} Connection status and Zabbix API version\n */\n testDatasource() {\n let zabbixVersion;\n return this.zabbix.getVersion()\n .then(version => {\n zabbixVersion = version;\n return this.zabbix.login();\n })\n .then(() => {\n if (this.enableDirectDBConnection) {\n return this.zabbix.dbConnector.testSQLDataSource();\n } else {\n return Promise.resolve();\n }\n })\n .then(() => {\n return {\n status: \"success\",\n title: \"Success\",\n message: \"Zabbix API version: \" + zabbixVersion\n };\n })\n .catch(error => {\n if (error instanceof ZabbixAPIError) {\n return {\n status: \"error\",\n title: error.message,\n message: error.message\n };\n } else if (error.data && error.data.message) {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error.data.message\n };\n } else {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Could not connect to given url\"\n };\n }\n });\n }\n\n ////////////////\n // Templating //\n ////////////////\n\n /**\n * Find metrics from templated request.\n *\n * @param {string} query Query from Templating\n * @return {string} Metric name - group, host, app or item or list\n * of metrics in \"{metric1,metcic2,...,metricN}\" format.\n */\n metricFindQuery(query) {\n let result;\n let parts = [];\n\n // Split query. Query structure: group.host.app.item\n _.each(utils.splitTemplateQuery(query), part => {\n part = this.replaceTemplateVars(part, {});\n\n // Replace wildcard to regex\n if (part === '*') {\n part = '/.*/';\n }\n parts.push(part);\n });\n let template = _.zipObject(['group', 'host', 'app', 'item'], parts);\n\n // Get items\n if (parts.length === 4) {\n // Search for all items, even it's not belong to any application\n if (template.app === '/.*/') {\n template.app = '';\n }\n result = this.zabbix.getItems(template.group, template.host, template.app, template.item);\n } else if (parts.length === 3) {\n // Get applications\n result = this.zabbix.getApps(template.group, template.host, template.app);\n } else if (parts.length === 2) {\n // Get hosts\n result = this.zabbix.getHosts(template.group, template.host);\n } else if (parts.length === 1) {\n // Get groups\n result = this.zabbix.getGroups(template.group);\n } else {\n result = Promise.resolve([]);\n }\n\n return result.then(metrics => {\n return _.map(metrics, formatMetric);\n });\n }\n\n /////////////////\n // Annotations //\n /////////////////\n\n annotationQuery(options) {\n var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);\n var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);\n var annotation = options.annotation;\n var showOkEvents = annotation.showOkEvents ? c.SHOW_ALL_EVENTS : c.SHOW_OK_EVENTS;\n\n // Show all triggers\n let triggersOptions = {\n showTriggers: c.SHOW_ALL_TRIGGERS,\n hideHostsInMaintenance: false\n };\n\n var getTriggers = this.zabbix.getTriggers(this.replaceTemplateVars(annotation.group, {}),\n this.replaceTemplateVars(annotation.host, {}),\n this.replaceTemplateVars(annotation.application, {}),\n triggersOptions);\n\n return getTriggers.then(triggers => {\n\n // Filter triggers by description\n let triggerName = this.replaceTemplateVars(annotation.trigger, {});\n if (utils.isRegex(triggerName)) {\n triggers = _.filter(triggers, trigger => {\n return utils.buildRegex(triggerName).test(trigger.description);\n });\n } else if (triggerName) {\n triggers = _.filter(triggers, trigger => {\n return trigger.description === triggerName;\n });\n }\n\n // Remove events below the chose severity\n triggers = _.filter(triggers, trigger => {\n return Number(trigger.priority) >= Number(annotation.minseverity);\n });\n\n var objectids = _.map(triggers, 'triggerid');\n return this.zabbix\n .getEvents(objectids, timeFrom, timeTo, showOkEvents)\n .then(events => {\n var indexedTriggers = _.keyBy(triggers, 'triggerid');\n\n // Hide acknowledged events if option enabled\n if (annotation.hideAcknowledged) {\n events = _.filter(events, event => {\n return !event.acknowledges.length;\n });\n }\n\n return _.map(events, event => {\n let tags;\n if (annotation.showHostname) {\n tags = _.map(event.hosts, 'name');\n }\n\n // Show event type (OK or Problem)\n let title = Number(event.value) ? 'Problem' : 'OK';\n\n let formatted_acknowledges = utils.formatAcknowledges(event.acknowledges);\n return {\n annotation: annotation,\n time: event.clock * 1000,\n title: title,\n tags: tags,\n text: indexedTriggers[event.objectid].description + formatted_acknowledges\n };\n });\n });\n });\n }\n\n /**\n * Get triggers and its details for panel's targets\n * Returns alert state ('ok' if no fired triggers, or 'alerting' if at least 1 trigger is fired)\n * or empty object if no related triggers are finded.\n */\n alertQuery(options) {\n let enabled_targets = filterEnabledTargets(options.targets);\n let getPanelItems = _.map(enabled_targets, t => {\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n return this.zabbix.getItemsFromTarget(target, {itemtype: 'num'});\n });\n\n return Promise.all(getPanelItems)\n .then(results => {\n let items = _.flatten(results);\n let itemids = _.map(items, 'itemid');\n\n if (itemids.length === 0) {\n return [];\n }\n return this.zabbix.getAlerts(itemids);\n })\n .then(triggers => {\n triggers = _.filter(triggers, trigger => {\n return trigger.priority >= this.alertingMinSeverity;\n });\n\n if (!triggers || triggers.length === 0) {\n return {};\n }\n\n let state = 'ok';\n\n let firedTriggers = _.filter(triggers, {value: '1'});\n if (firedTriggers.length) {\n state = 'alerting';\n }\n\n let thresholds = _.map(triggers, trigger => {\n return getTriggerThreshold(trigger.expression);\n });\n\n return {\n panelId: options.panelId,\n state: state,\n thresholds: thresholds\n };\n });\n }\n\n // Replace template variables\n replaceTargetVariables(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n _.forEach(parts, p => {\n if (target[p] && target[p].filter) {\n target[p].filter = this.replaceTemplateVars(target[p].filter, options.scopedVars);\n }\n });\n target.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars);\n\n _.forEach(target.functions, func => {\n func.params = _.map(func.params, param => {\n if (typeof param === 'number') {\n return +this.templateSrv.replace(param.toString(), options.scopedVars);\n } else {\n return this.templateSrv.replace(param, options.scopedVars);\n }\n });\n });\n }\n\n isUseTrends(timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);\n let useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);\n let useTrends = this.trends && (\n (timeFrom <= useTrendsFrom) ||\n (timeTo - timeFrom >= useTrendsRange)\n );\n return useTrends;\n }\n}\n\nfunction bindFunctionDefs(functionDefs, category) {\n var aggregationFunctions = _.map(metricFunctions.getCategories()[category], 'name');\n var aggFuncDefs = _.filter(functionDefs, function(func) {\n return _.includes(aggregationFunctions, func.def.name);\n });\n\n return _.map(aggFuncDefs, function(func) {\n var funcInstance = metricFunctions.createFuncInstance(func.def, func.params);\n return funcInstance.bindFunction(dataProcessor.metricFunctions);\n });\n}\n\nfunction getConsolidateBy(target) {\n let consolidateBy = 'avg';\n let funcDef = _.find(target.functions, func => {\n return func.def.name === 'consolidateBy';\n });\n if (funcDef && funcDef.params && funcDef.params.length) {\n consolidateBy = funcDef.params[0];\n }\n return consolidateBy;\n}\n\nfunction downsampleSeries(timeseries_data, options) {\n let defaultAgg = dataProcessor.aggregationFunctions['avg'];\n let consolidateByFunc = dataProcessor.aggregationFunctions[options.consolidateBy] || defaultAgg;\n return _.map(timeseries_data, timeseries => {\n if (timeseries.datapoints.length > options.maxDataPoints) {\n timeseries.datapoints = dataProcessor\n .groupBy(options.interval, consolidateByFunc, timeseries.datapoints);\n }\n return timeseries;\n });\n}\n\nfunction formatMetric(metricObj) {\n return {\n text: metricObj.name,\n expandable: false\n };\n}\n\n/**\n * Custom formatter for template variables.\n * Default Grafana \"regex\" formatter returns\n * value1|value2\n * This formatter returns\n * (value1|value2)\n * This format needed for using in complex regex with\n * template variables, for example\n * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait\n */\nfunction zabbixTemplateFormat(value) {\n if (typeof value === 'string') {\n return utils.escapeRegex(value);\n }\n\n var escapedValues = _.map(value, utils.escapeRegex);\n return '(' + escapedValues.join('|') + ')';\n}\n\nfunction zabbixItemIdsTemplateFormat(value) {\n if (typeof value === 'string') {\n return value;\n }\n return value.join(',');\n}\n\n/**\n * If template variables are used in request, replace it using regex format\n * and wrap with '/' for proper multi-value work. Example:\n * $variable selected as a, b, c\n * We use filter $variable\n * $variable -> a|b|c -> /a|b|c/\n * /$variable/ -> /a|b|c/ -> /a|b|c/\n */\nfunction replaceTemplateVars(templateSrv, target, scopedVars) {\n var replacedTarget = templateSrv.replace(target, scopedVars, zabbixTemplateFormat);\n if (target !== replacedTarget && !utils.isRegex(replacedTarget)) {\n replacedTarget = '/^' + replacedTarget + '$/';\n }\n return replacedTarget;\n}\n\n// Apply function one by one:\n// sequence([a(), b(), c()]) = c(b(a()));\nfunction sequence(funcsArray) {\n return function(result) {\n for (var i = 0; i < funcsArray.length; i++) {\n result = funcsArray[i].call(this, result);\n }\n return result;\n };\n}\n\nfunction filterEnabledTargets(targets) {\n return _.filter(targets, target => {\n return !(target.hide || !target.group || !target.host || !target.item);\n });\n}\n\nfunction getTriggerThreshold(expression) {\n let thresholdPattern = /.*[<>=]{1,2}([\\d\\.]+)/;\n let finded_thresholds = expression.match(thresholdPattern);\n if (finded_thresholds && finded_thresholds.length >= 2) {\n let threshold = finded_thresholds[1];\n threshold = Number(threshold);\n return threshold;\n } else {\n return null;\n }\n}\n\nexport {ZabbixAPIDatasource, zabbixTemplateFormat};\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {_.includes = _.contains;}\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/migrations.js b/dist/datasource-zabbix/migrations.js index 1b10639..e1f0be9 100644 --- a/dist/datasource-zabbix/migrations.js +++ b/dist/datasource-zabbix/migrations.js @@ -32,6 +32,7 @@ System.register([], function (_export, _context) { _export("migrateFrom2To3version", migrateFrom2To3version); function migrate(target) { + target.resultFormat = target.resultFormat || 'time_series'; if (isGrafana2target(target)) { return migrateFrom2To3version(target); } else { diff --git a/dist/datasource-zabbix/migrations.js.map b/dist/datasource-zabbix/migrations.js.map index 35917d4..a10a69a 100644 --- a/dist/datasource-zabbix/migrations.js.map +++ b/dist/datasource-zabbix/migrations.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/migrations.js"],"names":["isGrafana2target","target","mode","hostFilter","itemFilter","downsampleFunction","host","item","filter","undefined","migrateFrom2To3version","group","name","convertToRegex","application","migrate","str"],"mappings":";;;;;AAAA;;;;;AAKO,WAASA,gBAAT,CAA0BC,MAA1B,EAAkC;AACvC,QAAI,CAACA,OAAOC,IAAR,IAAgBD,OAAOC,IAAP,KAAgB,CAAhC,IAAqCD,OAAOC,IAAP,KAAgB,CAAzD,EAA4D;AAC1D,UAAI,CAACD,OAAOE,UAAP,IAAqBF,OAAOG,UAA5B,IAA0CH,OAAOI,kBAAjD,IACAJ,OAAOK,IAAP,IAAeL,OAAOK,IAAP,CAAYA,IAD5B,KAECL,OAAOM,IAAP,CAAYC,MAAZ,KAAuBC,SAAvB,IAAoCR,OAAOK,IAAP,CAAYE,MAAZ,KAAuBC,SAFhE,EAE4E;AAC1E,eAAO,IAAP;AACD,OAJD,MAIO;AACL,eAAO,KAAP;AACD;AACF,KARD,MAQO;AACL,aAAO,KAAP;AACD;AACF;;8BAZeT,gB;;AAcT,WAASU,sBAAT,CAAgCT,MAAhC,EAAwC;AAC7CA,WAAOU,KAAP,CAAaH,MAAb,GAAsBP,OAAOU,KAAP,CAAaC,IAAb,KAAsB,GAAtB,GAA4B,MAA5B,GAAqCX,OAAOU,KAAP,CAAaC,IAAxE;AACAX,WAAOK,IAAP,CAAYE,MAAZ,GAAqBP,OAAOK,IAAP,CAAYM,IAAZ,KAAqB,GAArB,GAA2BC,eAAeZ,OAAOE,UAAtB,CAA3B,GAA+DF,OAAOK,IAAP,CAAYM,IAAhG;AACAX,WAAOa,WAAP,CAAmBN,MAAnB,GAA4BP,OAAOa,WAAP,CAAmBF,IAAnB,KAA4B,GAA5B,GAAkC,EAAlC,GAAuCX,OAAOa,WAAP,CAAmBF,IAAtF;AACAX,WAAOM,IAAP,CAAYC,MAAZ,GAAqBP,OAAOM,IAAP,CAAYK,IAAZ,KAAqB,KAArB,GAA6BC,eAAeZ,OAAOG,UAAtB,CAA7B,GAAiEH,OAAOM,IAAP,CAAYK,IAAlG;AACA,WAAOX,MAAP;AACD;oCANeS,sB;;AAQT,WAASK,OAAT,CAAiBd,MAAjB,EAAyB;AAC9B,QAAID,iBAAiBC,MAAjB,CAAJ,EAA8B;AAC5B,aAAOS,uBAAuBT,MAAvB,CAAP;AACD,KAFD,MAEO;AACL,aAAOA,MAAP;AACD;AACF;;qBANec,O;;AAQhB,WAASF,cAAT,CAAwBG,GAAxB,EAA6B;AAC3B,QAAIA,GAAJ,EAAS;AACP,aAAO,MAAMA,GAAN,GAAY,GAAnB;AACD,KAFD,MAEO;AACL,aAAO,MAAP;AACD;AACF,G","file":"migrations.js","sourcesContent":["/**\n * Query format migration.\n * This module can detect query format version and make migration.\n */\n\nexport function isGrafana2target(target) {\n if (!target.mode || target.mode === 0 || target.mode === 2) {\n if ((target.hostFilter || target.itemFilter || target.downsampleFunction ||\n (target.host && target.host.host)) &&\n (target.item.filter === undefined && target.host.filter === undefined)) {\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n}\n\nexport function migrateFrom2To3version(target) {\n target.group.filter = target.group.name === \"*\" ? \"/.*/\" : target.group.name;\n target.host.filter = target.host.name === \"*\" ? convertToRegex(target.hostFilter) : target.host.name;\n target.application.filter = target.application.name === \"*\" ? \"\" : target.application.name;\n target.item.filter = target.item.name === \"All\" ? convertToRegex(target.itemFilter) : target.item.name;\n return target;\n}\n\nexport function migrate(target) {\n if (isGrafana2target(target)) {\n return migrateFrom2To3version(target);\n } else {\n return target;\n }\n}\n\nfunction convertToRegex(str) {\n if (str) {\n return '/' + str + '/';\n } else {\n return '/.*/';\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/migrations.js"],"names":["isGrafana2target","target","mode","hostFilter","itemFilter","downsampleFunction","host","item","filter","undefined","migrateFrom2To3version","group","name","convertToRegex","application","migrate","resultFormat","str"],"mappings":";;;;;AAAA;;;;;AAKO,WAASA,gBAAT,CAA0BC,MAA1B,EAAkC;AACvC,QAAI,CAACA,OAAOC,IAAR,IAAgBD,OAAOC,IAAP,KAAgB,CAAhC,IAAqCD,OAAOC,IAAP,KAAgB,CAAzD,EAA4D;AAC1D,UAAI,CAACD,OAAOE,UAAP,IAAqBF,OAAOG,UAA5B,IAA0CH,OAAOI,kBAAjD,IACAJ,OAAOK,IAAP,IAAeL,OAAOK,IAAP,CAAYA,IAD5B,KAECL,OAAOM,IAAP,CAAYC,MAAZ,KAAuBC,SAAvB,IAAoCR,OAAOK,IAAP,CAAYE,MAAZ,KAAuBC,SAFhE,EAE4E;AAC1E,eAAO,IAAP;AACD,OAJD,MAIO;AACL,eAAO,KAAP;AACD;AACF,KARD,MAQO;AACL,aAAO,KAAP;AACD;AACF;;8BAZeT,gB;;AAcT,WAASU,sBAAT,CAAgCT,MAAhC,EAAwC;AAC7CA,WAAOU,KAAP,CAAaH,MAAb,GAAsBP,OAAOU,KAAP,CAAaC,IAAb,KAAsB,GAAtB,GAA4B,MAA5B,GAAqCX,OAAOU,KAAP,CAAaC,IAAxE;AACAX,WAAOK,IAAP,CAAYE,MAAZ,GAAqBP,OAAOK,IAAP,CAAYM,IAAZ,KAAqB,GAArB,GAA2BC,eAAeZ,OAAOE,UAAtB,CAA3B,GAA+DF,OAAOK,IAAP,CAAYM,IAAhG;AACAX,WAAOa,WAAP,CAAmBN,MAAnB,GAA4BP,OAAOa,WAAP,CAAmBF,IAAnB,KAA4B,GAA5B,GAAkC,EAAlC,GAAuCX,OAAOa,WAAP,CAAmBF,IAAtF;AACAX,WAAOM,IAAP,CAAYC,MAAZ,GAAqBP,OAAOM,IAAP,CAAYK,IAAZ,KAAqB,KAArB,GAA6BC,eAAeZ,OAAOG,UAAtB,CAA7B,GAAiEH,OAAOM,IAAP,CAAYK,IAAlG;AACA,WAAOX,MAAP;AACD;oCANeS,sB;;AAQT,WAASK,OAAT,CAAiBd,MAAjB,EAAyB;AAC9BA,WAAOe,YAAP,GAAsBf,OAAOe,YAAP,IAAuB,aAA7C;AACA,QAAIhB,iBAAiBC,MAAjB,CAAJ,EAA8B;AAC5B,aAAOS,uBAAuBT,MAAvB,CAAP;AACD,KAFD,MAEO;AACL,aAAOA,MAAP;AACD;AACF;;qBAPec,O;;AAShB,WAASF,cAAT,CAAwBI,GAAxB,EAA6B;AAC3B,QAAIA,GAAJ,EAAS;AACP,aAAO,MAAMA,GAAN,GAAY,GAAnB;AACD,KAFD,MAEO;AACL,aAAO,MAAP;AACD;AACF,G","file":"migrations.js","sourcesContent":["/**\n * Query format migration.\n * This module can detect query format version and make migration.\n */\n\nexport function isGrafana2target(target) {\n if (!target.mode || target.mode === 0 || target.mode === 2) {\n if ((target.hostFilter || target.itemFilter || target.downsampleFunction ||\n (target.host && target.host.host)) &&\n (target.item.filter === undefined && target.host.filter === undefined)) {\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n}\n\nexport function migrateFrom2To3version(target) {\n target.group.filter = target.group.name === \"*\" ? \"/.*/\" : target.group.name;\n target.host.filter = target.host.name === \"*\" ? convertToRegex(target.hostFilter) : target.host.name;\n target.application.filter = target.application.name === \"*\" ? \"\" : target.application.name;\n target.item.filter = target.item.name === \"All\" ? convertToRegex(target.itemFilter) : target.item.name;\n return target;\n}\n\nexport function migrate(target) {\n target.resultFormat = target.resultFormat || 'time_series';\n if (isGrafana2target(target)) {\n return migrateFrom2To3version(target);\n } else {\n return target;\n }\n}\n\nfunction convertToRegex(str) {\n if (str) {\n return '/' + str + '/';\n } else {\n return '/.*/';\n }\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/partials/query.editor.html b/dist/datasource-zabbix/partials/query.editor.html index d731bf7..886ee05 100644 --- a/dist/datasource-zabbix/partials/query.editor.html +++ b/dist/datasource-zabbix/partials/query.editor.html @@ -11,6 +11,12 @@ +
+ +
+ +
+
diff --git a/dist/datasource-zabbix/query.controller.js b/dist/datasource-zabbix/query.controller.js index fe07c27..6023a4e 100644 --- a/dist/datasource-zabbix/query.controller.js +++ b/dist/datasource-zabbix/query.controller.js @@ -97,6 +97,8 @@ System.register(['app/plugins/sdk', 'lodash', './constants', './utils', './metri _this.ackFilters = [{ text: 'all triggers', value: 2 }, { text: 'unacknowledged', value: 0 }, { text: 'acknowledged', value: 1 }]; + _this.resultFormats = [{ text: 'Time series', value: 'time_series' }, { text: 'Table', value: 'table' }]; + _this.triggerSeverity = c.TRIGGER_SEVERITY; // Map functions for bs-typeahead diff --git a/dist/datasource-zabbix/query.controller.js.map b/dist/datasource-zabbix/query.controller.js.map index 24aaaf2..e39b316 100644 --- a/dist/datasource-zabbix/query.controller.js.map +++ b/dist/datasource-zabbix/query.controller.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/query.controller.js"],"names":["QueryCtrl","_","c","utils","metricFunctions","migrations","ZabbixQueryController","$scope","$injector","$rootScope","$sce","templateSrv","zabbix","datasource","replaceTemplateVars","editorModes","value","text","mode","MODE_METRICS","MODE_TEXT","MODE_ITSERVICE","MODE_ITEMID","MODE_TRIGGERS","editorMode","METRICS","TEXT","ITSERVICE","ITEMID","TRIGGERS","slaPropertyList","name","property","ackFilters","triggerSeverity","TRIGGER_SEVERITY","getGroupNames","bind","getMetricNames","getHostNames","getApplicationNames","getItemNames","getITServices","getVariables","getTemplateVariables","$on","onVariableChange","onTargetBlur","init","target","migrate","scopeDefaults","metric","oldTarget","cloneDeep","queryOptionsText","renderQueryOptionsText","defaults","targetDefaults","functions","map","func","createFuncInstance","def","params","initFilters","slaProperty","suggestITServices","itemtype","find","Promise","all","suggestGroups","suggestHosts","suggestApps","suggestItems","metricList","addAllValue","metrics","uniq","forEach","variables","unshift","variable","getAllGroups","then","groupList","groups","groupFilter","group","filter","getAllHosts","hostList","hosts","hostFilter","host","getAllApps","appList","apps","appFilter","application","options","showDisabledItems","getAllItems","itemList","items","getITService","itServiceList","itservices","str","isRegex","isTemplateVariable","newTarget","isEqual","targetChanged","isContainsVariables","some","field","parseTarget","panelCtrl","refresh","funcDef","newFunc","added","push","moveAliasFuncLast","length","without","aliasFunc","showQueryOptions","optionsMap","forOwn","key","join","templateUrl"],"mappings":"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","file":"query.controller.js","sourcesContent":["import {QueryCtrl} from 'app/plugins/sdk';\nimport _ from 'lodash';\nimport * as c from './constants';\nimport * as utils from './utils';\nimport * as metricFunctions from './metricFunctions';\nimport * as migrations from './migrations';\n\nimport './add-metric-function.directive';\nimport './metric-function-editor.directive';\n\nexport class ZabbixQueryController extends QueryCtrl {\n\n // ZabbixQueryCtrl constructor\n constructor($scope, $injector, $rootScope, $sce, templateSrv) {\n super($scope, $injector);\n this.zabbix = this.datasource.zabbix;\n\n // Use custom format for template variables\n this.replaceTemplateVars = this.datasource.replaceTemplateVars;\n this.templateSrv = templateSrv;\n\n this.editorModes = [\n {value: 'num', text: 'Metrics', mode: c.MODE_METRICS},\n {value: 'text', text: 'Text', mode: c.MODE_TEXT},\n {value: 'itservice', text: 'IT Services', mode: c.MODE_ITSERVICE},\n {value: 'itemid', text: 'Item ID', mode: c.MODE_ITEMID},\n {value: 'triggers', text: 'Triggers', mode: c.MODE_TRIGGERS}\n ];\n\n this.$scope.editorMode = {\n METRICS: c.MODE_METRICS,\n TEXT: c.MODE_TEXT,\n ITSERVICE: c.MODE_ITSERVICE,\n ITEMID: c.MODE_ITEMID,\n TRIGGERS: c.MODE_TRIGGERS\n };\n\n this.slaPropertyList = [\n {name: \"Status\", property: \"status\"},\n {name: \"SLA\", property: \"sla\"},\n {name: \"OK time\", property: \"okTime\"},\n {name: \"Problem time\", property: \"problemTime\"},\n {name: \"Down time\", property: \"downtimeTime\"}\n ];\n\n this.ackFilters = [\n {text: 'all triggers', value: 2},\n {text: 'unacknowledged', value: 0},\n {text: 'acknowledged', value: 1},\n ];\n\n this.triggerSeverity = c.TRIGGER_SEVERITY;\n\n // Map functions for bs-typeahead\n this.getGroupNames = _.bind(this.getMetricNames, this, 'groupList');\n this.getHostNames = _.bind(this.getMetricNames, this, 'hostList', true);\n this.getApplicationNames = _.bind(this.getMetricNames, this, 'appList');\n this.getItemNames = _.bind(this.getMetricNames, this, 'itemList');\n this.getITServices = _.bind(this.getMetricNames, this, 'itServiceList');\n this.getVariables = _.bind(this.getTemplateVariables, this);\n\n // Update metric suggestion when template variable was changed\n $rootScope.$on('template-variable-value-updated', () => this.onVariableChange());\n\n // Update metrics when item selected from dropdown\n $scope.$on('typeahead-updated', () => {\n this.onTargetBlur();\n });\n\n this.init = function() {\n var target = this.target;\n\n // Migrate old targets\n target = migrations.migrate(target);\n\n var scopeDefaults = {\n metric: {},\n oldTarget: _.cloneDeep(this.target),\n queryOptionsText: this.renderQueryOptionsText()\n };\n _.defaults(this, scopeDefaults);\n\n // Load default values\n var targetDefaults = {\n 'mode': c.MODE_METRICS,\n 'group': { 'filter': \"\" },\n 'host': { 'filter': \"\" },\n 'application': { 'filter': \"\" },\n 'item': { 'filter': \"\" },\n 'functions': [],\n 'triggers': {\n 'count': true,\n 'minSeverity': 3,\n 'acknowledged': 2\n },\n 'options': {\n 'showDisabledItems': false\n }\n };\n _.defaults(target, targetDefaults);\n\n // Create function instances from saved JSON\n target.functions = _.map(target.functions, function(func) {\n return metricFunctions.createFuncInstance(func.def, func.params);\n });\n\n if (target.mode === c.MODE_METRICS ||\n target.mode === c.MODE_TEXT ||\n target.mode === c.MODE_TRIGGERS) {\n this.initFilters();\n }\n else if (target.mode === c.MODE_ITSERVICE) {\n _.defaults(target, {slaProperty: {name: \"SLA\", property: \"sla\"}});\n this.suggestITServices();\n }\n };\n\n this.init();\n this.queryOptionsText = this.renderQueryOptionsText();\n }\n\n initFilters() {\n let itemtype = _.find(this.editorModes, {'mode': this.target.mode});\n itemtype = itemtype ? itemtype.value : null;\n return Promise.all([\n this.suggestGroups(),\n this.suggestHosts(),\n this.suggestApps(),\n this.suggestItems(itemtype)\n ]);\n }\n\n // Get list of metric names for bs-typeahead directive\n getMetricNames(metricList, addAllValue) {\n let metrics = _.uniq(_.map(this.metric[metricList], 'name'));\n\n // Add template variables\n _.forEach(this.templateSrv.variables, variable => {\n metrics.unshift('$' + variable.name);\n });\n\n if (addAllValue) {\n metrics.unshift('/.*/');\n }\n\n return metrics;\n }\n\n getTemplateVariables() {\n return _.map(this.templateSrv.variables, variable => {\n return '$' + variable.name;\n });\n }\n\n suggestGroups() {\n return this.zabbix.getAllGroups()\n .then(groups => {\n this.metric.groupList = groups;\n return groups;\n });\n }\n\n suggestHosts() {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n return this.zabbix.getAllHosts(groupFilter)\n .then(hosts => {\n this.metric.hostList = hosts;\n return hosts;\n });\n }\n\n suggestApps() {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n let hostFilter = this.replaceTemplateVars(this.target.host.filter);\n return this.zabbix.getAllApps(groupFilter, hostFilter)\n .then(apps => {\n this.metric.appList = apps;\n return apps;\n });\n }\n\n suggestItems(itemtype = 'num') {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n let hostFilter = this.replaceTemplateVars(this.target.host.filter);\n let appFilter = this.replaceTemplateVars(this.target.application.filter);\n let options = {\n itemtype: itemtype,\n showDisabledItems: this.target.options.showDisabledItems\n };\n\n return this.zabbix\n .getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => {\n this.metric.itemList = items;\n return items;\n });\n }\n\n suggestITServices() {\n return this.zabbix.getITService()\n .then(itservices => {\n this.metric.itServiceList = itservices;\n return itservices;\n });\n }\n\n isRegex(str) {\n return utils.isRegex(str);\n }\n\n isVariable(str) {\n return utils.isTemplateVariable(str, this.templateSrv.variables);\n }\n\n onTargetBlur() {\n var newTarget = _.cloneDeep(this.target);\n if (!_.isEqual(this.oldTarget, this.target)) {\n this.oldTarget = newTarget;\n this.targetChanged();\n }\n }\n\n onVariableChange() {\n if (this.isContainsVariables()) {\n this.targetChanged();\n }\n }\n\n /**\n * Check query for template variables\n */\n isContainsVariables() {\n return _.some(['group', 'host', 'application'], field => {\n if (this.target[field] && this.target[field].filter) {\n return utils.isTemplateVariable(this.target[field].filter, this.templateSrv.variables);\n } else {\n return false;\n }\n });\n }\n\n parseTarget() {\n // Parse target\n }\n\n // Validate target and set validation info\n validateTarget() {\n // validate\n }\n\n targetChanged() {\n this.initFilters();\n this.parseTarget();\n this.panelCtrl.refresh();\n }\n\n addFunction(funcDef) {\n var newFunc = metricFunctions.createFuncInstance(funcDef);\n newFunc.added = true;\n this.target.functions.push(newFunc);\n\n this.moveAliasFuncLast();\n\n if (newFunc.params.length && newFunc.added ||\n newFunc.def.params.length === 0) {\n this.targetChanged();\n }\n }\n\n removeFunction(func) {\n this.target.functions = _.without(this.target.functions, func);\n this.targetChanged();\n }\n\n moveAliasFuncLast() {\n var aliasFunc = _.find(this.target.functions, function(func) {\n return func.def.name === 'alias' ||\n func.def.name === 'aliasByNode' ||\n func.def.name === 'aliasByMetric';\n });\n\n if (aliasFunc) {\n this.target.functions = _.without(this.target.functions, aliasFunc);\n this.target.functions.push(aliasFunc);\n }\n }\n\n toggleQueryOptions() {\n this.showQueryOptions = !this.showQueryOptions;\n }\n\n onQueryOptionChange() {\n this.queryOptionsText = this.renderQueryOptionsText();\n this.onTargetBlur();\n }\n\n renderQueryOptionsText() {\n var optionsMap = {\n showDisabledItems: \"Show disabled items\"\n };\n var options = [];\n _.forOwn(this.target.options, (value, key) => {\n if (value) {\n if (value === true) {\n // Show only option name (if enabled) for boolean options\n options.push(optionsMap[key]);\n } else {\n // Show \"option = value\" for another options\n options.push(optionsMap[key] + \" = \" + value);\n }\n }\n });\n return \"Options: \" + options.join(', ');\n }\n\n /**\n * Switch query editor to specified mode.\n * Modes:\n * 0 - items\n * 1 - IT services\n * 2 - Text metrics\n */\n switchEditorMode(mode) {\n this.target.mode = mode;\n this.init();\n this.targetChanged();\n }\n}\n\n// Set templateUrl as static property\nZabbixQueryController.templateUrl = 'datasource-zabbix/partials/query.editor.html';\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/query.controller.js"],"names":["QueryCtrl","_","c","utils","metricFunctions","migrations","ZabbixQueryController","$scope","$injector","$rootScope","$sce","templateSrv","zabbix","datasource","replaceTemplateVars","editorModes","value","text","mode","MODE_METRICS","MODE_TEXT","MODE_ITSERVICE","MODE_ITEMID","MODE_TRIGGERS","editorMode","METRICS","TEXT","ITSERVICE","ITEMID","TRIGGERS","slaPropertyList","name","property","ackFilters","resultFormats","triggerSeverity","TRIGGER_SEVERITY","getGroupNames","bind","getMetricNames","getHostNames","getApplicationNames","getItemNames","getITServices","getVariables","getTemplateVariables","$on","onVariableChange","onTargetBlur","init","target","migrate","scopeDefaults","metric","oldTarget","cloneDeep","queryOptionsText","renderQueryOptionsText","defaults","targetDefaults","functions","map","func","createFuncInstance","def","params","initFilters","slaProperty","suggestITServices","itemtype","find","Promise","all","suggestGroups","suggestHosts","suggestApps","suggestItems","metricList","addAllValue","metrics","uniq","forEach","variables","unshift","variable","getAllGroups","then","groupList","groups","groupFilter","group","filter","getAllHosts","hostList","hosts","hostFilter","host","getAllApps","appList","apps","appFilter","application","options","showDisabledItems","getAllItems","itemList","items","getITService","itServiceList","itservices","str","isRegex","isTemplateVariable","newTarget","isEqual","targetChanged","isContainsVariables","some","field","parseTarget","panelCtrl","refresh","funcDef","newFunc","added","push","moveAliasFuncLast","length","without","aliasFunc","showQueryOptions","optionsMap","forOwn","key","join","templateUrl"],"mappings":"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","file":"query.controller.js","sourcesContent":["import {QueryCtrl} from 'app/plugins/sdk';\nimport _ from 'lodash';\nimport * as c from './constants';\nimport * as utils from './utils';\nimport * as metricFunctions from './metricFunctions';\nimport * as migrations from './migrations';\n\nimport './add-metric-function.directive';\nimport './metric-function-editor.directive';\n\nexport class ZabbixQueryController extends QueryCtrl {\n\n // ZabbixQueryCtrl constructor\n constructor($scope, $injector, $rootScope, $sce, templateSrv) {\n super($scope, $injector);\n this.zabbix = this.datasource.zabbix;\n\n // Use custom format for template variables\n this.replaceTemplateVars = this.datasource.replaceTemplateVars;\n this.templateSrv = templateSrv;\n\n this.editorModes = [\n {value: 'num', text: 'Metrics', mode: c.MODE_METRICS},\n {value: 'text', text: 'Text', mode: c.MODE_TEXT},\n {value: 'itservice', text: 'IT Services', mode: c.MODE_ITSERVICE},\n {value: 'itemid', text: 'Item ID', mode: c.MODE_ITEMID},\n {value: 'triggers', text: 'Triggers', mode: c.MODE_TRIGGERS}\n ];\n\n this.$scope.editorMode = {\n METRICS: c.MODE_METRICS,\n TEXT: c.MODE_TEXT,\n ITSERVICE: c.MODE_ITSERVICE,\n ITEMID: c.MODE_ITEMID,\n TRIGGERS: c.MODE_TRIGGERS\n };\n\n this.slaPropertyList = [\n {name: \"Status\", property: \"status\"},\n {name: \"SLA\", property: \"sla\"},\n {name: \"OK time\", property: \"okTime\"},\n {name: \"Problem time\", property: \"problemTime\"},\n {name: \"Down time\", property: \"downtimeTime\"}\n ];\n\n this.ackFilters = [\n {text: 'all triggers', value: 2},\n {text: 'unacknowledged', value: 0},\n {text: 'acknowledged', value: 1},\n ];\n\n this.resultFormats = [{ text: 'Time series', value: 'time_series' }, { text: 'Table', value: 'table' }];\n\n this.triggerSeverity = c.TRIGGER_SEVERITY;\n\n // Map functions for bs-typeahead\n this.getGroupNames = _.bind(this.getMetricNames, this, 'groupList');\n this.getHostNames = _.bind(this.getMetricNames, this, 'hostList', true);\n this.getApplicationNames = _.bind(this.getMetricNames, this, 'appList');\n this.getItemNames = _.bind(this.getMetricNames, this, 'itemList');\n this.getITServices = _.bind(this.getMetricNames, this, 'itServiceList');\n this.getVariables = _.bind(this.getTemplateVariables, this);\n\n // Update metric suggestion when template variable was changed\n $rootScope.$on('template-variable-value-updated', () => this.onVariableChange());\n\n // Update metrics when item selected from dropdown\n $scope.$on('typeahead-updated', () => {\n this.onTargetBlur();\n });\n\n this.init = function() {\n var target = this.target;\n\n // Migrate old targets\n target = migrations.migrate(target);\n\n var scopeDefaults = {\n metric: {},\n oldTarget: _.cloneDeep(this.target),\n queryOptionsText: this.renderQueryOptionsText()\n };\n _.defaults(this, scopeDefaults);\n\n // Load default values\n var targetDefaults = {\n 'mode': c.MODE_METRICS,\n 'group': { 'filter': \"\" },\n 'host': { 'filter': \"\" },\n 'application': { 'filter': \"\" },\n 'item': { 'filter': \"\" },\n 'functions': [],\n 'triggers': {\n 'count': true,\n 'minSeverity': 3,\n 'acknowledged': 2\n },\n 'options': {\n 'showDisabledItems': false\n }\n };\n _.defaults(target, targetDefaults);\n\n // Create function instances from saved JSON\n target.functions = _.map(target.functions, function(func) {\n return metricFunctions.createFuncInstance(func.def, func.params);\n });\n\n if (target.mode === c.MODE_METRICS ||\n target.mode === c.MODE_TEXT ||\n target.mode === c.MODE_TRIGGERS) {\n this.initFilters();\n }\n else if (target.mode === c.MODE_ITSERVICE) {\n _.defaults(target, {slaProperty: {name: \"SLA\", property: \"sla\"}});\n this.suggestITServices();\n }\n };\n\n this.init();\n this.queryOptionsText = this.renderQueryOptionsText();\n }\n\n initFilters() {\n let itemtype = _.find(this.editorModes, {'mode': this.target.mode});\n itemtype = itemtype ? itemtype.value : null;\n return Promise.all([\n this.suggestGroups(),\n this.suggestHosts(),\n this.suggestApps(),\n this.suggestItems(itemtype)\n ]);\n }\n\n // Get list of metric names for bs-typeahead directive\n getMetricNames(metricList, addAllValue) {\n let metrics = _.uniq(_.map(this.metric[metricList], 'name'));\n\n // Add template variables\n _.forEach(this.templateSrv.variables, variable => {\n metrics.unshift('$' + variable.name);\n });\n\n if (addAllValue) {\n metrics.unshift('/.*/');\n }\n\n return metrics;\n }\n\n getTemplateVariables() {\n return _.map(this.templateSrv.variables, variable => {\n return '$' + variable.name;\n });\n }\n\n suggestGroups() {\n return this.zabbix.getAllGroups()\n .then(groups => {\n this.metric.groupList = groups;\n return groups;\n });\n }\n\n suggestHosts() {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n return this.zabbix.getAllHosts(groupFilter)\n .then(hosts => {\n this.metric.hostList = hosts;\n return hosts;\n });\n }\n\n suggestApps() {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n let hostFilter = this.replaceTemplateVars(this.target.host.filter);\n return this.zabbix.getAllApps(groupFilter, hostFilter)\n .then(apps => {\n this.metric.appList = apps;\n return apps;\n });\n }\n\n suggestItems(itemtype = 'num') {\n let groupFilter = this.replaceTemplateVars(this.target.group.filter);\n let hostFilter = this.replaceTemplateVars(this.target.host.filter);\n let appFilter = this.replaceTemplateVars(this.target.application.filter);\n let options = {\n itemtype: itemtype,\n showDisabledItems: this.target.options.showDisabledItems\n };\n\n return this.zabbix\n .getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => {\n this.metric.itemList = items;\n return items;\n });\n }\n\n suggestITServices() {\n return this.zabbix.getITService()\n .then(itservices => {\n this.metric.itServiceList = itservices;\n return itservices;\n });\n }\n\n isRegex(str) {\n return utils.isRegex(str);\n }\n\n isVariable(str) {\n return utils.isTemplateVariable(str, this.templateSrv.variables);\n }\n\n onTargetBlur() {\n var newTarget = _.cloneDeep(this.target);\n if (!_.isEqual(this.oldTarget, this.target)) {\n this.oldTarget = newTarget;\n this.targetChanged();\n }\n }\n\n onVariableChange() {\n if (this.isContainsVariables()) {\n this.targetChanged();\n }\n }\n\n /**\n * Check query for template variables\n */\n isContainsVariables() {\n return _.some(['group', 'host', 'application'], field => {\n if (this.target[field] && this.target[field].filter) {\n return utils.isTemplateVariable(this.target[field].filter, this.templateSrv.variables);\n } else {\n return false;\n }\n });\n }\n\n parseTarget() {\n // Parse target\n }\n\n // Validate target and set validation info\n validateTarget() {\n // validate\n }\n\n targetChanged() {\n this.initFilters();\n this.parseTarget();\n this.panelCtrl.refresh();\n }\n\n addFunction(funcDef) {\n var newFunc = metricFunctions.createFuncInstance(funcDef);\n newFunc.added = true;\n this.target.functions.push(newFunc);\n\n this.moveAliasFuncLast();\n\n if (newFunc.params.length && newFunc.added ||\n newFunc.def.params.length === 0) {\n this.targetChanged();\n }\n }\n\n removeFunction(func) {\n this.target.functions = _.without(this.target.functions, func);\n this.targetChanged();\n }\n\n moveAliasFuncLast() {\n var aliasFunc = _.find(this.target.functions, function(func) {\n return func.def.name === 'alias' ||\n func.def.name === 'aliasByNode' ||\n func.def.name === 'aliasByMetric';\n });\n\n if (aliasFunc) {\n this.target.functions = _.without(this.target.functions, aliasFunc);\n this.target.functions.push(aliasFunc);\n }\n }\n\n toggleQueryOptions() {\n this.showQueryOptions = !this.showQueryOptions;\n }\n\n onQueryOptionChange() {\n this.queryOptionsText = this.renderQueryOptionsText();\n this.onTargetBlur();\n }\n\n renderQueryOptionsText() {\n var optionsMap = {\n showDisabledItems: \"Show disabled items\"\n };\n var options = [];\n _.forOwn(this.target.options, (value, key) => {\n if (value) {\n if (value === true) {\n // Show only option name (if enabled) for boolean options\n options.push(optionsMap[key]);\n } else {\n // Show \"option = value\" for another options\n options.push(optionsMap[key] + \" = \" + value);\n }\n }\n });\n return \"Options: \" + options.join(', ');\n }\n\n /**\n * Switch query editor to specified mode.\n * Modes:\n * 0 - items\n * 1 - IT services\n * 2 - Text metrics\n */\n switchEditorMode(mode) {\n this.target.mode = mode;\n this.init();\n this.targetChanged();\n }\n}\n\n// Set templateUrl as static property\nZabbixQueryController.templateUrl = 'datasource-zabbix/partials/query.editor.html';\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/responseHandler.js b/dist/datasource-zabbix/responseHandler.js index 07e1dfc..f8cf023 100644 --- a/dist/datasource-zabbix/responseHandler.js +++ b/dist/datasource-zabbix/responseHandler.js @@ -72,7 +72,28 @@ System.register(['lodash', 'app/core/table_model', './constants'], function (_ex var convertTextCallback = _.partial(convertText, target); return convertHistory(history, items, addHostName, convertTextCallback); - }function convertText(target, point) { + }function handleHistoryAsTable(history, items) { + var table = new TableModel(); + table.addColumn({ text: 'Host' }); + table.addColumn({ text: 'Item' }); + table.addColumn({ text: 'Key' }); + table.addColumn({ text: 'Last value' }); + + var grouped_history = _.groupBy(history, 'itemid'); + _.each(items, function (item) { + var itemHistory = grouped_history[item.itemid] || []; + var lastPoint = _.last(itemHistory); + var lastValue = lastPoint ? lastPoint.value : null; + var host = _.first(item.hosts); + host = host ? host.name : ""; + + table.rows.push([host, item.name, item.key_, lastValue]); + }); + + return table; + } + + function convertText(target, point) { var value = point.value; // Regex-based extractor @@ -81,9 +102,7 @@ System.register(['lodash', 'app/core/table_model', './constants'], function (_ex } return [value, point.clock * 1000 + Math.round(point.ns / 1000000)]; - } - - function extractText(str, pattern, useCaptureGroups) { + }function extractText(str, pattern, useCaptureGroups) { var extractPattern = new RegExp(pattern); var extractedValue = extractPattern.exec(str); if (extractedValue) { @@ -94,7 +113,9 @@ System.register(['lodash', 'app/core/table_model', './constants'], function (_ex } } return extractedValue; - }function handleSLAResponse(itservice, slaProperty, slaObject) { + } + + function handleSLAResponse(itservice, slaProperty, slaObject) { var targetSLA = slaObject[itservice.serviceid].sla[0]; if (slaProperty.property === 'status') { var targetStatus = parseInt(slaObject[itservice.serviceid].status); @@ -108,9 +129,7 @@ System.register(['lodash', 'app/core/table_model', './constants'], function (_ex datapoints: [[targetSLA[slaProperty.property], targetSLA.from * 1000], [targetSLA[slaProperty.property], targetSLA.to * 1000]] }; } - } - - function handleTriggersResponse(triggers, timeRange) { + }function handleTriggersResponse(triggers, timeRange) { if (_.isNumber(triggers)) { return { target: "triggers count", @@ -134,7 +153,9 @@ System.register(['lodash', 'app/core/table_model', './constants'], function (_ex }); return table; } - }function getTriggerStats(triggers) { + } + + function getTriggerStats(triggers) { var groups = _.uniq(_.flattenDeep(_.map(triggers, function (trigger) { return _.map(trigger.groups, 'name'); }))); @@ -149,12 +170,12 @@ System.register(['lodash', 'app/core/table_model', './constants'], function (_ex }); }); return stats; - } - - function convertHistoryPoint(point) { + }function convertHistoryPoint(point) { // Value must be a number for properly work return [Number(point.value), point.clock * 1000 + Math.round(point.ns / 1000000)]; - }function convertTrendPoint(valueType, point) { + } + + function convertTrendPoint(valueType, point) { var value; switch (valueType) { case "min": @@ -177,9 +198,7 @@ System.register(['lodash', 'app/core/table_model', './constants'], function (_ex } return [Number(value), point.clock * 1000]; - } - - return { + }return { setters: [function (_lodash) { _ = _lodash.default; }, function (_appCoreTable_model) { @@ -193,6 +212,7 @@ System.register(['lodash', 'app/core/table_model', './constants'], function (_ex convertHistory: convertHistory, handleTrends: handleTrends, handleText: handleText, + handleHistoryAsTable: handleHistoryAsTable, handleSLAResponse: handleSLAResponse, handleTriggersResponse: handleTriggersResponse }); diff --git a/dist/datasource-zabbix/responseHandler.js.map b/dist/datasource-zabbix/responseHandler.js.map index 86b3d9e..057df4a 100644 --- a/dist/datasource-zabbix/responseHandler.js.map +++ b/dist/datasource-zabbix/responseHandler.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/responseHandler.js"],"names":["convertHistory","history","items","addHostName","convertPointCallback","grouped_history","_","groupBy","hosts","uniqBy","flatten","map","hist","itemid","item","find","alias","name","keys","length","host","hostid","target","datapoints","handleHistory","convertHistoryPoint","handleTrends","valueType","partial","convertTrendPoint","handleText","convertTextCallback","convertText","point","value","textFilter","extractText","useCaptureGroups","clock","Math","round","ns","str","pattern","extractPattern","RegExp","extractedValue","exec","handleSLAResponse","itservice","slaProperty","slaObject","targetSLA","serviceid","sla","property","targetStatus","parseInt","status","to","from","handleTriggersResponse","triggers","timeRange","isNumber","stats","getTriggerStats","table","TableModel","addColumn","text","each","orderBy","c","TRIGGER_SEVERITY","severity","severity_stats","group","row","toPairs","s","concat","rows","push","groups","uniq","flattenDeep","trigger","priority","Number","value_min","value_max","value_avg","value_sum","value_count"],"mappings":"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","file":"responseHandler.js","sourcesContent":["import _ from 'lodash';\nimport TableModel from 'app/core/table_model';\nimport * as c from './constants';\n\n/**\n * Convert Zabbix API history.get response to Grafana format\n *\n * @return {Array} Array of timeseries in Grafana format\n * {\n * target: \"Metric name\",\n * datapoints: [[, ], ...]\n * }\n */\nfunction convertHistory(history, items, addHostName, convertPointCallback) {\n /**\n * Response should be in the format:\n * data: [\n * {\n * target: \"Metric name\",\n * datapoints: [[, ], ...]\n * }, ...\n * ]\n */\n\n // Group history by itemid\n var grouped_history = _.groupBy(history, 'itemid');\n var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid'); //uniqBy is needed to deduplicate\n\n return _.map(grouped_history, function(hist, itemid) {\n var item = _.find(items, {'itemid': itemid});\n var alias = item.name;\n if (_.keys(hosts).length > 1 && addHostName) { //only when actual multi hosts selected\n var host = _.find(hosts, {'hostid': item.hostid});\n alias = host.name + \": \" + alias;\n }\n return {\n target: alias,\n datapoints: _.map(hist, convertPointCallback)\n };\n });\n}\n\nfunction handleHistory(history, items, addHostName = true) {\n return convertHistory(history, items, addHostName, convertHistoryPoint);\n}\n\nfunction handleTrends(history, items, valueType, addHostName = true) {\n var convertPointCallback = _.partial(convertTrendPoint, valueType);\n return convertHistory(history, items, addHostName, convertPointCallback);\n}\n\nfunction handleText(history, items, target, addHostName = true) {\n let convertTextCallback = _.partial(convertText, target);\n return convertHistory(history, items, addHostName, convertTextCallback);\n}\n\nfunction convertText(target, point) {\n let value = point.value;\n\n // Regex-based extractor\n if (target.textFilter) {\n value = extractText(point.value, target.textFilter, target.useCaptureGroups);\n }\n\n return [\n value,\n point.clock * 1000 + Math.round(point.ns / 1000000)\n ];\n}\n\nfunction extractText(str, pattern, useCaptureGroups) {\n let extractPattern = new RegExp(pattern);\n let extractedValue = extractPattern.exec(str);\n if (extractedValue) {\n if (useCaptureGroups) {\n extractedValue = extractedValue[1];\n } else {\n extractedValue = extractedValue[0];\n }\n }\n return extractedValue;\n}\n\nfunction handleSLAResponse(itservice, slaProperty, slaObject) {\n var targetSLA = slaObject[itservice.serviceid].sla[0];\n if (slaProperty.property === 'status') {\n var targetStatus = parseInt(slaObject[itservice.serviceid].status);\n return {\n target: itservice.name + ' ' + slaProperty.name,\n datapoints: [\n [targetStatus, targetSLA.to * 1000]\n ]\n };\n } else {\n return {\n target: itservice.name + ' ' + slaProperty.name,\n datapoints: [\n [targetSLA[slaProperty.property], targetSLA.from * 1000],\n [targetSLA[slaProperty.property], targetSLA.to * 1000]\n ]\n };\n }\n}\n\nfunction handleTriggersResponse(triggers, timeRange) {\n if (_.isNumber(triggers)) {\n return {\n target: \"triggers count\",\n datapoints: [\n [triggers, timeRange[1] * 1000]\n ]\n };\n } else {\n let stats = getTriggerStats(triggers);\n let table = new TableModel();\n table.addColumn({text: 'Host group'});\n _.each(_.orderBy(c.TRIGGER_SEVERITY, ['val'], ['desc']), (severity) => {\n table.addColumn({text: severity.text});\n });\n _.each(stats, (severity_stats, group) => {\n let row = _.map(_.orderBy(_.toPairs(severity_stats), (s) => s[0], ['desc']), (s) => s[1]);\n row = _.concat([group], ...row);\n table.rows.push(row);\n });\n return table;\n }\n}\n\nfunction getTriggerStats(triggers) {\n let groups = _.uniq(_.flattenDeep(_.map(triggers, (trigger) => _.map(trigger.groups, 'name'))));\n // let severity = _.map(c.TRIGGER_SEVERITY, 'text');\n let stats = {};\n _.each(groups, (group) => {\n stats[group] = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0}; // severity:count\n });\n _.each(triggers, (trigger) => {\n _.each(trigger.groups, (group) => {\n stats[group.name][trigger.priority]++;\n });\n });\n return stats;\n}\n\nfunction convertHistoryPoint(point) {\n // Value must be a number for properly work\n return [\n Number(point.value),\n point.clock * 1000 + Math.round(point.ns / 1000000)\n ];\n}\n\nfunction convertTrendPoint(valueType, point) {\n var value;\n switch (valueType) {\n case \"min\":\n value = point.value_min;\n break;\n case \"max\":\n value = point.value_max;\n break;\n case \"avg\":\n value = point.value_avg;\n break;\n case \"sum\":\n value = point.value_sum;\n break;\n case \"count\":\n value = point.value_count;\n break;\n default:\n value = point.value_avg;\n }\n\n return [\n Number(value),\n point.clock * 1000\n ];\n}\n\nexport default {\n handleHistory: handleHistory,\n convertHistory: convertHistory,\n handleTrends: handleTrends,\n handleText: handleText,\n handleSLAResponse: handleSLAResponse,\n handleTriggersResponse: handleTriggersResponse\n};\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.uniqBy) {_.uniqBy = _.uniq;}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/responseHandler.js"],"names":["convertHistory","history","items","addHostName","convertPointCallback","grouped_history","_","groupBy","hosts","uniqBy","flatten","map","hist","itemid","item","find","alias","name","keys","length","host","hostid","target","datapoints","handleHistory","convertHistoryPoint","handleTrends","valueType","partial","convertTrendPoint","handleText","convertTextCallback","convertText","handleHistoryAsTable","table","TableModel","addColumn","text","each","itemHistory","lastPoint","last","lastValue","value","first","rows","push","key_","point","textFilter","extractText","useCaptureGroups","clock","Math","round","ns","str","pattern","extractPattern","RegExp","extractedValue","exec","handleSLAResponse","itservice","slaProperty","slaObject","targetSLA","serviceid","sla","property","targetStatus","parseInt","status","to","from","handleTriggersResponse","triggers","timeRange","isNumber","stats","getTriggerStats","orderBy","c","TRIGGER_SEVERITY","severity","severity_stats","group","row","toPairs","s","concat","groups","uniq","flattenDeep","trigger","priority","Number","value_min","value_max","value_avg","value_sum","value_count"],"mappings":"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","file":"responseHandler.js","sourcesContent":["import _ from 'lodash';\nimport TableModel from 'app/core/table_model';\nimport * as c from './constants';\n\n/**\n * Convert Zabbix API history.get response to Grafana format\n *\n * @return {Array} Array of timeseries in Grafana format\n * {\n * target: \"Metric name\",\n * datapoints: [[, ], ...]\n * }\n */\nfunction convertHistory(history, items, addHostName, convertPointCallback) {\n /**\n * Response should be in the format:\n * data: [\n * {\n * target: \"Metric name\",\n * datapoints: [[, ], ...]\n * }, ...\n * ]\n */\n\n // Group history by itemid\n var grouped_history = _.groupBy(history, 'itemid');\n var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid'); //uniqBy is needed to deduplicate\n\n return _.map(grouped_history, function(hist, itemid) {\n var item = _.find(items, {'itemid': itemid});\n var alias = item.name;\n if (_.keys(hosts).length > 1 && addHostName) { //only when actual multi hosts selected\n var host = _.find(hosts, {'hostid': item.hostid});\n alias = host.name + \": \" + alias;\n }\n return {\n target: alias,\n datapoints: _.map(hist, convertPointCallback)\n };\n });\n}\n\nfunction handleHistory(history, items, addHostName = true) {\n return convertHistory(history, items, addHostName, convertHistoryPoint);\n}\n\nfunction handleTrends(history, items, valueType, addHostName = true) {\n var convertPointCallback = _.partial(convertTrendPoint, valueType);\n return convertHistory(history, items, addHostName, convertPointCallback);\n}\n\nfunction handleText(history, items, target, addHostName = true) {\n let convertTextCallback = _.partial(convertText, target);\n return convertHistory(history, items, addHostName, convertTextCallback);\n}\n\nfunction handleHistoryAsTable(history, items) {\n let table = new TableModel();\n table.addColumn({text: 'Host'});\n table.addColumn({text: 'Item'});\n table.addColumn({text: 'Key'});\n table.addColumn({text: 'Last value'});\n\n let grouped_history = _.groupBy(history, 'itemid');\n _.each(items, (item) => {\n let itemHistory = grouped_history[item.itemid] || [];\n let lastPoint = _.last(itemHistory);\n let lastValue = lastPoint ? lastPoint.value : null;\n let host = _.first(item.hosts);\n host = host ? host.name : \"\";\n\n table.rows.push([\n host, item.name, item.key_, lastValue\n ]);\n });\n\n return table;\n}\n\nfunction convertText(target, point) {\n let value = point.value;\n\n // Regex-based extractor\n if (target.textFilter) {\n value = extractText(point.value, target.textFilter, target.useCaptureGroups);\n }\n\n return [\n value,\n point.clock * 1000 + Math.round(point.ns / 1000000)\n ];\n}\n\nfunction extractText(str, pattern, useCaptureGroups) {\n let extractPattern = new RegExp(pattern);\n let extractedValue = extractPattern.exec(str);\n if (extractedValue) {\n if (useCaptureGroups) {\n extractedValue = extractedValue[1];\n } else {\n extractedValue = extractedValue[0];\n }\n }\n return extractedValue;\n}\n\nfunction handleSLAResponse(itservice, slaProperty, slaObject) {\n var targetSLA = slaObject[itservice.serviceid].sla[0];\n if (slaProperty.property === 'status') {\n var targetStatus = parseInt(slaObject[itservice.serviceid].status);\n return {\n target: itservice.name + ' ' + slaProperty.name,\n datapoints: [\n [targetStatus, targetSLA.to * 1000]\n ]\n };\n } else {\n return {\n target: itservice.name + ' ' + slaProperty.name,\n datapoints: [\n [targetSLA[slaProperty.property], targetSLA.from * 1000],\n [targetSLA[slaProperty.property], targetSLA.to * 1000]\n ]\n };\n }\n}\n\nfunction handleTriggersResponse(triggers, timeRange) {\n if (_.isNumber(triggers)) {\n return {\n target: \"triggers count\",\n datapoints: [\n [triggers, timeRange[1] * 1000]\n ]\n };\n } else {\n let stats = getTriggerStats(triggers);\n let table = new TableModel();\n table.addColumn({text: 'Host group'});\n _.each(_.orderBy(c.TRIGGER_SEVERITY, ['val'], ['desc']), (severity) => {\n table.addColumn({text: severity.text});\n });\n _.each(stats, (severity_stats, group) => {\n let row = _.map(_.orderBy(_.toPairs(severity_stats), (s) => s[0], ['desc']), (s) => s[1]);\n row = _.concat([group], ...row);\n table.rows.push(row);\n });\n return table;\n }\n}\n\nfunction getTriggerStats(triggers) {\n let groups = _.uniq(_.flattenDeep(_.map(triggers, (trigger) => _.map(trigger.groups, 'name'))));\n // let severity = _.map(c.TRIGGER_SEVERITY, 'text');\n let stats = {};\n _.each(groups, (group) => {\n stats[group] = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0}; // severity:count\n });\n _.each(triggers, (trigger) => {\n _.each(trigger.groups, (group) => {\n stats[group.name][trigger.priority]++;\n });\n });\n return stats;\n}\n\nfunction convertHistoryPoint(point) {\n // Value must be a number for properly work\n return [\n Number(point.value),\n point.clock * 1000 + Math.round(point.ns / 1000000)\n ];\n}\n\nfunction convertTrendPoint(valueType, point) {\n var value;\n switch (valueType) {\n case \"min\":\n value = point.value_min;\n break;\n case \"max\":\n value = point.value_max;\n break;\n case \"avg\":\n value = point.value_avg;\n break;\n case \"sum\":\n value = point.value_sum;\n break;\n case \"count\":\n value = point.value_count;\n break;\n default:\n value = point.value_avg;\n }\n\n return [\n Number(value),\n point.clock * 1000\n ];\n}\n\nexport default {\n handleHistory: handleHistory,\n convertHistory: convertHistory,\n handleTrends: handleTrends,\n handleText: handleText,\n handleHistoryAsTable: handleHistoryAsTable,\n handleSLAResponse: handleSLAResponse,\n handleTriggersResponse: handleTriggersResponse\n};\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.uniqBy) {_.uniqBy = _.uniq;}\n"]} \ No newline at end of file diff --git a/src/datasource-zabbix/datasource.js b/src/datasource-zabbix/datasource.js index 12ec440..ceb9858 100644 --- a/src/datasource-zabbix/datasource.js +++ b/src/datasource-zabbix/datasource.js @@ -290,7 +290,11 @@ class ZabbixAPIDatasource { if (items.length) { return this.zabbix.getHistory(items, timeFrom, timeTo) .then(history => { - return responseHandler.handleText(history, items, target); + if (target.resultFormat === 'table') { + return responseHandler.handleHistoryAsTable(history, items); + } else { + return responseHandler.handleText(history, items, target); + } }); } else { return Promise.resolve([]); diff --git a/src/datasource-zabbix/migrations.js b/src/datasource-zabbix/migrations.js index 9429211..238c627 100644 --- a/src/datasource-zabbix/migrations.js +++ b/src/datasource-zabbix/migrations.js @@ -26,6 +26,7 @@ export function migrateFrom2To3version(target) { } export function migrate(target) { + target.resultFormat = target.resultFormat || 'time_series'; if (isGrafana2target(target)) { return migrateFrom2To3version(target); } else { diff --git a/src/datasource-zabbix/partials/query.editor.html b/src/datasource-zabbix/partials/query.editor.html index d731bf7..886ee05 100644 --- a/src/datasource-zabbix/partials/query.editor.html +++ b/src/datasource-zabbix/partials/query.editor.html @@ -11,6 +11,12 @@ +
+ +
+ +
+
diff --git a/src/datasource-zabbix/query.controller.js b/src/datasource-zabbix/query.controller.js index afd801d..0eb6a39 100644 --- a/src/datasource-zabbix/query.controller.js +++ b/src/datasource-zabbix/query.controller.js @@ -49,6 +49,8 @@ export class ZabbixQueryController extends QueryCtrl { {text: 'acknowledged', value: 1}, ]; + this.resultFormats = [{ text: 'Time series', value: 'time_series' }, { text: 'Table', value: 'table' }]; + this.triggerSeverity = c.TRIGGER_SEVERITY; // Map functions for bs-typeahead diff --git a/src/datasource-zabbix/responseHandler.js b/src/datasource-zabbix/responseHandler.js index 80b5a5f..ba9cd69 100644 --- a/src/datasource-zabbix/responseHandler.js +++ b/src/datasource-zabbix/responseHandler.js @@ -54,6 +54,29 @@ function handleText(history, items, target, addHostName = true) { return convertHistory(history, items, addHostName, convertTextCallback); } +function handleHistoryAsTable(history, items) { + let table = new TableModel(); + table.addColumn({text: 'Host'}); + table.addColumn({text: 'Item'}); + table.addColumn({text: 'Key'}); + table.addColumn({text: 'Last value'}); + + let grouped_history = _.groupBy(history, 'itemid'); + _.each(items, (item) => { + let itemHistory = grouped_history[item.itemid] || []; + let lastPoint = _.last(itemHistory); + let lastValue = lastPoint ? lastPoint.value : null; + let host = _.first(item.hosts); + host = host ? host.name : ""; + + table.rows.push([ + host, item.name, item.key_, lastValue + ]); + }); + + return table; +} + function convertText(target, point) { let value = point.value; @@ -182,6 +205,7 @@ export default { convertHistory: convertHistory, handleTrends: handleTrends, handleText: handleText, + handleHistoryAsTable: handleHistoryAsTable, handleSLAResponse: handleSLAResponse, handleTriggersResponse: handleTriggersResponse };