diff --git a/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js b/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js index 3e04924..90dd7e5 100644 --- a/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js +++ b/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js @@ -24,7 +24,7 @@ System.register(['lodash'], function (_export, _context) { var host = _.find(hosts, { 'hostid': item.hostid }); alias = host.name + ": " + alias; } - // zabbixCachingProxy deduplicates requests and returns one time series for equal queries. + // CachingProxy deduplicates requests and returns one time series for equal queries. // Clone is needed to prevent changing of series object shared between all targets. var datapoints = _.cloneDeep(series.points); return { diff --git a/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js.map b/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js.map index 3c00e4f..0fe4b44 100644 --- a/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js.map +++ b/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js"],"names":["convertGrafanaTSResponse","time_series","items","addHostName","hosts","_","uniqBy","flatten","map","grafanaSeries","itemid","series","name","item","find","alias","keys","length","host","hostid","datapoints","cloneDeep","points","target","sortBy","compactSQLQuery","query","replace","buildSQLHistoryQuery","itemids","table","timeFrom","timeTill","intervalSec","aggFunction","dialect","buildPostgresHistoryQuery","buildMysqlHistoryQuery","buildSQLTrendsQuery","valueColumn","buildPostgresTrendsQuery","buildMysqlTrendsQuery","time_expression","itemid_format","DEFAULT_QUERY_LIMIT","HISTORY_TO_TABLE_MAP","TREND_TO_TABLE_MAP","consolidateByFunc","consolidateByTrendColumns","ZabbixDBConnector","sqlDataSourceId","options","backendSrv","datasourceSrv","limit","loadSQLDataSource","datasourceId","ds","getAll","loadDatasource","then","sqlDataSourceType","meta","id","Promise","reject","testQuery","TEST_MYSQL_QUERY","TEST_POSTGRES_QUERY","invokeSQLQuery","intervalMs","consolidateBy","Math","ceil","grouped_items","groupBy","promises","value_type","join","all","results","includes","history","queryDef","refId","format","rawSql","maxDataPoints","datasourceRequest","url","method","data","queries","response"],"mappings":"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","file":"zabbixDBConnector.js","sourcesContent":["import _ from 'lodash';\n\nconst DEFAULT_QUERY_LIMIT = 10000;\nconst HISTORY_TO_TABLE_MAP = {\n '0': 'history',\n '1': 'history_str',\n '2': 'history_log',\n '3': 'history_uint',\n '4': 'history_text'\n};\n\nconst TREND_TO_TABLE_MAP = {\n '0': 'trends',\n '3': 'trends_uint'\n};\n\nconst consolidateByFunc = {\n 'avg': 'AVG',\n 'min': 'MIN',\n 'max': 'MAX',\n 'sum': 'SUM',\n 'count': 'COUNT'\n};\n\nconst consolidateByTrendColumns = {\n 'avg': 'value_avg',\n 'min': 'value_min',\n 'max': 'value_max'\n};\n\nexport class ZabbixDBConnector {\n\n constructor(sqlDataSourceId, options, backendSrv, datasourceSrv) {\n this.backendSrv = backendSrv;\n this.datasourceSrv = datasourceSrv;\n\n let limit = options.limit;\n this.sqlDataSourceId = sqlDataSourceId;\n this.limit = limit || DEFAULT_QUERY_LIMIT;\n\n this.loadSQLDataSource(sqlDataSourceId);\n }\n\n /**\n * Try to load DS with given id to check it's exist.\n * @param {*} datasourceId ID of SQL data source\n */\n loadSQLDataSource(datasourceId) {\n let ds = _.find(this.datasourceSrv.getAll(), {'id': datasourceId});\n if (ds) {\n return this.datasourceSrv.loadDatasource(ds.name)\n .then(ds => {\n this.sqlDataSourceType = ds.meta.id;\n return ds;\n });\n } else {\n return Promise.reject(`SQL Data Source with ID ${datasourceId} not found`);\n }\n }\n\n /**\n * Try to invoke test query for one of Zabbix database tables.\n */\n testSQLDataSource() {\n let testQuery = TEST_MYSQL_QUERY;\n if (this.sqlDataSourceType === 'postgres') {\n testQuery = TEST_POSTGRES_QUERY;\n }\n return this.invokeSQLQuery(testQuery);\n }\n\n getHistory(items, timeFrom, timeTill, options) {\n let {intervalMs, consolidateBy} = options;\n let intervalSec = Math.ceil(intervalMs / 1000);\n\n consolidateBy = consolidateBy || 'avg';\n let aggFunction = consolidateByFunc[consolidateBy];\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid').join(', ');\n let table = HISTORY_TO_TABLE_MAP[value_type];\n\n let dialect = this.sqlDataSourceType;\n let query = buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, dialect);\n\n query = compactSQLQuery(query);\n return this.invokeSQLQuery(query);\n });\n\n return Promise.all(promises).then(results => {\n return _.flatten(results);\n });\n }\n\n getTrends(items, timeFrom, timeTill, options) {\n let {intervalMs, consolidateBy} = options;\n let intervalSec = Math.ceil(intervalMs / 1000);\n\n consolidateBy = consolidateBy || 'avg';\n let aggFunction = consolidateByFunc[consolidateBy];\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid').join(', ');\n let table = TREND_TO_TABLE_MAP[value_type];\n let valueColumn = _.includes(['avg', 'min', 'max'], consolidateBy) ? consolidateBy : 'avg';\n valueColumn = consolidateByTrendColumns[valueColumn];\n\n let dialect = this.sqlDataSourceType;\n let query = buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn, dialect);\n\n query = compactSQLQuery(query);\n return this.invokeSQLQuery(query);\n });\n\n return Promise.all(promises).then(results => {\n return _.flatten(results);\n });\n }\n\n handleGrafanaTSResponse(history, items, addHostName = true) {\n return convertGrafanaTSResponse(history, items, addHostName);\n }\n\n invokeSQLQuery(query) {\n let queryDef = {\n refId: 'A',\n format: 'time_series',\n datasourceId: this.sqlDataSourceId,\n rawSql: query,\n maxDataPoints: this.limit\n };\n\n return this.backendSrv.datasourceRequest({\n url: '/api/tsdb/query',\n method: 'POST',\n data: {\n queries: [queryDef],\n }\n })\n .then(response => {\n let results = response.data.results;\n if (results['A']) {\n return results['A'].series;\n } else {\n return null;\n }\n });\n }\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\nfunction convertGrafanaTSResponse(time_series, items, addHostName) {\n var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid'); //uniqBy is needed to deduplicate\n let grafanaSeries = _.map(time_series, series => {\n let itemid = series.name;\n var item = _.find(items, {'itemid': itemid});\n var alias = item.name;\n 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 // zabbixCachingProxy deduplicates requests and returns one time series for equal queries.\n // Clone is needed to prevent changing of series object shared between all targets.\n let datapoints = _.cloneDeep(series.points);\n return {\n target: alias,\n datapoints: datapoints\n };\n });\n\n return _.sortBy(grafanaSeries, 'target');\n}\n\nfunction compactSQLQuery(query) {\n return query.replace(/\\s+/g, ' ');\n}\n\nfunction buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, dialect = 'mysql') {\n if (dialect === 'postgres') {\n return buildPostgresHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);\n } else {\n return buildMysqlHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);\n }\n}\n\nfunction buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn, dialect = 'mysql') {\n if (dialect === 'postgres') {\n return buildPostgresTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);\n } else {\n return buildMysqlTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);\n }\n}\n\n///////////\n// MySQL //\n///////////\n\nfunction buildMysqlHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {\n let time_expression = `clock DIV ${intervalSec} * ${intervalSec}`;\n let query = `\n SELECT itemid AS metric, ${time_expression} AS time_sec, ${aggFunction}(value) AS value\n FROM ${table}\n WHERE itemid IN (${itemids})\n AND clock > ${timeFrom} AND clock < ${timeTill}\n GROUP BY ${time_expression}, metric\n ORDER BY time_sec ASC\n `;\n return query;\n}\n\nfunction buildMysqlTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {\n let time_expression = `clock DIV ${intervalSec} * ${intervalSec}`;\n let query = `\n SELECT itemid AS metric, ${time_expression} AS time_sec, ${aggFunction}(${valueColumn}) AS value\n FROM ${table}\n WHERE itemid IN (${itemids})\n AND clock > ${timeFrom} AND clock < ${timeTill}\n GROUP BY ${time_expression}, metric\n ORDER BY time_sec ASC\n `;\n return query;\n}\n\nconst TEST_MYSQL_QUERY = `SELECT itemid AS metric, clock AS time_sec, value_avg AS value FROM trends_uint LIMIT 1`;\n\n////////////////\n// PostgreSQL //\n////////////////\n\nconst itemid_format = 'FM99999999999999999999';\n\nfunction buildPostgresHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {\n let time_expression = `clock / ${intervalSec} * ${intervalSec}`;\n let query = `\n SELECT to_char(itemid, '${itemid_format}') AS metric, ${time_expression} AS time, ${aggFunction}(value) AS value\n FROM ${table}\n WHERE itemid IN (${itemids})\n AND clock > ${timeFrom} AND clock < ${timeTill}\n GROUP BY 1, 2\n ORDER BY time ASC\n `;\n return query;\n}\n\nfunction buildPostgresTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {\n let time_expression = `clock / ${intervalSec} * ${intervalSec}`;\n let query = `\n SELECT to_char(itemid, '${itemid_format}') AS metric, ${time_expression} AS time, ${aggFunction}(${valueColumn}) AS value\n FROM ${table}\n WHERE itemid IN (${itemids})\n AND clock > ${timeFrom} AND clock < ${timeTill}\n GROUP BY 1, 2\n ORDER BY time ASC\n `;\n return query;\n}\n\nconst TEST_POSTGRES_QUERY = `\n SELECT to_char(itemid, '${itemid_format}') AS metric, clock AS time, value_avg AS value\n FROM trends_uint LIMIT 1\n`;\n"]} \ No newline at end of file +{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js"],"names":["convertGrafanaTSResponse","time_series","items","addHostName","hosts","_","uniqBy","flatten","map","grafanaSeries","itemid","series","name","item","find","alias","keys","length","host","hostid","datapoints","cloneDeep","points","target","sortBy","compactSQLQuery","query","replace","buildSQLHistoryQuery","itemids","table","timeFrom","timeTill","intervalSec","aggFunction","dialect","buildPostgresHistoryQuery","buildMysqlHistoryQuery","buildSQLTrendsQuery","valueColumn","buildPostgresTrendsQuery","buildMysqlTrendsQuery","time_expression","itemid_format","DEFAULT_QUERY_LIMIT","HISTORY_TO_TABLE_MAP","TREND_TO_TABLE_MAP","consolidateByFunc","consolidateByTrendColumns","ZabbixDBConnector","sqlDataSourceId","options","backendSrv","datasourceSrv","limit","loadSQLDataSource","datasourceId","ds","getAll","loadDatasource","then","sqlDataSourceType","meta","id","Promise","reject","testQuery","TEST_MYSQL_QUERY","TEST_POSTGRES_QUERY","invokeSQLQuery","intervalMs","consolidateBy","Math","ceil","grouped_items","groupBy","promises","value_type","join","all","results","includes","history","queryDef","refId","format","rawSql","maxDataPoints","datasourceRequest","url","method","data","queries","response"],"mappings":"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","file":"zabbixDBConnector.js","sourcesContent":["import _ from 'lodash';\n\nconst DEFAULT_QUERY_LIMIT = 10000;\nconst HISTORY_TO_TABLE_MAP = {\n '0': 'history',\n '1': 'history_str',\n '2': 'history_log',\n '3': 'history_uint',\n '4': 'history_text'\n};\n\nconst TREND_TO_TABLE_MAP = {\n '0': 'trends',\n '3': 'trends_uint'\n};\n\nconst consolidateByFunc = {\n 'avg': 'AVG',\n 'min': 'MIN',\n 'max': 'MAX',\n 'sum': 'SUM',\n 'count': 'COUNT'\n};\n\nconst consolidateByTrendColumns = {\n 'avg': 'value_avg',\n 'min': 'value_min',\n 'max': 'value_max'\n};\n\nexport class ZabbixDBConnector {\n\n constructor(sqlDataSourceId, options, backendSrv, datasourceSrv) {\n this.backendSrv = backendSrv;\n this.datasourceSrv = datasourceSrv;\n\n let limit = options.limit;\n this.sqlDataSourceId = sqlDataSourceId;\n this.limit = limit || DEFAULT_QUERY_LIMIT;\n\n this.loadSQLDataSource(sqlDataSourceId);\n }\n\n /**\n * Try to load DS with given id to check it's exist.\n * @param {*} datasourceId ID of SQL data source\n */\n loadSQLDataSource(datasourceId) {\n let ds = _.find(this.datasourceSrv.getAll(), {'id': datasourceId});\n if (ds) {\n return this.datasourceSrv.loadDatasource(ds.name)\n .then(ds => {\n this.sqlDataSourceType = ds.meta.id;\n return ds;\n });\n } else {\n return Promise.reject(`SQL Data Source with ID ${datasourceId} not found`);\n }\n }\n\n /**\n * Try to invoke test query for one of Zabbix database tables.\n */\n testSQLDataSource() {\n let testQuery = TEST_MYSQL_QUERY;\n if (this.sqlDataSourceType === 'postgres') {\n testQuery = TEST_POSTGRES_QUERY;\n }\n return this.invokeSQLQuery(testQuery);\n }\n\n getHistory(items, timeFrom, timeTill, options) {\n let {intervalMs, consolidateBy} = options;\n let intervalSec = Math.ceil(intervalMs / 1000);\n\n consolidateBy = consolidateBy || 'avg';\n let aggFunction = consolidateByFunc[consolidateBy];\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid').join(', ');\n let table = HISTORY_TO_TABLE_MAP[value_type];\n\n let dialect = this.sqlDataSourceType;\n let query = buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, dialect);\n\n query = compactSQLQuery(query);\n return this.invokeSQLQuery(query);\n });\n\n return Promise.all(promises).then(results => {\n return _.flatten(results);\n });\n }\n\n getTrends(items, timeFrom, timeTill, options) {\n let {intervalMs, consolidateBy} = options;\n let intervalSec = Math.ceil(intervalMs / 1000);\n\n consolidateBy = consolidateBy || 'avg';\n let aggFunction = consolidateByFunc[consolidateBy];\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid').join(', ');\n let table = TREND_TO_TABLE_MAP[value_type];\n let valueColumn = _.includes(['avg', 'min', 'max'], consolidateBy) ? consolidateBy : 'avg';\n valueColumn = consolidateByTrendColumns[valueColumn];\n\n let dialect = this.sqlDataSourceType;\n let query = buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn, dialect);\n\n query = compactSQLQuery(query);\n return this.invokeSQLQuery(query);\n });\n\n return Promise.all(promises).then(results => {\n return _.flatten(results);\n });\n }\n\n handleGrafanaTSResponse(history, items, addHostName = true) {\n return convertGrafanaTSResponse(history, items, addHostName);\n }\n\n invokeSQLQuery(query) {\n let queryDef = {\n refId: 'A',\n format: 'time_series',\n datasourceId: this.sqlDataSourceId,\n rawSql: query,\n maxDataPoints: this.limit\n };\n\n return this.backendSrv.datasourceRequest({\n url: '/api/tsdb/query',\n method: 'POST',\n data: {\n queries: [queryDef],\n }\n })\n .then(response => {\n let results = response.data.results;\n if (results['A']) {\n return results['A'].series;\n } else {\n return null;\n }\n });\n }\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\nfunction convertGrafanaTSResponse(time_series, items, addHostName) {\n var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid'); //uniqBy is needed to deduplicate\n let grafanaSeries = _.map(time_series, series => {\n let itemid = series.name;\n var item = _.find(items, {'itemid': itemid});\n var alias = item.name;\n 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 // CachingProxy deduplicates requests and returns one time series for equal queries.\n // Clone is needed to prevent changing of series object shared between all targets.\n let datapoints = _.cloneDeep(series.points);\n return {\n target: alias,\n datapoints: datapoints\n };\n });\n\n return _.sortBy(grafanaSeries, 'target');\n}\n\nfunction compactSQLQuery(query) {\n return query.replace(/\\s+/g, ' ');\n}\n\nfunction buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, dialect = 'mysql') {\n if (dialect === 'postgres') {\n return buildPostgresHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);\n } else {\n return buildMysqlHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction);\n }\n}\n\nfunction buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn, dialect = 'mysql') {\n if (dialect === 'postgres') {\n return buildPostgresTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);\n } else {\n return buildMysqlTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn);\n }\n}\n\n///////////\n// MySQL //\n///////////\n\nfunction buildMysqlHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {\n let time_expression = `clock DIV ${intervalSec} * ${intervalSec}`;\n let query = `\n SELECT itemid AS metric, ${time_expression} AS time_sec, ${aggFunction}(value) AS value\n FROM ${table}\n WHERE itemid IN (${itemids})\n AND clock > ${timeFrom} AND clock < ${timeTill}\n GROUP BY ${time_expression}, metric\n ORDER BY time_sec ASC\n `;\n return query;\n}\n\nfunction buildMysqlTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {\n let time_expression = `clock DIV ${intervalSec} * ${intervalSec}`;\n let query = `\n SELECT itemid AS metric, ${time_expression} AS time_sec, ${aggFunction}(${valueColumn}) AS value\n FROM ${table}\n WHERE itemid IN (${itemids})\n AND clock > ${timeFrom} AND clock < ${timeTill}\n GROUP BY ${time_expression}, metric\n ORDER BY time_sec ASC\n `;\n return query;\n}\n\nconst TEST_MYSQL_QUERY = `SELECT itemid AS metric, clock AS time_sec, value_avg AS value FROM trends_uint LIMIT 1`;\n\n////////////////\n// PostgreSQL //\n////////////////\n\nconst itemid_format = 'FM99999999999999999999';\n\nfunction buildPostgresHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction) {\n let time_expression = `clock / ${intervalSec} * ${intervalSec}`;\n let query = `\n SELECT to_char(itemid, '${itemid_format}') AS metric, ${time_expression} AS time, ${aggFunction}(value) AS value\n FROM ${table}\n WHERE itemid IN (${itemids})\n AND clock > ${timeFrom} AND clock < ${timeTill}\n GROUP BY 1, 2\n ORDER BY time ASC\n `;\n return query;\n}\n\nfunction buildPostgresTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn) {\n let time_expression = `clock / ${intervalSec} * ${intervalSec}`;\n let query = `\n SELECT to_char(itemid, '${itemid_format}') AS metric, ${time_expression} AS time, ${aggFunction}(${valueColumn}) AS value\n FROM ${table}\n WHERE itemid IN (${itemids})\n AND clock > ${timeFrom} AND clock < ${timeTill}\n GROUP BY 1, 2\n ORDER BY time ASC\n `;\n return query;\n}\n\nconst TEST_POSTGRES_QUERY = `\n SELECT to_char(itemid, '${itemid_format}') AS metric, clock AS time, value_avg AS value\n FROM trends_uint LIMIT 1\n`;\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js index 496e9e4..c73b79c 100644 --- a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js +++ b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js @@ -3,7 +3,7 @@ System.register(['lodash', '../../../utils', './zabbixAPICore'], function (_export, _context) { "use strict"; - var _, utils, ZabbixAPICoreService, _slicedToArray, _createClass, ZabbixAPIConnector; + var _, utils, ZabbixAPICore, _slicedToArray, _createClass, ZabbixAPIConnector; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -34,7 +34,7 @@ System.register(['lodash', '../../../utils', './zabbixAPICore'], function (_expo }, function (_utils) { utils = _utils; }, function (_zabbixAPICore) { - ZabbixAPICoreService = _zabbixAPICore.ZabbixAPICoreService; + ZabbixAPICore = _zabbixAPICore.ZabbixAPICore; }], execute: function () { _slicedToArray = function () { @@ -113,7 +113,7 @@ System.register(['lodash', '../../../utils', './zabbixAPICore'], function (_expo this.loginErrorCount = 0; this.maxLoginAttempts = 3; - this.zabbixAPICore = new ZabbixAPICoreService(backendSrv); + this.zabbixAPICore = new ZabbixAPICore(backendSrv); this.getTrend = this.getTrend_ZBXNEXT1193; //getTrend = getTrend_30; diff --git a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js.map b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js.map index d3ff2b4..61cbc28 100644 --- a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js.map +++ b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js"],"names":["filterTriggersByAcknowledge","triggers","acknowledged","_","filter","trigger","lastEvent","isNotAuthorized","message","utils","ZabbixAPICoreService","ZabbixAPIConnector","api_url","username","password","basicAuth","withCredentials","backendSrv","url","auth","requestOptions","loginPromise","loginErrorCount","maxLoginAttempts","zabbixAPICore","getTrend","getTrend_ZBXNEXT1193","method","params","request","catch","error","data","loginOnce","then","statusText","Promise","reject","resolve","login","getVersion","eventid","eventids","output","sortfield","real_hosts","groupids","hostids","appids","itemtype","webitems","selectHosts","applicationids","value_type","expandItems","itemids","globalmacro","itemid","items","length","lastvalue","timeFrom","timeTill","grouped_items","groupBy","promises","map","history","sortorder","time_from","time_till","all","flatten","trend","self","serviceids","timeRange","timeTo","intervals","from","to","options","showTriggers","maintenance","expandDescription","expandData","expandComment","monitored","skipDependent","value","selectGroups","selectItems","selectLastEvent","selectTags","lastChangeSince","lastChangeTill","objectids","showEvents","select_acknowledges","preservekeys","events","event","acknowledges","minSeverity","count","min_severity","countOutput"],"mappings":"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","file":"zabbixAPIConnector.js","sourcesContent":["import _ from 'lodash';\nimport * as utils from '../../../utils';\nimport { ZabbixAPICoreService } from './zabbixAPICore';\n\n/**\n * Zabbix API Wrapper.\n * Creates Zabbix API instance with given parameters (url, credentials and other).\n * Wraps API calls and provides high-level methods.\n */\nexport class ZabbixAPIConnector {\n\n /** @ngInject */\n constructor(api_url, username, password, basicAuth, withCredentials, backendSrv) {\n this.url = api_url;\n this.username = username;\n this.password = password;\n this.auth = \"\";\n\n this.requestOptions = {\n basicAuth: basicAuth,\n withCredentials: withCredentials\n };\n\n this.loginPromise = null;\n this.loginErrorCount = 0;\n this.maxLoginAttempts = 3;\n\n this.zabbixAPICore = new ZabbixAPICoreService(backendSrv);\n\n this.getTrend = this.getTrend_ZBXNEXT1193;\n //getTrend = getTrend_30;\n }\n\n //////////////////////////\n // Core method wrappers //\n //////////////////////////\n\n request(method, params) {\n return this.zabbixAPICore.request(this.url, method, params, this.requestOptions, this.auth)\n .catch(error => {\n if (isNotAuthorized(error.data)) {\n // Handle auth errors\n this.loginErrorCount++;\n if (this.loginErrorCount > this.maxLoginAttempts) {\n this.loginErrorCount = 0;\n return null;\n } else {\n return this.loginOnce()\n .then(() => this.request(method, params));\n }\n } else {\n // Handle API errors\n let message = error.data ? error.data : error.statusText;\n return Promise.reject(message);\n }\n });\n }\n\n /**\n * When API unauthenticated or auth token expired each request produce login()\n * call. But auth token is common to all requests. This function wraps login() method\n * and call it once. If login() already called just wait for it (return its promise).\n * @return login promise\n */\n loginOnce() {\n if (!this.loginPromise) {\n this.loginPromise = Promise.resolve(\n this.login().then(auth => {\n this.auth = auth;\n this.loginPromise = null;\n return auth;\n })\n );\n }\n return this.loginPromise;\n }\n\n /**\n * Get authentication token.\n */\n login() {\n return this.zabbixAPICore.login(this.url, this.username, this.password, this.requestOptions);\n }\n\n /**\n * Get Zabbix API version\n */\n getVersion() {\n return this.zabbixAPICore.getVersion(this.url, this.requestOptions);\n }\n\n ////////////////////////////////\n // Zabbix API method wrappers //\n ////////////////////////////////\n\n acknowledgeEvent(eventid, message) {\n var params = {\n eventids: eventid,\n message: message\n };\n\n return this.request('event.acknowledge', params);\n }\n\n getGroups() {\n var params = {\n output: ['name'],\n sortfield: 'name',\n real_hosts: true\n };\n\n return this.request('hostgroup.get', params);\n }\n\n getHosts(groupids) {\n var params = {\n output: ['name', 'host'],\n sortfield: 'name'\n };\n if (groupids) {\n params.groupids = groupids;\n }\n\n return this.request('host.get', params);\n }\n\n getApps(hostids) {\n var params = {\n output: 'extend',\n hostids: hostids\n };\n\n return this.request('application.get', params);\n }\n\n /**\n * Get Zabbix items\n * @param {[type]} hostids host ids\n * @param {[type]} appids application ids\n * @param {String} itemtype 'num' or 'text'\n * @return {[type]} array of items\n */\n getItems(hostids, appids, itemtype) {\n var params = {\n output: [\n 'name', 'key_',\n 'value_type',\n 'hostid',\n 'status',\n 'state'\n ],\n sortfield: 'name',\n webitems: true,\n filter: {},\n selectHosts: ['hostid', 'name']\n };\n if (hostids) {\n params.hostids = hostids;\n }\n if (appids) {\n params.applicationids = appids;\n }\n if (itemtype === 'num') {\n // Return only numeric metrics\n params.filter.value_type = [0, 3];\n }\n if (itemtype === 'text') {\n // Return only text metrics\n params.filter.value_type = [1, 2, 4];\n }\n\n return this.request('item.get', params)\n .then(utils.expandItems);\n }\n\n getItemsByIDs(itemids) {\n var params = {\n itemids: itemids,\n output: [\n 'name', 'key_',\n 'value_type',\n 'hostid',\n 'status',\n 'state'\n ],\n webitems: true,\n selectHosts: ['hostid', 'name']\n };\n\n return this.request('item.get', params)\n .then(utils.expandItems);\n }\n\n getMacros(hostids) {\n var params = {\n output: 'extend',\n hostids: hostids\n };\n\n return this.request('usermacro.get', params);\n }\n\n getGlobalMacros() {\n var params = {\n output: 'extend',\n globalmacro: true\n };\n\n return this.request('usermacro.get', params);\n }\n\n getLastValue(itemid) {\n var params = {\n output: ['lastvalue'],\n itemids: itemid\n };\n return this.request('item.get', params)\n .then(items => items.length ? items[0].lastvalue : null);\n }\n\n /**\n * Perform history query from Zabbix API\n *\n * @param {Array} items Array of Zabbix item objects\n * @param {Number} timeFrom Time in seconds\n * @param {Number} timeTill Time in seconds\n * @return {Array} Array of Zabbix history objects\n */\n getHistory(items, timeFrom, timeTill) {\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid');\n let params = {\n output: 'extend',\n history: value_type,\n itemids: itemids,\n sortfield: 'clock',\n sortorder: 'ASC',\n time_from: timeFrom\n };\n\n // Relative queries (e.g. last hour) don't include an end time\n if (timeTill) {\n params.time_till = timeTill;\n }\n\n return this.request('history.get', params);\n });\n\n return Promise.all(promises).then(_.flatten);\n }\n\n /**\n * Perform trends query from Zabbix API\n * Use trends api extension from ZBXNEXT-1193 patch.\n *\n * @param {Array} items Array of Zabbix item objects\n * @param {Number} time_from Time in seconds\n * @param {Number} time_till Time in seconds\n * @return {Array} Array of Zabbix trend objects\n */\n getTrend_ZBXNEXT1193(items, timeFrom, timeTill) {\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid');\n let params = {\n output: 'extend',\n trend: value_type,\n itemids: itemids,\n sortfield: 'clock',\n sortorder: 'ASC',\n time_from: timeFrom\n };\n\n // Relative queries (e.g. last hour) don't include an end time\n if (timeTill) {\n params.time_till = timeTill;\n }\n\n return this.request('trend.get', params);\n });\n\n return Promise.all(promises).then(_.flatten);\n }\n\n getTrend_30(items, time_from, time_till, value_type) {\n var self = this;\n var itemids = _.map(items, 'itemid');\n\n var params = {\n output: [\"itemid\",\n \"clock\",\n value_type\n ],\n itemids: itemids,\n time_from: time_from\n };\n\n // Relative queries (e.g. last hour) don't include an end time\n if (time_till) {\n params.time_till = time_till;\n }\n\n return self.request('trend.get', params);\n }\n\n getITService(serviceids) {\n var params = {\n output: 'extend',\n serviceids: serviceids\n };\n return this.request('service.get', params);\n }\n\n getSLA(serviceids, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n var params = {\n serviceids: serviceids,\n intervals: [{\n from: timeFrom,\n to: timeTo\n }]\n };\n return this.request('service.getsla', params);\n }\n\n getTriggers(groupids, hostids, applicationids, options) {\n let {showTriggers, maintenance, timeFrom, timeTo} = options;\n\n let params = {\n output: 'extend',\n groupids: groupids,\n hostids: hostids,\n applicationids: applicationids,\n expandDescription: true,\n expandData: true,\n expandComment: true,\n monitored: true,\n skipDependent: true,\n //only_true: true,\n filter: {\n value: 1\n },\n selectGroups: ['name'],\n selectHosts: ['name', 'host', 'maintenance_status'],\n selectItems: ['name', 'key_', 'lastvalue'],\n selectLastEvent: 'extend',\n selectTags: 'extend'\n };\n\n if (showTriggers) {\n params.filter.value = showTriggers;\n }\n\n if (maintenance) {\n params.maintenance = true;\n }\n\n if (timeFrom || timeTo) {\n params.lastChangeSince = timeFrom;\n params.lastChangeTill = timeTo;\n }\n\n return this.request('trigger.get', params);\n }\n\n getEvents(objectids, timeFrom, timeTo, showEvents) {\n var params = {\n output: 'extend',\n time_from: timeFrom,\n time_till: timeTo,\n objectids: objectids,\n select_acknowledges: 'extend',\n selectHosts: 'extend',\n value: showEvents\n };\n\n return this.request('event.get', params);\n }\n\n getAcknowledges(eventids) {\n var params = {\n output: 'extend',\n eventids: eventids,\n preservekeys: true,\n select_acknowledges: 'extend',\n sortfield: 'clock',\n sortorder: 'DESC'\n };\n\n return this.request('event.get', params)\n .then(events => {\n return _.filter(events, (event) => event.acknowledges.length);\n });\n }\n\n getAlerts(itemids, timeFrom, timeTo) {\n var params = {\n output: 'extend',\n itemids: itemids,\n expandDescription: true,\n expandData: true,\n expandComment: true,\n monitored: true,\n skipDependent: true,\n //only_true: true,\n // filter: {\n // value: 1\n // },\n selectLastEvent: 'extend'\n };\n\n if (timeFrom || timeTo) {\n params.lastChangeSince = timeFrom;\n params.lastChangeTill = timeTo;\n }\n\n return this.request('trigger.get', params);\n }\n\n getHostAlerts(hostids, applicationids, options) {\n let {minSeverity, acknowledged, count, timeFrom, timeTo} = options;\n let params = {\n output: 'extend',\n hostids: hostids,\n min_severity: minSeverity,\n filter: { value: 1 },\n expandDescription: true,\n expandData: true,\n expandComment: true,\n monitored: true,\n skipDependent: true,\n selectLastEvent: 'extend',\n selectGroups: 'extend',\n selectHosts: ['host', 'name']\n };\n\n if (count && acknowledged !== 0 && acknowledged !== 1) {\n params.countOutput = true;\n }\n\n if (applicationids && applicationids.length) {\n params.applicationids = applicationids;\n }\n\n if (timeFrom || timeTo) {\n params.lastChangeSince = timeFrom;\n params.lastChangeTill = timeTo;\n }\n\n return this.request('trigger.get', params)\n .then((triggers) => {\n if (!count || acknowledged === 0 || acknowledged === 1) {\n triggers = filterTriggersByAcknowledge(triggers, acknowledged);\n if (count) {\n triggers = triggers.length;\n }\n }\n return triggers;\n });\n }\n}\n\nfunction filterTriggersByAcknowledge(triggers, acknowledged) {\n if (acknowledged === 0) {\n return _.filter(triggers, (trigger) => trigger.lastEvent.acknowledged === \"0\");\n } else if (acknowledged === 1) {\n return _.filter(triggers, (trigger) => trigger.lastEvent.acknowledged === \"1\");\n } else {\n return triggers;\n }\n}\n\nfunction isNotAuthorized(message) {\n return (\n message === \"Session terminated, re-login, please.\" ||\n message === \"Not authorised.\" ||\n message === \"Not authorized.\"\n );\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js"],"names":["filterTriggersByAcknowledge","triggers","acknowledged","_","filter","trigger","lastEvent","isNotAuthorized","message","utils","ZabbixAPICore","ZabbixAPIConnector","api_url","username","password","basicAuth","withCredentials","backendSrv","url","auth","requestOptions","loginPromise","loginErrorCount","maxLoginAttempts","zabbixAPICore","getTrend","getTrend_ZBXNEXT1193","method","params","request","catch","error","data","loginOnce","then","statusText","Promise","reject","resolve","login","getVersion","eventid","eventids","output","sortfield","real_hosts","groupids","hostids","appids","itemtype","webitems","selectHosts","applicationids","value_type","expandItems","itemids","globalmacro","itemid","items","length","lastvalue","timeFrom","timeTill","grouped_items","groupBy","promises","map","history","sortorder","time_from","time_till","all","flatten","trend","self","serviceids","timeRange","timeTo","intervals","from","to","options","showTriggers","maintenance","expandDescription","expandData","expandComment","monitored","skipDependent","value","selectGroups","selectItems","selectLastEvent","selectTags","lastChangeSince","lastChangeTill","objectids","showEvents","select_acknowledges","preservekeys","events","event","acknowledges","minSeverity","count","min_severity","countOutput"],"mappings":"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","file":"zabbixAPIConnector.js","sourcesContent":["import _ from 'lodash';\nimport * as utils from '../../../utils';\nimport { ZabbixAPICore } from './zabbixAPICore';\n\n/**\n * Zabbix API Wrapper.\n * Creates Zabbix API instance with given parameters (url, credentials and other).\n * Wraps API calls and provides high-level methods.\n */\nexport class ZabbixAPIConnector {\n\n /** @ngInject */\n constructor(api_url, username, password, basicAuth, withCredentials, backendSrv) {\n this.url = api_url;\n this.username = username;\n this.password = password;\n this.auth = \"\";\n\n this.requestOptions = {\n basicAuth: basicAuth,\n withCredentials: withCredentials\n };\n\n this.loginPromise = null;\n this.loginErrorCount = 0;\n this.maxLoginAttempts = 3;\n\n this.zabbixAPICore = new ZabbixAPICore(backendSrv);\n\n this.getTrend = this.getTrend_ZBXNEXT1193;\n //getTrend = getTrend_30;\n }\n\n //////////////////////////\n // Core method wrappers //\n //////////////////////////\n\n request(method, params) {\n return this.zabbixAPICore.request(this.url, method, params, this.requestOptions, this.auth)\n .catch(error => {\n if (isNotAuthorized(error.data)) {\n // Handle auth errors\n this.loginErrorCount++;\n if (this.loginErrorCount > this.maxLoginAttempts) {\n this.loginErrorCount = 0;\n return null;\n } else {\n return this.loginOnce()\n .then(() => this.request(method, params));\n }\n } else {\n // Handle API errors\n let message = error.data ? error.data : error.statusText;\n return Promise.reject(message);\n }\n });\n }\n\n /**\n * When API unauthenticated or auth token expired each request produce login()\n * call. But auth token is common to all requests. This function wraps login() method\n * and call it once. If login() already called just wait for it (return its promise).\n * @return login promise\n */\n loginOnce() {\n if (!this.loginPromise) {\n this.loginPromise = Promise.resolve(\n this.login().then(auth => {\n this.auth = auth;\n this.loginPromise = null;\n return auth;\n })\n );\n }\n return this.loginPromise;\n }\n\n /**\n * Get authentication token.\n */\n login() {\n return this.zabbixAPICore.login(this.url, this.username, this.password, this.requestOptions);\n }\n\n /**\n * Get Zabbix API version\n */\n getVersion() {\n return this.zabbixAPICore.getVersion(this.url, this.requestOptions);\n }\n\n ////////////////////////////////\n // Zabbix API method wrappers //\n ////////////////////////////////\n\n acknowledgeEvent(eventid, message) {\n var params = {\n eventids: eventid,\n message: message\n };\n\n return this.request('event.acknowledge', params);\n }\n\n getGroups() {\n var params = {\n output: ['name'],\n sortfield: 'name',\n real_hosts: true\n };\n\n return this.request('hostgroup.get', params);\n }\n\n getHosts(groupids) {\n var params = {\n output: ['name', 'host'],\n sortfield: 'name'\n };\n if (groupids) {\n params.groupids = groupids;\n }\n\n return this.request('host.get', params);\n }\n\n getApps(hostids) {\n var params = {\n output: 'extend',\n hostids: hostids\n };\n\n return this.request('application.get', params);\n }\n\n /**\n * Get Zabbix items\n * @param {[type]} hostids host ids\n * @param {[type]} appids application ids\n * @param {String} itemtype 'num' or 'text'\n * @return {[type]} array of items\n */\n getItems(hostids, appids, itemtype) {\n var params = {\n output: [\n 'name', 'key_',\n 'value_type',\n 'hostid',\n 'status',\n 'state'\n ],\n sortfield: 'name',\n webitems: true,\n filter: {},\n selectHosts: ['hostid', 'name']\n };\n if (hostids) {\n params.hostids = hostids;\n }\n if (appids) {\n params.applicationids = appids;\n }\n if (itemtype === 'num') {\n // Return only numeric metrics\n params.filter.value_type = [0, 3];\n }\n if (itemtype === 'text') {\n // Return only text metrics\n params.filter.value_type = [1, 2, 4];\n }\n\n return this.request('item.get', params)\n .then(utils.expandItems);\n }\n\n getItemsByIDs(itemids) {\n var params = {\n itemids: itemids,\n output: [\n 'name', 'key_',\n 'value_type',\n 'hostid',\n 'status',\n 'state'\n ],\n webitems: true,\n selectHosts: ['hostid', 'name']\n };\n\n return this.request('item.get', params)\n .then(utils.expandItems);\n }\n\n getMacros(hostids) {\n var params = {\n output: 'extend',\n hostids: hostids\n };\n\n return this.request('usermacro.get', params);\n }\n\n getGlobalMacros() {\n var params = {\n output: 'extend',\n globalmacro: true\n };\n\n return this.request('usermacro.get', params);\n }\n\n getLastValue(itemid) {\n var params = {\n output: ['lastvalue'],\n itemids: itemid\n };\n return this.request('item.get', params)\n .then(items => items.length ? items[0].lastvalue : null);\n }\n\n /**\n * Perform history query from Zabbix API\n *\n * @param {Array} items Array of Zabbix item objects\n * @param {Number} timeFrom Time in seconds\n * @param {Number} timeTill Time in seconds\n * @return {Array} Array of Zabbix history objects\n */\n getHistory(items, timeFrom, timeTill) {\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid');\n let params = {\n output: 'extend',\n history: value_type,\n itemids: itemids,\n sortfield: 'clock',\n sortorder: 'ASC',\n time_from: timeFrom\n };\n\n // Relative queries (e.g. last hour) don't include an end time\n if (timeTill) {\n params.time_till = timeTill;\n }\n\n return this.request('history.get', params);\n });\n\n return Promise.all(promises).then(_.flatten);\n }\n\n /**\n * Perform trends query from Zabbix API\n * Use trends api extension from ZBXNEXT-1193 patch.\n *\n * @param {Array} items Array of Zabbix item objects\n * @param {Number} time_from Time in seconds\n * @param {Number} time_till Time in seconds\n * @return {Array} Array of Zabbix trend objects\n */\n getTrend_ZBXNEXT1193(items, timeFrom, timeTill) {\n\n // Group items by value type and perform request for each value type\n let grouped_items = _.groupBy(items, 'value_type');\n let promises = _.map(grouped_items, (items, value_type) => {\n let itemids = _.map(items, 'itemid');\n let params = {\n output: 'extend',\n trend: value_type,\n itemids: itemids,\n sortfield: 'clock',\n sortorder: 'ASC',\n time_from: timeFrom\n };\n\n // Relative queries (e.g. last hour) don't include an end time\n if (timeTill) {\n params.time_till = timeTill;\n }\n\n return this.request('trend.get', params);\n });\n\n return Promise.all(promises).then(_.flatten);\n }\n\n getTrend_30(items, time_from, time_till, value_type) {\n var self = this;\n var itemids = _.map(items, 'itemid');\n\n var params = {\n output: [\"itemid\",\n \"clock\",\n value_type\n ],\n itemids: itemids,\n time_from: time_from\n };\n\n // Relative queries (e.g. last hour) don't include an end time\n if (time_till) {\n params.time_till = time_till;\n }\n\n return self.request('trend.get', params);\n }\n\n getITService(serviceids) {\n var params = {\n output: 'extend',\n serviceids: serviceids\n };\n return this.request('service.get', params);\n }\n\n getSLA(serviceids, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n var params = {\n serviceids: serviceids,\n intervals: [{\n from: timeFrom,\n to: timeTo\n }]\n };\n return this.request('service.getsla', params);\n }\n\n getTriggers(groupids, hostids, applicationids, options) {\n let {showTriggers, maintenance, timeFrom, timeTo} = options;\n\n let params = {\n output: 'extend',\n groupids: groupids,\n hostids: hostids,\n applicationids: applicationids,\n expandDescription: true,\n expandData: true,\n expandComment: true,\n monitored: true,\n skipDependent: true,\n //only_true: true,\n filter: {\n value: 1\n },\n selectGroups: ['name'],\n selectHosts: ['name', 'host', 'maintenance_status'],\n selectItems: ['name', 'key_', 'lastvalue'],\n selectLastEvent: 'extend',\n selectTags: 'extend'\n };\n\n if (showTriggers) {\n params.filter.value = showTriggers;\n }\n\n if (maintenance) {\n params.maintenance = true;\n }\n\n if (timeFrom || timeTo) {\n params.lastChangeSince = timeFrom;\n params.lastChangeTill = timeTo;\n }\n\n return this.request('trigger.get', params);\n }\n\n getEvents(objectids, timeFrom, timeTo, showEvents) {\n var params = {\n output: 'extend',\n time_from: timeFrom,\n time_till: timeTo,\n objectids: objectids,\n select_acknowledges: 'extend',\n selectHosts: 'extend',\n value: showEvents\n };\n\n return this.request('event.get', params);\n }\n\n getAcknowledges(eventids) {\n var params = {\n output: 'extend',\n eventids: eventids,\n preservekeys: true,\n select_acknowledges: 'extend',\n sortfield: 'clock',\n sortorder: 'DESC'\n };\n\n return this.request('event.get', params)\n .then(events => {\n return _.filter(events, (event) => event.acknowledges.length);\n });\n }\n\n getAlerts(itemids, timeFrom, timeTo) {\n var params = {\n output: 'extend',\n itemids: itemids,\n expandDescription: true,\n expandData: true,\n expandComment: true,\n monitored: true,\n skipDependent: true,\n //only_true: true,\n // filter: {\n // value: 1\n // },\n selectLastEvent: 'extend'\n };\n\n if (timeFrom || timeTo) {\n params.lastChangeSince = timeFrom;\n params.lastChangeTill = timeTo;\n }\n\n return this.request('trigger.get', params);\n }\n\n getHostAlerts(hostids, applicationids, options) {\n let {minSeverity, acknowledged, count, timeFrom, timeTo} = options;\n let params = {\n output: 'extend',\n hostids: hostids,\n min_severity: minSeverity,\n filter: { value: 1 },\n expandDescription: true,\n expandData: true,\n expandComment: true,\n monitored: true,\n skipDependent: true,\n selectLastEvent: 'extend',\n selectGroups: 'extend',\n selectHosts: ['host', 'name']\n };\n\n if (count && acknowledged !== 0 && acknowledged !== 1) {\n params.countOutput = true;\n }\n\n if (applicationids && applicationids.length) {\n params.applicationids = applicationids;\n }\n\n if (timeFrom || timeTo) {\n params.lastChangeSince = timeFrom;\n params.lastChangeTill = timeTo;\n }\n\n return this.request('trigger.get', params)\n .then((triggers) => {\n if (!count || acknowledged === 0 || acknowledged === 1) {\n triggers = filterTriggersByAcknowledge(triggers, acknowledged);\n if (count) {\n triggers = triggers.length;\n }\n }\n return triggers;\n });\n }\n}\n\nfunction filterTriggersByAcknowledge(triggers, acknowledged) {\n if (acknowledged === 0) {\n return _.filter(triggers, (trigger) => trigger.lastEvent.acknowledged === \"0\");\n } else if (acknowledged === 1) {\n return _.filter(triggers, (trigger) => trigger.lastEvent.acknowledged === \"1\");\n } else {\n return triggers;\n }\n}\n\nfunction isNotAuthorized(message) {\n return (\n message === \"Session terminated, re-login, please.\" ||\n message === \"Not authorised.\" ||\n message === \"Not authorized.\"\n );\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js index 8159f64..8ce8c9b 100644 --- a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js +++ b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js @@ -3,7 +3,7 @@ System.register([], function (_export, _context) { "use strict"; - var _createClass, ZabbixAPICoreService, ZabbixAPIError; + var _createClass, ZabbixAPICore, ZabbixAPIError; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -32,11 +32,11 @@ System.register([], function (_export, _context) { }; }(); - _export("ZabbixAPICoreService", ZabbixAPICoreService = function () { + _export("ZabbixAPICore", ZabbixAPICore = function () { /** @ngInject */ - function ZabbixAPICoreService(backendSrv) { - _classCallCheck(this, ZabbixAPICoreService); + function ZabbixAPICore(backendSrv) { + _classCallCheck(this, ZabbixAPICore); this.backendSrv = backendSrv; } @@ -47,7 +47,7 @@ System.register([], function (_export, _context) { */ - _createClass(ZabbixAPICoreService, [{ + _createClass(ZabbixAPICore, [{ key: "request", value: function request(api_url, method, params, options, auth) { var requestData = { @@ -116,10 +116,10 @@ System.register([], function (_export, _context) { } }]); - return ZabbixAPICoreService; + return ZabbixAPICore; }()); - _export("ZabbixAPICoreService", ZabbixAPICoreService); + _export("ZabbixAPICore", ZabbixAPICore); _export("ZabbixAPIError", ZabbixAPIError = function () { function ZabbixAPIError(error) { diff --git a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js.map b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js.map index 390eb21..46e9d89 100644 --- a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js.map +++ b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js"],"names":["ZabbixAPICoreService","backendSrv","api_url","method","params","options","auth","requestData","jsonrpc","id","Promise","reject","ZabbixAPIError","data","requestOptions","url","headers","basicAuth","withCredentials","Authorization","datasourceRequest","then","response","error","result","username","password","user","request","code","name","message"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAIaA,oB;;AAEX;AACA,sCAAYC,UAAZ,EAAwB;AAAA;;AACtB,eAAKA,UAAL,GAAkBA,UAAlB;AACD;;AAED;;;;;;;;kCAIQC,O,EAASC,M,EAAQC,M,EAAQC,O,EAASC,I,EAAM;AAC9C,gBAAIC,cAAc;AAChBC,uBAAS,KADO;AAEhBL,sBAAQA,MAFQ;AAGhBC,sBAAQA,MAHQ;AAIhBK,kBAAI;AAJY,aAAlB;;AAOA,gBAAIH,SAAS,EAAb,EAAiB;AACf;AACA,qBAAOI,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmB,EAACC,MAAM,iBAAP,EAAnB,CAAf,CAAP;AACD,aAHD,MAGO,IAAIP,IAAJ,EAAU;AACf;AACAC,0BAAYD,IAAZ,GAAmBA,IAAnB;AACD;;AAED,gBAAIQ,iBAAiB;AACnBX,sBAAQ,MADW;AAEnBY,mBAAKb,OAFc;AAGnBW,oBAAMN,WAHa;AAInBS,uBAAS;AACP,gCAAgB;AADT;AAJU,aAArB;;AASA;AACA,gBAAIX,QAAQY,SAAR,IAAqBZ,QAAQa,eAAjC,EAAkD;AAChDJ,6BAAeI,eAAf,GAAiC,IAAjC;AACD;AACD,gBAAIb,QAAQY,SAAZ,EAAuB;AACrBH,6BAAeE,OAAf,CAAuBG,aAAvB,GAAuCd,QAAQY,SAA/C;AACD;;AAED,mBAAO,KAAKG,iBAAL,CAAuBN,cAAvB,CAAP;AACD;;;4CAEiBA,c,EAAgB;AAChC,mBAAO,KAAKb,UAAL,CAAgBmB,iBAAhB,CAAkCN,cAAlC,EACNO,IADM,CACD,UAACC,QAAD,EAAc;AAClB,kBAAI,CAACA,SAAST,IAAd,EAAoB;AAClB,uBAAOH,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmB,EAACC,MAAM,wBAAP,EAAnB,CAAf,CAAP;AACD,eAFD,MAEO,IAAIS,SAAST,IAAT,CAAcU,KAAlB,EAAyB;;AAE9B;AACA,uBAAOb,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmBU,SAAST,IAAT,CAAcU,KAAjC,CAAf,CAAP;AACD;;AAED;AACA,qBAAOD,SAAST,IAAT,CAAcW,MAArB;AACD,aAZM,CAAP;AAaD;;;gCAMKtB,O,EAASuB,Q,EAAUC,Q,EAAUrB,O,EAAS;AAC1C,gBAAID,SAAS;AACXuB,oBAAMF,QADK;AAEXC,wBAAUA;AAFC,aAAb;AAIA,mBAAO,KAAKE,OAAL,CAAa1B,OAAb,EAAsB,YAAtB,EAAoCE,MAApC,EAA4CC,OAA5C,EAAqD,IAArD,CAAP;AACD;;;qCAMUH,O,EAASG,O,EAAS;AAC3B,mBAAO,KAAKuB,OAAL,CAAa1B,OAAb,EAAsB,iBAAtB,EAAyC,EAAzC,EAA6CG,OAA7C,CAAP;AACD;;;;;;;;gCAIUO,c;AACX,gCAAYW,KAAZ,EAAmB;AAAA;;AACjB,eAAKM,IAAL,GAAYN,MAAMM,IAAN,IAAc,IAA1B;AACA,eAAKC,IAAL,GAAYP,MAAMQ,OAAN,IAAiB,EAA7B;AACA,eAAKlB,IAAL,GAAYU,MAAMV,IAAN,IAAc,EAA1B;AACA,eAAKkB,OAAL,GAAe,uBAAuB,KAAKD,IAA5B,GAAmC,GAAnC,GAAyC,KAAKjB,IAA7D;AACD;;;;qCAEU;AACT,mBAAO,KAAKiB,IAAL,GAAY,GAAZ,GAAkB,KAAKjB,IAA9B;AACD","file":"zabbixAPICore.js","sourcesContent":["/**\n * General Zabbix API methods\n */\n\nexport class ZabbixAPICoreService {\n\n /** @ngInject */\n constructor(backendSrv) {\n this.backendSrv = backendSrv;\n }\n\n /**\n * Request data from Zabbix API\n * @return {object} response.result\n */\n request(api_url, method, params, options, auth) {\n let requestData = {\n jsonrpc: '2.0',\n method: method,\n params: params,\n id: 1\n };\n\n if (auth === \"\") {\n // Reject immediately if not authenticated\n return Promise.reject(new ZabbixAPIError({data: \"Not authorised.\"}));\n } else if (auth) {\n // Set auth parameter only if it needed\n requestData.auth = auth;\n }\n\n let requestOptions = {\n method: 'POST',\n url: api_url,\n data: requestData,\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n // Set request options for basic auth\n if (options.basicAuth || options.withCredentials) {\n requestOptions.withCredentials = true;\n }\n if (options.basicAuth) {\n requestOptions.headers.Authorization = options.basicAuth;\n }\n\n return this.datasourceRequest(requestOptions);\n }\n\n datasourceRequest(requestOptions) {\n return this.backendSrv.datasourceRequest(requestOptions)\n .then((response) => {\n if (!response.data) {\n return Promise.reject(new ZabbixAPIError({data: \"General Error, no data\"}));\n } else if (response.data.error) {\n\n // Handle Zabbix API errors\n return Promise.reject(new ZabbixAPIError(response.data.error));\n }\n\n // Success\n return response.data.result;\n });\n }\n\n /**\n * Get authentication token.\n * @return {string} auth token\n */\n login(api_url, username, password, options) {\n let params = {\n user: username,\n password: password\n };\n return this.request(api_url, 'user.login', params, options, null);\n }\n\n /**\n * Get Zabbix API version\n * Matches the version of Zabbix starting from Zabbix 2.0.4\n */\n getVersion(api_url, options) {\n return this.request(api_url, 'apiinfo.version', [], options);\n }\n}\n\n// Define zabbix API exception type\nexport class ZabbixAPIError {\n constructor(error) {\n this.code = error.code || null;\n this.name = error.message || \"\";\n this.data = error.data || \"\";\n this.message = \"Zabbix API Error: \" + this.name + \" \" + this.data;\n }\n\n toString() {\n return this.name + \" \" + this.data;\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js"],"names":["ZabbixAPICore","backendSrv","api_url","method","params","options","auth","requestData","jsonrpc","id","Promise","reject","ZabbixAPIError","data","requestOptions","url","headers","basicAuth","withCredentials","Authorization","datasourceRequest","then","response","error","result","username","password","user","request","code","name","message"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAIaA,a;;AAEX;AACA,+BAAYC,UAAZ,EAAwB;AAAA;;AACtB,eAAKA,UAAL,GAAkBA,UAAlB;AACD;;AAED;;;;;;;;kCAIQC,O,EAASC,M,EAAQC,M,EAAQC,O,EAASC,I,EAAM;AAC9C,gBAAIC,cAAc;AAChBC,uBAAS,KADO;AAEhBL,sBAAQA,MAFQ;AAGhBC,sBAAQA,MAHQ;AAIhBK,kBAAI;AAJY,aAAlB;;AAOA,gBAAIH,SAAS,EAAb,EAAiB;AACf;AACA,qBAAOI,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmB,EAACC,MAAM,iBAAP,EAAnB,CAAf,CAAP;AACD,aAHD,MAGO,IAAIP,IAAJ,EAAU;AACf;AACAC,0BAAYD,IAAZ,GAAmBA,IAAnB;AACD;;AAED,gBAAIQ,iBAAiB;AACnBX,sBAAQ,MADW;AAEnBY,mBAAKb,OAFc;AAGnBW,oBAAMN,WAHa;AAInBS,uBAAS;AACP,gCAAgB;AADT;AAJU,aAArB;;AASA;AACA,gBAAIX,QAAQY,SAAR,IAAqBZ,QAAQa,eAAjC,EAAkD;AAChDJ,6BAAeI,eAAf,GAAiC,IAAjC;AACD;AACD,gBAAIb,QAAQY,SAAZ,EAAuB;AACrBH,6BAAeE,OAAf,CAAuBG,aAAvB,GAAuCd,QAAQY,SAA/C;AACD;;AAED,mBAAO,KAAKG,iBAAL,CAAuBN,cAAvB,CAAP;AACD;;;4CAEiBA,c,EAAgB;AAChC,mBAAO,KAAKb,UAAL,CAAgBmB,iBAAhB,CAAkCN,cAAlC,EACNO,IADM,CACD,UAACC,QAAD,EAAc;AAClB,kBAAI,CAACA,SAAST,IAAd,EAAoB;AAClB,uBAAOH,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmB,EAACC,MAAM,wBAAP,EAAnB,CAAf,CAAP;AACD,eAFD,MAEO,IAAIS,SAAST,IAAT,CAAcU,KAAlB,EAAyB;;AAE9B;AACA,uBAAOb,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmBU,SAAST,IAAT,CAAcU,KAAjC,CAAf,CAAP;AACD;;AAED;AACA,qBAAOD,SAAST,IAAT,CAAcW,MAArB;AACD,aAZM,CAAP;AAaD;;;gCAMKtB,O,EAASuB,Q,EAAUC,Q,EAAUrB,O,EAAS;AAC1C,gBAAID,SAAS;AACXuB,oBAAMF,QADK;AAEXC,wBAAUA;AAFC,aAAb;AAIA,mBAAO,KAAKE,OAAL,CAAa1B,OAAb,EAAsB,YAAtB,EAAoCE,MAApC,EAA4CC,OAA5C,EAAqD,IAArD,CAAP;AACD;;;qCAMUH,O,EAASG,O,EAAS;AAC3B,mBAAO,KAAKuB,OAAL,CAAa1B,OAAb,EAAsB,iBAAtB,EAAyC,EAAzC,EAA6CG,OAA7C,CAAP;AACD;;;;;;;;gCAIUO,c;AACX,gCAAYW,KAAZ,EAAmB;AAAA;;AACjB,eAAKM,IAAL,GAAYN,MAAMM,IAAN,IAAc,IAA1B;AACA,eAAKC,IAAL,GAAYP,MAAMQ,OAAN,IAAiB,EAA7B;AACA,eAAKlB,IAAL,GAAYU,MAAMV,IAAN,IAAc,EAA1B;AACA,eAAKkB,OAAL,GAAe,uBAAuB,KAAKD,IAA5B,GAAmC,GAAnC,GAAyC,KAAKjB,IAA7D;AACD;;;;qCAEU;AACT,mBAAO,KAAKiB,IAAL,GAAY,GAAZ,GAAkB,KAAKjB,IAA9B;AACD","file":"zabbixAPICore.js","sourcesContent":["/**\n * General Zabbix API methods\n */\n\nexport class ZabbixAPICore {\n\n /** @ngInject */\n constructor(backendSrv) {\n this.backendSrv = backendSrv;\n }\n\n /**\n * Request data from Zabbix API\n * @return {object} response.result\n */\n request(api_url, method, params, options, auth) {\n let requestData = {\n jsonrpc: '2.0',\n method: method,\n params: params,\n id: 1\n };\n\n if (auth === \"\") {\n // Reject immediately if not authenticated\n return Promise.reject(new ZabbixAPIError({data: \"Not authorised.\"}));\n } else if (auth) {\n // Set auth parameter only if it needed\n requestData.auth = auth;\n }\n\n let requestOptions = {\n method: 'POST',\n url: api_url,\n data: requestData,\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n // Set request options for basic auth\n if (options.basicAuth || options.withCredentials) {\n requestOptions.withCredentials = true;\n }\n if (options.basicAuth) {\n requestOptions.headers.Authorization = options.basicAuth;\n }\n\n return this.datasourceRequest(requestOptions);\n }\n\n datasourceRequest(requestOptions) {\n return this.backendSrv.datasourceRequest(requestOptions)\n .then((response) => {\n if (!response.data) {\n return Promise.reject(new ZabbixAPIError({data: \"General Error, no data\"}));\n } else if (response.data.error) {\n\n // Handle Zabbix API errors\n return Promise.reject(new ZabbixAPIError(response.data.error));\n }\n\n // Success\n return response.data.result;\n });\n }\n\n /**\n * Get authentication token.\n * @return {string} auth token\n */\n login(api_url, username, password, options) {\n let params = {\n user: username,\n password: password\n };\n return this.request(api_url, 'user.login', params, options, null);\n }\n\n /**\n * Get Zabbix API version\n * Matches the version of Zabbix starting from Zabbix 2.0.4\n */\n getVersion(api_url, options) {\n return this.request(api_url, 'apiinfo.version', [], options);\n }\n}\n\n// Define zabbix API exception type\nexport class ZabbixAPIError {\n constructor(error) {\n this.code = error.code || null;\n this.name = error.message || \"\";\n this.data = error.data || \"\";\n this.message = \"Zabbix API Error: \" + this.name + \" \" + this.data;\n }\n\n toString() {\n return this.name + \" \" + this.data;\n }\n}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/proxy/cachingProxy.js b/dist/datasource-zabbix/zabbix/proxy/cachingProxy.js new file mode 100644 index 0000000..3a917ab --- /dev/null +++ b/dist/datasource-zabbix/zabbix/proxy/cachingProxy.js @@ -0,0 +1,150 @@ +"use strict"; + +System.register([], function (_export, _context) { + "use strict"; + + var _createClass, CachingProxy; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + /** + * Wrap request to prevent multiple calls + * with same params when waiting for result. + */ + function callOnce(func, promiseKeeper, funcScope) { + return function () { + var hash = getRequestHash(arguments); + if (!promiseKeeper[hash]) { + promiseKeeper[hash] = Promise.resolve(func.apply(funcScope, arguments).then(function (result) { + promiseKeeper[hash] = null; + return result; + })); + } + return promiseKeeper[hash]; + }; + } + + function _cacheRequest(func, funcName, funcScope, self) { + return function () { + if (!self.cache[funcName]) { + self.cache[funcName] = {}; + } + + var cacheObject = self.cache[funcName]; + var hash = getRequestHash(arguments); + if (self.cacheEnabled && !self._isExpired(cacheObject[hash])) { + return Promise.resolve(cacheObject[hash].value); + } else { + return func.apply(funcScope, arguments).then(function (result) { + cacheObject[hash] = { + value: result, + timestamp: Date.now() + }; + return result; + }); + } + }; + } + + function getRequestHash(args) { + var argsJson = JSON.stringify(args); + return argsJson.getHash(); + } + + return { + setters: [], + execute: function () { + _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + _export("CachingProxy", CachingProxy = function () { + function CachingProxy(cacheOptions) { + _classCallCheck(this, CachingProxy); + + this.cacheEnabled = cacheOptions.enabled; + this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default + + // Internal objects for data storing + this.cache = {}; + this.promises = {}; + } + + /** + * Check that result is present in the cache and is up to date or send request otherwise. + */ + + + _createClass(CachingProxy, [{ + key: "cacheRequest", + value: function cacheRequest(func, funcName, funcScope) { + return _cacheRequest(func, funcName, funcScope, this); + } + }, { + key: "proxyfy", + value: function proxyfy(func, funcName, funcScope) { + if (!this.promises[funcName]) { + this.promises[funcName] = {}; + } + var promiseKeeper = this.promises[funcName]; + return callOnce(func, promiseKeeper, funcScope); + } + }, { + key: "proxyfyWithCache", + value: function proxyfyWithCache(func, funcName, funcScope) { + var proxyfied = this.proxyfy(func, funcName, funcScope); + return this.cacheRequest(proxyfied, funcName, funcScope); + } + }, { + key: "_isExpired", + value: function _isExpired(cacheObject) { + if (cacheObject) { + var object_age = Date.now() - cacheObject.timestamp; + return !(cacheObject.timestamp && object_age < this.ttl); + } else { + return true; + } + } + }]); + + return CachingProxy; + }()); + + _export("CachingProxy", CachingProxy); + + String.prototype.getHash = function () { + var hash = 0, + i, + chr, + len; + if (this.length !== 0) { + for (i = 0, len = this.length; i < len; i++) { + chr = this.charCodeAt(i); + hash = (hash << 5) - hash + chr; + hash |= 0; // Convert to 32bit integer + } + } + return hash; + }; + } + }; +}); +//# sourceMappingURL=cachingProxy.js.map diff --git a/dist/datasource-zabbix/zabbix/proxy/cachingProxy.js.map b/dist/datasource-zabbix/zabbix/proxy/cachingProxy.js.map new file mode 100644 index 0000000..0018ea3 --- /dev/null +++ b/dist/datasource-zabbix/zabbix/proxy/cachingProxy.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../../src/datasource-zabbix/zabbix/proxy/cachingProxy.js"],"names":["callOnce","func","promiseKeeper","funcScope","hash","getRequestHash","arguments","Promise","resolve","apply","then","result","cacheRequest","funcName","self","cache","cacheObject","cacheEnabled","_isExpired","value","timestamp","Date","now","args","argsJson","JSON","stringify","getHash","CachingProxy","cacheOptions","enabled","ttl","promises","proxyfied","proxyfy","object_age","String","prototype","i","chr","len","length","charCodeAt"],"mappings":"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","file":"cachingProxy.js","sourcesContent":["/**\n * This module allows to deduplicate function calls with the same params and\n * cache result of function call.\n */\n\nexport class CachingProxy {\n\n constructor(cacheOptions) {\n this.cacheEnabled = cacheOptions.enabled;\n this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default\n\n // Internal objects for data storing\n this.cache = {};\n this.promises = {};\n }\n\n /**\n * Check that result is present in the cache and is up to date or send request otherwise.\n */\n cacheRequest(func, funcName, funcScope) {\n return cacheRequest(func, funcName, funcScope, this);\n }\n\n /**\n * Wrap request to prevent multiple calls with same params when request is waiting for response.\n */\n proxyfy(func, funcName, funcScope) {\n if (!this.promises[funcName]) {\n this.promises[funcName] = {};\n }\n const promiseKeeper = this.promises[funcName];\n return callOnce(func, promiseKeeper, funcScope);\n }\n\n proxyfyWithCache(func, funcName, funcScope) {\n let proxyfied = this.proxyfy(func, funcName, funcScope);\n return this.cacheRequest(proxyfied, funcName, funcScope);\n }\n\n _isExpired(cacheObject) {\n if (cacheObject) {\n let object_age = Date.now() - cacheObject.timestamp;\n return !(cacheObject.timestamp && object_age < this.ttl);\n } else {\n return true;\n }\n }\n}\n\n/**\n * Wrap request to prevent multiple calls\n * with same params when waiting for result.\n */\nfunction callOnce(func, promiseKeeper, funcScope) {\n return function() {\n var hash = getRequestHash(arguments);\n if (!promiseKeeper[hash]) {\n promiseKeeper[hash] = Promise.resolve(\n func.apply(funcScope, arguments)\n .then(result => {\n promiseKeeper[hash] = null;\n return result;\n })\n );\n }\n return promiseKeeper[hash];\n };\n}\n\nfunction cacheRequest(func, funcName, funcScope, self) {\n return function() {\n if (!self.cache[funcName]) {\n self.cache[funcName] = {};\n }\n\n let cacheObject = self.cache[funcName];\n let hash = getRequestHash(arguments);\n if (self.cacheEnabled && !self._isExpired(cacheObject[hash])) {\n return Promise.resolve(cacheObject[hash].value);\n } else {\n return func.apply(funcScope, arguments)\n .then(result => {\n cacheObject[hash] = {\n value: result,\n timestamp: Date.now()\n };\n return result;\n });\n }\n };\n}\n\nfunction getRequestHash(args) {\n const argsJson = JSON.stringify(args);\n return argsJson.getHash();\n}\n\nString.prototype.getHash = function() {\n var hash = 0, i, chr, len;\n if (this.length !== 0) {\n for (i = 0, len = this.length; i < len; i++) {\n chr = this.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n }\n return hash;\n};\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js b/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js deleted file mode 100644 index 0402178..0000000 --- a/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js +++ /dev/null @@ -1,283 +0,0 @@ -'use strict'; - -System.register(['lodash'], function (_export, _context) { - "use strict"; - - var _, _createClass, ZabbixCachingProxy; - - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { - arr2[i] = arr[i]; - } - - return arr2; - } else { - return Array.from(arr); - } - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - /** - * Wrap zabbix API request to prevent multiple calls - * with same params when waiting for result. - */ - function callAPIRequestOnce(func, promiseKeeper, argsHashFunc) { - return function () { - var hash = argsHashFunc(arguments); - if (!promiseKeeper[hash]) { - promiseKeeper[hash] = Promise.resolve(func.apply(this, arguments).then(function (result) { - promiseKeeper[hash] = null; - return result; - })); - } - return promiseKeeper[hash]; - }; - } - - function getRequestHash(args) { - var requestStamp = _.map(args, function (arg) { - if (arg === undefined) { - return 'undefined'; - } else { - if (_.isArray(arg)) { - return arg.sort().toString(); - } else { - return arg.toString(); - } - } - }).join(); - return requestStamp.getHash(); - } - - function getHistoryRequestHash(args) { - var itemids = _.map(args[0], 'itemid'); - var stamp = itemids.join() + args[1] + args[2]; - return stamp.getHash(); - } - - function getDBQueryHash(args) { - var itemids = _.map(args[0], 'itemid'); - var consolidateBy = args[3].consolidateBy; - var intervalMs = args[3].intervalMs; - var stamp = itemids.join() + args[1] + args[2] + consolidateBy + intervalMs; - return stamp.getHash(); - } - - return { - setters: [function (_lodash) { - _ = _lodash.default; - }], - execute: function () { - _createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; - }(); - - _export('ZabbixCachingProxy', ZabbixCachingProxy = function () { - function ZabbixCachingProxy(zabbixAPI, zabbixDBConnector, cacheOptions) { - _classCallCheck(this, ZabbixCachingProxy); - - this.zabbixAPI = zabbixAPI; - this.dbConnector = zabbixDBConnector; - this.cacheEnabled = cacheOptions.enabled; - this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default - - // Internal objects for data storing - this.cache = { - groups: {}, - hosts: {}, - applications: {}, - items: {}, - history: {}, - trends: {}, - macros: {}, - globalMacros: {}, - itServices: {} - }; - - this.historyPromises = {}; - - // Don't run duplicated history requests - this.getHistory = callAPIRequestOnce(_.bind(this.zabbixAPI.getHistory, this.zabbixAPI), this.historyPromises, getHistoryRequestHash); - - if (this.dbConnector) { - this.getHistoryDB = callAPIRequestOnce(_.bind(this.dbConnector.getHistory, this.dbConnector), this.historyPromises, getDBQueryHash); - this.getTrendsDB = callAPIRequestOnce(_.bind(this.dbConnector.getTrends, this.dbConnector), this.historyPromises, getDBQueryHash); - } - - // Don't run duplicated requests - this.groupPromises = {}; - this.getGroupsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGroups, this.zabbixAPI), this.groupPromises, getRequestHash); - - this.hostPromises = {}; - this.getHostsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getHosts, this.zabbixAPI), this.hostPromises, getRequestHash); - - this.appPromises = {}; - this.getAppsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getApps, this.zabbixAPI), this.appPromises, getRequestHash); - - this.itemPromises = {}; - this.getItemsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItems, this.zabbixAPI), this.itemPromises, getRequestHash); - - this.itemByIdPromises = {}; - this.getItemsByIdOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItemsByIDs, this.zabbixAPI), this.itemPromises, getRequestHash); - - this.itServicesPromises = {}; - this.getITServicesOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getITService, this.zabbixAPI), this.itServicesPromises, getRequestHash); - - this.macroPromises = {}; - this.getMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getMacros, this.zabbixAPI), this.macroPromises, getRequestHash); - - this.globalMacroPromises = {}; - this.getGlobalMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGlobalMacros, this.zabbixAPI), this.globalMacroPromises, getRequestHash); - } - - _createClass(ZabbixCachingProxy, [{ - key: 'isExpired', - value: function isExpired(cacheObject) { - if (cacheObject) { - var object_age = Date.now() - cacheObject.timestamp; - return !(cacheObject.timestamp && object_age < this.ttl); - } else { - return true; - } - } - }, { - key: 'proxyRequest', - value: function proxyRequest(request, params, cacheObject) { - var hash = getRequestHash(params); - if (this.cacheEnabled && !this.isExpired(cacheObject[hash])) { - return Promise.resolve(cacheObject[hash].value); - } else { - return request.apply(undefined, _toConsumableArray(params)).then(function (result) { - cacheObject[hash] = { - value: result, - timestamp: Date.now() - }; - return result; - }); - } - } - }, { - key: 'getGroups', - value: function getGroups() { - return this.proxyRequest(this.getGroupsOnce, [], this.cache.groups); - } - }, { - key: 'getHosts', - value: function getHosts(groupids) { - return this.proxyRequest(this.getHostsOnce, [groupids], this.cache.hosts); - } - }, { - key: 'getApps', - value: function getApps(hostids) { - return this.proxyRequest(this.getAppsOnce, [hostids], this.cache.applications); - } - }, { - key: 'getItems', - value: function getItems(hostids, appids, itemtype) { - var params = [hostids, appids, itemtype]; - return this.proxyRequest(this.getItemsOnce, params, this.cache.items); - } - }, { - key: 'getItemsByIDs', - value: function getItemsByIDs(itemids) { - var params = [itemids]; - return this.proxyRequest(this.getItemsByIdOnce, params, this.cache.items); - } - }, { - key: 'getITServices', - value: function getITServices() { - return this.proxyRequest(this.getITServicesOnce, [], this.cache.itServices); - } - }, { - key: 'getMacros', - value: function getMacros(hostids) { - // Merge global macros and host macros - var promises = [this.proxyRequest(this.getMacrosOnce, [hostids], this.cache.macros), this.proxyRequest(this.getGlobalMacrosOnce, [], this.cache.globalMacros)]; - - return Promise.all(promises).then(_.flatten); - } - }, { - key: 'getHistoryFromCache', - value: function getHistoryFromCache(items, time_from, time_till) { - var historyStorage = this.cache.history; - var full_history; - var expired = _.filter(_.keyBy(items, 'itemid'), function (item, itemid) { - return !historyStorage[itemid]; - }); - if (expired.length) { - return this.zabbixAPI.getHistory(expired, time_from, time_till).then(function (history) { - var grouped_history = _.groupBy(history, 'itemid'); - _.forEach(expired, function (item) { - var itemid = item.itemid; - historyStorage[itemid] = item; - historyStorage[itemid].time_from = time_from; - historyStorage[itemid].time_till = time_till; - historyStorage[itemid].history = grouped_history[itemid]; - }); - full_history = _.map(items, function (item) { - return historyStorage[item.itemid].history; - }); - return _.flatten(full_history, true); - }); - } else { - full_history = _.map(items, function (item) { - return historyStorage[item.itemid].history; - }); - return Promise.resolve(_.flatten(full_history, true)); - } - } - }, { - key: 'getHistoryFromAPI', - value: function getHistoryFromAPI(items, time_from, time_till) { - return this.zabbixAPI.getHistory(items, time_from, time_till); - } - }]); - - return ZabbixCachingProxy; - }()); - - _export('ZabbixCachingProxy', ZabbixCachingProxy); - - String.prototype.getHash = function () { - var hash = 0, - i, - chr, - len; - if (this.length !== 0) { - for (i = 0, len = this.length; i < len; i++) { - chr = this.charCodeAt(i); - hash = (hash << 5) - hash + chr; - hash |= 0; // Convert to 32bit integer - } - } - return hash; - }; - - // Fix for backward compatibility with lodash 2.4 - if (!_.keyBy) { - _.keyBy = _.indexBy; - } - } - }; -}); -//# sourceMappingURL=zabbixCachingProxy.js.map diff --git a/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js.map b/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js.map deleted file mode 100644 index 732292c..0000000 --- a/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../../../src/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js"],"names":["callAPIRequestOnce","func","promiseKeeper","argsHashFunc","hash","arguments","Promise","resolve","apply","then","result","getRequestHash","args","requestStamp","_","map","arg","undefined","isArray","sort","toString","join","getHash","getHistoryRequestHash","itemids","stamp","getDBQueryHash","consolidateBy","intervalMs","ZabbixCachingProxy","zabbixAPI","zabbixDBConnector","cacheOptions","dbConnector","cacheEnabled","enabled","ttl","cache","groups","hosts","applications","items","history","trends","macros","globalMacros","itServices","historyPromises","getHistory","bind","getHistoryDB","getTrendsDB","getTrends","groupPromises","getGroupsOnce","getGroups","hostPromises","getHostsOnce","getHosts","appPromises","getAppsOnce","getApps","itemPromises","getItemsOnce","getItems","itemByIdPromises","getItemsByIdOnce","getItemsByIDs","itServicesPromises","getITServicesOnce","getITService","macroPromises","getMacrosOnce","getMacros","globalMacroPromises","getGlobalMacrosOnce","getGlobalMacros","cacheObject","object_age","Date","now","timestamp","request","params","isExpired","value","proxyRequest","groupids","hostids","appids","itemtype","promises","all","flatten","time_from","time_till","historyStorage","full_history","expired","filter","keyBy","item","itemid","length","grouped_history","groupBy","forEach","String","prototype","i","chr","len","charCodeAt","indexBy"],"mappings":"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","file":"zabbixCachingProxy.js","sourcesContent":["import _ from 'lodash';\n\nexport class ZabbixCachingProxy {\n constructor(zabbixAPI, zabbixDBConnector, cacheOptions) {\n this.zabbixAPI = zabbixAPI;\n this.dbConnector = zabbixDBConnector;\n this.cacheEnabled = cacheOptions.enabled;\n this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default\n\n // Internal objects for data storing\n this.cache = {\n groups: {},\n hosts: {},\n applications: {},\n items: {},\n history: {},\n trends: {},\n macros: {},\n globalMacros: {},\n itServices: {}\n };\n\n this.historyPromises = {};\n\n // Don't run duplicated history requests\n this.getHistory = callAPIRequestOnce(_.bind(this.zabbixAPI.getHistory, this.zabbixAPI),\n this.historyPromises, getHistoryRequestHash);\n\n if (this.dbConnector) {\n this.getHistoryDB = callAPIRequestOnce(_.bind(this.dbConnector.getHistory, this.dbConnector),\n this.historyPromises, getDBQueryHash);\n this.getTrendsDB = callAPIRequestOnce(_.bind(this.dbConnector.getTrends, this.dbConnector),\n this.historyPromises, getDBQueryHash);\n }\n\n // Don't run duplicated requests\n this.groupPromises = {};\n this.getGroupsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGroups, this.zabbixAPI),\n this.groupPromises, getRequestHash);\n\n this.hostPromises = {};\n this.getHostsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getHosts, this.zabbixAPI),\n this.hostPromises, getRequestHash);\n\n this.appPromises = {};\n this.getAppsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getApps, this.zabbixAPI),\n this.appPromises, getRequestHash);\n\n this.itemPromises = {};\n this.getItemsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItems, this.zabbixAPI),\n this.itemPromises, getRequestHash);\n\n this.itemByIdPromises = {};\n this.getItemsByIdOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItemsByIDs, this.zabbixAPI),\n this.itemPromises, getRequestHash);\n\n this.itServicesPromises = {};\n this.getITServicesOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getITService, this.zabbixAPI),\n this.itServicesPromises, getRequestHash);\n\n this.macroPromises = {};\n this.getMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getMacros, this.zabbixAPI),\n this.macroPromises, getRequestHash);\n\n this.globalMacroPromises = {};\n this.getGlobalMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGlobalMacros, this.zabbixAPI),\n this.globalMacroPromises, getRequestHash);\n }\n\n isExpired(cacheObject) {\n if (cacheObject) {\n let object_age = Date.now() - cacheObject.timestamp;\n return !(cacheObject.timestamp && object_age < this.ttl);\n } else {\n return true;\n }\n }\n\n /**\n * Check that result is present in cache and up to date\n * or send request to API.\n */\n proxyRequest(request, params, cacheObject) {\n let hash = getRequestHash(params);\n if (this.cacheEnabled && !this.isExpired(cacheObject[hash])) {\n return Promise.resolve(cacheObject[hash].value);\n } else {\n return request(...params)\n .then(result => {\n cacheObject[hash] = {\n value: result,\n timestamp: Date.now()\n };\n return result;\n });\n }\n }\n\n getGroups() {\n return this.proxyRequest(this.getGroupsOnce, [], this.cache.groups);\n }\n\n getHosts(groupids) {\n return this.proxyRequest(this.getHostsOnce, [groupids], this.cache.hosts);\n }\n\n getApps(hostids) {\n return this.proxyRequest(this.getAppsOnce, [hostids], this.cache.applications);\n }\n\n getItems(hostids, appids, itemtype) {\n let params = [hostids, appids, itemtype];\n return this.proxyRequest(this.getItemsOnce, params, this.cache.items);\n }\n\n getItemsByIDs(itemids) {\n let params = [itemids];\n return this.proxyRequest(this.getItemsByIdOnce, params, this.cache.items);\n }\n\n getITServices() {\n return this.proxyRequest(this.getITServicesOnce, [], this.cache.itServices);\n }\n\n getMacros(hostids) {\n // Merge global macros and host macros\n let promises = [\n this.proxyRequest(this.getMacrosOnce, [hostids], this.cache.macros),\n this.proxyRequest(this.getGlobalMacrosOnce, [], this.cache.globalMacros)\n ];\n\n return Promise.all(promises).then(_.flatten);\n }\n\n getHistoryFromCache(items, time_from, time_till) {\n var historyStorage = this.cache.history;\n var full_history;\n var expired = _.filter(_.keyBy(items, 'itemid'), (item, itemid) => {\n return !historyStorage[itemid];\n });\n if (expired.length) {\n return this.zabbixAPI.getHistory(expired, time_from, time_till).then(function(history) {\n var grouped_history = _.groupBy(history, 'itemid');\n _.forEach(expired, item => {\n var itemid = item.itemid;\n historyStorage[itemid] = item;\n historyStorage[itemid].time_from = time_from;\n historyStorage[itemid].time_till = time_till;\n historyStorage[itemid].history = grouped_history[itemid];\n });\n full_history = _.map(items, item => {\n return historyStorage[item.itemid].history;\n });\n return _.flatten(full_history, true);\n });\n } else {\n full_history = _.map(items, function(item) {\n return historyStorage[item.itemid].history;\n });\n return Promise.resolve(_.flatten(full_history, true));\n }\n }\n\n getHistoryFromAPI(items, time_from, time_till) {\n return this.zabbixAPI.getHistory(items, time_from, time_till);\n }\n}\n\n/**\n * Wrap zabbix API request to prevent multiple calls\n * with same params when waiting for result.\n */\nfunction callAPIRequestOnce(func, promiseKeeper, argsHashFunc) {\n return function() {\n var hash = argsHashFunc(arguments);\n if (!promiseKeeper[hash]) {\n promiseKeeper[hash] = Promise.resolve(\n func.apply(this, arguments)\n .then(result => {\n promiseKeeper[hash] = null;\n return result;\n })\n );\n }\n return promiseKeeper[hash];\n };\n}\n\nfunction getRequestHash(args) {\n var requestStamp = _.map(args, arg => {\n if (arg === undefined) {\n return 'undefined';\n } else {\n if (_.isArray(arg)) {\n return arg.sort().toString();\n } else {\n return arg.toString();\n }\n }\n }).join();\n return requestStamp.getHash();\n}\n\nfunction getHistoryRequestHash(args) {\n let itemids = _.map(args[0], 'itemid');\n let stamp = itemids.join() + args[1] + args[2];\n return stamp.getHash();\n}\n\nfunction getDBQueryHash(args) {\n let itemids = _.map(args[0], 'itemid');\n let consolidateBy = args[3].consolidateBy;\n let intervalMs = args[3].intervalMs;\n let stamp = itemids.join() + args[1] + args[2] + consolidateBy + intervalMs;\n return stamp.getHash();\n}\n\nString.prototype.getHash = function() {\n var hash = 0, i, chr, len;\n if (this.length !== 0) {\n for (i = 0, len = this.length; i < len; i++) {\n chr = this.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n }\n return hash;\n};\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix/zabbix.js b/dist/datasource-zabbix/zabbix/zabbix.js index 8dd5e59..913b244 100644 --- a/dist/datasource-zabbix/zabbix/zabbix.js +++ b/dist/datasource-zabbix/zabbix/zabbix.js @@ -1,9 +1,9 @@ 'use strict'; -System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnector', './connectors/sql/zabbixDBConnector', './proxy/zabbixCachingProxy'], function (_export, _context) { +System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnector', './connectors/sql/zabbixDBConnector', './proxy/cachingProxy'], function (_export, _context) { "use strict"; - var _, utils, ZabbixAPIConnector, ZabbixDBConnector, ZabbixCachingProxy, _slicedToArray, _createClass, Zabbix; + var _, utils, ZabbixAPIConnector, ZabbixDBConnector, CachingProxy, _slicedToArray, _createClass, REQUESTS_TO_PROXYFY, REQUESTS_TO_CACHE, REQUESTS_TO_BIND, Zabbix; function _toConsumableArray(arr) { if (Array.isArray(arr)) { @@ -23,10 +23,6 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect } } - // angular - // .module('grafana.services') - // .factory('Zabbix', ZabbixFactory); - /////////////////////////////////////////////////////////////////////////////// /** @@ -99,8 +95,8 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect ZabbixAPIConnector = _connectorsZabbix_apiZabbixAPIConnector.ZabbixAPIConnector; }, function (_connectorsSqlZabbixDBConnector) { ZabbixDBConnector = _connectorsSqlZabbixDBConnector.ZabbixDBConnector; - }, function (_proxyZabbixCachingProxy) { - ZabbixCachingProxy = _proxyZabbixCachingProxy.ZabbixCachingProxy; + }, function (_proxyCachingProxy) { + CachingProxy = _proxyCachingProxy.CachingProxy; }], execute: function () { _slicedToArray = function () { @@ -159,6 +155,10 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect }; }(); + REQUESTS_TO_PROXYFY = ['getHistory', 'getTrend', 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion']; + REQUESTS_TO_CACHE = ['getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getITService']; + REQUESTS_TO_BIND = ['getHistory', 'getTrend', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion', 'login']; + _export('Zabbix', Zabbix = function () { /** @ngInject */ @@ -174,42 +174,111 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect sqlDatasourceId = options.sqlDatasourceId; - // Initialize Zabbix API - this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv); - - if (enableDirectDBConnection) { - this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv); - } - // Initialize caching proxy for requests var cacheOptions = { enabled: true, ttl: cacheTTL }; - this.cachingProxy = new ZabbixCachingProxy(this.zabbixAPI, this.dbConnector, cacheOptions); + this.cachingProxy = new CachingProxy(cacheOptions); - // Proxy methods - this.getHistory = this.cachingProxy.getHistory.bind(this.cachingProxy); - this.getMacros = this.cachingProxy.getMacros.bind(this.cachingProxy); - this.getItemsByIDs = this.cachingProxy.getItemsByIDs.bind(this.cachingProxy); + this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv); if (enableDirectDBConnection) { - this.getHistoryDB = this.cachingProxy.getHistoryDB.bind(this.cachingProxy); - this.getTrendsDB = this.cachingProxy.getTrendsDB.bind(this.cachingProxy); + this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv); + this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector); + this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector); } - this.getTrend = this.zabbixAPI.getTrend.bind(this.zabbixAPI); - this.getEvents = this.zabbixAPI.getEvents.bind(this.zabbixAPI); - this.getAlerts = this.zabbixAPI.getAlerts.bind(this.zabbixAPI); - this.getHostAlerts = this.zabbixAPI.getHostAlerts.bind(this.zabbixAPI); - this.getAcknowledges = this.zabbixAPI.getAcknowledges.bind(this.zabbixAPI); - this.getITService = this.zabbixAPI.getITService.bind(this.zabbixAPI); - this.getSLA = this.zabbixAPI.getSLA.bind(this.zabbixAPI); - this.getVersion = this.zabbixAPI.getVersion.bind(this.zabbixAPI); - this.login = this.zabbixAPI.login.bind(this.zabbixAPI); + this.proxyfyRequests(); + this.cacheRequests(); + this.bindRequests(); } _createClass(Zabbix, [{ + key: 'proxyfyRequests', + value: function proxyfyRequests() { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = REQUESTS_TO_PROXYFY[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var request = _step.value; + + this.zabbixAPI[request] = this.cachingProxy.proxyfy(this.zabbixAPI[request], request, this.zabbixAPI); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + }, { + key: 'cacheRequests', + value: function cacheRequests() { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = REQUESTS_TO_CACHE[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var request = _step2.value; + + this.zabbixAPI[request] = this.cachingProxy.cacheRequest(this.zabbixAPI[request], request, this.zabbixAPI); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + }, { + key: 'bindRequests', + value: function bindRequests() { + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = REQUESTS_TO_BIND[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var request = _step3.value; + + this[request] = this.zabbixAPI[request].bind(this.zabbixAPI); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3.return) { + _iterator3.return(); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + }, { key: 'getItemsFromTarget', value: function getItemsFromTarget(target, options) { var parts = ['group', 'host', 'application', 'item']; @@ -239,7 +308,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect }, { key: 'getAllGroups', value: function getAllGroups() { - return this.cachingProxy.getGroups(); + return this.zabbixAPI.getGroups(); } }, { key: 'getGroups', @@ -255,7 +324,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect return this.getGroups(groupFilter).then(function (groups) { var groupids = _.map(groups, 'groupid'); - return _this.cachingProxy.getHosts(groupids); + return _this.zabbixAPI.getHosts(groupids); }); } }, { @@ -272,7 +341,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect return this.getHosts(groupFilter, hostFilter).then(function (hosts) { var hostids = _.map(hosts, 'hostid'); - return _this2.cachingProxy.getApps(hostids); + return _this2.zabbixAPI.getApps(hostids); }); } }, { @@ -283,7 +352,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect return this.getHosts(groupFilter, hostFilter).then(function (hosts) { var hostids = _.map(hosts, 'hostid'); if (appFilter) { - return _this3.cachingProxy.getApps(hostids).then(function (apps) { + return _this3.zabbixAPI.getApps(hostids).then(function (apps) { return filterByQuery(apps, appFilter); }); } else { @@ -303,10 +372,10 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect return this.getApps(groupFilter, hostFilter, appFilter).then(function (apps) { if (apps.appFilterEmpty) { - return _this4.cachingProxy.getItems(apps.hostids, undefined, options.itemtype); + return _this4.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype); } else { var appids = _.map(apps, 'applicationid'); - return _this4.cachingProxy.getItems(undefined, appids, options.itemtype); + return _this4.zabbixAPI.getItems(undefined, appids, options.itemtype); } }).then(function (items) { if (!options.showDisabledItems) { @@ -341,7 +410,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect }, { key: 'getITServices', value: function getITServices(itServiceFilter) { - return this.cachingProxy.getITServices().then(function (itServices) { + return this.zabbixAPI.getITService().then(function (itServices) { return findByFilter(itServices, itServiceFilter); }); } diff --git a/dist/datasource-zabbix/zabbix/zabbix.js.map b/dist/datasource-zabbix/zabbix/zabbix.js.map index cbdb31a..51ac765 100644 --- a/dist/datasource-zabbix/zabbix/zabbix.js.map +++ b/dist/datasource-zabbix/zabbix/zabbix.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/datasource-zabbix/zabbix/zabbix.js"],"names":["findByName","list","name","finded","_","find","filterByName","filter","filterByRegex","regex","filterPattern","utils","buildRegex","zbx_obj","test","findByFilter","isRegex","filterByQuery","getHostIds","items","hostIds","map","item","hosts","uniq","flatten","ZabbixAPIConnector","ZabbixDBConnector","ZabbixCachingProxy","Zabbix","url","options","backendSrv","datasourceSrv","username","password","basicAuth","withCredentials","cacheTTL","enableDirectDBConnection","sqlDatasourceId","zabbixAPI","dbConnector","cacheOptions","enabled","ttl","cachingProxy","getHistory","bind","getMacros","getItemsByIDs","getHistoryDB","getTrendsDB","getTrend","getEvents","getAlerts","getHostAlerts","getAcknowledges","getITService","getSLA","getVersion","login","target","parts","filters","p","getItems","Promise","all","getHosts","getApps","then","results","apps","appFilterEmpty","getGroups","groupFilter","getAllGroups","groups","groupids","hostFilter","getAllHosts","hostids","appFilter","undefined","itemtype","appids","showDisabledItems","expandUserMacro","forEach","containsMacro","replaceMacro","macros","itemFilter","getAllItems","itServiceFilter","getITServices","itServices","promises","filteredGroups","filteredHosts","filteredApps","query","applicationids","getTriggers"],"mappings":"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","file":"zabbix.js","sourcesContent":["// import angular from 'angular';\nimport _ from 'lodash';\nimport * as utils from '../utils';\nimport { ZabbixAPIConnector } from './connectors/zabbix_api/zabbixAPIConnector';\nimport { ZabbixDBConnector } from './connectors/sql/zabbixDBConnector';\nimport { ZabbixCachingProxy } from './proxy/zabbixCachingProxy';\n\nexport class Zabbix {\n\n /** @ngInject */\n constructor(url, options, backendSrv, datasourceSrv) {\n let {\n username, password, basicAuth, withCredentials, cacheTTL,\n enableDirectDBConnection, sqlDatasourceId\n } = options;\n\n // Initialize Zabbix API\n this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);\n\n if (enableDirectDBConnection) {\n this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv);\n }\n\n // Initialize caching proxy for requests\n let cacheOptions = {\n enabled: true,\n ttl: cacheTTL\n };\n this.cachingProxy = new ZabbixCachingProxy(this.zabbixAPI, this.dbConnector, cacheOptions);\n\n // Proxy methods\n this.getHistory = this.cachingProxy.getHistory.bind(this.cachingProxy);\n this.getMacros = this.cachingProxy.getMacros.bind(this.cachingProxy);\n this.getItemsByIDs = this.cachingProxy.getItemsByIDs.bind(this.cachingProxy);\n\n if (enableDirectDBConnection) {\n this.getHistoryDB = this.cachingProxy.getHistoryDB.bind(this.cachingProxy);\n this.getTrendsDB = this.cachingProxy.getTrendsDB.bind(this.cachingProxy);\n }\n\n this.getTrend = this.zabbixAPI.getTrend.bind(this.zabbixAPI);\n this.getEvents = this.zabbixAPI.getEvents.bind(this.zabbixAPI);\n this.getAlerts = this.zabbixAPI.getAlerts.bind(this.zabbixAPI);\n this.getHostAlerts = this.zabbixAPI.getHostAlerts.bind(this.zabbixAPI);\n this.getAcknowledges = this.zabbixAPI.getAcknowledges.bind(this.zabbixAPI);\n this.getITService = this.zabbixAPI.getITService.bind(this.zabbixAPI);\n this.getSLA = this.zabbixAPI.getSLA.bind(this.zabbixAPI);\n this.getVersion = this.zabbixAPI.getVersion.bind(this.zabbixAPI);\n this.login = this.zabbixAPI.login.bind(this.zabbixAPI);\n }\n\n getItemsFromTarget(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n let filters = _.map(parts, p => target[p].filter);\n return this.getItems(...filters, options);\n }\n\n getHostsFromTarget(target) {\n let parts = ['group', 'host', 'application'];\n let filters = _.map(parts, p => target[p].filter);\n return Promise.all([\n this.getHosts(...filters),\n this.getApps(...filters),\n ]).then((results) => {\n let [hosts, apps] = results;\n if (apps.appFilterEmpty) {\n apps = [];\n }\n return [hosts, apps];\n });\n }\n\n getAllGroups() {\n return this.cachingProxy.getGroups();\n }\n\n getGroups(groupFilter) {\n return this.getAllGroups()\n .then(groups => findByFilter(groups, groupFilter));\n }\n\n /**\n * Get list of host belonging to given groups.\n */\n getAllHosts(groupFilter) {\n return this.getGroups(groupFilter)\n .then(groups => {\n let groupids = _.map(groups, 'groupid');\n return this.cachingProxy.getHosts(groupids);\n });\n }\n\n getHosts(groupFilter, hostFilter) {\n return this.getAllHosts(groupFilter)\n .then(hosts => findByFilter(hosts, hostFilter));\n }\n\n /**\n * Get list of applications belonging to given groups and hosts.\n */\n getAllApps(groupFilter, hostFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n return this.cachingProxy.getApps(hostids);\n });\n }\n\n getApps(groupFilter, hostFilter, appFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n if (appFilter) {\n return this.cachingProxy.getApps(hostids)\n .then(apps => filterByQuery(apps, appFilter));\n } else {\n return {\n appFilterEmpty: true,\n hostids: hostids\n };\n }\n });\n }\n\n getAllItems(groupFilter, hostFilter, appFilter, options = {}) {\n return this.getApps(groupFilter, hostFilter, appFilter)\n .then(apps => {\n if (apps.appFilterEmpty) {\n return this.cachingProxy.getItems(apps.hostids, undefined, options.itemtype);\n } else {\n let appids = _.map(apps, 'applicationid');\n return this.cachingProxy.getItems(undefined, appids, options.itemtype);\n }\n })\n .then(items => {\n if (!options.showDisabledItems) {\n items = _.filter(items, {'status': '0'});\n }\n\n return items;\n })\n .then(this.expandUserMacro.bind(this));\n }\n\n expandUserMacro(items) {\n let hostids = getHostIds(items);\n return this.getMacros(hostids)\n .then(macros => {\n _.forEach(items, item => {\n if (utils.containsMacro(item.name)) {\n item.name = utils.replaceMacro(item, macros);\n }\n });\n return items;\n });\n }\n\n getItems(groupFilter, hostFilter, appFilter, itemFilter, options = {}) {\n return this.getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => filterByQuery(items, itemFilter));\n }\n\n getITServices(itServiceFilter) {\n return this.cachingProxy.getITServices()\n .then(itServices => findByFilter(itServices, itServiceFilter));\n }\n\n /**\n * Build query - convert target filters to array of Zabbix items\n */\n getTriggers(groupFilter, hostFilter, appFilter, options) {\n let promises = [\n this.getGroups(groupFilter),\n this.getHosts(groupFilter, hostFilter),\n this.getApps(groupFilter, hostFilter, appFilter)\n ];\n\n return Promise.all(promises)\n .then(results => {\n let filteredGroups = results[0];\n let filteredHosts = results[1];\n let filteredApps = results[2];\n let query = {};\n\n if (appFilter) {\n query.applicationids = _.flatten(_.map(filteredApps, 'applicationid'));\n }\n if (hostFilter) {\n query.hostids = _.map(filteredHosts, 'hostid');\n }\n if (groupFilter) {\n query.groupids = _.map(filteredGroups, 'groupid');\n }\n\n return query;\n }).then(query => {\n return this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options);\n });\n }\n}\n\n// angular\n// .module('grafana.services')\n// .factory('Zabbix', ZabbixFactory);\n\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Find group, host, app or item by given name.\n * @param list list of groups, apps or other\n * @param name visible name\n * @return array with finded element or empty array\n */\nfunction findByName(list, name) {\n var finded = _.find(list, {'name': name});\n if (finded) {\n return [finded];\n } else {\n return [];\n }\n}\n\n/**\n * Different hosts can contains applications and items with same name.\n * For this reason use _.filter, which return all elements instead _.find,\n * which return only first finded.\n * @param {[type]} list list of elements\n * @param {[type]} name app name\n * @return {[type]} array with finded element or empty array\n */\nfunction filterByName(list, name) {\n var finded = _.filter(list, {'name': name});\n if (finded) {\n return finded;\n } else {\n return [];\n }\n}\n\nfunction filterByRegex(list, regex) {\n var filterPattern = utils.buildRegex(regex);\n return _.filter(list, function (zbx_obj) {\n return filterPattern.test(zbx_obj.name);\n });\n}\n\nfunction findByFilter(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return findByName(list, filter);\n }\n}\n\nfunction filterByQuery(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return filterByName(list, filter);\n }\n}\n\nfunction getHostIds(items) {\n let hostIds = _.map(items, item => {\n return _.map(item.hosts, 'hostid');\n });\n return _.uniq(_.flatten(hostIds));\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/datasource-zabbix/zabbix/zabbix.js"],"names":["findByName","list","name","finded","_","find","filterByName","filter","filterByRegex","regex","filterPattern","utils","buildRegex","zbx_obj","test","findByFilter","isRegex","filterByQuery","getHostIds","items","hostIds","map","item","hosts","uniq","flatten","ZabbixAPIConnector","ZabbixDBConnector","CachingProxy","REQUESTS_TO_PROXYFY","REQUESTS_TO_CACHE","REQUESTS_TO_BIND","Zabbix","url","options","backendSrv","datasourceSrv","username","password","basicAuth","withCredentials","cacheTTL","enableDirectDBConnection","sqlDatasourceId","cacheOptions","enabled","ttl","cachingProxy","zabbixAPI","dbConnector","getHistoryDB","proxyfyWithCache","getHistory","getTrendsDB","getTrends","proxyfyRequests","cacheRequests","bindRequests","request","proxyfy","cacheRequest","bind","target","parts","filters","p","getItems","Promise","all","getHosts","getApps","then","results","apps","appFilterEmpty","getGroups","groupFilter","getAllGroups","groups","groupids","hostFilter","getAllHosts","hostids","appFilter","undefined","itemtype","appids","showDisabledItems","expandUserMacro","getMacros","forEach","containsMacro","replaceMacro","macros","itemFilter","getAllItems","itServiceFilter","getITService","itServices","promises","filteredGroups","filteredHosts","filteredApps","query","applicationids","getTriggers"],"mappings":"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","file":"zabbix.js","sourcesContent":["import _ from 'lodash';\nimport * as utils from '../utils';\nimport { ZabbixAPIConnector } from './connectors/zabbix_api/zabbixAPIConnector';\nimport { ZabbixDBConnector } from './connectors/sql/zabbixDBConnector';\nimport { CachingProxy } from './proxy/cachingProxy';\n\nconst REQUESTS_TO_PROXYFY = [\n 'getHistory', 'getTrend', 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs',\n 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion'\n];\n\nconst REQUESTS_TO_CACHE = [\n 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getITService'\n];\n\nconst REQUESTS_TO_BIND = [\n 'getHistory', 'getTrend', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts',\n 'getAcknowledges', 'getITService', 'getSLA', 'getVersion', 'login'\n];\n\nexport class Zabbix {\n\n /** @ngInject */\n constructor(url, options, backendSrv, datasourceSrv) {\n let {\n username,\n password,\n basicAuth,\n withCredentials,\n cacheTTL,\n enableDirectDBConnection,\n sqlDatasourceId\n } = options;\n\n // Initialize caching proxy for requests\n let cacheOptions = {\n enabled: true,\n ttl: cacheTTL\n };\n this.cachingProxy = new CachingProxy(cacheOptions);\n\n this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);\n\n if (enableDirectDBConnection) {\n this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv);\n this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector);\n this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector);\n }\n\n this.proxyfyRequests();\n this.cacheRequests();\n this.bindRequests();\n }\n\n proxyfyRequests() {\n for (let request of REQUESTS_TO_PROXYFY) {\n this.zabbixAPI[request] = this.cachingProxy.proxyfy(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n cacheRequests() {\n for (let request of REQUESTS_TO_CACHE) {\n this.zabbixAPI[request] = this.cachingProxy.cacheRequest(this.zabbixAPI[request], request, this.zabbixAPI);\n }\n }\n\n bindRequests() {\n for (let request of REQUESTS_TO_BIND) {\n this[request] = this.zabbixAPI[request].bind(this.zabbixAPI);\n }\n }\n\n getItemsFromTarget(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n let filters = _.map(parts, p => target[p].filter);\n return this.getItems(...filters, options);\n }\n\n getHostsFromTarget(target) {\n let parts = ['group', 'host', 'application'];\n let filters = _.map(parts, p => target[p].filter);\n return Promise.all([\n this.getHosts(...filters),\n this.getApps(...filters),\n ]).then((results) => {\n let [hosts, apps] = results;\n if (apps.appFilterEmpty) {\n apps = [];\n }\n return [hosts, apps];\n });\n }\n\n getAllGroups() {\n return this.zabbixAPI.getGroups();\n }\n\n getGroups(groupFilter) {\n return this.getAllGroups()\n .then(groups => findByFilter(groups, groupFilter));\n }\n\n /**\n * Get list of host belonging to given groups.\n */\n getAllHosts(groupFilter) {\n return this.getGroups(groupFilter)\n .then(groups => {\n let groupids = _.map(groups, 'groupid');\n return this.zabbixAPI.getHosts(groupids);\n });\n }\n\n getHosts(groupFilter, hostFilter) {\n return this.getAllHosts(groupFilter)\n .then(hosts => findByFilter(hosts, hostFilter));\n }\n\n /**\n * Get list of applications belonging to given groups and hosts.\n */\n getAllApps(groupFilter, hostFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n return this.zabbixAPI.getApps(hostids);\n });\n }\n\n getApps(groupFilter, hostFilter, appFilter) {\n return this.getHosts(groupFilter, hostFilter)\n .then(hosts => {\n let hostids = _.map(hosts, 'hostid');\n if (appFilter) {\n return this.zabbixAPI.getApps(hostids)\n .then(apps => filterByQuery(apps, appFilter));\n } else {\n return {\n appFilterEmpty: true,\n hostids: hostids\n };\n }\n });\n }\n\n getAllItems(groupFilter, hostFilter, appFilter, options = {}) {\n return this.getApps(groupFilter, hostFilter, appFilter)\n .then(apps => {\n if (apps.appFilterEmpty) {\n return this.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype);\n } else {\n let appids = _.map(apps, 'applicationid');\n return this.zabbixAPI.getItems(undefined, appids, options.itemtype);\n }\n })\n .then(items => {\n if (!options.showDisabledItems) {\n items = _.filter(items, {'status': '0'});\n }\n\n return items;\n })\n .then(this.expandUserMacro.bind(this));\n }\n\n expandUserMacro(items) {\n let hostids = getHostIds(items);\n return this.getMacros(hostids)\n .then(macros => {\n _.forEach(items, item => {\n if (utils.containsMacro(item.name)) {\n item.name = utils.replaceMacro(item, macros);\n }\n });\n return items;\n });\n }\n\n getItems(groupFilter, hostFilter, appFilter, itemFilter, options = {}) {\n return this.getAllItems(groupFilter, hostFilter, appFilter, options)\n .then(items => filterByQuery(items, itemFilter));\n }\n\n getITServices(itServiceFilter) {\n return this.zabbixAPI.getITService()\n .then(itServices => findByFilter(itServices, itServiceFilter));\n }\n\n /**\n * Build query - convert target filters to array of Zabbix items\n */\n getTriggers(groupFilter, hostFilter, appFilter, options) {\n let promises = [\n this.getGroups(groupFilter),\n this.getHosts(groupFilter, hostFilter),\n this.getApps(groupFilter, hostFilter, appFilter)\n ];\n\n return Promise.all(promises)\n .then(results => {\n let filteredGroups = results[0];\n let filteredHosts = results[1];\n let filteredApps = results[2];\n let query = {};\n\n if (appFilter) {\n query.applicationids = _.flatten(_.map(filteredApps, 'applicationid'));\n }\n if (hostFilter) {\n query.hostids = _.map(filteredHosts, 'hostid');\n }\n if (groupFilter) {\n query.groupids = _.map(filteredGroups, 'groupid');\n }\n\n return query;\n }).then(query => {\n return this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options);\n });\n }\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Find group, host, app or item by given name.\n * @param list list of groups, apps or other\n * @param name visible name\n * @return array with finded element or empty array\n */\nfunction findByName(list, name) {\n var finded = _.find(list, {'name': name});\n if (finded) {\n return [finded];\n } else {\n return [];\n }\n}\n\n/**\n * Different hosts can contains applications and items with same name.\n * For this reason use _.filter, which return all elements instead _.find,\n * which return only first finded.\n * @param {[type]} list list of elements\n * @param {[type]} name app name\n * @return {[type]} array with finded element or empty array\n */\nfunction filterByName(list, name) {\n var finded = _.filter(list, {'name': name});\n if (finded) {\n return finded;\n } else {\n return [];\n }\n}\n\nfunction filterByRegex(list, regex) {\n var filterPattern = utils.buildRegex(regex);\n return _.filter(list, function (zbx_obj) {\n return filterPattern.test(zbx_obj.name);\n });\n}\n\nfunction findByFilter(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return findByName(list, filter);\n }\n}\n\nfunction filterByQuery(list, filter) {\n if (utils.isRegex(filter)) {\n return filterByRegex(list, filter);\n } else {\n return filterByName(list, filter);\n }\n}\n\nfunction getHostIds(items) {\n let hostIds = _.map(items, item => {\n return _.map(item.hosts, 'hostid');\n });\n return _.uniq(_.flatten(hostIds));\n}\n"]} \ No newline at end of file diff --git a/dist/vendor/npm/tether.min.js b/dist/vendor/npm/tether.min.js index d16b9b1..2e55d27 100644 --- a/dist/vendor/npm/tether.min.js +++ b/dist/vendor/npm/tether.min.js @@ -1 +1 @@ -!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=t.getBoundingClientRect(),o={};for(var i in e)o[i]=e[i];if(t.ownerDocument!==document){var r=t.ownerDocument.defaultView.frameElement;if(r){var s=n(r);o.top+=s.top,o.bottom+=s.top,o.left+=s.left,o.right+=s.left}}return o}function r(t){var e=getComputedStyle(t)||{},o=e.position,i=[];if("fixed"===o)return[t];for(var n=t;(n=n.parentNode)&&n&&1===n.nodeType;){var r=void 0;try{r=getComputedStyle(n)}catch(s){}if("undefined"==typeof r||null===r)return i.push(n),i;var a=r,f=a.overflow,l=a.overflowX,h=a.overflowY;/(auto|scroll)/.test(f+h+l)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&i.push(n)}return i.push(t.ownerDocument.body),t.ownerDocument!==document&&i.push(t.ownerDocument.defaultView),i}function s(){A&&document.body.removeChild(A),A=null}function a(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i=n(t),r=P();return i.top-=r.top,i.left-=r.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function f(t){return t.offsetParent||document.documentElement}function l(){if(M)return M;var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");h(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return M={width:n,height:n}}function h(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function d(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=c(t).replace(o," ");g(t,i)}}function p(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{d(t,e);var o=c(t)+(" "+e);g(t,o)}}function u(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=c(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function c(t){return t.className instanceof t.ownerDocument.defaultView.SVGAnimatedString?t.className.baseVal:t.className}function g(t,e){t.setAttribute("class",e)}function m(t,e,o){o.forEach(function(o){e.indexOf(o)===-1&&u(t,o)&&d(t,o)}),e.forEach(function(e){u(t,e)||p(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function y(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function b(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function w(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;i1?o-1:0),n=1;n16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&b()-t<10||(null!=o&&(clearTimeout(o),o=null),t=b(),X(),e=b()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var F={center:"center",left:"right",right:"left"},H={middle:"middle",top:"bottom",bottom:"top"},N={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},U=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=F[e.left]),"auto"===i&&(i=H[e.top]),{left:o,top:i}},V=function(t){var e=t.left,o=t.top;return"undefined"!=typeof N[t.left]&&(e=N[t.left]),"undefined"!=typeof N[t.top]&&(o=N[t.top]),{left:e,top:o}},R=function(t){var e=t.split(" "),o=z(e,2),i=o[0],n=o[1];return{top:i,left:n}},q=R,I=function(t){function e(t){var o=this;i(this,e),j(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),D.push(this),this.history=[],this.setOptions(t,!1),x.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return v(e,t),E(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]||arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=h(i,t);var n=this.options,s=n.element,a=n.target,f=n.targetModifier;if(this.element=s,this.target=a,this.targetModifier=f,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),p(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&p(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=q(this.options.targetAttachment),this.attachment=q(this.options.attachment),this.offset=R(this.options.offset),this.targetOffset=R(this.options.targetOffset),"undefined"!=typeof this.scrollParents&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=r(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return a(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=a(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,r=0;n&&(r=15);var s=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-r,e={width:15,height:.975*s*(s/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;s<408&&this.target===document.body&&(f=-11e-5*Math.pow(s,2)-.00727*s+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-s);return e.top=l*(s-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];this.options.addTargetClasses!==!1&&p(this.target,this.getClass("enabled")),p(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==t.target.ownerDocument&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;d(this.target,this.getClass("enabled")),d(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),D.forEach(function(e,o){e===t&&D.splice(o,1)}),0===D.length&&s()}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),k(function(){"undefined"!=typeof o._addAttachClasses&&(m(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&m(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];if(this.enabled){this.clearCache();var o=U(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return a(t.element)}),n=i.width,r=i.height;if(0===n&&0===r&&"undefined"!=typeof this.lastSize){var s=this.lastSize;n=s.width,r=s.height}else this.lastSize={width:n,height:r};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=h,p=C(V(this.attachment),{width:n,height:r}),u=C(V(o),d),c=C(this.offset,{width:n,height:r}),g=C(this.targetOffset,d);p=w(p,c),u=w(u,g);for(var m=h.left+u.left-p.left,v=h.top+u.top-p.top,y=0;yA.documentElement.clientHeight&&(S=this.cache("scrollbar-size",l),E.viewport.bottom-=S.height),T.innerWidth>A.documentElement.clientWidth&&(S=this.cache("scrollbar-size",l),E.viewport.right-=S.width),["","static"].indexOf(A.body.style.position)!==-1&&["","static"].indexOf(A.body.parentElement.style.position)!==-1||(E.page.bottom=A.body.scrollHeight-v-r,E.page.right=A.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return f(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return a(e)}),i=getComputedStyle(e),n=o,r={};if(["Top","Left","Bottom","Right"].forEach(function(t){r[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=A.body.scrollWidth-o.left-n.width+r.right,o.bottom=A.body.scrollHeight-o.top-n.height+r.bottom,E.page.top>=o.top+r.top&&E.page.bottom>=o.bottom&&E.page.left>=o.left+r.left&&E.page.right>=o.right){var s=e.scrollTop,l=e.scrollLeft;E.offset={top:E.page.top-o.top+s-r.top,left:E.page.left-o.left+l-r.left}}}(),this.move(E),this.history.unshift(E),this.history.length>3&&this.history.pop(),e&&_(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,s=0;s=0){var c=a.split(" "),m=z(c,2);d=m[0],h=m[1]}else h=d=a;var b=O(e,r);"target"!==d&&"both"!==d||(ob[3]&&"bottom"===v.top&&(o-=p,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ob[3]&&o-(s-p)>=b[1]&&(o-=s-p,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+s>b[3]?(o-=p,v.top="top",o-=s,y.top="bottom"):"bottom"===y.top&&ob[3]&&"top"===y.top?(o-=s,y.top="bottom"):ob[2]&&"right"===v.left&&(i-=u,v.left="left")),"together"===h&&(ib[2]&&"right"===v.left?"left"===y.left?(i-=u,v.left="left",i-=f,y.left="right"):"right"===y.left&&(i-=u,v.left="left",i+=f,y.left="left"):"center"===v.left&&(i+f>b[2]&&"left"===y.left?(i-=f,y.left="right"):ib[3]&&"top"===y.top&&(o-=s,y.top="bottom")),"element"!==h&&"both"!==h||(ib[2]&&("left"===y.left?(i-=f,y.left="right"):"center"===y.left&&(i-=f/2,y.left="right"))),"string"==typeof l?l=l.split(",").map(function(t){return t.trim()}):l===!0&&(l=["top","left","right","bottom"]),l=l||[];var w=[],C=[];o=0?(o=b[1],w.push("top")):C.push("top")),o+s>b[3]&&(l.indexOf("bottom")>=0?(o=b[3]-s,w.push("bottom")):C.push("bottom")),i=0?(i=b[0],w.push("left")):C.push("left")),i+f>b[2]&&(l.indexOf("right")>=0?(i=b[2]-f,w.push("right")):C.push("right")),w.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),g.push(t),w.forEach(function(e){g.push(t+"-"+e)})}(),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),g.push(t),C.forEach(function(e){g.push(t+"-"+e)})}(),(w.indexOf("left")>=0||w.indexOf("right")>=0)&&(y.left=v.left=!1),(w.indexOf("top")>=0||w.indexOf("bottom")>=0)&&(y.top=v.top=!1),v.top===n.top&&v.left===n.left&&y.top===e.attachment.top&&y.left===e.attachment.left||(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,g,c),m(e.element,g,c)}),{top:o,left:i}}});var Y=x.Utils,a=Y.getBounds,m=Y.updateClasses,k=Y.defer;x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return a(e.element)}),r=n.height,s=n.width,f=this.getTargetBounds(),l=o+r,h=i+s,d=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==h||d.push(t)}),i<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==l||d.push(t)});var p=[],u=[],c=["left","top","right","bottom"];return p.push(this.getClass("abutted")),c.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),d.length&&u.push(this.getClass("abutted")),d.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,u,p),m(e.element,u,p)}),!0}});var z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return x.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=z(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),$}); \ No newline at end of file +!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?module.exports=e():t.Tether=e()}(this,function(){"use strict";function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t){var o=t.getBoundingClientRect(),i={};for(var n in o)i[n]=o[n];if(t.ownerDocument!==document){var r=t.ownerDocument.defaultView.frameElement;if(r){var s=e(r);i.top+=s.top,i.bottom+=s.top,i.left+=s.left,i.right+=s.left}}return i}function o(t){var e=getComputedStyle(t)||{},o=e.position,i=[];if("fixed"===o)return[t];for(var n=t;(n=n.parentNode)&&n&&1===n.nodeType;){var r=void 0;try{r=getComputedStyle(n)}catch(s){}if("undefined"==typeof r||null===r)return i.push(n),i;var a=r,f=a.overflow,l=a.overflowX,h=a.overflowY;/(auto|scroll|overlay)/.test(f+h+l)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&i.push(n)}return i.push(t.ownerDocument.body),t.ownerDocument!==document&&i.push(t.ownerDocument.defaultView),i}function i(){O&&document.body.removeChild(O),O=null}function n(t){var o=void 0;t===document?(o=document,t=document.documentElement):o=t.ownerDocument;var i=o.documentElement,n=e(t),r=A();return n.top-=r.top,n.left-=r.left,"undefined"==typeof n.width&&(n.width=document.body.scrollWidth-n.left-n.right),"undefined"==typeof n.height&&(n.height=document.body.scrollHeight-n.top-n.bottom),n.top=n.top-i.clientTop,n.left=n.left-i.clientLeft,n.right=o.body.clientWidth-n.width-n.left,n.bottom=o.body.clientHeight-n.height-n.top,n}function r(t){return t.offsetParent||document.documentElement}function s(){if(T)return T;var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");a(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return T={width:n,height:n}}function a(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function f(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=d(t).replace(o," ");p(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{f(t,e);var o=d(t)+(" "+e);p(t,o)}}function h(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=d(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function d(t){return t.className instanceof t.ownerDocument.defaultView.SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function u(t,e,o){o.forEach(function(o){e.indexOf(o)===-1&&h(t,o)&&f(t,o)}),e.forEach(function(e){h(t,e)||l(t,e)})}function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"object"==typeof performance&&"function"==typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;i1?o-1:0),n=1;n16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||(null!=o&&(clearTimeout(o),o=null),t=m(),Y(),e=m()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var L={center:"center",left:"right",right:"left"},D={middle:"middle",top:"bottom",bottom:"top"},X={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},F=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=L[e.left]),"auto"===i&&(i=D[e.top]),{left:o,top:i}},H=function(t){var e=t.left,o=t.top;return"undefined"!=typeof X[t.left]&&(e=X[t.left]),"undefined"!=typeof X[t.top]&&(o=X[t.top]),{left:e,top:o}},N=function(t){var e=t.split(" "),o=k(e,2),i=o[0],n=o[1];return{top:i,left:n}},U=N,V=function(e){function h(e){var o=this;t(this,h),_(Object.getPrototypeOf(h.prototype),"constructor",this).call(this),this.position=this.position.bind(this),z.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return c(h,e),w(h,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,i=arguments.length<=1||void 0===arguments[1]||arguments[1],n={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=a(n,t);var r=this.options,s=r.element,f=r.target,h=r.targetModifier;if(this.element=s,this.target=f,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=U(this.options.targetAttachment),this.attachment=U(this.options.attachment),this.offset=N(this.options.offset),this.targetOffset=N(this.options.targetOffset),"undefined"!=typeof this.scrollParents&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=o(this.target),this.options.enabled!==!1&&this.enable(i)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return n(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=n(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;r&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;a<408&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-a);return e.top=l*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==t.target.ownerDocument&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;f(this.target,this.getClass("enabled")),f(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),z.forEach(function(e,o){e===t&&z.splice(o,1)}),0===z.length&&i()}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),P(function(){"undefined"!=typeof o._addAttachClasses&&(u(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&u(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];if(this.enabled){this.clearCache();var o=F(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return n(t.element)}),a=i.width,f=i.height;if(0===a&&0===f&&"undefined"!=typeof this.lastSize){var l=this.lastSize;a=l.width,f=l.height}else this.lastSize={width:a,height:f};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=h,p=y(H(this.attachment),{width:a,height:f}),u=y(H(o),d),c=y(this.offset,{width:a,height:f}),g=y(this.targetOffset,d);p=v(p,c),u=v(u,g);for(var m=h.left+u.left-p.left,b=h.top+u.top-p.top,w=0;wA.documentElement.clientHeight&&(S=this.cache("scrollbar-size",s),x.viewport.bottom-=S.height),T.innerWidth>A.documentElement.clientWidth&&(S=this.cache("scrollbar-size",s),x.viewport.right-=S.width),["","static"].indexOf(A.body.style.position)!==-1&&["","static"].indexOf(A.body.parentElement.style.position)!==-1||(x.page.bottom=A.body.scrollHeight-b-f,x.page.right=A.body.scrollWidth-m-a),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return r(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return n(e)}),i=getComputedStyle(e),s=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=A.body.scrollWidth-o.left-s.width+a.right,o.bottom=A.body.scrollHeight-o.top-s.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,l=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+l-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&M(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var s=!1,f=0;f=0){var u=s.split(" "),g=k(u,2);d=g[0],h=g[1]}else h=d=s;var w=b(e,n);"target"!==d&&"both"!==d||(ow[3]&&"bottom"===v.top&&(o-=p,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ow[3]&&o-(f-p)>=w[1]&&(o-=f-p,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+f>w[3]?(o-=p,v.top="top",o-=f,y.top="bottom"):"bottom"===y.top&&ow[3]&&"top"===y.top?(o-=f,y.top="bottom"):ow[2]&&"right"===v.left&&(i-=c,v.left="left")),"together"===h&&(iw[2]&&"right"===v.left?"left"===y.left?(i-=c,v.left="left",i-=l,y.left="right"):"right"===y.left&&(i-=c,v.left="left",i+=l,y.left="left"):"center"===v.left&&(i+l>w[2]&&"left"===y.left?(i-=l,y.left="right"):iw[3]&&"top"===y.top&&(o-=f,y.top="bottom")),"element"!==h&&"both"!==h||(iw[2]&&("left"===y.left?(i-=l,y.left="right"):"center"===y.left&&(i-=l/2,y.left="right"))),"string"==typeof a?a=a.split(",").map(function(t){return t.trim()}):a===!0&&(a=["top","left","right","bottom"]),a=a||[];var C=[],O=[];o=0?(o=w[1],C.push("top")):O.push("top")),o+f>w[3]&&(a.indexOf("bottom")>=0?(o=w[3]-f,C.push("bottom")):O.push("bottom")),i=0?(i=w[0],C.push("left")):O.push("left")),i+l>w[2]&&(a.indexOf("right")>=0?(i=w[2]-l,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),v.top===r.top&&v.left===r.left&&y.top===e.attachment.top&&y.left===e.attachment.left||(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),P(function(){e.options.addTargetClasses!==!1&&u(e.target,m,g),u(e.element,m,g)}),{top:o,left:i}}});var B=C.Utils,n=B.getBounds,u=B.updateClasses,P=B.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,r=this.cache("element-bounds",function(){return n(e.element)}),s=r.height,a=r.width,f=this.getTargetBounds(),l=o+s,h=i+a,d=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==h||d.push(t)}),i<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==l||d.push(t)});var p=[],c=[],g=["left","top","right","bottom"];return p.push(this.getClass("abutted")),g.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),d.length&&c.push(this.getClass("abutted")),d.forEach(function(t){c.push(e.getClass("abutted")+"-"+t)}),P(function(){e.options.addTargetClasses!==!1&&u(e.target,c,p),u(e.element,c,p)}),!0}});var k=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=k(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R}); \ No newline at end of file diff --git a/src/datasource-zabbix/datasource.js b/src/datasource-zabbix/datasource.js index f0aa06f..4c8ca67 100644 --- a/src/datasource-zabbix/datasource.js +++ b/src/datasource-zabbix/datasource.js @@ -54,6 +54,7 @@ class ZabbixAPIDatasource { this.sqlDatasourceId = dbConnectionOptions.datasourceId; let zabbixOptions = { + url: this.url, username: this.username, password: this.password, basicAuth: this.basicAuth, @@ -63,7 +64,7 @@ class ZabbixAPIDatasource { sqlDatasourceId: this.sqlDatasourceId }; - this.zabbix = new Zabbix(this.url, zabbixOptions, backendSrv, datasourceSrv); + this.zabbix = new Zabbix(zabbixOptions, backendSrv, datasourceSrv); } //////////////////////// diff --git a/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js b/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js index 3e8f2a7..d47ed4b 100644 --- a/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js +++ b/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js @@ -164,7 +164,7 @@ function convertGrafanaTSResponse(time_series, items, addHostName) { var host = _.find(hosts, {'hostid': item.hostid}); alias = host.name + ": " + alias; } - // zabbixCachingProxy deduplicates requests and returns one time series for equal queries. + // CachingProxy deduplicates requests and returns one time series for equal queries. // Clone is needed to prevent changing of series object shared between all targets. let datapoints = _.cloneDeep(series.points); return { diff --git a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js index ab77e84..30838f2 100644 --- a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js +++ b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js @@ -1,6 +1,6 @@ import _ from 'lodash'; import * as utils from '../../../utils'; -import { ZabbixAPICoreService } from './zabbixAPICore'; +import { ZabbixAPICore } from './zabbixAPICore'; /** * Zabbix API Wrapper. @@ -25,7 +25,7 @@ export class ZabbixAPIConnector { this.loginErrorCount = 0; this.maxLoginAttempts = 3; - this.zabbixAPICore = new ZabbixAPICoreService(backendSrv); + this.zabbixAPICore = new ZabbixAPICore(backendSrv); this.getTrend = this.getTrend_ZBXNEXT1193; //getTrend = getTrend_30; diff --git a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js index a8875c9..97b6c7b 100644 --- a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js +++ b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js @@ -2,7 +2,7 @@ * General Zabbix API methods */ -export class ZabbixAPICoreService { +export class ZabbixAPICore { /** @ngInject */ constructor(backendSrv) { diff --git a/src/datasource-zabbix/zabbix/proxy/cachingProxy.js b/src/datasource-zabbix/zabbix/proxy/cachingProxy.js new file mode 100644 index 0000000..ec36b1f --- /dev/null +++ b/src/datasource-zabbix/zabbix/proxy/cachingProxy.js @@ -0,0 +1,108 @@ +/** + * This module allows to deduplicate function calls with the same params and + * cache result of function call. + */ + +export class CachingProxy { + + constructor(cacheOptions) { + this.cacheEnabled = cacheOptions.enabled; + this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default + + // Internal objects for data storing + this.cache = {}; + this.promises = {}; + } + + /** + * Check that result is present in the cache and is up to date or send request otherwise. + */ + cacheRequest(func, funcName, funcScope) { + return cacheRequest(func, funcName, funcScope, this); + } + + /** + * Wrap request to prevent multiple calls with same params when request is waiting for response. + */ + proxyfy(func, funcName, funcScope) { + if (!this.promises[funcName]) { + this.promises[funcName] = {}; + } + const promiseKeeper = this.promises[funcName]; + return callOnce(func, promiseKeeper, funcScope); + } + + proxyfyWithCache(func, funcName, funcScope) { + let proxyfied = this.proxyfy(func, funcName, funcScope); + return this.cacheRequest(proxyfied, funcName, funcScope); + } + + _isExpired(cacheObject) { + if (cacheObject) { + let object_age = Date.now() - cacheObject.timestamp; + return !(cacheObject.timestamp && object_age < this.ttl); + } else { + return true; + } + } +} + +/** + * Wrap request to prevent multiple calls + * with same params when waiting for result. + */ +function callOnce(func, promiseKeeper, funcScope) { + return function() { + var hash = getRequestHash(arguments); + if (!promiseKeeper[hash]) { + promiseKeeper[hash] = Promise.resolve( + func.apply(funcScope, arguments) + .then(result => { + promiseKeeper[hash] = null; + return result; + }) + ); + } + return promiseKeeper[hash]; + }; +} + +function cacheRequest(func, funcName, funcScope, self) { + return function() { + if (!self.cache[funcName]) { + self.cache[funcName] = {}; + } + + let cacheObject = self.cache[funcName]; + let hash = getRequestHash(arguments); + if (self.cacheEnabled && !self._isExpired(cacheObject[hash])) { + return Promise.resolve(cacheObject[hash].value); + } else { + return func.apply(funcScope, arguments) + .then(result => { + cacheObject[hash] = { + value: result, + timestamp: Date.now() + }; + return result; + }); + } + }; +} + +function getRequestHash(args) { + const argsJson = JSON.stringify(args); + return argsJson.getHash(); +} + +String.prototype.getHash = function() { + var hash = 0, i, chr, len; + if (this.length !== 0) { + for (i = 0, len = this.length; i < len; i++) { + chr = this.charCodeAt(i); + hash = ((hash << 5) - hash) + chr; + hash |= 0; // Convert to 32bit integer + } + } + return hash; +}; diff --git a/src/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js b/src/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js deleted file mode 100644 index 4cd36f7..0000000 --- a/src/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js +++ /dev/null @@ -1,231 +0,0 @@ -import _ from 'lodash'; - -export class ZabbixCachingProxy { - constructor(zabbixAPI, zabbixDBConnector, cacheOptions) { - this.zabbixAPI = zabbixAPI; - this.dbConnector = zabbixDBConnector; - this.cacheEnabled = cacheOptions.enabled; - this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default - - // Internal objects for data storing - this.cache = { - groups: {}, - hosts: {}, - applications: {}, - items: {}, - history: {}, - trends: {}, - macros: {}, - globalMacros: {}, - itServices: {} - }; - - this.historyPromises = {}; - - // Don't run duplicated history requests - this.getHistory = callAPIRequestOnce(_.bind(this.zabbixAPI.getHistory, this.zabbixAPI), - this.historyPromises, getHistoryRequestHash); - - if (this.dbConnector) { - this.getHistoryDB = callAPIRequestOnce(_.bind(this.dbConnector.getHistory, this.dbConnector), - this.historyPromises, getDBQueryHash); - this.getTrendsDB = callAPIRequestOnce(_.bind(this.dbConnector.getTrends, this.dbConnector), - this.historyPromises, getDBQueryHash); - } - - // Don't run duplicated requests - this.groupPromises = {}; - this.getGroupsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGroups, this.zabbixAPI), - this.groupPromises, getRequestHash); - - this.hostPromises = {}; - this.getHostsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getHosts, this.zabbixAPI), - this.hostPromises, getRequestHash); - - this.appPromises = {}; - this.getAppsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getApps, this.zabbixAPI), - this.appPromises, getRequestHash); - - this.itemPromises = {}; - this.getItemsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItems, this.zabbixAPI), - this.itemPromises, getRequestHash); - - this.itemByIdPromises = {}; - this.getItemsByIdOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItemsByIDs, this.zabbixAPI), - this.itemPromises, getRequestHash); - - this.itServicesPromises = {}; - this.getITServicesOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getITService, this.zabbixAPI), - this.itServicesPromises, getRequestHash); - - this.macroPromises = {}; - this.getMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getMacros, this.zabbixAPI), - this.macroPromises, getRequestHash); - - this.globalMacroPromises = {}; - this.getGlobalMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGlobalMacros, this.zabbixAPI), - this.globalMacroPromises, getRequestHash); - } - - isExpired(cacheObject) { - if (cacheObject) { - let object_age = Date.now() - cacheObject.timestamp; - return !(cacheObject.timestamp && object_age < this.ttl); - } else { - return true; - } - } - - /** - * Check that result is present in cache and up to date - * or send request to API. - */ - proxyRequest(request, params, cacheObject) { - let hash = getRequestHash(params); - if (this.cacheEnabled && !this.isExpired(cacheObject[hash])) { - return Promise.resolve(cacheObject[hash].value); - } else { - return request(...params) - .then(result => { - cacheObject[hash] = { - value: result, - timestamp: Date.now() - }; - return result; - }); - } - } - - getGroups() { - return this.proxyRequest(this.getGroupsOnce, [], this.cache.groups); - } - - getHosts(groupids) { - return this.proxyRequest(this.getHostsOnce, [groupids], this.cache.hosts); - } - - getApps(hostids) { - return this.proxyRequest(this.getAppsOnce, [hostids], this.cache.applications); - } - - getItems(hostids, appids, itemtype) { - let params = [hostids, appids, itemtype]; - return this.proxyRequest(this.getItemsOnce, params, this.cache.items); - } - - getItemsByIDs(itemids) { - let params = [itemids]; - return this.proxyRequest(this.getItemsByIdOnce, params, this.cache.items); - } - - getITServices() { - return this.proxyRequest(this.getITServicesOnce, [], this.cache.itServices); - } - - getMacros(hostids) { - // Merge global macros and host macros - let promises = [ - this.proxyRequest(this.getMacrosOnce, [hostids], this.cache.macros), - this.proxyRequest(this.getGlobalMacrosOnce, [], this.cache.globalMacros) - ]; - - return Promise.all(promises).then(_.flatten); - } - - getHistoryFromCache(items, time_from, time_till) { - var historyStorage = this.cache.history; - var full_history; - var expired = _.filter(_.keyBy(items, 'itemid'), (item, itemid) => { - return !historyStorage[itemid]; - }); - if (expired.length) { - return this.zabbixAPI.getHistory(expired, time_from, time_till).then(function(history) { - var grouped_history = _.groupBy(history, 'itemid'); - _.forEach(expired, item => { - var itemid = item.itemid; - historyStorage[itemid] = item; - historyStorage[itemid].time_from = time_from; - historyStorage[itemid].time_till = time_till; - historyStorage[itemid].history = grouped_history[itemid]; - }); - full_history = _.map(items, item => { - return historyStorage[item.itemid].history; - }); - return _.flatten(full_history, true); - }); - } else { - full_history = _.map(items, function(item) { - return historyStorage[item.itemid].history; - }); - return Promise.resolve(_.flatten(full_history, true)); - } - } - - getHistoryFromAPI(items, time_from, time_till) { - return this.zabbixAPI.getHistory(items, time_from, time_till); - } -} - -/** - * Wrap zabbix API request to prevent multiple calls - * with same params when waiting for result. - */ -function callAPIRequestOnce(func, promiseKeeper, argsHashFunc) { - return function() { - var hash = argsHashFunc(arguments); - if (!promiseKeeper[hash]) { - promiseKeeper[hash] = Promise.resolve( - func.apply(this, arguments) - .then(result => { - promiseKeeper[hash] = null; - return result; - }) - ); - } - return promiseKeeper[hash]; - }; -} - -function getRequestHash(args) { - var requestStamp = _.map(args, arg => { - if (arg === undefined) { - return 'undefined'; - } else { - if (_.isArray(arg)) { - return arg.sort().toString(); - } else { - return arg.toString(); - } - } - }).join(); - return requestStamp.getHash(); -} - -function getHistoryRequestHash(args) { - let itemids = _.map(args[0], 'itemid'); - let stamp = itemids.join() + args[1] + args[2]; - return stamp.getHash(); -} - -function getDBQueryHash(args) { - let itemids = _.map(args[0], 'itemid'); - let consolidateBy = args[3].consolidateBy; - let intervalMs = args[3].intervalMs; - let stamp = itemids.join() + args[1] + args[2] + consolidateBy + intervalMs; - return stamp.getHash(); -} - -String.prototype.getHash = function() { - var hash = 0, i, chr, len; - if (this.length !== 0) { - for (i = 0, len = this.length; i < len; i++) { - chr = this.charCodeAt(i); - hash = ((hash << 5) - hash) + chr; - hash |= 0; // Convert to 32bit integer - } - } - return hash; -}; - -// Fix for backward compatibility with lodash 2.4 -if (!_.keyBy) {_.keyBy = _.indexBy;} diff --git a/src/datasource-zabbix/zabbix/zabbix.js b/src/datasource-zabbix/zabbix/zabbix.js index fc36e73..f121e39 100644 --- a/src/datasource-zabbix/zabbix/zabbix.js +++ b/src/datasource-zabbix/zabbix/zabbix.js @@ -1,52 +1,74 @@ -// import angular from 'angular'; import _ from 'lodash'; import * as utils from '../utils'; import { ZabbixAPIConnector } from './connectors/zabbix_api/zabbixAPIConnector'; import { ZabbixDBConnector } from './connectors/sql/zabbixDBConnector'; -import { ZabbixCachingProxy } from './proxy/zabbixCachingProxy'; +import { CachingProxy } from './proxy/cachingProxy'; + +const REQUESTS_TO_PROXYFY = [ + 'getHistory', 'getTrend', 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', + 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion' +]; + +const REQUESTS_TO_CACHE = [ + 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getITService' +]; + +const REQUESTS_TO_BIND = [ + 'getHistory', 'getTrend', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts', + 'getAcknowledges', 'getITService', 'getSLA', 'getVersion', 'login' +]; export class Zabbix { /** @ngInject */ - constructor(url, options, backendSrv, datasourceSrv) { + constructor(options, backendSrv, datasourceSrv) { let { - username, password, basicAuth, withCredentials, cacheTTL, - enableDirectDBConnection, sqlDatasourceId + url, + username, + password, + basicAuth, + withCredentials, + cacheTTL, + enableDirectDBConnection, + sqlDatasourceId } = options; - // Initialize Zabbix API - this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv); - - if (enableDirectDBConnection) { - this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv); - } - // Initialize caching proxy for requests let cacheOptions = { enabled: true, ttl: cacheTTL }; - this.cachingProxy = new ZabbixCachingProxy(this.zabbixAPI, this.dbConnector, cacheOptions); + this.cachingProxy = new CachingProxy(cacheOptions); - // Proxy methods - this.getHistory = this.cachingProxy.getHistory.bind(this.cachingProxy); - this.getMacros = this.cachingProxy.getMacros.bind(this.cachingProxy); - this.getItemsByIDs = this.cachingProxy.getItemsByIDs.bind(this.cachingProxy); + this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv); if (enableDirectDBConnection) { - this.getHistoryDB = this.cachingProxy.getHistoryDB.bind(this.cachingProxy); - this.getTrendsDB = this.cachingProxy.getTrendsDB.bind(this.cachingProxy); + this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv); + this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector); + this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector); } - this.getTrend = this.zabbixAPI.getTrend.bind(this.zabbixAPI); - this.getEvents = this.zabbixAPI.getEvents.bind(this.zabbixAPI); - this.getAlerts = this.zabbixAPI.getAlerts.bind(this.zabbixAPI); - this.getHostAlerts = this.zabbixAPI.getHostAlerts.bind(this.zabbixAPI); - this.getAcknowledges = this.zabbixAPI.getAcknowledges.bind(this.zabbixAPI); - this.getITService = this.zabbixAPI.getITService.bind(this.zabbixAPI); - this.getSLA = this.zabbixAPI.getSLA.bind(this.zabbixAPI); - this.getVersion = this.zabbixAPI.getVersion.bind(this.zabbixAPI); - this.login = this.zabbixAPI.login.bind(this.zabbixAPI); + this.proxyfyRequests(); + this.cacheRequests(); + this.bindRequests(); + } + + proxyfyRequests() { + for (let request of REQUESTS_TO_PROXYFY) { + this.zabbixAPI[request] = this.cachingProxy.proxyfy(this.zabbixAPI[request], request, this.zabbixAPI); + } + } + + cacheRequests() { + for (let request of REQUESTS_TO_CACHE) { + this.zabbixAPI[request] = this.cachingProxy.cacheRequest(this.zabbixAPI[request], request, this.zabbixAPI); + } + } + + bindRequests() { + for (let request of REQUESTS_TO_BIND) { + this[request] = this.zabbixAPI[request].bind(this.zabbixAPI); + } } getItemsFromTarget(target, options) { @@ -71,7 +93,7 @@ export class Zabbix { } getAllGroups() { - return this.cachingProxy.getGroups(); + return this.zabbixAPI.getGroups(); } getGroups(groupFilter) { @@ -86,7 +108,7 @@ export class Zabbix { return this.getGroups(groupFilter) .then(groups => { let groupids = _.map(groups, 'groupid'); - return this.cachingProxy.getHosts(groupids); + return this.zabbixAPI.getHosts(groupids); }); } @@ -102,7 +124,7 @@ export class Zabbix { return this.getHosts(groupFilter, hostFilter) .then(hosts => { let hostids = _.map(hosts, 'hostid'); - return this.cachingProxy.getApps(hostids); + return this.zabbixAPI.getApps(hostids); }); } @@ -111,7 +133,7 @@ export class Zabbix { .then(hosts => { let hostids = _.map(hosts, 'hostid'); if (appFilter) { - return this.cachingProxy.getApps(hostids) + return this.zabbixAPI.getApps(hostids) .then(apps => filterByQuery(apps, appFilter)); } else { return { @@ -126,10 +148,10 @@ export class Zabbix { return this.getApps(groupFilter, hostFilter, appFilter) .then(apps => { if (apps.appFilterEmpty) { - return this.cachingProxy.getItems(apps.hostids, undefined, options.itemtype); + return this.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype); } else { let appids = _.map(apps, 'applicationid'); - return this.cachingProxy.getItems(undefined, appids, options.itemtype); + return this.zabbixAPI.getItems(undefined, appids, options.itemtype); } }) .then(items => { @@ -161,7 +183,7 @@ export class Zabbix { } getITServices(itServiceFilter) { - return this.cachingProxy.getITServices() + return this.zabbixAPI.getITService() .then(itServices => findByFilter(itServices, itServiceFilter)); } @@ -199,10 +221,6 @@ export class Zabbix { } } -// angular -// .module('grafana.services') -// .factory('Zabbix', ZabbixFactory); - /////////////////////////////////////////////////////////////////////////////// /**