From 24e10e885da75df8d89421f27c82cd5034e27d28 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Sat, 17 Mar 2018 15:49:34 +0300 Subject: [PATCH] refactor: move zabbix modules --- Gruntfile.js | 2 +- .../benchmarks/timeseries_bench.js | 137 +-- .../benchmarks/timeseries_bench.js.map | 1 + dist/datasource-zabbix/datasource.js | 14 +- dist/datasource-zabbix/datasource.js.map | 2 +- .../specs/dataProcessor.spec.js | 91 +- .../specs/dataProcessor.spec.js.map | 1 + .../specs/datasource.spec.js | 914 ++++++++++-------- .../specs/datasource.spec.js.map | 1 + .../specs/timeseries.spec.js | 59 +- .../specs/timeseries.spec.js.map | 1 + dist/datasource-zabbix/specs/utils.spec.js | 265 +++-- .../datasource-zabbix/specs/utils.spec.js.map | 1 + dist/datasource-zabbix/zabbix.js | 384 -------- dist/datasource-zabbix/zabbix.js.map | 1 - .../connectors/sql}/zabbixDBConnector.js | 307 +++--- .../connectors/sql/zabbixDBConnector.js.map | 1 + .../zabbix/connectors/zabbixConnector.js | 106 ++ .../zabbix/connectors/zabbixConnector.js.map | 1 + .../zabbix_api/zabbixAPIConnector.js | 547 +++++++++++ .../zabbix_api/zabbixAPIConnector.js.map | 1 + .../connectors/zabbix_api/zabbixAPICore.js} | 34 +- .../zabbix_api/zabbixAPICore.js.map | 1 + .../zabbix/proxy/zabbixCachingProxy.js | 283 ++++++ .../zabbix/proxy/zabbixCachingProxy.js.map | 1 + dist/datasource-zabbix/zabbix/zabbix.js | 385 ++++++++ dist/datasource-zabbix/zabbix/zabbix.js.map | 1 + dist/datasource-zabbix/zabbixAPI.service.js | 559 ----------- .../zabbixAPI.service.js.map | 1 - .../zabbixAPICore.service.js.map | 1 - .../zabbixCachingProxy.service.js | 291 ------ .../zabbixCachingProxy.service.js.map | 1 - .../zabbixDBConnector.js.map | 1 - src/datasource-zabbix/datasource.js | 8 +- src/datasource-zabbix/zabbix.js | 276 ------ .../connectors/sql}/zabbixDBConnector.js | 237 +++-- .../zabbix/connectors/zabbixConnector.js | 46 + .../zabbix_api/zabbixAPIConnector.js | 484 ++++++++++ .../connectors/zabbix_api/zabbixAPICore.js} | 8 +- .../zabbix/proxy/zabbixCachingProxy.js | 231 +++++ src/datasource-zabbix/zabbix/zabbix.js | 268 +++++ src/datasource-zabbix/zabbixAPI.service.js | 504 ---------- .../zabbixCachingProxy.service.js | 245 ----- 43 files changed, 3437 insertions(+), 3266 deletions(-) create mode 100644 dist/datasource-zabbix/benchmarks/timeseries_bench.js.map create mode 100644 dist/datasource-zabbix/specs/dataProcessor.spec.js.map create mode 100644 dist/datasource-zabbix/specs/datasource.spec.js.map create mode 100644 dist/datasource-zabbix/specs/timeseries.spec.js.map create mode 100644 dist/datasource-zabbix/specs/utils.spec.js.map delete mode 100644 dist/datasource-zabbix/zabbix.js delete mode 100644 dist/datasource-zabbix/zabbix.js.map rename dist/datasource-zabbix/{ => zabbix/connectors/sql}/zabbixDBConnector.js (52%) create mode 100644 dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js.map create mode 100644 dist/datasource-zabbix/zabbix/connectors/zabbixConnector.js create mode 100644 dist/datasource-zabbix/zabbix/connectors/zabbixConnector.js.map create mode 100644 dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js create mode 100644 dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js.map rename dist/datasource-zabbix/{zabbixAPICore.service.js => zabbix/connectors/zabbix_api/zabbixAPICore.js} (85%) create mode 100644 dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js.map create mode 100644 dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js create mode 100644 dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js.map create mode 100644 dist/datasource-zabbix/zabbix/zabbix.js create mode 100644 dist/datasource-zabbix/zabbix/zabbix.js.map delete mode 100644 dist/datasource-zabbix/zabbixAPI.service.js delete mode 100644 dist/datasource-zabbix/zabbixAPI.service.js.map delete mode 100644 dist/datasource-zabbix/zabbixAPICore.service.js.map delete mode 100644 dist/datasource-zabbix/zabbixCachingProxy.service.js delete mode 100644 dist/datasource-zabbix/zabbixCachingProxy.service.js.map delete mode 100644 dist/datasource-zabbix/zabbixDBConnector.js.map delete mode 100644 src/datasource-zabbix/zabbix.js rename src/datasource-zabbix/{ => zabbix/connectors/sql}/zabbixDBConnector.js (53%) create mode 100644 src/datasource-zabbix/zabbix/connectors/zabbixConnector.js create mode 100644 src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js rename src/datasource-zabbix/{zabbixAPICore.service.js => zabbix/connectors/zabbix_api/zabbixAPICore.js} (93%) create mode 100644 src/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js create mode 100644 src/datasource-zabbix/zabbix/zabbix.js delete mode 100644 src/datasource-zabbix/zabbixAPI.service.js delete mode 100644 src/datasource-zabbix/zabbixCachingProxy.service.js diff --git a/Gruntfile.js b/Gruntfile.js index 0db565f..3c3dfb4 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -85,7 +85,7 @@ module.exports = function(grunt) { cwd: 'src', expand: true, src: [ - 'datasource-zabbix/*.js', + 'datasource-zabbix/**/*.js', 'panel-triggers/*.js', 'components/*.js', 'vendor/*.js', diff --git a/dist/datasource-zabbix/benchmarks/timeseries_bench.js b/dist/datasource-zabbix/benchmarks/timeseries_bench.js index 857af9b..235f701 100644 --- a/dist/datasource-zabbix/benchmarks/timeseries_bench.js +++ b/dist/datasource-zabbix/benchmarks/timeseries_bench.js @@ -1,70 +1,77 @@ -import _ from 'lodash'; -import ts from '../timeseries'; +'use strict'; -let datapoints = [[10.7104, 1498409636085], [10.578, 1498409651011], [10.5985, 1498409666628], [10.6877, 1498409681525], [10.5495, 1498409696586], [10.5981, 1498409711009], [10.5076, 1498409726949], [11.4807, 1498409741853], [11.6165, 1498409756165], [11.8575, 1498409771018], [11.9936, 1498409786056], [10.7566, 1498409801942], [10.7484, 1498409816010], [10.6038, 1498409831018], [10.2932, 1498409846010], [10.4912, 1498409861946], [10.4151, 1498409876871], [10.2401, 1498409891710], [10.4921, 1498409906143], [10.4413, 1498409921477], [10.6318, 1498409936147], [10.5277, 1498409951915], [10.6333, 1498409966052], [10.6417, 1498409981944], [10.4505, 1498409996867], [10.5812, 1498410011770], [10.4934, 1498410026573], [10.5731, 1498410041317], [10.5, 1498410056213], [10.6505, 1498410071013], [9.4035, 1498410086387]]; +System.register(['lodash', '../timeseries'], function (_export, _context) { + "use strict"; -let series_set = [ - [[1.0247, 1498409631773], [0.9988, 1498409646697], [0.9817, 1498409661239], [0.9569, 1498409676045], [1.0331, 1498409691922], [1.0755, 1498409706546], [1.1862, 1498409721525], [1.2984, 1498409736175], [1.2389, 1498409751817], [1.1452, 1498409766783], [1.102, 1498409781699], [0.9647, 1498409796664], [1.0063, 1498409811627], [1.0318, 1498409826887], [1.065, 1498409841645], [1.0907, 1498409856647], [1.0229, 1498409871521], [1.0654, 1498409886031], [1.0568, 1498409901544], [1.0818, 1498409916194], [1.1335, 1498409931672], [1.057, 1498409946673], [1.0243, 1498409961669], [1.0329, 1498409976637], [1.1428, 1498409991563], [1.2198, 1498410006441], [1.2192, 1498410021230], [1.2615, 1498410036027], [1.1765, 1498410051907], [1.2352, 1498410066109], [1.0557, 1498410081043]], - [[10.7104, 1498409636085], [10.578, 1498409651011], [10.5985, 1498409666628], [10.6877, 1498409681525], [10.5495, 1498409696586], [10.5981, 1498409711009], [10.5076, 1498409726949], [11.4807, 1498409741853], [11.6165, 1498409756165], [11.8575, 1498409771018], [11.9936, 1498409786056], [10.7566, 1498409801942], [10.7484, 1498409816010], [10.6038, 1498409831018], [10.2932, 1498409846010], [10.4912, 1498409861946], [10.4151, 1498409876871], [10.2401, 1498409891710], [10.4921, 1498409906143], [10.4413, 1498409921477], [10.6318, 1498409936147], [10.5277, 1498409951915], [10.6333, 1498409966052], [10.6417, 1498409981944], [10.4505, 1498409996867], [10.5812, 1498410011770], [10.4934, 1498410026573], [10.5731, 1498410041317], [10.5, 1498410056213], [10.6505, 1498410071013], [9.4035, 1498410086387]] -]; + var _, ts, datapoints, series_set, growing_series; -let growing_series = [[10755200, 1498332216642], [10761200, 1498332276802], [10767200, 1498332336367], [10773200, 1498332396584], [10779200, 1498332456880], [10785200, 1498332516479], [10791200, 1498332576610], [10797200, 1498332636353], [10803200, 1498332696513], [10809200, 1498332756884], [10815200, 1498332816890], [10821200, 1498332876305], [10827200, 1498332936384], [10833200, 1498332996659], [10839200, 1498333056965], [10845200, 1498333116748], [10851200, 1498333176687], [10857200, 1498333236646], [10863200, 1498333297034], [10869200, 1498333356358], [10875200, 1498333416445], [4800, 1498333536686], [17900, 1498333667962], [24000, 1498333729157], [29500, 1498333783662], [34800, 1498333836813], [40700, 1498333896403], [46800, 1498333956953], [52800, 1498334016976], [6000, 1498334136593], [12000, 1498334196567]]; + return { + setters: [function (_lodash) { + _ = _lodash.default; + }, function (_timeseries) { + ts = _timeseries.default; + }], + execute: function () { + datapoints = [[10.7104, 1498409636085], [10.578, 1498409651011], [10.5985, 1498409666628], [10.6877, 1498409681525], [10.5495, 1498409696586], [10.5981, 1498409711009], [10.5076, 1498409726949], [11.4807, 1498409741853], [11.6165, 1498409756165], [11.8575, 1498409771018], [11.9936, 1498409786056], [10.7566, 1498409801942], [10.7484, 1498409816010], [10.6038, 1498409831018], [10.2932, 1498409846010], [10.4912, 1498409861946], [10.4151, 1498409876871], [10.2401, 1498409891710], [10.4921, 1498409906143], [10.4413, 1498409921477], [10.6318, 1498409936147], [10.5277, 1498409951915], [10.6333, 1498409966052], [10.6417, 1498409981944], [10.4505, 1498409996867], [10.5812, 1498410011770], [10.4934, 1498410026573], [10.5731, 1498410041317], [10.5, 1498410056213], [10.6505, 1498410071013], [9.4035, 1498410086387]]; + series_set = [[[1.0247, 1498409631773], [0.9988, 1498409646697], [0.9817, 1498409661239], [0.9569, 1498409676045], [1.0331, 1498409691922], [1.0755, 1498409706546], [1.1862, 1498409721525], [1.2984, 1498409736175], [1.2389, 1498409751817], [1.1452, 1498409766783], [1.102, 1498409781699], [0.9647, 1498409796664], [1.0063, 1498409811627], [1.0318, 1498409826887], [1.065, 1498409841645], [1.0907, 1498409856647], [1.0229, 1498409871521], [1.0654, 1498409886031], [1.0568, 1498409901544], [1.0818, 1498409916194], [1.1335, 1498409931672], [1.057, 1498409946673], [1.0243, 1498409961669], [1.0329, 1498409976637], [1.1428, 1498409991563], [1.2198, 1498410006441], [1.2192, 1498410021230], [1.2615, 1498410036027], [1.1765, 1498410051907], [1.2352, 1498410066109], [1.0557, 1498410081043]], [[10.7104, 1498409636085], [10.578, 1498409651011], [10.5985, 1498409666628], [10.6877, 1498409681525], [10.5495, 1498409696586], [10.5981, 1498409711009], [10.5076, 1498409726949], [11.4807, 1498409741853], [11.6165, 1498409756165], [11.8575, 1498409771018], [11.9936, 1498409786056], [10.7566, 1498409801942], [10.7484, 1498409816010], [10.6038, 1498409831018], [10.2932, 1498409846010], [10.4912, 1498409861946], [10.4151, 1498409876871], [10.2401, 1498409891710], [10.4921, 1498409906143], [10.4413, 1498409921477], [10.6318, 1498409936147], [10.5277, 1498409951915], [10.6333, 1498409966052], [10.6417, 1498409981944], [10.4505, 1498409996867], [10.5812, 1498410011770], [10.4934, 1498410026573], [10.5731, 1498410041317], [10.5, 1498410056213], [10.6505, 1498410071013], [9.4035, 1498410086387]]]; + growing_series = [[10755200, 1498332216642], [10761200, 1498332276802], [10767200, 1498332336367], [10773200, 1498332396584], [10779200, 1498332456880], [10785200, 1498332516479], [10791200, 1498332576610], [10797200, 1498332636353], [10803200, 1498332696513], [10809200, 1498332756884], [10815200, 1498332816890], [10821200, 1498332876305], [10827200, 1498332936384], [10833200, 1498332996659], [10839200, 1498333056965], [10845200, 1498333116748], [10851200, 1498333176687], [10857200, 1498333236646], [10863200, 1498333297034], [10869200, 1498333356358], [10875200, 1498333416445], [4800, 1498333536686], [17900, 1498333667962], [24000, 1498333729157], [29500, 1498333783662], [34800, 1498333836813], [40700, 1498333896403], [46800, 1498333956953], [52800, 1498334016976], [6000, 1498334136593], [12000, 1498334196567]]; -module.exports = [ - { - name: 'groupBy', - tests: { - 'groupBy(AVERAGE)': () => { - ts.groupBy(datapoints, '5m', ts.AVERAGE); - }, - 'groupBy(MAX)': () => { - ts.groupBy(datapoints, '5m', ts.COUNT); - } + + module.exports = [{ + name: 'groupBy', + tests: { + 'groupBy(AVERAGE)': function groupByAVERAGE() { + ts.groupBy(datapoints, '5m', ts.AVERAGE); + }, + 'groupBy(MAX)': function groupByMAX() { + ts.groupBy(datapoints, '5m', ts.COUNT); + } + } + }, { + name: 'sumSeries', + tests: { + 'sumSeries()': function sumSeries() { + ts.sumSeries(series_set); + }, + 'groupBy(MAX)->sumSeries()': function groupByMAXSumSeries() { + var prepeared_series = _.map(series_set, function (datapoints) { + return ts.groupBy(datapoints, '5m', ts.MAX); + }); + ts.sumSeries(prepeared_series); + } + } + }, { + name: 'delta vs rate', + tests: { + 'delta()': function delta() { + ts.delta(growing_series); + }, + 'rate()': function rate() { + ts.rate(growing_series); + } + } + }, { + name: 'scale', + tests: { + 'scale()': function scale() { + ts.scale(datapoints, 42); + }, + 'scale_perf()': function scale_perf() { + ts.scale_perf(datapoints, 42); + } + } + }, { + name: 'groupBy vs groupBy_perf', + tests: { + 'groupBy()': function groupBy() { + ts.groupBy(datapoints, '5m', ts.AVERAGE); + }, + 'groupBy_perf()': function groupBy_perf() { + ts.groupBy_perf(datapoints, '5m', ts.AVERAGE); + } + } + }]; } - }, - { - name: 'sumSeries', - tests: { - 'sumSeries()': () => { - ts.sumSeries(series_set); - }, - 'groupBy(MAX)->sumSeries()': () => { - let prepeared_series = _.map(series_set, datapoints => ts.groupBy(datapoints, '5m', ts.MAX)); - ts.sumSeries(prepeared_series); - } - } - }, - { - name: 'delta vs rate', - tests: { - 'delta()': () => { - ts.delta(growing_series); - }, - 'rate()': () => { - ts.rate(growing_series); - } - } - }, - { - name: 'scale', - tests: { - 'scale()': () => { - ts.scale(datapoints, 42); - }, - 'scale_perf()': () => { - ts.scale_perf(datapoints, 42); - } - } - }, - { - name: 'groupBy vs groupBy_perf', - tests: { - 'groupBy()': () => { - ts.groupBy(datapoints, '5m', ts.AVERAGE); - }, - 'groupBy_perf()': () => { - ts.groupBy_perf(datapoints, '5m', ts.AVERAGE); - } - } - } -]; + }; +}); +//# sourceMappingURL=timeseries_bench.js.map diff --git a/dist/datasource-zabbix/benchmarks/timeseries_bench.js.map b/dist/datasource-zabbix/benchmarks/timeseries_bench.js.map new file mode 100644 index 0000000..26a5f73 --- /dev/null +++ b/dist/datasource-zabbix/benchmarks/timeseries_bench.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/datasource-zabbix/benchmarks/timeseries_bench.js"],"names":["_","ts","datapoints","series_set","growing_series","module","exports","name","tests","groupBy","AVERAGE","COUNT","sumSeries","prepeared_series","map","MAX","delta","rate","scale","scale_perf","groupBy_perf"],"mappings":"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","file":"timeseries_bench.js","sourcesContent":["import _ from 'lodash';\nimport ts from '../timeseries';\n\nlet datapoints = [[10.7104, 1498409636085], [10.578, 1498409651011], [10.5985, 1498409666628], [10.6877, 1498409681525], [10.5495, 1498409696586], [10.5981, 1498409711009], [10.5076, 1498409726949], [11.4807, 1498409741853], [11.6165, 1498409756165], [11.8575, 1498409771018], [11.9936, 1498409786056], [10.7566, 1498409801942], [10.7484, 1498409816010], [10.6038, 1498409831018], [10.2932, 1498409846010], [10.4912, 1498409861946], [10.4151, 1498409876871], [10.2401, 1498409891710], [10.4921, 1498409906143], [10.4413, 1498409921477], [10.6318, 1498409936147], [10.5277, 1498409951915], [10.6333, 1498409966052], [10.6417, 1498409981944], [10.4505, 1498409996867], [10.5812, 1498410011770], [10.4934, 1498410026573], [10.5731, 1498410041317], [10.5, 1498410056213], [10.6505, 1498410071013], [9.4035, 1498410086387]];\n\nlet series_set = [\n [[1.0247, 1498409631773], [0.9988, 1498409646697], [0.9817, 1498409661239], [0.9569, 1498409676045], [1.0331, 1498409691922], [1.0755, 1498409706546], [1.1862, 1498409721525], [1.2984, 1498409736175], [1.2389, 1498409751817], [1.1452, 1498409766783], [1.102, 1498409781699], [0.9647, 1498409796664], [1.0063, 1498409811627], [1.0318, 1498409826887], [1.065, 1498409841645], [1.0907, 1498409856647], [1.0229, 1498409871521], [1.0654, 1498409886031], [1.0568, 1498409901544], [1.0818, 1498409916194], [1.1335, 1498409931672], [1.057, 1498409946673], [1.0243, 1498409961669], [1.0329, 1498409976637], [1.1428, 1498409991563], [1.2198, 1498410006441], [1.2192, 1498410021230], [1.2615, 1498410036027], [1.1765, 1498410051907], [1.2352, 1498410066109], [1.0557, 1498410081043]],\n [[10.7104, 1498409636085], [10.578, 1498409651011], [10.5985, 1498409666628], [10.6877, 1498409681525], [10.5495, 1498409696586], [10.5981, 1498409711009], [10.5076, 1498409726949], [11.4807, 1498409741853], [11.6165, 1498409756165], [11.8575, 1498409771018], [11.9936, 1498409786056], [10.7566, 1498409801942], [10.7484, 1498409816010], [10.6038, 1498409831018], [10.2932, 1498409846010], [10.4912, 1498409861946], [10.4151, 1498409876871], [10.2401, 1498409891710], [10.4921, 1498409906143], [10.4413, 1498409921477], [10.6318, 1498409936147], [10.5277, 1498409951915], [10.6333, 1498409966052], [10.6417, 1498409981944], [10.4505, 1498409996867], [10.5812, 1498410011770], [10.4934, 1498410026573], [10.5731, 1498410041317], [10.5, 1498410056213], [10.6505, 1498410071013], [9.4035, 1498410086387]]\n];\n\nlet growing_series = [[10755200, 1498332216642], [10761200, 1498332276802], [10767200, 1498332336367], [10773200, 1498332396584], [10779200, 1498332456880], [10785200, 1498332516479], [10791200, 1498332576610], [10797200, 1498332636353], [10803200, 1498332696513], [10809200, 1498332756884], [10815200, 1498332816890], [10821200, 1498332876305], [10827200, 1498332936384], [10833200, 1498332996659], [10839200, 1498333056965], [10845200, 1498333116748], [10851200, 1498333176687], [10857200, 1498333236646], [10863200, 1498333297034], [10869200, 1498333356358], [10875200, 1498333416445], [4800, 1498333536686], [17900, 1498333667962], [24000, 1498333729157], [29500, 1498333783662], [34800, 1498333836813], [40700, 1498333896403], [46800, 1498333956953], [52800, 1498334016976], [6000, 1498334136593], [12000, 1498334196567]];\n\nmodule.exports = [\n {\n name: 'groupBy',\n tests: {\n 'groupBy(AVERAGE)': () => {\n ts.groupBy(datapoints, '5m', ts.AVERAGE);\n },\n 'groupBy(MAX)': () => {\n ts.groupBy(datapoints, '5m', ts.COUNT);\n }\n }\n },\n {\n name: 'sumSeries',\n tests: {\n 'sumSeries()': () => {\n ts.sumSeries(series_set);\n },\n 'groupBy(MAX)->sumSeries()': () => {\n let prepeared_series = _.map(series_set, datapoints => ts.groupBy(datapoints, '5m', ts.MAX));\n ts.sumSeries(prepeared_series);\n }\n }\n },\n {\n name: 'delta vs rate',\n tests: {\n 'delta()': () => {\n ts.delta(growing_series);\n },\n 'rate()': () => {\n ts.rate(growing_series);\n }\n }\n },\n {\n name: 'scale',\n tests: {\n 'scale()': () => {\n ts.scale(datapoints, 42);\n },\n 'scale_perf()': () => {\n ts.scale_perf(datapoints, 42);\n }\n }\n },\n {\n name: 'groupBy vs groupBy_perf',\n tests: {\n 'groupBy()': () => {\n ts.groupBy(datapoints, '5m', ts.AVERAGE);\n },\n 'groupBy_perf()': () => {\n ts.groupBy_perf(datapoints, '5m', ts.AVERAGE);\n }\n }\n }\n];\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/datasource.js b/dist/datasource-zabbix/datasource.js index 96fc27c..75cbb42 100644 --- a/dist/datasource-zabbix/datasource.js +++ b/dist/datasource-zabbix/datasource.js @@ -1,9 +1,9 @@ 'use strict'; -System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', './metricFunctions', './constants', './dataProcessor', './responseHandler', './zabbix.js', './zabbixAlerting.service.js', './zabbixAPICore.service.js'], function (_export, _context) { +System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', './metricFunctions', './constants', './dataProcessor', './responseHandler', './zabbixAlerting.service.js', './zabbix/zabbix', './zabbix/connectors/zabbix_api/zabbixAPICore'], function (_export, _context) { "use strict"; - var _, dateMath, utils, migrations, metricFunctions, c, dataProcessor, responseHandler, ZabbixAPIError, _slicedToArray, _createClass, ZabbixAPIDatasource; + var _, dateMath, utils, migrations, metricFunctions, c, dataProcessor, responseHandler, Zabbix, ZabbixAPIError, _slicedToArray, _createClass, ZabbixAPIDatasource; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -140,8 +140,10 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', dataProcessor = _dataProcessor.default; }, function (_responseHandler) { responseHandler = _responseHandler.default; - }, function (_zabbixJs) {}, function (_zabbixAlertingServiceJs) {}, function (_zabbixAPICoreServiceJs) { - ZabbixAPIError = _zabbixAPICoreServiceJs.ZabbixAPIError; + }, function (_zabbixAlertingServiceJs) {}, function (_zabbixZabbix) { + Zabbix = _zabbixZabbix.Zabbix; + }, function (_zabbixConnectorsZabbix_apiZabbixAPICore) { + ZabbixAPIError = _zabbixConnectorsZabbix_apiZabbixAPICore.ZabbixAPIError; }], execute: function () { _slicedToArray = function () { @@ -203,7 +205,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', _export('ZabbixAPIDatasource', ZabbixAPIDatasource = function () { /** @ngInject */ - function ZabbixAPIDatasource(instanceSettings, templateSrv, alertSrv, dashboardSrv, zabbixAlertingSrv, Zabbix) { + function ZabbixAPIDatasource(instanceSettings, templateSrv, alertSrv, dashboardSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) { _classCallCheck(this, ZabbixAPIDatasource); this.templateSrv = templateSrv; @@ -255,7 +257,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations', sqlDatasourceId: this.sqlDatasourceId }; - this.zabbix = new Zabbix(this.url, zabbixOptions); + this.zabbix = new Zabbix(this.url, zabbixOptions, backendSrv, datasourceSrv); } //////////////////////// diff --git a/dist/datasource-zabbix/datasource.js.map b/dist/datasource-zabbix/datasource.js.map index 7d7b5e7..7e1e86c 100644 --- a/dist/datasource-zabbix/datasource.js.map +++ b/dist/datasource-zabbix/datasource.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","getConsolidateBy","target","consolidateBy","funcDef","find","functions","length","downsampleSeries","timeseries_data","options","defaultAgg","consolidateByFunc","timeseries","datapoints","maxDataPoints","groupBy","interval","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","zabbixItemIdsTemplateFormat","replaceTemplateVars","templateSrv","scopedVars","replacedTarget","replace","isRegex","sequence","funcsArray","result","i","call","filterEnabledTargets","targets","hide","group","host","item","getTriggerThreshold","expression","thresholdPattern","finded_thresholds","match","threshold","Number","dateMath","migrations","c","responseHandler","ZabbixAPIError","ZabbixAPIDatasource","instanceSettings","alertSrv","dashboardSrv","zabbixAlertingSrv","Zabbix","partial","url","basicAuth","withCredentials","jsonData","username","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","dbConnectionOptions","dbConnection","enableDirectDBConnection","enable","sqlDatasourceId","datasourceId","zabbixOptions","zabbix","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","t","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","replaceTargetVariables","timeFunctions","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_METRICS","MODE_TEXT","migrate","queryNumericData","queryTextData","MODE_ITEMID","itemids","queryItemIdData","MODE_ITSERVICE","queryITServiceData","MODE_TRIGGERS","queryTriggersData","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","queryNumericDataForItems","items","getHistoryPromise","getTrendsDB","dbConnector","handleGrafanaTSResponse","history","valueType","getTrendValueType","getTrend","handleTrends","series","sortBy","point","DATAPOINT_TS","getHistoryDB","getHistory","handleHistory","applyDataProcessingFunctions","catch","console","log","error","trendFunctions","trendValueFunc","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","unShiftTimeSeries","resultFormat","handleHistoryAsTable","handleText","resolve","split","itemid","trim","getItemsByIDs","itservice","itServiceFilter","slaProperty","itServiceIds","itServices","isOldVersion","getITServices","itservices","serviceid","getSLA","serviceids","handleSLAResponse","slaResponse","getHostsFromTarget","results","hosts","apps","hostids","appids","minSeverity","triggers","acknowledged","count","getHostAlerts","handleTriggersResponse","zabbixVersion","getVersion","version","login","testSQLDataSource","status","title","message","query","parts","each","splitTemplateQuery","part","push","template","zipObject","app","getItems","getApps","getHosts","getGroups","metrics","rangeRaw","annotation","showOkEvents","SHOW_ALL_EVENTS","SHOW_OK_EVENTS","triggersOptions","showTriggers","SHOW_ALL_TRIGGERS","hideHostsInMaintenance","getTriggers","application","triggerName","trigger","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport './zabbix.js';\nimport './zabbixAlerting.service.js';\nimport {ZabbixAPIError} from './zabbixAPICore.service.js';\n\nclass ZabbixAPIDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, zabbixAlertingSrv, Zabbix) {\n this.templateSrv = templateSrv;\n this.alertSrv = alertSrv;\n this.dashboardSrv = dashboardSrv;\n this.zabbixAlertingSrv = zabbixAlertingSrv;\n\n // Use custom format for template variables\n this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);\n\n // General data source settings\n this.name = instanceSettings.name;\n this.url = instanceSettings.url;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n\n const jsonData = instanceSettings.jsonData;\n\n // Zabbix API credentials\n this.username = jsonData.username;\n this.password = jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = jsonData.trends;\n this.trendsFrom = jsonData.trendsFrom || '7d';\n this.trendsRange = jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = jsonData.alerting;\n this.addThresholds = jsonData.addThresholds;\n this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n // Direct DB Connection options\n let dbConnectionOptions = jsonData.dbConnection || {};\n this.enableDirectDBConnection = dbConnectionOptions.enable;\n this.sqlDatasourceId = dbConnectionOptions.datasourceId;\n\n let zabbixOptions = {\n username: this.username,\n password: this.password,\n basicAuth: this.basicAuth,\n withCredentials: this.withCredentials,\n cacheTTL: this.cacheTTL,\n enableDirectDBConnection: this.enableDirectDBConnection,\n sqlDatasourceId: this.sqlDatasourceId\n };\n\n this.zabbix = new Zabbix(this.url, zabbixOptions);\n }\n\n ////////////////////////\n // Datasource methods //\n ////////////////////////\n\n /**\n * Query panel data. Calls for each panel in dashboard.\n * @param {Object} options Contains time range, targets and other info.\n * @return {Object} Grafana metrics object with timeseries data for each target.\n */\n query(options) {\n // Get alerts for current panel\n if (this.alertingEnabled) {\n this.alertQuery(options).then(alert => {\n this.zabbixAlertingSrv.setPanelAlertState(options.panelId, alert.state);\n\n this.zabbixAlertingSrv.removeZabbixThreshold(options.panelId);\n if (this.addThresholds) {\n _.forEach(alert.thresholds, threshold => {\n this.zabbixAlertingSrv.setPanelThreshold(options.panelId, threshold);\n });\n }\n });\n }\n\n // Create request for each target\n let promises = _.map(options.targets, t => {\n // Don't request undefined and hidden targets\n if (t.hide) {\n return [];\n }\n\n let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);\n let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);\n\n // Prevent changes of original object\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n\n // Apply Time-related functions (timeShift(), etc)\n let timeFunctions = bindFunctionDefs(target.functions, 'Time');\n if (timeFunctions.length) {\n const [time_from, time_to] = sequence(timeFunctions)([timeFrom, timeTo]);\n timeFrom = time_from;\n timeTo = time_to;\n }\n let timeRange = [timeFrom, timeTo];\n\n let useTrends = this.isUseTrends(timeRange);\n\n // Metrics or Text query mode\n if (!target.mode || target.mode === c.MODE_METRICS || target.mode === c.MODE_TEXT) {\n // Migrate old targets\n target = migrations.migrate(target);\n\n // Don't request undefined and hidden targets\n if (target.hide || !target.group || !target.host || !target.item) {\n return [];\n }\n\n if (!target.mode || target.mode === c.MODE_METRICS) {\n return this.queryNumericData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_TEXT) {\n return this.queryTextData(target, timeRange);\n }\n } else if (target.mode === c.MODE_ITEMID) {\n // Item ID mode\n if (!target.itemids) {\n return [];\n }\n return this.queryItemIdData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_ITSERVICE) {\n // IT services mode\n return this.queryITServiceData(target, timeRange, options);\n } else if (target.mode === c.MODE_TRIGGERS) {\n // Triggers mode\n return this.queryTriggersData(target, timeRange);\n } else {\n return [];\n }\n });\n\n // Data for panel (all targets)\n return Promise.all(_.flatten(promises))\n .then(_.flatten)\n .then(data => {\n return { data: data };\n });\n }\n\n /**\n * Query target data for Metrics mode\n */\n queryNumericData(target, timeRange, useTrends, options) {\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query history for numeric items\n */\n queryNumericDataForItems(items, target, timeRange, useTrends, options) {\n let [timeFrom, timeTo] = timeRange;\n let getHistoryPromise;\n options.consolidateBy = getConsolidateBy(target);\n\n if (useTrends) {\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getTrendsDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n let valueType = this.getTrendValueType(target);\n getHistoryPromise = this.zabbix.getTrend(items, timeFrom, timeTo)\n .then(history => responseHandler.handleTrends(history, items, valueType))\n .then(timeseries => {\n // Sort trend data, issue #202\n _.forEach(timeseries, series => {\n series.datapoints = _.sortBy(series.datapoints, point => point[c.DATAPOINT_TS]);\n });\n return timeseries;\n });\n }\n } else {\n // Use history\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getHistoryDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n getHistoryPromise = this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => responseHandler.handleHistory(history, items));\n }\n }\n\n return getHistoryPromise\n .then(timeseries => this.applyDataProcessingFunctions(timeseries, target))\n .then(timeseries => downsampleSeries(timeseries, options))\n .catch(error => {\n console.log(error);\n return [];\n });\n }\n\n getTrendValueType(target) {\n // Find trendValue() function and get specified trend value\n var trendFunctions = _.map(metricFunctions.getCategories()['Trends'], 'name');\n var trendValueFunc = _.find(target.functions, func => {\n return _.includes(trendFunctions, func.def.name);\n });\n return trendValueFunc ? trendValueFunc.params[0] : \"avg\";\n }\n\n applyDataProcessingFunctions(timeseries_data, target) {\n let transformFunctions = bindFunctionDefs(target.functions, 'Transform');\n let aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');\n let filterFunctions = bindFunctionDefs(target.functions, 'Filter');\n let aliasFunctions = bindFunctionDefs(target.functions, 'Alias');\n\n // Apply transformation functions\n timeseries_data = _.cloneDeep(_.map(timeseries_data, timeseries => {\n timeseries.datapoints = sequence(transformFunctions)(timeseries.datapoints);\n return timeseries;\n }));\n\n // Apply filter functions\n if (filterFunctions.length) {\n timeseries_data = sequence(filterFunctions)(timeseries_data);\n }\n\n // Apply aggregations\n if (aggregationFunctions.length) {\n let dp = _.map(timeseries_data, 'datapoints');\n dp = sequence(aggregationFunctions)(dp);\n\n let aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name');\n let lastAgg = _.findLast(target.functions, func => {\n return _.includes(aggFuncNames, func.def.name);\n });\n\n timeseries_data = [{\n target: lastAgg.text,\n datapoints: dp\n }];\n }\n\n // Apply alias functions\n _.forEach(timeseries_data, sequence(aliasFunctions));\n\n // Apply Time-related functions (timeShift(), etc)\n // Find timeShift() function and get specified trend value\n this.applyTimeShiftFunction(timeseries_data, target);\n\n return timeseries_data;\n }\n\n applyTimeShiftFunction(timeseries_data, target) {\n // Find timeShift() function and get specified interval\n let timeShiftFunc = _.find(target.functions, (func) => {\n return func.def.name === 'timeShift';\n });\n if (timeShiftFunc) {\n let shift = timeShiftFunc.params[0];\n _.forEach(timeseries_data, (series) => {\n series.datapoints = dataProcessor.unShiftTimeSeries(shift, series.datapoints);\n });\n }\n }\n\n /**\n * Query target data for Text mode\n */\n queryTextData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let options = {\n itemtype: 'text'\n };\n return this.zabbix.getItemsFromTarget(target, options)\n .then(items => {\n if (items.length) {\n return this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => {\n if (target.resultFormat === 'table') {\n return responseHandler.handleHistoryAsTable(history, items, target);\n } else {\n return responseHandler.handleText(history, items, target);\n }\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Query target data for Item ID mode\n */\n queryItemIdData(target, timeRange, useTrends, options) {\n let itemids = target.itemids;\n itemids = this.templateSrv.replace(itemids, options.scopedVars, zabbixItemIdsTemplateFormat);\n itemids = _.map(itemids.split(','), itemid => itemid.trim());\n\n if (!itemids) {\n return [];\n }\n\n return this.zabbix.getItemsByIDs(itemids)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query target data for IT Services mode\n */\n queryITServiceData(target, timeRange, options) {\n // Don't show undefined and hidden targets\n if (target.hide || (!target.itservice && !target.itServiceFilter) || !target.slaProperty) {\n return [];\n }\n\n let itServiceIds = [];\n let itServices = [];\n let itServiceFilter;\n let isOldVersion = target.itservice && !target.itServiceFilter;\n\n if (isOldVersion) {\n // Backward compatibility\n itServiceFilter = '/.*/';\n } else {\n itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);\n }\n\n return this.zabbix.getITServices(itServiceFilter)\n .then(itservices => {\n itServices = itservices;\n if (isOldVersion) {\n itServices = _.filter(itServices, {'serviceid': target.itservice.serviceid});\n }\n\n itServiceIds = _.map(itServices, 'serviceid');\n return itServiceIds;\n })\n .then(serviceids => {\n return this.zabbix.getSLA(serviceids, timeRange);\n })\n .then(slaResponse => {\n return _.map(itServiceIds, serviceid => {\n let itservice = _.find(itServices, {'serviceid': serviceid});\n return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse);\n });\n });\n }\n\n queryTriggersData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n return this.zabbix.getHostsFromTarget(target)\n .then((results) => {\n let [hosts, apps] = results;\n if (hosts.length) {\n let hostids = _.map(hosts, 'hostid');\n let appids = _.map(apps, 'applicationid');\n let options = {\n minSeverity: target.triggers.minSeverity,\n acknowledged: target.triggers.acknowledged,\n count: target.triggers.count,\n timeFrom: timeFrom,\n timeTo: timeTo\n };\n return this.zabbix.getHostAlerts(hostids, appids, options)\n .then((triggers) => {\n return responseHandler.handleTriggersResponse(triggers, timeRange);\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Test connection to Zabbix API\n * @return {object} Connection status and Zabbix API version\n */\n testDatasource() {\n let zabbixVersion;\n return this.zabbix.getVersion()\n .then(version => {\n zabbixVersion = version;\n return this.zabbix.login();\n })\n .then(() => {\n if (this.enableDirectDBConnection) {\n return this.zabbix.dbConnector.testSQLDataSource();\n } else {\n return Promise.resolve();\n }\n })\n .then(() => {\n return {\n status: \"success\",\n title: \"Success\",\n message: \"Zabbix API version: \" + zabbixVersion\n };\n })\n .catch(error => {\n if (error instanceof ZabbixAPIError) {\n return {\n status: \"error\",\n title: error.message,\n message: error.message\n };\n } else if (error.data && error.data.message) {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error.data.message\n };\n } else {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Could not connect to given url\"\n };\n }\n });\n }\n\n ////////////////\n // Templating //\n ////////////////\n\n /**\n * Find metrics from templated request.\n *\n * @param {string} query Query from Templating\n * @return {string} Metric name - group, host, app or item or list\n * of metrics in \"{metric1,metcic2,...,metricN}\" format.\n */\n metricFindQuery(query) {\n let result;\n let parts = [];\n\n // Split query. Query structure: group.host.app.item\n _.each(utils.splitTemplateQuery(query), part => {\n part = this.replaceTemplateVars(part, {});\n\n // Replace wildcard to regex\n if (part === '*') {\n part = '/.*/';\n }\n parts.push(part);\n });\n let template = _.zipObject(['group', 'host', 'app', 'item'], parts);\n\n // Get items\n if (parts.length === 4) {\n // Search for all items, even it's not belong to any application\n if (template.app === '/.*/') {\n template.app = '';\n }\n result = this.zabbix.getItems(template.group, template.host, template.app, template.item);\n } else if (parts.length === 3) {\n // Get applications\n result = this.zabbix.getApps(template.group, template.host, template.app);\n } else if (parts.length === 2) {\n // Get hosts\n result = this.zabbix.getHosts(template.group, template.host);\n } else if (parts.length === 1) {\n // Get groups\n result = this.zabbix.getGroups(template.group);\n } else {\n result = Promise.resolve([]);\n }\n\n return result.then(metrics => {\n return _.map(metrics, formatMetric);\n });\n }\n\n /////////////////\n // Annotations //\n /////////////////\n\n annotationQuery(options) {\n var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);\n var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);\n var annotation = options.annotation;\n var showOkEvents = annotation.showOkEvents ? c.SHOW_ALL_EVENTS : c.SHOW_OK_EVENTS;\n\n // Show all triggers\n let triggersOptions = {\n showTriggers: c.SHOW_ALL_TRIGGERS,\n hideHostsInMaintenance: false\n };\n\n var getTriggers = this.zabbix.getTriggers(this.replaceTemplateVars(annotation.group, {}),\n this.replaceTemplateVars(annotation.host, {}),\n this.replaceTemplateVars(annotation.application, {}),\n triggersOptions);\n\n return getTriggers.then(triggers => {\n\n // Filter triggers by description\n let triggerName = this.replaceTemplateVars(annotation.trigger, {});\n if (utils.isRegex(triggerName)) {\n triggers = _.filter(triggers, trigger => {\n return utils.buildRegex(triggerName).test(trigger.description);\n });\n } else if (triggerName) {\n triggers = _.filter(triggers, trigger => {\n return trigger.description === triggerName;\n });\n }\n\n // Remove events below the chose severity\n triggers = _.filter(triggers, trigger => {\n return Number(trigger.priority) >= Number(annotation.minseverity);\n });\n\n var objectids = _.map(triggers, 'triggerid');\n return this.zabbix\n .getEvents(objectids, timeFrom, timeTo, showOkEvents)\n .then(events => {\n var indexedTriggers = _.keyBy(triggers, 'triggerid');\n\n // Hide acknowledged events if option enabled\n if (annotation.hideAcknowledged) {\n events = _.filter(events, event => {\n return !event.acknowledges.length;\n });\n }\n\n return _.map(events, event => {\n let tags;\n if (annotation.showHostname) {\n tags = _.map(event.hosts, 'name');\n }\n\n // Show event type (OK or Problem)\n let title = Number(event.value) ? 'Problem' : 'OK';\n\n let formatted_acknowledges = utils.formatAcknowledges(event.acknowledges);\n return {\n annotation: annotation,\n time: event.clock * 1000,\n title: title,\n tags: tags,\n text: indexedTriggers[event.objectid].description + formatted_acknowledges\n };\n });\n });\n });\n }\n\n /**\n * Get triggers and its details for panel's targets\n * Returns alert state ('ok' if no fired triggers, or 'alerting' if at least 1 trigger is fired)\n * or empty object if no related triggers are finded.\n */\n alertQuery(options) {\n let enabled_targets = filterEnabledTargets(options.targets);\n let getPanelItems = _.map(enabled_targets, t => {\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n return this.zabbix.getItemsFromTarget(target, {itemtype: 'num'});\n });\n\n return Promise.all(getPanelItems)\n .then(results => {\n let items = _.flatten(results);\n let itemids = _.map(items, 'itemid');\n\n if (itemids.length === 0) {\n return [];\n }\n return this.zabbix.getAlerts(itemids);\n })\n .then(triggers => {\n triggers = _.filter(triggers, trigger => {\n return trigger.priority >= this.alertingMinSeverity;\n });\n\n if (!triggers || triggers.length === 0) {\n return {};\n }\n\n let state = 'ok';\n\n let firedTriggers = _.filter(triggers, {value: '1'});\n if (firedTriggers.length) {\n state = 'alerting';\n }\n\n let thresholds = _.map(triggers, trigger => {\n return getTriggerThreshold(trigger.expression);\n });\n\n return {\n panelId: options.panelId,\n state: state,\n thresholds: thresholds\n };\n });\n }\n\n // Replace template variables\n replaceTargetVariables(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n _.forEach(parts, p => {\n if (target[p] && target[p].filter) {\n target[p].filter = this.replaceTemplateVars(target[p].filter, options.scopedVars);\n }\n });\n target.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars);\n\n _.forEach(target.functions, func => {\n func.params = _.map(func.params, param => {\n if (typeof param === 'number') {\n return +this.templateSrv.replace(param.toString(), options.scopedVars);\n } else {\n return this.templateSrv.replace(param, options.scopedVars);\n }\n });\n });\n }\n\n isUseTrends(timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);\n let useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);\n let useTrends = this.trends && (\n (timeFrom <= useTrendsFrom) ||\n (timeTo - timeFrom >= useTrendsRange)\n );\n return useTrends;\n }\n}\n\nfunction bindFunctionDefs(functionDefs, category) {\n var aggregationFunctions = _.map(metricFunctions.getCategories()[category], 'name');\n var aggFuncDefs = _.filter(functionDefs, function(func) {\n return _.includes(aggregationFunctions, func.def.name);\n });\n\n return _.map(aggFuncDefs, function(func) {\n var funcInstance = metricFunctions.createFuncInstance(func.def, func.params);\n return funcInstance.bindFunction(dataProcessor.metricFunctions);\n });\n}\n\nfunction getConsolidateBy(target) {\n let consolidateBy = 'avg';\n let funcDef = _.find(target.functions, func => {\n return func.def.name === 'consolidateBy';\n });\n if (funcDef && funcDef.params && funcDef.params.length) {\n consolidateBy = funcDef.params[0];\n }\n return consolidateBy;\n}\n\nfunction downsampleSeries(timeseries_data, options) {\n let defaultAgg = dataProcessor.aggregationFunctions['avg'];\n let consolidateByFunc = dataProcessor.aggregationFunctions[options.consolidateBy] || defaultAgg;\n return _.map(timeseries_data, timeseries => {\n if (timeseries.datapoints.length > options.maxDataPoints) {\n timeseries.datapoints = dataProcessor\n .groupBy(options.interval, consolidateByFunc, timeseries.datapoints);\n }\n return timeseries;\n });\n}\n\nfunction formatMetric(metricObj) {\n return {\n text: metricObj.name,\n expandable: false\n };\n}\n\n/**\n * Custom formatter for template variables.\n * Default Grafana \"regex\" formatter returns\n * value1|value2\n * This formatter returns\n * (value1|value2)\n * This format needed for using in complex regex with\n * template variables, for example\n * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait\n */\nfunction zabbixTemplateFormat(value) {\n if (typeof value === 'string') {\n return utils.escapeRegex(value);\n }\n\n var escapedValues = _.map(value, utils.escapeRegex);\n return '(' + escapedValues.join('|') + ')';\n}\n\nfunction zabbixItemIdsTemplateFormat(value) {\n if (typeof value === 'string') {\n return value;\n }\n return value.join(',');\n}\n\n/**\n * If template variables are used in request, replace it using regex format\n * and wrap with '/' for proper multi-value work. Example:\n * $variable selected as a, b, c\n * We use filter $variable\n * $variable -> a|b|c -> /a|b|c/\n * /$variable/ -> /a|b|c/ -> /a|b|c/\n */\nfunction replaceTemplateVars(templateSrv, target, scopedVars) {\n var replacedTarget = templateSrv.replace(target, scopedVars, zabbixTemplateFormat);\n if (target !== replacedTarget && !utils.isRegex(replacedTarget)) {\n replacedTarget = '/^' + replacedTarget + '$/';\n }\n return replacedTarget;\n}\n\n// Apply function one by one:\n// sequence([a(), b(), c()]) = c(b(a()));\nfunction sequence(funcsArray) {\n return function(result) {\n for (var i = 0; i < funcsArray.length; i++) {\n result = funcsArray[i].call(this, result);\n }\n return result;\n };\n}\n\nfunction filterEnabledTargets(targets) {\n return _.filter(targets, target => {\n return !(target.hide || !target.group || !target.host || !target.item);\n });\n}\n\nfunction getTriggerThreshold(expression) {\n let thresholdPattern = /.*[<>=]{1,2}([\\d\\.]+)/;\n let finded_thresholds = expression.match(thresholdPattern);\n if (finded_thresholds && finded_thresholds.length >= 2) {\n let threshold = finded_thresholds[1];\n threshold = Number(threshold);\n return threshold;\n } else {\n return null;\n }\n}\n\nexport {ZabbixAPIDatasource, zabbixTemplateFormat};\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {_.includes = _.contains;}\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/datasource.js"],"names":["bindFunctionDefs","functionDefs","category","aggregationFunctions","_","map","metricFunctions","getCategories","aggFuncDefs","filter","func","includes","def","name","funcInstance","createFuncInstance","params","bindFunction","dataProcessor","getConsolidateBy","target","consolidateBy","funcDef","find","functions","length","downsampleSeries","timeseries_data","options","defaultAgg","consolidateByFunc","timeseries","datapoints","maxDataPoints","groupBy","interval","formatMetric","metricObj","text","expandable","zabbixTemplateFormat","value","utils","escapeRegex","escapedValues","join","zabbixItemIdsTemplateFormat","replaceTemplateVars","templateSrv","scopedVars","replacedTarget","replace","isRegex","sequence","funcsArray","result","i","call","filterEnabledTargets","targets","hide","group","host","item","getTriggerThreshold","expression","thresholdPattern","finded_thresholds","match","threshold","Number","dateMath","migrations","c","responseHandler","Zabbix","ZabbixAPIError","ZabbixAPIDatasource","instanceSettings","alertSrv","dashboardSrv","backendSrv","datasourceSrv","zabbixAlertingSrv","partial","url","basicAuth","withCredentials","jsonData","username","password","trends","trendsFrom","trendsRange","ttl","cacheTTL","parseInterval","alertingEnabled","alerting","addThresholds","alertingMinSeverity","SEV_WARNING","dbConnectionOptions","dbConnection","enableDirectDBConnection","enable","sqlDatasourceId","datasourceId","zabbixOptions","zabbix","alertQuery","then","setPanelAlertState","panelId","alert","state","removeZabbixThreshold","forEach","thresholds","setPanelThreshold","promises","t","timeFrom","Math","ceil","parse","range","from","timeTo","to","cloneDeep","replaceTargetVariables","timeFunctions","time_from","time_to","timeRange","useTrends","isUseTrends","mode","MODE_METRICS","MODE_TEXT","migrate","queryNumericData","queryTextData","MODE_ITEMID","itemids","queryItemIdData","MODE_ITSERVICE","queryITServiceData","MODE_TRIGGERS","queryTriggersData","Promise","all","flatten","data","getItemOptions","itemtype","getItemsFromTarget","queryNumericDataForItems","items","getHistoryPromise","getTrendsDB","dbConnector","handleGrafanaTSResponse","history","valueType","getTrendValueType","getTrend","handleTrends","series","sortBy","point","DATAPOINT_TS","getHistoryDB","getHistory","handleHistory","applyDataProcessingFunctions","catch","console","log","error","trendFunctions","trendValueFunc","transformFunctions","filterFunctions","aliasFunctions","dp","aggFuncNames","lastAgg","findLast","applyTimeShiftFunction","timeShiftFunc","shift","unShiftTimeSeries","resultFormat","handleHistoryAsTable","handleText","resolve","split","itemid","trim","getItemsByIDs","itservice","itServiceFilter","slaProperty","itServiceIds","itServices","isOldVersion","getITServices","itservices","serviceid","getSLA","serviceids","handleSLAResponse","slaResponse","getHostsFromTarget","results","hosts","apps","hostids","appids","minSeverity","triggers","acknowledged","count","getHostAlerts","handleTriggersResponse","zabbixVersion","getVersion","version","login","testSQLDataSource","status","title","message","query","parts","each","splitTemplateQuery","part","push","template","zipObject","app","getItems","getApps","getHosts","getGroups","metrics","rangeRaw","annotation","showOkEvents","SHOW_ALL_EVENTS","SHOW_OK_EVENTS","triggersOptions","showTriggers","SHOW_ALL_TRIGGERS","hideHostsInMaintenance","getTriggers","application","triggerName","trigger","buildRegex","test","description","priority","minseverity","objectids","getEvents","indexedTriggers","keyBy","hideAcknowledged","events","event","acknowledges","tags","showHostname","formatted_acknowledges","formatAcknowledges","time","clock","objectid","enabled_targets","getPanelItems","getAlerts","firedTriggers","p","textFilter","param","toString","useTrendsFrom","useTrendsRange","contains","indexBy"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport * as dateMath from 'app/core/utils/datemath';\nimport * as utils from './utils';\nimport * as migrations from './migrations';\nimport * as metricFunctions from './metricFunctions';\nimport * as c from './constants';\nimport dataProcessor from './dataProcessor';\nimport responseHandler from './responseHandler';\nimport './zabbixAlerting.service.js';\nimport { Zabbix } from './zabbix/zabbix';\nimport {ZabbixAPIError} from './zabbix/connectors/zabbix_api/zabbixAPICore';\n\nclass ZabbixAPIDatasource {\n\n /** @ngInject */\n constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) {\n this.templateSrv = templateSrv;\n this.alertSrv = alertSrv;\n this.dashboardSrv = dashboardSrv;\n this.zabbixAlertingSrv = zabbixAlertingSrv;\n\n // Use custom format for template variables\n this.replaceTemplateVars = _.partial(replaceTemplateVars, this.templateSrv);\n\n // General data source settings\n this.name = instanceSettings.name;\n this.url = instanceSettings.url;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n\n const jsonData = instanceSettings.jsonData;\n\n // Zabbix API credentials\n this.username = jsonData.username;\n this.password = jsonData.password;\n\n // Use trends instead history since specified time\n this.trends = jsonData.trends;\n this.trendsFrom = jsonData.trendsFrom || '7d';\n this.trendsRange = jsonData.trendsRange || '4d';\n\n // Set cache update interval\n var ttl = jsonData.cacheTTL || '1h';\n this.cacheTTL = utils.parseInterval(ttl);\n\n // Alerting options\n this.alertingEnabled = jsonData.alerting;\n this.addThresholds = jsonData.addThresholds;\n this.alertingMinSeverity = jsonData.alertingMinSeverity || c.SEV_WARNING;\n\n // Direct DB Connection options\n let dbConnectionOptions = jsonData.dbConnection || {};\n this.enableDirectDBConnection = dbConnectionOptions.enable;\n this.sqlDatasourceId = dbConnectionOptions.datasourceId;\n\n let zabbixOptions = {\n username: this.username,\n password: this.password,\n basicAuth: this.basicAuth,\n withCredentials: this.withCredentials,\n cacheTTL: this.cacheTTL,\n enableDirectDBConnection: this.enableDirectDBConnection,\n sqlDatasourceId: this.sqlDatasourceId\n };\n\n this.zabbix = new Zabbix(this.url, zabbixOptions, backendSrv, datasourceSrv);\n }\n\n ////////////////////////\n // Datasource methods //\n ////////////////////////\n\n /**\n * Query panel data. Calls for each panel in dashboard.\n * @param {Object} options Contains time range, targets and other info.\n * @return {Object} Grafana metrics object with timeseries data for each target.\n */\n query(options) {\n // Get alerts for current panel\n if (this.alertingEnabled) {\n this.alertQuery(options).then(alert => {\n this.zabbixAlertingSrv.setPanelAlertState(options.panelId, alert.state);\n\n this.zabbixAlertingSrv.removeZabbixThreshold(options.panelId);\n if (this.addThresholds) {\n _.forEach(alert.thresholds, threshold => {\n this.zabbixAlertingSrv.setPanelThreshold(options.panelId, threshold);\n });\n }\n });\n }\n\n // Create request for each target\n let promises = _.map(options.targets, t => {\n // Don't request undefined and hidden targets\n if (t.hide) {\n return [];\n }\n\n let timeFrom = Math.ceil(dateMath.parse(options.range.from) / 1000);\n let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);\n\n // Prevent changes of original object\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n\n // Apply Time-related functions (timeShift(), etc)\n let timeFunctions = bindFunctionDefs(target.functions, 'Time');\n if (timeFunctions.length) {\n const [time_from, time_to] = sequence(timeFunctions)([timeFrom, timeTo]);\n timeFrom = time_from;\n timeTo = time_to;\n }\n let timeRange = [timeFrom, timeTo];\n\n let useTrends = this.isUseTrends(timeRange);\n\n // Metrics or Text query mode\n if (!target.mode || target.mode === c.MODE_METRICS || target.mode === c.MODE_TEXT) {\n // Migrate old targets\n target = migrations.migrate(target);\n\n // Don't request undefined and hidden targets\n if (target.hide || !target.group || !target.host || !target.item) {\n return [];\n }\n\n if (!target.mode || target.mode === c.MODE_METRICS) {\n return this.queryNumericData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_TEXT) {\n return this.queryTextData(target, timeRange);\n }\n } else if (target.mode === c.MODE_ITEMID) {\n // Item ID mode\n if (!target.itemids) {\n return [];\n }\n return this.queryItemIdData(target, timeRange, useTrends, options);\n } else if (target.mode === c.MODE_ITSERVICE) {\n // IT services mode\n return this.queryITServiceData(target, timeRange, options);\n } else if (target.mode === c.MODE_TRIGGERS) {\n // Triggers mode\n return this.queryTriggersData(target, timeRange);\n } else {\n return [];\n }\n });\n\n // Data for panel (all targets)\n return Promise.all(_.flatten(promises))\n .then(_.flatten)\n .then(data => {\n return { data: data };\n });\n }\n\n /**\n * Query target data for Metrics mode\n */\n queryNumericData(target, timeRange, useTrends, options) {\n let getItemOptions = {\n itemtype: 'num'\n };\n return this.zabbix.getItemsFromTarget(target, getItemOptions)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query history for numeric items\n */\n queryNumericDataForItems(items, target, timeRange, useTrends, options) {\n let [timeFrom, timeTo] = timeRange;\n let getHistoryPromise;\n options.consolidateBy = getConsolidateBy(target);\n\n if (useTrends) {\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getTrendsDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n let valueType = this.getTrendValueType(target);\n getHistoryPromise = this.zabbix.getTrend(items, timeFrom, timeTo)\n .then(history => responseHandler.handleTrends(history, items, valueType))\n .then(timeseries => {\n // Sort trend data, issue #202\n _.forEach(timeseries, series => {\n series.datapoints = _.sortBy(series.datapoints, point => point[c.DATAPOINT_TS]);\n });\n return timeseries;\n });\n }\n } else {\n // Use history\n if (this.enableDirectDBConnection) {\n getHistoryPromise = this.zabbix.getHistoryDB(items, timeFrom, timeTo, options)\n .then(history => this.zabbix.dbConnector.handleGrafanaTSResponse(history, items));\n } else {\n getHistoryPromise = this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => responseHandler.handleHistory(history, items));\n }\n }\n\n return getHistoryPromise\n .then(timeseries => this.applyDataProcessingFunctions(timeseries, target))\n .then(timeseries => downsampleSeries(timeseries, options))\n .catch(error => {\n console.log(error);\n return [];\n });\n }\n\n getTrendValueType(target) {\n // Find trendValue() function and get specified trend value\n var trendFunctions = _.map(metricFunctions.getCategories()['Trends'], 'name');\n var trendValueFunc = _.find(target.functions, func => {\n return _.includes(trendFunctions, func.def.name);\n });\n return trendValueFunc ? trendValueFunc.params[0] : \"avg\";\n }\n\n applyDataProcessingFunctions(timeseries_data, target) {\n let transformFunctions = bindFunctionDefs(target.functions, 'Transform');\n let aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');\n let filterFunctions = bindFunctionDefs(target.functions, 'Filter');\n let aliasFunctions = bindFunctionDefs(target.functions, 'Alias');\n\n // Apply transformation functions\n timeseries_data = _.cloneDeep(_.map(timeseries_data, timeseries => {\n timeseries.datapoints = sequence(transformFunctions)(timeseries.datapoints);\n return timeseries;\n }));\n\n // Apply filter functions\n if (filterFunctions.length) {\n timeseries_data = sequence(filterFunctions)(timeseries_data);\n }\n\n // Apply aggregations\n if (aggregationFunctions.length) {\n let dp = _.map(timeseries_data, 'datapoints');\n dp = sequence(aggregationFunctions)(dp);\n\n let aggFuncNames = _.map(metricFunctions.getCategories()['Aggregate'], 'name');\n let lastAgg = _.findLast(target.functions, func => {\n return _.includes(aggFuncNames, func.def.name);\n });\n\n timeseries_data = [{\n target: lastAgg.text,\n datapoints: dp\n }];\n }\n\n // Apply alias functions\n _.forEach(timeseries_data, sequence(aliasFunctions));\n\n // Apply Time-related functions (timeShift(), etc)\n // Find timeShift() function and get specified trend value\n this.applyTimeShiftFunction(timeseries_data, target);\n\n return timeseries_data;\n }\n\n applyTimeShiftFunction(timeseries_data, target) {\n // Find timeShift() function and get specified interval\n let timeShiftFunc = _.find(target.functions, (func) => {\n return func.def.name === 'timeShift';\n });\n if (timeShiftFunc) {\n let shift = timeShiftFunc.params[0];\n _.forEach(timeseries_data, (series) => {\n series.datapoints = dataProcessor.unShiftTimeSeries(shift, series.datapoints);\n });\n }\n }\n\n /**\n * Query target data for Text mode\n */\n queryTextData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let options = {\n itemtype: 'text'\n };\n return this.zabbix.getItemsFromTarget(target, options)\n .then(items => {\n if (items.length) {\n return this.zabbix.getHistory(items, timeFrom, timeTo)\n .then(history => {\n if (target.resultFormat === 'table') {\n return responseHandler.handleHistoryAsTable(history, items, target);\n } else {\n return responseHandler.handleText(history, items, target);\n }\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Query target data for Item ID mode\n */\n queryItemIdData(target, timeRange, useTrends, options) {\n let itemids = target.itemids;\n itemids = this.templateSrv.replace(itemids, options.scopedVars, zabbixItemIdsTemplateFormat);\n itemids = _.map(itemids.split(','), itemid => itemid.trim());\n\n if (!itemids) {\n return [];\n }\n\n return this.zabbix.getItemsByIDs(itemids)\n .then(items => {\n return this.queryNumericDataForItems(items, target, timeRange, useTrends, options);\n });\n }\n\n /**\n * Query target data for IT Services mode\n */\n queryITServiceData(target, timeRange, options) {\n // Don't show undefined and hidden targets\n if (target.hide || (!target.itservice && !target.itServiceFilter) || !target.slaProperty) {\n return [];\n }\n\n let itServiceIds = [];\n let itServices = [];\n let itServiceFilter;\n let isOldVersion = target.itservice && !target.itServiceFilter;\n\n if (isOldVersion) {\n // Backward compatibility\n itServiceFilter = '/.*/';\n } else {\n itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);\n }\n\n return this.zabbix.getITServices(itServiceFilter)\n .then(itservices => {\n itServices = itservices;\n if (isOldVersion) {\n itServices = _.filter(itServices, {'serviceid': target.itservice.serviceid});\n }\n\n itServiceIds = _.map(itServices, 'serviceid');\n return itServiceIds;\n })\n .then(serviceids => {\n return this.zabbix.getSLA(serviceids, timeRange);\n })\n .then(slaResponse => {\n return _.map(itServiceIds, serviceid => {\n let itservice = _.find(itServices, {'serviceid': serviceid});\n return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse);\n });\n });\n }\n\n queryTriggersData(target, timeRange) {\n let [timeFrom, timeTo] = timeRange;\n return this.zabbix.getHostsFromTarget(target)\n .then((results) => {\n let [hosts, apps] = results;\n if (hosts.length) {\n let hostids = _.map(hosts, 'hostid');\n let appids = _.map(apps, 'applicationid');\n let options = {\n minSeverity: target.triggers.minSeverity,\n acknowledged: target.triggers.acknowledged,\n count: target.triggers.count,\n timeFrom: timeFrom,\n timeTo: timeTo\n };\n return this.zabbix.getHostAlerts(hostids, appids, options)\n .then((triggers) => {\n return responseHandler.handleTriggersResponse(triggers, timeRange);\n });\n } else {\n return Promise.resolve([]);\n }\n });\n }\n\n /**\n * Test connection to Zabbix API\n * @return {object} Connection status and Zabbix API version\n */\n testDatasource() {\n let zabbixVersion;\n return this.zabbix.getVersion()\n .then(version => {\n zabbixVersion = version;\n return this.zabbix.login();\n })\n .then(() => {\n if (this.enableDirectDBConnection) {\n return this.zabbix.dbConnector.testSQLDataSource();\n } else {\n return Promise.resolve();\n }\n })\n .then(() => {\n return {\n status: \"success\",\n title: \"Success\",\n message: \"Zabbix API version: \" + zabbixVersion\n };\n })\n .catch(error => {\n if (error instanceof ZabbixAPIError) {\n return {\n status: \"error\",\n title: error.message,\n message: error.message\n };\n } else if (error.data && error.data.message) {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Connection failed: \" + error.data.message\n };\n } else {\n return {\n status: \"error\",\n title: \"Connection failed\",\n message: \"Could not connect to given url\"\n };\n }\n });\n }\n\n ////////////////\n // Templating //\n ////////////////\n\n /**\n * Find metrics from templated request.\n *\n * @param {string} query Query from Templating\n * @return {string} Metric name - group, host, app or item or list\n * of metrics in \"{metric1,metcic2,...,metricN}\" format.\n */\n metricFindQuery(query) {\n let result;\n let parts = [];\n\n // Split query. Query structure: group.host.app.item\n _.each(utils.splitTemplateQuery(query), part => {\n part = this.replaceTemplateVars(part, {});\n\n // Replace wildcard to regex\n if (part === '*') {\n part = '/.*/';\n }\n parts.push(part);\n });\n let template = _.zipObject(['group', 'host', 'app', 'item'], parts);\n\n // Get items\n if (parts.length === 4) {\n // Search for all items, even it's not belong to any application\n if (template.app === '/.*/') {\n template.app = '';\n }\n result = this.zabbix.getItems(template.group, template.host, template.app, template.item);\n } else if (parts.length === 3) {\n // Get applications\n result = this.zabbix.getApps(template.group, template.host, template.app);\n } else if (parts.length === 2) {\n // Get hosts\n result = this.zabbix.getHosts(template.group, template.host);\n } else if (parts.length === 1) {\n // Get groups\n result = this.zabbix.getGroups(template.group);\n } else {\n result = Promise.resolve([]);\n }\n\n return result.then(metrics => {\n return _.map(metrics, formatMetric);\n });\n }\n\n /////////////////\n // Annotations //\n /////////////////\n\n annotationQuery(options) {\n var timeFrom = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);\n var timeTo = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);\n var annotation = options.annotation;\n var showOkEvents = annotation.showOkEvents ? c.SHOW_ALL_EVENTS : c.SHOW_OK_EVENTS;\n\n // Show all triggers\n let triggersOptions = {\n showTriggers: c.SHOW_ALL_TRIGGERS,\n hideHostsInMaintenance: false\n };\n\n var getTriggers = this.zabbix.getTriggers(this.replaceTemplateVars(annotation.group, {}),\n this.replaceTemplateVars(annotation.host, {}),\n this.replaceTemplateVars(annotation.application, {}),\n triggersOptions);\n\n return getTriggers.then(triggers => {\n\n // Filter triggers by description\n let triggerName = this.replaceTemplateVars(annotation.trigger, {});\n if (utils.isRegex(triggerName)) {\n triggers = _.filter(triggers, trigger => {\n return utils.buildRegex(triggerName).test(trigger.description);\n });\n } else if (triggerName) {\n triggers = _.filter(triggers, trigger => {\n return trigger.description === triggerName;\n });\n }\n\n // Remove events below the chose severity\n triggers = _.filter(triggers, trigger => {\n return Number(trigger.priority) >= Number(annotation.minseverity);\n });\n\n var objectids = _.map(triggers, 'triggerid');\n return this.zabbix\n .getEvents(objectids, timeFrom, timeTo, showOkEvents)\n .then(events => {\n var indexedTriggers = _.keyBy(triggers, 'triggerid');\n\n // Hide acknowledged events if option enabled\n if (annotation.hideAcknowledged) {\n events = _.filter(events, event => {\n return !event.acknowledges.length;\n });\n }\n\n return _.map(events, event => {\n let tags;\n if (annotation.showHostname) {\n tags = _.map(event.hosts, 'name');\n }\n\n // Show event type (OK or Problem)\n let title = Number(event.value) ? 'Problem' : 'OK';\n\n let formatted_acknowledges = utils.formatAcknowledges(event.acknowledges);\n return {\n annotation: annotation,\n time: event.clock * 1000,\n title: title,\n tags: tags,\n text: indexedTriggers[event.objectid].description + formatted_acknowledges\n };\n });\n });\n });\n }\n\n /**\n * Get triggers and its details for panel's targets\n * Returns alert state ('ok' if no fired triggers, or 'alerting' if at least 1 trigger is fired)\n * or empty object if no related triggers are finded.\n */\n alertQuery(options) {\n let enabled_targets = filterEnabledTargets(options.targets);\n let getPanelItems = _.map(enabled_targets, t => {\n let target = _.cloneDeep(t);\n this.replaceTargetVariables(target, options);\n return this.zabbix.getItemsFromTarget(target, {itemtype: 'num'});\n });\n\n return Promise.all(getPanelItems)\n .then(results => {\n let items = _.flatten(results);\n let itemids = _.map(items, 'itemid');\n\n if (itemids.length === 0) {\n return [];\n }\n return this.zabbix.getAlerts(itemids);\n })\n .then(triggers => {\n triggers = _.filter(triggers, trigger => {\n return trigger.priority >= this.alertingMinSeverity;\n });\n\n if (!triggers || triggers.length === 0) {\n return {};\n }\n\n let state = 'ok';\n\n let firedTriggers = _.filter(triggers, {value: '1'});\n if (firedTriggers.length) {\n state = 'alerting';\n }\n\n let thresholds = _.map(triggers, trigger => {\n return getTriggerThreshold(trigger.expression);\n });\n\n return {\n panelId: options.panelId,\n state: state,\n thresholds: thresholds\n };\n });\n }\n\n // Replace template variables\n replaceTargetVariables(target, options) {\n let parts = ['group', 'host', 'application', 'item'];\n _.forEach(parts, p => {\n if (target[p] && target[p].filter) {\n target[p].filter = this.replaceTemplateVars(target[p].filter, options.scopedVars);\n }\n });\n target.textFilter = this.replaceTemplateVars(target.textFilter, options.scopedVars);\n\n _.forEach(target.functions, func => {\n func.params = _.map(func.params, param => {\n if (typeof param === 'number') {\n return +this.templateSrv.replace(param.toString(), options.scopedVars);\n } else {\n return this.templateSrv.replace(param, options.scopedVars);\n }\n });\n });\n }\n\n isUseTrends(timeRange) {\n let [timeFrom, timeTo] = timeRange;\n let useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);\n let useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);\n let useTrends = this.trends && (\n (timeFrom <= useTrendsFrom) ||\n (timeTo - timeFrom >= useTrendsRange)\n );\n return useTrends;\n }\n}\n\nfunction bindFunctionDefs(functionDefs, category) {\n var aggregationFunctions = _.map(metricFunctions.getCategories()[category], 'name');\n var aggFuncDefs = _.filter(functionDefs, function(func) {\n return _.includes(aggregationFunctions, func.def.name);\n });\n\n return _.map(aggFuncDefs, function(func) {\n var funcInstance = metricFunctions.createFuncInstance(func.def, func.params);\n return funcInstance.bindFunction(dataProcessor.metricFunctions);\n });\n}\n\nfunction getConsolidateBy(target) {\n let consolidateBy = 'avg';\n let funcDef = _.find(target.functions, func => {\n return func.def.name === 'consolidateBy';\n });\n if (funcDef && funcDef.params && funcDef.params.length) {\n consolidateBy = funcDef.params[0];\n }\n return consolidateBy;\n}\n\nfunction downsampleSeries(timeseries_data, options) {\n let defaultAgg = dataProcessor.aggregationFunctions['avg'];\n let consolidateByFunc = dataProcessor.aggregationFunctions[options.consolidateBy] || defaultAgg;\n return _.map(timeseries_data, timeseries => {\n if (timeseries.datapoints.length > options.maxDataPoints) {\n timeseries.datapoints = dataProcessor\n .groupBy(options.interval, consolidateByFunc, timeseries.datapoints);\n }\n return timeseries;\n });\n}\n\nfunction formatMetric(metricObj) {\n return {\n text: metricObj.name,\n expandable: false\n };\n}\n\n/**\n * Custom formatter for template variables.\n * Default Grafana \"regex\" formatter returns\n * value1|value2\n * This formatter returns\n * (value1|value2)\n * This format needed for using in complex regex with\n * template variables, for example\n * /CPU $cpu_item.*time/ where $cpu_item is system,user,iowait\n */\nfunction zabbixTemplateFormat(value) {\n if (typeof value === 'string') {\n return utils.escapeRegex(value);\n }\n\n var escapedValues = _.map(value, utils.escapeRegex);\n return '(' + escapedValues.join('|') + ')';\n}\n\nfunction zabbixItemIdsTemplateFormat(value) {\n if (typeof value === 'string') {\n return value;\n }\n return value.join(',');\n}\n\n/**\n * If template variables are used in request, replace it using regex format\n * and wrap with '/' for proper multi-value work. Example:\n * $variable selected as a, b, c\n * We use filter $variable\n * $variable -> a|b|c -> /a|b|c/\n * /$variable/ -> /a|b|c/ -> /a|b|c/\n */\nfunction replaceTemplateVars(templateSrv, target, scopedVars) {\n var replacedTarget = templateSrv.replace(target, scopedVars, zabbixTemplateFormat);\n if (target !== replacedTarget && !utils.isRegex(replacedTarget)) {\n replacedTarget = '/^' + replacedTarget + '$/';\n }\n return replacedTarget;\n}\n\n// Apply function one by one:\n// sequence([a(), b(), c()]) = c(b(a()));\nfunction sequence(funcsArray) {\n return function(result) {\n for (var i = 0; i < funcsArray.length; i++) {\n result = funcsArray[i].call(this, result);\n }\n return result;\n };\n}\n\nfunction filterEnabledTargets(targets) {\n return _.filter(targets, target => {\n return !(target.hide || !target.group || !target.host || !target.item);\n });\n}\n\nfunction getTriggerThreshold(expression) {\n let thresholdPattern = /.*[<>=]{1,2}([\\d\\.]+)/;\n let finded_thresholds = expression.match(thresholdPattern);\n if (finded_thresholds && finded_thresholds.length >= 2) {\n let threshold = finded_thresholds[1];\n threshold = Number(threshold);\n return threshold;\n } else {\n return null;\n }\n}\n\nexport {ZabbixAPIDatasource, zabbixTemplateFormat};\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {_.includes = _.contains;}\nif (!_.keyBy) {_.keyBy = _.indexBy;}\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/specs/dataProcessor.spec.js b/dist/datasource-zabbix/specs/dataProcessor.spec.js index 999e3a7..0b45998 100644 --- a/dist/datasource-zabbix/specs/dataProcessor.spec.js +++ b/dist/datasource-zabbix/specs/dataProcessor.spec.js @@ -1,51 +1,56 @@ -import _ from 'lodash'; -import dataProcessor from '../dataProcessor'; +'use strict'; -describe('dataProcessor', () => { - let ctx = {}; +System.register(['lodash', '../dataProcessor'], function (_export, _context) { + "use strict"; - beforeEach(() => { - ctx.datapoints = [ - [[10, 1500000000000], [2, 1500000001000], [7, 1500000002000], [1, 1500000003000]], - [[9, 1500000000000], [3, 1500000001000], [4, 1500000002000], [8, 1500000003000]], - ]; - }); + var _, dataProcessor; - describe('When apply groupBy() functions', () => { - it('should return series average', () => { - let aggregateBy = dataProcessor.metricFunctions['groupBy']; - const avg2s = _.map(ctx.datapoints, (dp) => aggregateBy('2s', 'avg', dp)); - expect(avg2s).toEqual([ - [[6, 1500000000000], [4, 1500000002000]], - [[6, 1500000000000], [6, 1500000002000]], - ]); + return { + setters: [function (_lodash) { + _ = _lodash.default; + }, function (_dataProcessor) { + dataProcessor = _dataProcessor.default; + }], + execute: function () { - const avg10s = _.map(ctx.datapoints, (dp) => aggregateBy('10s', 'avg', dp)); - expect(avg10s).toEqual([ - [[5, 1500000000000]], - [[6, 1500000000000]], - ]); + describe('dataProcessor', function () { + var ctx = {}; - // not aligned - const dp = [[10, 1500000001000], [2, 1500000002000], [7, 1500000003000], [1, 1500000004000]]; - expect(aggregateBy('2s', 'avg', dp)).toEqual([ - [10, 1500000000000], [4.5, 1500000002000], [1, 1500000004000] - ]); - }); - }); + beforeEach(function () { + ctx.datapoints = [[[10, 1500000000000], [2, 1500000001000], [7, 1500000002000], [1, 1500000003000]], [[9, 1500000000000], [3, 1500000001000], [4, 1500000002000], [8, 1500000003000]]]; + }); - describe('When apply aggregateBy() functions', () => { - it('should return series average', () => { - let aggregateBy = dataProcessor.metricFunctions['aggregateBy']; - const avg1s = aggregateBy('1s', 'avg', ctx.datapoints); - expect(avg1s).toEqual([ - [9.5, 1500000000000], [2.5, 1500000001000], [5.5, 1500000002000], [4.5, 1500000003000] - ]); + describe('When apply groupBy() functions', function () { + it('should return series average', function () { + var aggregateBy = dataProcessor.metricFunctions['groupBy']; + var avg2s = _.map(ctx.datapoints, function (dp) { + return aggregateBy('2s', 'avg', dp); + }); + expect(avg2s).toEqual([[[6, 1500000000000], [4, 1500000002000]], [[6, 1500000000000], [6, 1500000002000]]]); - const avg10s = aggregateBy('10s', 'avg', ctx.datapoints); - expect(avg10s).toEqual([ - [5.5, 1500000000000] - ]); - }); - }); + var avg10s = _.map(ctx.datapoints, function (dp) { + return aggregateBy('10s', 'avg', dp); + }); + expect(avg10s).toEqual([[[5, 1500000000000]], [[6, 1500000000000]]]); + + // not aligned + var dp = [[10, 1500000001000], [2, 1500000002000], [7, 1500000003000], [1, 1500000004000]]; + expect(aggregateBy('2s', 'avg', dp)).toEqual([[10, 1500000000000], [4.5, 1500000002000], [1, 1500000004000]]); + }); + }); + + describe('When apply aggregateBy() functions', function () { + it('should return series average', function () { + var aggregateBy = dataProcessor.metricFunctions['aggregateBy']; + var avg1s = aggregateBy('1s', 'avg', ctx.datapoints); + expect(avg1s).toEqual([[9.5, 1500000000000], [2.5, 1500000001000], [5.5, 1500000002000], [4.5, 1500000003000]]); + + var avg10s = aggregateBy('10s', 'avg', ctx.datapoints); + expect(avg10s).toEqual([[5.5, 1500000000000]]); + }); + }); + }); + } + }; }); +//# sourceMappingURL=dataProcessor.spec.js.map diff --git a/dist/datasource-zabbix/specs/dataProcessor.spec.js.map b/dist/datasource-zabbix/specs/dataProcessor.spec.js.map new file mode 100644 index 0000000..a810a1e --- /dev/null +++ b/dist/datasource-zabbix/specs/dataProcessor.spec.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/datasource-zabbix/specs/dataProcessor.spec.js"],"names":["_","dataProcessor","describe","ctx","beforeEach","datapoints","it","aggregateBy","metricFunctions","avg2s","map","dp","expect","toEqual","avg10s","avg1s"],"mappings":";;;;;;;;;AAAOA,O;;AACAC,mB;;;;AAEPC,eAAS,eAAT,EAA0B,YAAM;AAC9B,YAAIC,MAAM,EAAV;;AAEAC,mBAAW,YAAM;AACfD,cAAIE,UAAJ,GAAiB,CACf,CAAC,CAAC,EAAD,EAAK,aAAL,CAAD,EAAsB,CAAC,CAAD,EAAI,aAAJ,CAAtB,EAA0C,CAAC,CAAD,EAAI,aAAJ,CAA1C,EAA8D,CAAC,CAAD,EAAI,aAAJ,CAA9D,CADe,EAEf,CAAC,CAAC,CAAD,EAAI,aAAJ,CAAD,EAAsB,CAAC,CAAD,EAAI,aAAJ,CAAtB,EAA0C,CAAC,CAAD,EAAI,aAAJ,CAA1C,EAA8D,CAAC,CAAD,EAAI,aAAJ,CAA9D,CAFe,CAAjB;AAID,SALD;;AAOAH,iBAAS,gCAAT,EAA2C,YAAM;AAC/CI,aAAG,8BAAH,EAAmC,YAAM;AACvC,gBAAIC,cAAcN,cAAcO,eAAd,CAA8B,SAA9B,CAAlB;AACA,gBAAMC,QAAQT,EAAEU,GAAF,CAAMP,IAAIE,UAAV,EAAsB,UAACM,EAAD;AAAA,qBAAQJ,YAAY,IAAZ,EAAkB,KAAlB,EAAyBI,EAAzB,CAAR;AAAA,aAAtB,CAAd;AACAC,mBAAOH,KAAP,EAAcI,OAAd,CAAsB,CACpB,CAAC,CAAC,CAAD,EAAI,aAAJ,CAAD,EAAqB,CAAC,CAAD,EAAI,aAAJ,CAArB,CADoB,EAEpB,CAAC,CAAC,CAAD,EAAI,aAAJ,CAAD,EAAqB,CAAC,CAAD,EAAI,aAAJ,CAArB,CAFoB,CAAtB;;AAKA,gBAAMC,SAASd,EAAEU,GAAF,CAAMP,IAAIE,UAAV,EAAsB,UAACM,EAAD;AAAA,qBAAQJ,YAAY,KAAZ,EAAmB,KAAnB,EAA0BI,EAA1B,CAAR;AAAA,aAAtB,CAAf;AACAC,mBAAOE,MAAP,EAAeD,OAAf,CAAuB,CACrB,CAAC,CAAC,CAAD,EAAI,aAAJ,CAAD,CADqB,EAErB,CAAC,CAAC,CAAD,EAAI,aAAJ,CAAD,CAFqB,CAAvB;;AAKA;AACA,gBAAMF,KAAK,CAAC,CAAC,EAAD,EAAK,aAAL,CAAD,EAAsB,CAAC,CAAD,EAAI,aAAJ,CAAtB,EAA0C,CAAC,CAAD,EAAI,aAAJ,CAA1C,EAA8D,CAAC,CAAD,EAAI,aAAJ,CAA9D,CAAX;AACAC,mBAAOL,YAAY,IAAZ,EAAkB,KAAlB,EAAyBI,EAAzB,CAAP,EAAqCE,OAArC,CAA6C,CAC3C,CAAC,EAAD,EAAK,aAAL,CAD2C,EACtB,CAAC,GAAD,EAAM,aAAN,CADsB,EACA,CAAC,CAAD,EAAI,aAAJ,CADA,CAA7C;AAGD,WAnBD;AAoBD,SArBD;;AAuBAX,iBAAS,oCAAT,EAA+C,YAAM;AACnDI,aAAG,8BAAH,EAAmC,YAAM;AACvC,gBAAIC,cAAcN,cAAcO,eAAd,CAA8B,aAA9B,CAAlB;AACA,gBAAMO,QAAQR,YAAY,IAAZ,EAAkB,KAAlB,EAAyBJ,IAAIE,UAA7B,CAAd;AACAO,mBAAOG,KAAP,EAAcF,OAAd,CAAsB,CACpB,CAAC,GAAD,EAAM,aAAN,CADoB,EACE,CAAC,GAAD,EAAM,aAAN,CADF,EACwB,CAAC,GAAD,EAAM,aAAN,CADxB,EAC8C,CAAC,GAAD,EAAM,aAAN,CAD9C,CAAtB;;AAIA,gBAAMC,SAASP,YAAY,KAAZ,EAAmB,KAAnB,EAA0BJ,IAAIE,UAA9B,CAAf;AACAO,mBAAOE,MAAP,EAAeD,OAAf,CAAuB,CACrB,CAAC,GAAD,EAAM,aAAN,CADqB,CAAvB;AAGD,WAXD;AAYD,SAbD;AAcD,OA/CD","file":"dataProcessor.spec.js","sourcesContent":["import _ from 'lodash';\nimport dataProcessor from '../dataProcessor';\n\ndescribe('dataProcessor', () => {\n let ctx = {};\n\n beforeEach(() => {\n ctx.datapoints = [\n [[10, 1500000000000], [2, 1500000001000], [7, 1500000002000], [1, 1500000003000]],\n [[9, 1500000000000], [3, 1500000001000], [4, 1500000002000], [8, 1500000003000]],\n ];\n });\n\n describe('When apply groupBy() functions', () => {\n it('should return series average', () => {\n let aggregateBy = dataProcessor.metricFunctions['groupBy'];\n const avg2s = _.map(ctx.datapoints, (dp) => aggregateBy('2s', 'avg', dp));\n expect(avg2s).toEqual([\n [[6, 1500000000000], [4, 1500000002000]],\n [[6, 1500000000000], [6, 1500000002000]],\n ]);\n\n const avg10s = _.map(ctx.datapoints, (dp) => aggregateBy('10s', 'avg', dp));\n expect(avg10s).toEqual([\n [[5, 1500000000000]],\n [[6, 1500000000000]],\n ]);\n\n // not aligned\n const dp = [[10, 1500000001000], [2, 1500000002000], [7, 1500000003000], [1, 1500000004000]];\n expect(aggregateBy('2s', 'avg', dp)).toEqual([\n [10, 1500000000000], [4.5, 1500000002000], [1, 1500000004000]\n ]);\n });\n });\n\n describe('When apply aggregateBy() functions', () => {\n it('should return series average', () => {\n let aggregateBy = dataProcessor.metricFunctions['aggregateBy'];\n const avg1s = aggregateBy('1s', 'avg', ctx.datapoints);\n expect(avg1s).toEqual([\n [9.5, 1500000000000], [2.5, 1500000001000], [5.5, 1500000002000], [4.5, 1500000003000]\n ]);\n\n const avg10s = aggregateBy('10s', 'avg', ctx.datapoints);\n expect(avg10s).toEqual([\n [5.5, 1500000000000]\n ]);\n });\n });\n});\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/specs/datasource.spec.js b/dist/datasource-zabbix/specs/datasource.spec.js index 697c982..3679501 100644 --- a/dist/datasource-zabbix/specs/datasource.spec.js +++ b/dist/datasource-zabbix/specs/datasource.spec.js @@ -1,429 +1,509 @@ -import _ from 'lodash'; -import Q, { Promise } from "q"; -import {Datasource} from "../module"; -import {zabbixTemplateFormat} from "../datasource"; +"use strict"; -describe('ZabbixDatasource', () => { - let ctx = {}; +System.register(["lodash", "q", "../module", "../datasource"], function (_export, _context) { + "use strict"; - beforeEach(() => { - ctx.instanceSettings = { - jsonData: { - alerting: true, - username: 'zabbix', - password: 'zabbix', - trends: true, - trendsFrom: '14d', - trendsRange: '7d', - dbConnection: { - enabled: false - } - } - }; - ctx.templateSrv = {}; - ctx.alertSrv = {}; - ctx.dashboardSrv = {}; - ctx.zabbixAlertingSrv = { - setPanelAlertState: jest.fn(), - removeZabbixThreshold: jest.fn(), - }; - ctx.zabbix = () => {}; + var _, Q, Promise, Datasource, zabbixTemplateFormat; - ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix); - }); + return { + setters: [function (_lodash) { + _ = _lodash.default; + }, function (_q) { + Q = _q.default; + Promise = _q.Promise; + }, function (_module) { + Datasource = _module.Datasource; + }, function (_datasource) { + zabbixTemplateFormat = _datasource.zabbixTemplateFormat; + }], + execute: function () { - describe('When querying data', () => { - beforeEach(() => { - ctx.ds.replaceTemplateVars = (str) => str; - ctx.ds.alertQuery = () => Q.when([]); - }); + describe('ZabbixDatasource', function () { + var ctx = {}; - ctx.options = { - targets: [ - { - group: {filter: ""}, - host: {filter: ""}, - application: {filter: ""}, - item: {filter: ""} - } - ], - range: {from: 'now-7d', to: 'now'} - }; - - it('should return an empty array when no targets are set', (done) => { - let options = { - targets: [], - range: {from: 'now-6h', to: 'now'} - }; - ctx.ds.query(options).then(result => { - expect(result.data.length).toBe(0); - done(); - }); - }); - - it('should use trends if it enabled and time more than trendsFrom', (done) => { - let ranges = ['now-7d', 'now-168h', 'now-1M', 'now-1y']; - - _.forEach(ranges, range => { - ctx.options.range.from = range; - ctx.ds.queryNumericData = jest.fn(); - ctx.ds.query(ctx.options); - - // Check that useTrends options is true - let callArgs = ctx.ds.queryNumericData.mock.calls[0]; - expect(callArgs[2]).toBe(true); - ctx.ds.queryNumericData.mockClear(); - }); - - done(); - }); - - it('shouldnt use trends if it enabled and time less than trendsFrom', (done) => { - let ranges = ['now-6d', 'now-167h', 'now-1h', 'now-30m', 'now-30s']; - - _.forEach(ranges, range => { - ctx.options.range.from = range; - ctx.ds.queryNumericData = jest.fn(); - ctx.ds.query(ctx.options); - - // Check that useTrends options is false - let callArgs = ctx.ds.queryNumericData.mock.calls[0]; - expect(callArgs[2]).toBe(false); - ctx.ds.queryNumericData.mockClear(); - }); - done(); - }); - - }); - - describe('When querying text data', () => { - beforeEach(() => { - ctx.ds.replaceTemplateVars = (str) => str; - ctx.ds.alertQuery = () => Q.when([]); - ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([ - {clock: "1500010200", itemid:"10100", ns:"900111000", value:"Linux first"}, - {clock: "1500010300", itemid:"10100", ns:"900111000", value:"Linux 2nd"}, - {clock: "1500010400", itemid:"10100", ns:"900111000", value:"Linux last"} - ])); - - ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([ - { - hosts: [{hostid: "10001", name: "Zabbix server"}], - itemid: "10100", - name: "System information", - key_: "system.uname", - } - ])); - - ctx.options = { - range: {from: 'now-1h', to: 'now'}, - targets: [ - { - group: {filter: ""}, - host: {filter: "Zabbix server"}, - application: {filter: ""}, - item: {filter: "System information"}, - textFilter: "", - useCaptureGroups: true, - mode: 2, - resultFormat: "table", - options: { - skipEmptyValues: false + beforeEach(function () { + ctx.instanceSettings = { + jsonData: { + alerting: true, + username: 'zabbix', + password: 'zabbix', + trends: true, + trendsFrom: '14d', + trendsRange: '7d', + dbConnection: { + enabled: false + } } + }; + ctx.templateSrv = {}; + ctx.alertSrv = {}; + ctx.dashboardSrv = {}; + ctx.zabbixAlertingSrv = { + setPanelAlertState: jest.fn(), + removeZabbixThreshold: jest.fn() + }; + ctx.zabbix = function () {}; + + ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix); + }); + + describe('When querying data', function () { + beforeEach(function () { + ctx.ds.replaceTemplateVars = function (str) { + return str; + }; + ctx.ds.alertQuery = function () { + return Q.when([]); + }; + }); + + ctx.options = { + targets: [{ + group: { filter: "" }, + host: { filter: "" }, + application: { filter: "" }, + item: { filter: "" } + }], + range: { from: 'now-7d', to: 'now' } + }; + + it('should return an empty array when no targets are set', function (done) { + var options = { + targets: [], + range: { from: 'now-6h', to: 'now' } + }; + ctx.ds.query(options).then(function (result) { + expect(result.data.length).toBe(0); + done(); + }); + }); + + it('should use trends if it enabled and time more than trendsFrom', function (done) { + var ranges = ['now-7d', 'now-168h', 'now-1M', 'now-1y']; + + _.forEach(ranges, function (range) { + ctx.options.range.from = range; + ctx.ds.queryNumericData = jest.fn(); + ctx.ds.query(ctx.options); + + // Check that useTrends options is true + var callArgs = ctx.ds.queryNumericData.mock.calls[0]; + expect(callArgs[2]).toBe(true); + ctx.ds.queryNumericData.mockClear(); + }); + + done(); + }); + + it('shouldnt use trends if it enabled and time less than trendsFrom', function (done) { + var ranges = ['now-6d', 'now-167h', 'now-1h', 'now-30m', 'now-30s']; + + _.forEach(ranges, function (range) { + ctx.options.range.from = range; + ctx.ds.queryNumericData = jest.fn(); + ctx.ds.query(ctx.options); + + // Check that useTrends options is false + var callArgs = ctx.ds.queryNumericData.mock.calls[0]; + expect(callArgs[2]).toBe(false); + ctx.ds.queryNumericData.mockClear(); + }); + done(); + }); + }); + + describe('When querying text data', function () { + beforeEach(function () { + ctx.ds.replaceTemplateVars = function (str) { + return str; + }; + ctx.ds.alertQuery = function () { + return Q.when([]); + }; + ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([{ clock: "1500010200", itemid: "10100", ns: "900111000", value: "Linux first" }, { clock: "1500010300", itemid: "10100", ns: "900111000", value: "Linux 2nd" }, { clock: "1500010400", itemid: "10100", ns: "900111000", value: "Linux last" }])); + + ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([{ + hosts: [{ hostid: "10001", name: "Zabbix server" }], + itemid: "10100", + name: "System information", + key_: "system.uname" + }])); + + ctx.options = { + range: { from: 'now-1h', to: 'now' }, + targets: [{ + group: { filter: "" }, + host: { filter: "Zabbix server" }, + application: { filter: "" }, + item: { filter: "System information" }, + textFilter: "", + useCaptureGroups: true, + mode: 2, + resultFormat: "table", + options: { + skipEmptyValues: false + } + }] + }; + }); + + it('should return data in table format', function (done) { + ctx.ds.query(ctx.options).then(function (result) { + expect(result.data.length).toBe(1); + + var tableData = result.data[0]; + expect(tableData.columns).toEqual([{ text: 'Host' }, { text: 'Item' }, { text: 'Key' }, { text: 'Last value' }]); + expect(tableData.rows).toEqual([['Zabbix server', 'System information', 'system.uname', 'Linux last']]); + done(); + }); + }); + + it('should extract value if regex with capture group is used', function (done) { + ctx.options.targets[0].textFilter = "Linux (.*)"; + ctx.ds.query(ctx.options).then(function (result) { + var tableData = result.data[0]; + expect(tableData.rows[0][3]).toEqual('last'); + done(); + }); + }); + + it('should skip item when last value is empty', function () { + ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([{ + hosts: [{ hostid: "10001", name: "Zabbix server" }], + itemid: "10100", name: "System information", key_: "system.uname" + }, { + hosts: [{ hostid: "10002", name: "Server02" }], + itemid: "90109", name: "System information", key_: "system.uname" + }])); + + ctx.options.targets[0].options.skipEmptyValues = true; + ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([{ clock: "1500010200", itemid: "10100", ns: "900111000", value: "Linux first" }, { clock: "1500010300", itemid: "10100", ns: "900111000", value: "Linux 2nd" }, { clock: "1500010400", itemid: "10100", ns: "900111000", value: "Linux last" }, { clock: "1500010200", itemid: "90109", ns: "900111000", value: "Non empty value" }, { clock: "1500010500", itemid: "90109", ns: "900111000", value: "" }])); + return ctx.ds.query(ctx.options).then(function (result) { + var tableData = result.data[0]; + expect(tableData.rows.length).toBe(1); + expect(tableData.rows[0][3]).toEqual('Linux last'); + }); + }); + }); + + describe('When replacing template variables', function () { + + function testReplacingVariable(target, varValue, expectedResult, done) { + ctx.ds.templateSrv.replace = function () { + return zabbixTemplateFormat(varValue); + }; + + var result = ctx.ds.replaceTemplateVars(target); + expect(result).toBe(expectedResult); + done(); } - ], - }; - }); - it('should return data in table format', (done) => { - ctx.ds.query(ctx.options).then(result => { - expect(result.data.length).toBe(1); + /* + * Alphanumerics, spaces, dots, dashes and underscores + * are allowed in Zabbix host name. + * 'AaBbCc0123 .-_' + */ + it('should return properly escaped regex', function (done) { + var target = '$host'; + var template_var_value = 'AaBbCc0123 .-_'; + var expected_result = '/^AaBbCc0123 \\.-_$/'; - let tableData = result.data[0]; - expect(tableData.columns).toEqual([ - {text: 'Host'}, {text: 'Item'}, {text: 'Key'}, {text: 'Last value'} - ]); - expect(tableData.rows).toEqual([ - ['Zabbix server', 'System information', 'system.uname', 'Linux last'] - ]); - done(); + testReplacingVariable(target, template_var_value, expected_result, done); + }); + + /* + * Single-value variable + * $host = backend01 + * $host => /^backend01|backend01$/ + */ + it('should return proper regex for single value', function (done) { + var target = '$host'; + var template_var_value = 'backend01'; + var expected_result = '/^backend01$/'; + + testReplacingVariable(target, template_var_value, expected_result, done); + }); + + /* + * Multi-value variable + * $host = [backend01, backend02] + * $host => /^(backend01|backend01)$/ + */ + it('should return proper regex for multi-value', function (done) { + var target = '$host'; + var template_var_value = ['backend01', 'backend02']; + var expected_result = '/^(backend01|backend02)$/'; + + testReplacingVariable(target, template_var_value, expected_result, done); + }); + }); + + describe('When invoking metricFindQuery()', function () { + beforeEach(function () { + ctx.ds.replaceTemplateVars = function (str) { + return str; + }; + ctx.ds.zabbix = { + getGroups: jest.fn().mockReturnValue(Q.when([])), + getHosts: jest.fn().mockReturnValue(Q.when([])), + getApps: jest.fn().mockReturnValue(Q.when([])), + getItems: jest.fn().mockReturnValue(Q.when([])) + }; + }); + + it('should return groups', function (done) { + var tests = [{ query: '*', expect: '/.*/' }, { query: '', expect: '' }, { query: 'Backend', expect: 'Backend' }, { query: 'Back*', expect: 'Back*' }]; + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = tests[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var test = _step.value; + + ctx.ds.metricFindQuery(test.query); + expect(ctx.ds.zabbix.getGroups).toBeCalledWith(test.expect); + ctx.ds.zabbix.getGroups.mockClear(); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + done(); + }); + + it('should return hosts', function (done) { + var tests = [{ query: '*.*', expect: ['/.*/', '/.*/'] }, { query: '.', expect: ['', ''] }, { query: 'Backend.*', expect: ['Backend', '/.*/'] }, { query: 'Back*.', expect: ['Back*', ''] }]; + + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = tests[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var test = _step2.value; + + ctx.ds.metricFindQuery(test.query); + expect(ctx.ds.zabbix.getHosts).toBeCalledWith(test.expect[0], test.expect[1]); + ctx.ds.zabbix.getHosts.mockClear(); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + done(); + }); + + it('should return applications', function (done) { + var tests = [{ query: '*.*.*', expect: ['/.*/', '/.*/', '/.*/'] }, { query: '.*.', expect: ['', '/.*/', ''] }, { query: 'Backend.backend01.*', expect: ['Backend', 'backend01', '/.*/'] }, { query: 'Back*.*.', expect: ['Back*', '/.*/', ''] }]; + + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = tests[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var test = _step3.value; + + ctx.ds.metricFindQuery(test.query); + expect(ctx.ds.zabbix.getApps).toBeCalledWith(test.expect[0], test.expect[1], test.expect[2]); + ctx.ds.zabbix.getApps.mockClear(); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3.return) { + _iterator3.return(); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + done(); + }); + + it('should return items', function (done) { + var tests = [{ query: '*.*.*.*', expect: ['/.*/', '/.*/', '', '/.*/'] }, { query: '.*.*.*', expect: ['', '/.*/', '', '/.*/'] }, { query: 'Backend.backend01.*.*', expect: ['Backend', 'backend01', '', '/.*/'] }, { query: 'Back*.*.cpu.*', expect: ['Back*', '/.*/', 'cpu', '/.*/'] }]; + + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = tests[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var test = _step4.value; + + ctx.ds.metricFindQuery(test.query); + expect(ctx.ds.zabbix.getItems).toBeCalledWith(test.expect[0], test.expect[1], test.expect[2], test.expect[3]); + ctx.ds.zabbix.getItems.mockClear(); + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4.return) { + _iterator4.return(); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + done(); + }); + + it('should invoke method with proper arguments', function (done) { + var query = '*.*'; + + ctx.ds.metricFindQuery(query); + expect(ctx.ds.zabbix.getHosts).toBeCalledWith('/.*/', '/.*/'); + done(); + }); + }); + + describe('When querying alerts', function () { + var options = {}; + + beforeEach(function () { + ctx.ds.replaceTemplateVars = function (str) { + return str; + }; + + var targetItems = [{ + "itemid": "1", + "name": "test item", + "key_": "test.key", + "value_type": "3", + "hostid": "10631", + "status": "0", + "state": "0", + "hosts": [{ "hostid": "10631", "name": "Test host" }], + "item": "Test item" + }]; + ctx.ds.zabbix.getItemsFromTarget = function () { + return Promise.resolve(targetItems); + }; + + options = { + "panelId": 10, + "targets": [{ + "application": { "filter": "" }, + "group": { "filter": "Test group" }, + "host": { "filter": "Test host" }, + "item": { "filter": "Test item" } + }] + }; + }); + + it('should return threshold when comparative symbol is `less than`', function () { + + var itemTriggers = [{ + "triggerid": "15383", + "priority": "4", + "expression": "{15915}<100" + }]; + + ctx.ds.zabbix.getAlerts = function () { + return Promise.resolve(itemTriggers); + }; + + return ctx.ds.alertQuery(options).then(function (resp) { + expect(resp.thresholds).toHaveLength(1); + expect(resp.thresholds[0]).toBe(100); + return resp; + }); + }); + + it('should return threshold when comparative symbol is `less than or equal`', function () { + + var itemTriggers = [{ + "triggerid": "15383", + "priority": "4", + "expression": "{15915}<=100" + }]; + + ctx.ds.zabbix.getAlerts = function () { + return Promise.resolve(itemTriggers); + }; + + return ctx.ds.alertQuery(options).then(function (resp) { + expect(resp.thresholds.length).toBe(1); + expect(resp.thresholds[0]).toBe(100); + return resp; + }); + }); + + it('should return threshold when comparative symbol is `greater than or equal`', function () { + + var itemTriggers = [{ + "triggerid": "15383", + "priority": "4", + "expression": "{15915}>=30" + }]; + + ctx.ds.zabbix.getAlerts = function () { + return Promise.resolve(itemTriggers); + }; + + return ctx.ds.alertQuery(options).then(function (resp) { + expect(resp.thresholds.length).toBe(1); + expect(resp.thresholds[0]).toBe(30); + return resp; + }); + }); + + it('should return threshold when comparative symbol is `equal`', function () { + + var itemTriggers = [{ + "triggerid": "15383", + "priority": "4", + "expression": "{15915}=50" + }]; + + ctx.ds.zabbix.getAlerts = function () { + return Promise.resolve(itemTriggers); + }; + + return ctx.ds.alertQuery(options).then(function (resp) { + expect(resp.thresholds.length).toBe(1); + expect(resp.thresholds[0]).toBe(50); + return resp; + }); + }); + }); }); - }); - - it('should extract value if regex with capture group is used', (done) => { - ctx.options.targets[0].textFilter = "Linux (.*)"; - ctx.ds.query(ctx.options).then(result => { - let tableData = result.data[0]; - expect(tableData.rows[0][3]).toEqual('last'); - done(); - }); - }); - - it('should skip item when last value is empty', () => { - ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([ - { - hosts: [{hostid: "10001", name: "Zabbix server"}], - itemid: "10100", name: "System information", key_: "system.uname" - }, - { - hosts: [{hostid: "10002", name: "Server02"}], - itemid: "90109", name: "System information", key_: "system.uname" - } - ])); - - ctx.options.targets[0].options.skipEmptyValues = true; - ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([ - {clock: "1500010200", itemid:"10100", ns:"900111000", value:"Linux first"}, - {clock: "1500010300", itemid:"10100", ns:"900111000", value:"Linux 2nd"}, - {clock: "1500010400", itemid:"10100", ns:"900111000", value:"Linux last"}, - {clock: "1500010200", itemid:"90109", ns:"900111000", value:"Non empty value"}, - {clock: "1500010500", itemid:"90109", ns:"900111000", value:""} - ])); - return ctx.ds.query(ctx.options).then(result => { - let tableData = result.data[0]; - expect(tableData.rows.length).toBe(1); - expect(tableData.rows[0][3]).toEqual('Linux last'); - }); - }); - }); - - describe('When replacing template variables', () => { - - function testReplacingVariable(target, varValue, expectedResult, done) { - ctx.ds.templateSrv.replace = () => { - return zabbixTemplateFormat(varValue); - }; - - let result = ctx.ds.replaceTemplateVars(target); - expect(result).toBe(expectedResult); - done(); } - - /* - * Alphanumerics, spaces, dots, dashes and underscores - * are allowed in Zabbix host name. - * 'AaBbCc0123 .-_' - */ - it('should return properly escaped regex', (done) => { - let target = '$host'; - let template_var_value = 'AaBbCc0123 .-_'; - let expected_result = '/^AaBbCc0123 \\.-_$/'; - - testReplacingVariable(target, template_var_value, expected_result, done); - }); - - /* - * Single-value variable - * $host = backend01 - * $host => /^backend01|backend01$/ - */ - it('should return proper regex for single value', (done) => { - let target = '$host'; - let template_var_value = 'backend01'; - let expected_result = '/^backend01$/'; - - testReplacingVariable(target, template_var_value, expected_result, done); - }); - - /* - * Multi-value variable - * $host = [backend01, backend02] - * $host => /^(backend01|backend01)$/ - */ - it('should return proper regex for multi-value', (done) => { - let target = '$host'; - let template_var_value = ['backend01', 'backend02']; - let expected_result = '/^(backend01|backend02)$/'; - - testReplacingVariable(target, template_var_value, expected_result, done); - }); - }); - - describe('When invoking metricFindQuery()', () => { - beforeEach(() => { - ctx.ds.replaceTemplateVars = (str) => str; - ctx.ds.zabbix = { - getGroups: jest.fn().mockReturnValue(Q.when([])), - getHosts: jest.fn().mockReturnValue(Q.when([])), - getApps: jest.fn().mockReturnValue(Q.when([])), - getItems: jest.fn().mockReturnValue(Q.when([])) - }; - }); - - it('should return groups', (done) => { - const tests = [ - {query: '*', expect: '/.*/'}, - {query: '', expect: ''}, - {query: 'Backend', expect: 'Backend'}, - {query: 'Back*', expect: 'Back*'}, - ]; - - for (const test of tests) { - ctx.ds.metricFindQuery(test.query); - expect(ctx.ds.zabbix.getGroups).toBeCalledWith(test.expect); - ctx.ds.zabbix.getGroups.mockClear(); - } - done(); - }); - - it('should return hosts', (done) => { - const tests = [ - {query: '*.*', expect: ['/.*/', '/.*/']}, - {query: '.', expect: ['', '']}, - {query: 'Backend.*', expect: ['Backend', '/.*/']}, - {query: 'Back*.', expect: ['Back*', '']}, - ]; - - for (const test of tests) { - ctx.ds.metricFindQuery(test.query); - expect(ctx.ds.zabbix.getHosts).toBeCalledWith(test.expect[0], test.expect[1]); - ctx.ds.zabbix.getHosts.mockClear(); - } - done(); - }); - - it('should return applications', (done) => { - const tests = [ - {query: '*.*.*', expect: ['/.*/', '/.*/', '/.*/']}, - {query: '.*.', expect: ['', '/.*/', '']}, - {query: 'Backend.backend01.*', expect: ['Backend', 'backend01', '/.*/']}, - {query: 'Back*.*.', expect: ['Back*', '/.*/', '']} - ]; - - for (const test of tests) { - ctx.ds.metricFindQuery(test.query); - expect(ctx.ds.zabbix.getApps).toBeCalledWith(test.expect[0], test.expect[1], test.expect[2]); - ctx.ds.zabbix.getApps.mockClear(); - } - done(); - }); - - it('should return items', (done) => { - const tests = [ - {query: '*.*.*.*', expect: ['/.*/', '/.*/', '', '/.*/']}, - {query: '.*.*.*', expect: ['', '/.*/', '', '/.*/']}, - {query: 'Backend.backend01.*.*', expect: ['Backend', 'backend01', '', '/.*/']}, - {query: 'Back*.*.cpu.*', expect: ['Back*', '/.*/', 'cpu', '/.*/']} - ]; - - for (const test of tests) { - ctx.ds.metricFindQuery(test.query); - expect(ctx.ds.zabbix.getItems) - .toBeCalledWith(test.expect[0], test.expect[1], test.expect[2], test.expect[3]); - ctx.ds.zabbix.getItems.mockClear(); - } - done(); - }); - - it('should invoke method with proper arguments', (done) => { - let query = '*.*'; - - ctx.ds.metricFindQuery(query); - expect(ctx.ds.zabbix.getHosts).toBeCalledWith('/.*/', '/.*/'); - done(); - }); - }); - - describe('When querying alerts', () => { - let options = {}; - - beforeEach(() => { - ctx.ds.replaceTemplateVars = (str) => str; - - let targetItems = [{ - "itemid": "1", - "name": "test item", - "key_": "test.key", - "value_type": "3", - "hostid": "10631", - "status": "0", - "state": "0", - "hosts": [{"hostid": "10631", "name": "Test host"}], - "item": "Test item" - }]; - ctx.ds.zabbix.getItemsFromTarget = () => Promise.resolve(targetItems); - - options = { - "panelId": 10, - "targets": [{ - "application": {"filter": ""}, - "group": {"filter": "Test group"}, - "host": {"filter": "Test host"}, - "item": {"filter": "Test item"}, - }] - }; - }); - - it('should return threshold when comparative symbol is `less than`', () => { - - let itemTriggers = [{ - "triggerid": "15383", - "priority": "4", - "expression": "{15915}<100", - }]; - - ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers); - - return ctx.ds.alertQuery(options) - .then(resp => { - expect(resp.thresholds).toHaveLength(1); - expect(resp.thresholds[0]).toBe(100); - return resp; - }); - }); - - it('should return threshold when comparative symbol is `less than or equal`', () => { - - let itemTriggers = [{ - "triggerid": "15383", - "priority": "4", - "expression": "{15915}<=100", - }]; - - ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers); - - return ctx.ds.alertQuery(options) - .then(resp => { - expect(resp.thresholds.length).toBe(1); - expect(resp.thresholds[0]).toBe(100); - return resp; - }); - }); - - it('should return threshold when comparative symbol is `greater than or equal`', () => { - - let itemTriggers = [{ - "triggerid": "15383", - "priority": "4", - "expression": "{15915}>=30", - }]; - - ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers); - - return ctx.ds.alertQuery(options) - .then(resp => { - expect(resp.thresholds.length).toBe(1); - expect(resp.thresholds[0]).toBe(30); - return resp; - }); - }); - - it('should return threshold when comparative symbol is `equal`', () => { - - let itemTriggers = [{ - "triggerid": "15383", - "priority": "4", - "expression": "{15915}=50", - }]; - - ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers); - - return ctx.ds.alertQuery(options) - .then(resp => { - expect(resp.thresholds.length).toBe(1); - expect(resp.thresholds[0]).toBe(50); - return resp; - }); - }); - }); + }; }); +//# sourceMappingURL=datasource.spec.js.map diff --git a/dist/datasource-zabbix/specs/datasource.spec.js.map b/dist/datasource-zabbix/specs/datasource.spec.js.map new file mode 100644 index 0000000..c178bb2 --- /dev/null +++ b/dist/datasource-zabbix/specs/datasource.spec.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/datasource-zabbix/specs/datasource.spec.js"],"names":["_","Q","Promise","Datasource","zabbixTemplateFormat","describe","ctx","beforeEach","instanceSettings","jsonData","alerting","username","password","trends","trendsFrom","trendsRange","dbConnection","enabled","templateSrv","alertSrv","dashboardSrv","zabbixAlertingSrv","setPanelAlertState","jest","fn","removeZabbixThreshold","zabbix","ds","replaceTemplateVars","str","alertQuery","when","options","targets","group","filter","host","application","item","range","from","to","it","done","query","then","expect","result","data","length","toBe","ranges","forEach","queryNumericData","callArgs","mock","calls","mockClear","getHistory","mockReturnValue","resolve","clock","itemid","ns","value","getItemsFromTarget","hosts","hostid","name","key_","textFilter","useCaptureGroups","mode","resultFormat","skipEmptyValues","tableData","columns","toEqual","text","rows","testReplacingVariable","target","varValue","expectedResult","replace","template_var_value","expected_result","getGroups","getHosts","getApps","getItems","tests","test","metricFindQuery","toBeCalledWith","targetItems","itemTriggers","getAlerts","resp","thresholds","toHaveLength"],"mappings":"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","file":"datasource.spec.js","sourcesContent":["import _ from 'lodash';\nimport Q, { Promise } from \"q\";\nimport {Datasource} from \"../module\";\nimport {zabbixTemplateFormat} from \"../datasource\";\n\ndescribe('ZabbixDatasource', () => {\n let ctx = {};\n\n beforeEach(() => {\n ctx.instanceSettings = {\n jsonData: {\n alerting: true,\n username: 'zabbix',\n password: 'zabbix',\n trends: true,\n trendsFrom: '14d',\n trendsRange: '7d',\n dbConnection: {\n enabled: false\n }\n }\n };\n ctx.templateSrv = {};\n ctx.alertSrv = {};\n ctx.dashboardSrv = {};\n ctx.zabbixAlertingSrv = {\n setPanelAlertState: jest.fn(),\n removeZabbixThreshold: jest.fn(),\n };\n ctx.zabbix = () => {};\n\n ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix);\n });\n\n describe('When querying data', () => {\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n ctx.ds.alertQuery = () => Q.when([]);\n });\n\n ctx.options = {\n targets: [\n {\n group: {filter: \"\"},\n host: {filter: \"\"},\n application: {filter: \"\"},\n item: {filter: \"\"}\n }\n ],\n range: {from: 'now-7d', to: 'now'}\n };\n\n it('should return an empty array when no targets are set', (done) => {\n let options = {\n targets: [],\n range: {from: 'now-6h', to: 'now'}\n };\n ctx.ds.query(options).then(result => {\n expect(result.data.length).toBe(0);\n done();\n });\n });\n\n it('should use trends if it enabled and time more than trendsFrom', (done) => {\n let ranges = ['now-7d', 'now-168h', 'now-1M', 'now-1y'];\n\n _.forEach(ranges, range => {\n ctx.options.range.from = range;\n ctx.ds.queryNumericData = jest.fn();\n ctx.ds.query(ctx.options);\n\n // Check that useTrends options is true\n let callArgs = ctx.ds.queryNumericData.mock.calls[0];\n expect(callArgs[2]).toBe(true);\n ctx.ds.queryNumericData.mockClear();\n });\n\n done();\n });\n\n it('shouldnt use trends if it enabled and time less than trendsFrom', (done) => {\n let ranges = ['now-6d', 'now-167h', 'now-1h', 'now-30m', 'now-30s'];\n\n _.forEach(ranges, range => {\n ctx.options.range.from = range;\n ctx.ds.queryNumericData = jest.fn();\n ctx.ds.query(ctx.options);\n\n // Check that useTrends options is false\n let callArgs = ctx.ds.queryNumericData.mock.calls[0];\n expect(callArgs[2]).toBe(false);\n ctx.ds.queryNumericData.mockClear();\n });\n done();\n });\n\n });\n\n describe('When querying text data', () => {\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n ctx.ds.alertQuery = () => Q.when([]);\n ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([\n {clock: \"1500010200\", itemid:\"10100\", ns:\"900111000\", value:\"Linux first\"},\n {clock: \"1500010300\", itemid:\"10100\", ns:\"900111000\", value:\"Linux 2nd\"},\n {clock: \"1500010400\", itemid:\"10100\", ns:\"900111000\", value:\"Linux last\"}\n ]));\n\n ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([\n {\n hosts: [{hostid: \"10001\", name: \"Zabbix server\"}],\n itemid: \"10100\",\n name: \"System information\",\n key_: \"system.uname\",\n }\n ]));\n\n ctx.options = {\n range: {from: 'now-1h', to: 'now'},\n targets: [\n {\n group: {filter: \"\"},\n host: {filter: \"Zabbix server\"},\n application: {filter: \"\"},\n item: {filter: \"System information\"},\n textFilter: \"\",\n useCaptureGroups: true,\n mode: 2,\n resultFormat: \"table\",\n options: {\n skipEmptyValues: false\n }\n }\n ],\n };\n });\n\n it('should return data in table format', (done) => {\n ctx.ds.query(ctx.options).then(result => {\n expect(result.data.length).toBe(1);\n\n let tableData = result.data[0];\n expect(tableData.columns).toEqual([\n {text: 'Host'}, {text: 'Item'}, {text: 'Key'}, {text: 'Last value'}\n ]);\n expect(tableData.rows).toEqual([\n ['Zabbix server', 'System information', 'system.uname', 'Linux last']\n ]);\n done();\n });\n });\n\n it('should extract value if regex with capture group is used', (done) => {\n ctx.options.targets[0].textFilter = \"Linux (.*)\";\n ctx.ds.query(ctx.options).then(result => {\n let tableData = result.data[0];\n expect(tableData.rows[0][3]).toEqual('last');\n done();\n });\n });\n\n it('should skip item when last value is empty', () => {\n ctx.ds.zabbix.getItemsFromTarget = jest.fn().mockReturnValue(Promise.resolve([\n {\n hosts: [{hostid: \"10001\", name: \"Zabbix server\"}],\n itemid: \"10100\", name: \"System information\", key_: \"system.uname\"\n },\n {\n hosts: [{hostid: \"10002\", name: \"Server02\"}],\n itemid: \"90109\", name: \"System information\", key_: \"system.uname\"\n }\n ]));\n\n ctx.options.targets[0].options.skipEmptyValues = true;\n ctx.ds.zabbix.getHistory = jest.fn().mockReturnValue(Promise.resolve([\n {clock: \"1500010200\", itemid:\"10100\", ns:\"900111000\", value:\"Linux first\"},\n {clock: \"1500010300\", itemid:\"10100\", ns:\"900111000\", value:\"Linux 2nd\"},\n {clock: \"1500010400\", itemid:\"10100\", ns:\"900111000\", value:\"Linux last\"},\n {clock: \"1500010200\", itemid:\"90109\", ns:\"900111000\", value:\"Non empty value\"},\n {clock: \"1500010500\", itemid:\"90109\", ns:\"900111000\", value:\"\"}\n ]));\n return ctx.ds.query(ctx.options).then(result => {\n let tableData = result.data[0];\n expect(tableData.rows.length).toBe(1);\n expect(tableData.rows[0][3]).toEqual('Linux last');\n });\n });\n });\n\n describe('When replacing template variables', () => {\n\n function testReplacingVariable(target, varValue, expectedResult, done) {\n ctx.ds.templateSrv.replace = () => {\n return zabbixTemplateFormat(varValue);\n };\n\n let result = ctx.ds.replaceTemplateVars(target);\n expect(result).toBe(expectedResult);\n done();\n }\n\n /*\n * Alphanumerics, spaces, dots, dashes and underscores\n * are allowed in Zabbix host name.\n * 'AaBbCc0123 .-_'\n */\n it('should return properly escaped regex', (done) => {\n let target = '$host';\n let template_var_value = 'AaBbCc0123 .-_';\n let expected_result = '/^AaBbCc0123 \\\\.-_$/';\n\n testReplacingVariable(target, template_var_value, expected_result, done);\n });\n\n /*\n * Single-value variable\n * $host = backend01\n * $host => /^backend01|backend01$/\n */\n it('should return proper regex for single value', (done) => {\n let target = '$host';\n let template_var_value = 'backend01';\n let expected_result = '/^backend01$/';\n\n testReplacingVariable(target, template_var_value, expected_result, done);\n });\n\n /*\n * Multi-value variable\n * $host = [backend01, backend02]\n * $host => /^(backend01|backend01)$/\n */\n it('should return proper regex for multi-value', (done) => {\n let target = '$host';\n let template_var_value = ['backend01', 'backend02'];\n let expected_result = '/^(backend01|backend02)$/';\n\n testReplacingVariable(target, template_var_value, expected_result, done);\n });\n });\n\n describe('When invoking metricFindQuery()', () => {\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n ctx.ds.zabbix = {\n getGroups: jest.fn().mockReturnValue(Q.when([])),\n getHosts: jest.fn().mockReturnValue(Q.when([])),\n getApps: jest.fn().mockReturnValue(Q.when([])),\n getItems: jest.fn().mockReturnValue(Q.when([]))\n };\n });\n\n it('should return groups', (done) => {\n const tests = [\n {query: '*', expect: '/.*/'},\n {query: '', expect: ''},\n {query: 'Backend', expect: 'Backend'},\n {query: 'Back*', expect: 'Back*'},\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getGroups).toBeCalledWith(test.expect);\n ctx.ds.zabbix.getGroups.mockClear();\n }\n done();\n });\n\n it('should return hosts', (done) => {\n const tests = [\n {query: '*.*', expect: ['/.*/', '/.*/']},\n {query: '.', expect: ['', '']},\n {query: 'Backend.*', expect: ['Backend', '/.*/']},\n {query: 'Back*.', expect: ['Back*', '']},\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getHosts).toBeCalledWith(test.expect[0], test.expect[1]);\n ctx.ds.zabbix.getHosts.mockClear();\n }\n done();\n });\n\n it('should return applications', (done) => {\n const tests = [\n {query: '*.*.*', expect: ['/.*/', '/.*/', '/.*/']},\n {query: '.*.', expect: ['', '/.*/', '']},\n {query: 'Backend.backend01.*', expect: ['Backend', 'backend01', '/.*/']},\n {query: 'Back*.*.', expect: ['Back*', '/.*/', '']}\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getApps).toBeCalledWith(test.expect[0], test.expect[1], test.expect[2]);\n ctx.ds.zabbix.getApps.mockClear();\n }\n done();\n });\n\n it('should return items', (done) => {\n const tests = [\n {query: '*.*.*.*', expect: ['/.*/', '/.*/', '', '/.*/']},\n {query: '.*.*.*', expect: ['', '/.*/', '', '/.*/']},\n {query: 'Backend.backend01.*.*', expect: ['Backend', 'backend01', '', '/.*/']},\n {query: 'Back*.*.cpu.*', expect: ['Back*', '/.*/', 'cpu', '/.*/']}\n ];\n\n for (const test of tests) {\n ctx.ds.metricFindQuery(test.query);\n expect(ctx.ds.zabbix.getItems)\n .toBeCalledWith(test.expect[0], test.expect[1], test.expect[2], test.expect[3]);\n ctx.ds.zabbix.getItems.mockClear();\n }\n done();\n });\n\n it('should invoke method with proper arguments', (done) => {\n let query = '*.*';\n\n ctx.ds.metricFindQuery(query);\n expect(ctx.ds.zabbix.getHosts).toBeCalledWith('/.*/', '/.*/');\n done();\n });\n });\n\n describe('When querying alerts', () => {\n let options = {};\n\n beforeEach(() => {\n ctx.ds.replaceTemplateVars = (str) => str;\n\n let targetItems = [{\n \"itemid\": \"1\",\n \"name\": \"test item\",\n \"key_\": \"test.key\",\n \"value_type\": \"3\",\n \"hostid\": \"10631\",\n \"status\": \"0\",\n \"state\": \"0\",\n \"hosts\": [{\"hostid\": \"10631\", \"name\": \"Test host\"}],\n \"item\": \"Test item\"\n }];\n ctx.ds.zabbix.getItemsFromTarget = () => Promise.resolve(targetItems);\n\n options = {\n \"panelId\": 10,\n \"targets\": [{\n \"application\": {\"filter\": \"\"},\n \"group\": {\"filter\": \"Test group\"},\n \"host\": {\"filter\": \"Test host\"},\n \"item\": {\"filter\": \"Test item\"},\n }]\n };\n });\n\n it('should return threshold when comparative symbol is `less than`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}<100\",\n }];\n\n ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers);\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds).toHaveLength(1);\n expect(resp.thresholds[0]).toBe(100);\n return resp;\n });\n });\n\n it('should return threshold when comparative symbol is `less than or equal`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}<=100\",\n }];\n\n ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers);\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds.length).toBe(1);\n expect(resp.thresholds[0]).toBe(100);\n return resp;\n });\n });\n\n it('should return threshold when comparative symbol is `greater than or equal`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}>=30\",\n }];\n\n ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers);\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds.length).toBe(1);\n expect(resp.thresholds[0]).toBe(30);\n return resp;\n });\n });\n\n it('should return threshold when comparative symbol is `equal`', () => {\n\n let itemTriggers = [{\n \"triggerid\": \"15383\",\n \"priority\": \"4\",\n \"expression\": \"{15915}=50\",\n }];\n\n ctx.ds.zabbix.getAlerts = () => Promise.resolve(itemTriggers);\n\n return ctx.ds.alertQuery(options)\n .then(resp => {\n expect(resp.thresholds.length).toBe(1);\n expect(resp.thresholds[0]).toBe(50);\n return resp;\n });\n });\n });\n});\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/specs/timeseries.spec.js b/dist/datasource-zabbix/specs/timeseries.spec.js index f1311bd..3d472d1 100644 --- a/dist/datasource-zabbix/specs/timeseries.spec.js +++ b/dist/datasource-zabbix/specs/timeseries.spec.js @@ -1,34 +1,41 @@ -// import _ from 'lodash'; -import ts from '../timeseries'; +'use strict'; -describe('timeseries processing functions', () => { +System.register(['../timeseries'], function (_export, _context) { + "use strict"; - describe('sumSeries()', () => { - it('should properly sum series', (done) => { - let series = [ - [[0, 1], [1, 2], [1, 3]], - [[2, 1], [3, 2], [4, 3]] - ]; + var ts; + return { + setters: [function (_timeseries) { + ts = _timeseries.default; + }], + execute: function () { - let expected = [[2, 1], [4, 2], [5, 3]]; + describe('timeseries processing functions', function () { - let result = ts.sumSeries(series); - expect(result).toEqual(expected); - done(); - }); + describe('sumSeries()', function () { + it('should properly sum series', function (done) { + var series = [[[0, 1], [1, 2], [1, 3]], [[2, 1], [3, 2], [4, 3]]]; - it('should properly sum series with nulls', (done) => { - // issue #286 - let series = [ - [[1, 1], [1, 2], [1, 3]], - [[3, 2], [4, 3]] - ]; + var expected = [[2, 1], [4, 2], [5, 3]]; - let expected = [[1, 1], [4, 2], [5, 3]]; + var result = ts.sumSeries(series); + expect(result).toEqual(expected); + done(); + }); - let result = ts.sumSeries(series); - expect(result).toEqual(expected); - done(); - }); - }); + it('should properly sum series with nulls', function (done) { + // issue #286 + var series = [[[1, 1], [1, 2], [1, 3]], [[3, 2], [4, 3]]]; + + var expected = [[1, 1], [4, 2], [5, 3]]; + + var result = ts.sumSeries(series); + expect(result).toEqual(expected); + done(); + }); + }); + }); // import _ from 'lodash'; + } + }; }); +//# sourceMappingURL=timeseries.spec.js.map diff --git a/dist/datasource-zabbix/specs/timeseries.spec.js.map b/dist/datasource-zabbix/specs/timeseries.spec.js.map new file mode 100644 index 0000000..117e0af --- /dev/null +++ b/dist/datasource-zabbix/specs/timeseries.spec.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/datasource-zabbix/specs/timeseries.spec.js"],"names":["ts","describe","it","done","series","expected","result","sumSeries","expect","toEqual"],"mappings":";;;;;;;;AACOA,Q;;;;AAEPC,eAAS,iCAAT,EAA4C,YAAM;;AAEhDA,iBAAS,aAAT,EAAwB,YAAM;AAC5BC,aAAG,4BAAH,EAAiC,UAACC,IAAD,EAAU;AACzC,gBAAIC,SAAS,CACX,CAAC,CAAC,CAAD,EAAI,CAAJ,CAAD,EAAS,CAAC,CAAD,EAAI,CAAJ,CAAT,EAAiB,CAAC,CAAD,EAAI,CAAJ,CAAjB,CADW,EAEX,CAAC,CAAC,CAAD,EAAI,CAAJ,CAAD,EAAS,CAAC,CAAD,EAAI,CAAJ,CAAT,EAAiB,CAAC,CAAD,EAAI,CAAJ,CAAjB,CAFW,CAAb;;AAKA,gBAAIC,WAAW,CAAC,CAAC,CAAD,EAAI,CAAJ,CAAD,EAAS,CAAC,CAAD,EAAI,CAAJ,CAAT,EAAiB,CAAC,CAAD,EAAI,CAAJ,CAAjB,CAAf;;AAEA,gBAAIC,SAASN,GAAGO,SAAH,CAAaH,MAAb,CAAb;AACAI,mBAAOF,MAAP,EAAeG,OAAf,CAAuBJ,QAAvB;AACAF;AACD,WAXD;;AAaAD,aAAG,uCAAH,EAA4C,UAACC,IAAD,EAAU;AACpD;AACA,gBAAIC,SAAS,CACX,CAAC,CAAC,CAAD,EAAI,CAAJ,CAAD,EAAS,CAAC,CAAD,EAAI,CAAJ,CAAT,EAAiB,CAAC,CAAD,EAAI,CAAJ,CAAjB,CADW,EAEX,CAAC,CAAC,CAAD,EAAI,CAAJ,CAAD,EAAS,CAAC,CAAD,EAAI,CAAJ,CAAT,CAFW,CAAb;;AAKA,gBAAIC,WAAW,CAAC,CAAC,CAAD,EAAI,CAAJ,CAAD,EAAS,CAAC,CAAD,EAAI,CAAJ,CAAT,EAAiB,CAAC,CAAD,EAAI,CAAJ,CAAjB,CAAf;;AAEA,gBAAIC,SAASN,GAAGO,SAAH,CAAaH,MAAb,CAAb;AACAI,mBAAOF,MAAP,EAAeG,OAAf,CAAuBJ,QAAvB;AACAF;AACD,WAZD;AAaD,SA3BD;AA4BD,OA9BD,E,CAHA","file":"timeseries.spec.js","sourcesContent":["// import _ from 'lodash';\nimport ts from '../timeseries';\n\ndescribe('timeseries processing functions', () => {\n\n describe('sumSeries()', () => {\n it('should properly sum series', (done) => {\n let series = [\n [[0, 1], [1, 2], [1, 3]],\n [[2, 1], [3, 2], [4, 3]]\n ];\n\n let expected = [[2, 1], [4, 2], [5, 3]];\n\n let result = ts.sumSeries(series);\n expect(result).toEqual(expected);\n done();\n });\n\n it('should properly sum series with nulls', (done) => {\n // issue #286\n let series = [\n [[1, 1], [1, 2], [1, 3]],\n [[3, 2], [4, 3]]\n ];\n\n let expected = [[1, 1], [4, 2], [5, 3]];\n\n let result = ts.sumSeries(series);\n expect(result).toEqual(expected);\n done();\n });\n });\n});\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/specs/utils.spec.js b/dist/datasource-zabbix/specs/utils.spec.js index d460baa..f45371c 100644 --- a/dist/datasource-zabbix/specs/utils.spec.js +++ b/dist/datasource-zabbix/specs/utils.spec.js @@ -1,141 +1,136 @@ -import _ from 'lodash'; -import * as utils from '../utils'; +'use strict'; -describe('Utils', () => { +System.register(['lodash', '../utils'], function (_export, _context) { + "use strict"; - describe('expandItemName()', () => { + var _, utils; - it('should properly expand unquoted params', (done) => { - let test_cases = [ - { - name: `CPU $2 time`, - key: `system.cpu.util[,user,avg1]`, - expected: "CPU user time" - }, - { - name: `CPU $2 time - $3`, - key: `system.cpu.util[,system,avg1]`, - expected: "CPU system time - avg1" - }, - { - name: `CPU - $1 - $2 - $3`, - key: `system.cpu.util[,system,avg1]`, - expected: "CPU - - system - avg1" - } - ]; + return { + setters: [function (_lodash) { + _ = _lodash.default; + }, function (_utils) { + utils = _utils; + }], + execute: function () { - _.each(test_cases, test_case => { - let expandedName = utils.expandItemName(test_case.name, test_case.key); - expect(expandedName).toBe(test_case.expected); + describe('Utils', function () { + + describe('expandItemName()', function () { + + it('should properly expand unquoted params', function (done) { + var test_cases = [{ + name: 'CPU $2 time', + key: 'system.cpu.util[,user,avg1]', + expected: "CPU user time" + }, { + name: 'CPU $2 time - $3', + key: 'system.cpu.util[,system,avg1]', + expected: "CPU system time - avg1" + }, { + name: 'CPU - $1 - $2 - $3', + key: 'system.cpu.util[,system,avg1]', + expected: "CPU - - system - avg1" + }]; + + _.each(test_cases, function (test_case) { + var expandedName = utils.expandItemName(test_case.name, test_case.key); + expect(expandedName).toBe(test_case.expected); + }); + done(); + }); + + it('should properly expand quoted params with commas', function (done) { + var test_cases = [{ + name: 'CPU $2 time', + key: 'system.cpu.util["type=user,value=avg",user]', + expected: "CPU user time" + }, { + name: 'CPU $1 time', + key: 'system.cpu.util["type=user,value=avg","user"]', + expected: "CPU type=user,value=avg time" + }, { + name: 'CPU $1 time $3', + key: 'system.cpu.util["type=user,value=avg",,"user"]', + expected: "CPU type=user,value=avg time user" + }, { + name: 'CPU $1 $2 $3', + key: 'system.cpu.util["type=user,value=avg",time,"user"]', + expected: "CPU type=user,value=avg time user" + }]; + + _.each(test_cases, function (test_case) { + var expandedName = utils.expandItemName(test_case.name, test_case.key); + expect(expandedName).toBe(test_case.expected); + }); + done(); + }); + + it('should properly expand array params', function (done) { + var test_cases = [{ + name: 'CPU $2 - $3 time', + key: 'system.cpu.util[,[user,system],avg1]', + expected: "CPU user,system - avg1 time" + }, { + name: 'CPU $2 - $3 time', + key: 'system.cpu.util[,["user,system",iowait],avg1]', + expected: 'CPU "user,system",iowait - avg1 time' + }, { + name: 'CPU - $2 - $3 - $4', + key: 'system.cpu.util[,[],["user,system",iowait],avg1]', + expected: 'CPU - - "user,system",iowait - avg1' + }]; + + _.each(test_cases, function (test_case) { + var expandedName = utils.expandItemName(test_case.name, test_case.key); + expect(expandedName).toBe(test_case.expected); + }); + done(); + }); + }); + + describe('splitTemplateQuery()', function () { + + // Backward compatibility + it('should properly split query in old format', function (done) { + var test_cases = [{ + query: '/alu/./tw-(nyc|que|brx|dwt|brk)-sta_(w|d)*-alu-[0-9{2}/', + expected: ['/alu/', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9{2}/'] + }, { + query: 'a.b.c.d', + expected: ['a', 'b', 'c', 'd'] + }]; + + _.each(test_cases, function (test_case) { + var splitQuery = utils.splitTemplateQuery(test_case.query); + expect(splitQuery).toEqual(test_case.expected); + }); + done(); + }); + + it('should properly split query', function (done) { + var test_cases = [{ + query: '{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(w|d)*-alu-[0-9]*/}', + expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]*/'] + }, { + query: '{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(w|d)*-alu-[0-9]{2}/}', + expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]{2}/'] + }, { + query: '{a}{b}{c}{d}', + expected: ['a', 'b', 'c', 'd'] + }, { + query: '{a}{b.c.d}', + expected: ['a', 'b.c.d'] + }]; + + _.each(test_cases, function (test_case) { + var splitQuery = utils.splitTemplateQuery(test_case.query); + expect(splitQuery).toEqual(test_case.expected); + }); + done(); + }); + }); }); - done(); - }); - - it('should properly expand quoted params with commas', (done) => { - let test_cases = [ - { - name: `CPU $2 time`, - key: `system.cpu.util["type=user,value=avg",user]`, - expected: "CPU user time" - }, - { - name: `CPU $1 time`, - key: `system.cpu.util["type=user,value=avg","user"]`, - expected: "CPU type=user,value=avg time" - }, - { - name: `CPU $1 time $3`, - key: `system.cpu.util["type=user,value=avg",,"user"]`, - expected: "CPU type=user,value=avg time user" - }, - { - name: `CPU $1 $2 $3`, - key: `system.cpu.util["type=user,value=avg",time,"user"]`, - expected: "CPU type=user,value=avg time user" - } - ]; - - _.each(test_cases, test_case => { - let expandedName = utils.expandItemName(test_case.name, test_case.key); - expect(expandedName).toBe(test_case.expected); - }); - done(); - }); - - it('should properly expand array params', (done) => { - let test_cases = [ - { - name: `CPU $2 - $3 time`, - key: `system.cpu.util[,[user,system],avg1]`, - expected: "CPU user,system - avg1 time" - }, - { - name: `CPU $2 - $3 time`, - key: `system.cpu.util[,["user,system",iowait],avg1]`, - expected: `CPU "user,system",iowait - avg1 time` - }, - { - name: `CPU - $2 - $3 - $4`, - key: `system.cpu.util[,[],["user,system",iowait],avg1]`, - expected: `CPU - - "user,system",iowait - avg1` - } - ]; - - _.each(test_cases, test_case => { - let expandedName = utils.expandItemName(test_case.name, test_case.key); - expect(expandedName).toBe(test_case.expected); - }); - done(); - }); - }); - - describe('splitTemplateQuery()', () => { - - // Backward compatibility - it('should properly split query in old format', (done) => { - let test_cases = [ - { - query: `/alu/./tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9{2}/`, - expected: ['/alu/', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9{2}/'] - }, - { - query: `a.b.c.d`, - expected: ['a', 'b', 'c', 'd'] - } - ]; - - _.each(test_cases, test_case => { - let splitQuery = utils.splitTemplateQuery(test_case.query); - expect(splitQuery).toEqual(test_case.expected); - }); - done(); - }); - - it('should properly split query', (done) => { - let test_cases = [ - { - query: `{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]*/}`, - expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]*/'] - }, - { - query: `{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]{2}/}`, - expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]{2}/'] - }, - { - query: `{a}{b}{c}{d}`, - expected: ['a', 'b', 'c', 'd'] - }, - { - query: `{a}{b.c.d}`, - expected: ['a', 'b.c.d'] - } - ]; - - _.each(test_cases, test_case => { - let splitQuery = utils.splitTemplateQuery(test_case.query); - expect(splitQuery).toEqual(test_case.expected); - }); - done(); - }); - }); + } + }; }); +//# sourceMappingURL=utils.spec.js.map diff --git a/dist/datasource-zabbix/specs/utils.spec.js.map b/dist/datasource-zabbix/specs/utils.spec.js.map new file mode 100644 index 0000000..8d341c4 --- /dev/null +++ b/dist/datasource-zabbix/specs/utils.spec.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/datasource-zabbix/specs/utils.spec.js"],"names":["_","utils","describe","it","done","test_cases","name","key","expected","each","expandedName","expandItemName","test_case","expect","toBe","query","splitQuery","splitTemplateQuery","toEqual"],"mappings":"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","file":"utils.spec.js","sourcesContent":["import _ from 'lodash';\nimport * as utils from '../utils';\n\ndescribe('Utils', () => {\n\n describe('expandItemName()', () => {\n\n it('should properly expand unquoted params', (done) => {\n let test_cases = [\n {\n name: `CPU $2 time`,\n key: `system.cpu.util[,user,avg1]`,\n expected: \"CPU user time\"\n },\n {\n name: `CPU $2 time - $3`,\n key: `system.cpu.util[,system,avg1]`,\n expected: \"CPU system time - avg1\"\n },\n {\n name: `CPU - $1 - $2 - $3`,\n key: `system.cpu.util[,system,avg1]`,\n expected: \"CPU - - system - avg1\"\n }\n ];\n\n _.each(test_cases, test_case => {\n let expandedName = utils.expandItemName(test_case.name, test_case.key);\n expect(expandedName).toBe(test_case.expected);\n });\n done();\n });\n\n it('should properly expand quoted params with commas', (done) => {\n let test_cases = [\n {\n name: `CPU $2 time`,\n key: `system.cpu.util[\"type=user,value=avg\",user]`,\n expected: \"CPU user time\"\n },\n {\n name: `CPU $1 time`,\n key: `system.cpu.util[\"type=user,value=avg\",\"user\"]`,\n expected: \"CPU type=user,value=avg time\"\n },\n {\n name: `CPU $1 time $3`,\n key: `system.cpu.util[\"type=user,value=avg\",,\"user\"]`,\n expected: \"CPU type=user,value=avg time user\"\n },\n {\n name: `CPU $1 $2 $3`,\n key: `system.cpu.util[\"type=user,value=avg\",time,\"user\"]`,\n expected: \"CPU type=user,value=avg time user\"\n }\n ];\n\n _.each(test_cases, test_case => {\n let expandedName = utils.expandItemName(test_case.name, test_case.key);\n expect(expandedName).toBe(test_case.expected);\n });\n done();\n });\n\n it('should properly expand array params', (done) => {\n let test_cases = [\n {\n name: `CPU $2 - $3 time`,\n key: `system.cpu.util[,[user,system],avg1]`,\n expected: \"CPU user,system - avg1 time\"\n },\n {\n name: `CPU $2 - $3 time`,\n key: `system.cpu.util[,[\"user,system\",iowait],avg1]`,\n expected: `CPU \"user,system\",iowait - avg1 time`\n },\n {\n name: `CPU - $2 - $3 - $4`,\n key: `system.cpu.util[,[],[\"user,system\",iowait],avg1]`,\n expected: `CPU - - \"user,system\",iowait - avg1`\n }\n ];\n\n _.each(test_cases, test_case => {\n let expandedName = utils.expandItemName(test_case.name, test_case.key);\n expect(expandedName).toBe(test_case.expected);\n });\n done();\n });\n });\n\n describe('splitTemplateQuery()', () => {\n\n // Backward compatibility\n it('should properly split query in old format', (done) => {\n let test_cases = [\n {\n query: `/alu/./tw-(nyc|que|brx|dwt|brk)-sta_(\\w|\\d)*-alu-[0-9{2}/`,\n expected: ['/alu/', '/tw-(nyc|que|brx|dwt|brk)-sta_(\\w|\\d)*-alu-[0-9{2}/']\n },\n {\n query: `a.b.c.d`,\n expected: ['a', 'b', 'c', 'd']\n }\n ];\n\n _.each(test_cases, test_case => {\n let splitQuery = utils.splitTemplateQuery(test_case.query);\n expect(splitQuery).toEqual(test_case.expected);\n });\n done();\n });\n\n it('should properly split query', (done) => {\n let test_cases = [\n {\n query: `{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(\\w|\\d)*-alu-[0-9]*/}`,\n expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\\w|\\d)*-alu-[0-9]*/']\n },\n {\n query: `{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(\\w|\\d)*-alu-[0-9]{2}/}`,\n expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\\w|\\d)*-alu-[0-9]{2}/']\n },\n {\n query: `{a}{b}{c}{d}`,\n expected: ['a', 'b', 'c', 'd']\n },\n {\n query: `{a}{b.c.d}`,\n expected: ['a', 'b.c.d']\n }\n ];\n\n _.each(test_cases, test_case => {\n let splitQuery = utils.splitTemplateQuery(test_case.query);\n expect(splitQuery).toEqual(test_case.expected);\n });\n done();\n });\n });\n});\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbix.js b/dist/datasource-zabbix/zabbix.js deleted file mode 100644 index 2c4a178..0000000 --- a/dist/datasource-zabbix/zabbix.js +++ /dev/null @@ -1,384 +0,0 @@ -'use strict'; - -System.register(['angular', 'lodash', './utils', './zabbixAPI.service.js', './zabbixCachingProxy.service.js', './zabbixDBConnector'], function (_export, _context) { - "use strict"; - - var angular, _, utils, _slicedToArray, _createClass; - - 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"); - } - } - - // Use factory() instead service() for multiple data sources support. - // Each Zabbix data source instance should initialize its own API instance. - - /** @ngInject */ - function ZabbixFactory(zabbixAPIService, ZabbixCachingProxy, ZabbixDBConnector) { - var Zabbix = function () { - function Zabbix(url, options) { - _classCallCheck(this, Zabbix); - - var username = options.username, - password = options.password, - basicAuth = options.basicAuth, - withCredentials = options.withCredentials, - cacheTTL = options.cacheTTL, - enableDirectDBConnection = options.enableDirectDBConnection, - sqlDatasourceId = options.sqlDatasourceId; - - - // Initialize Zabbix API - var ZabbixAPI = zabbixAPIService; - this.zabbixAPI = new ZabbixAPI(url, username, password, basicAuth, withCredentials); - - if (enableDirectDBConnection) { - this.dbConnector = new ZabbixDBConnector(sqlDatasourceId); - } - - // Initialize caching proxy for requests - var cacheOptions = { - enabled: true, - ttl: cacheTTL - }; - this.cachingProxy = new ZabbixCachingProxy(this.zabbixAPI, this.dbConnector, 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); - - if (enableDirectDBConnection) { - this.getHistoryDB = this.cachingProxy.getHistoryDB.bind(this.cachingProxy); - this.getTrendsDB = this.cachingProxy.getTrendsDB.bind(this.cachingProxy); - } - - 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); - } - - _createClass(Zabbix, [{ - key: 'getItemsFromTarget', - value: function getItemsFromTarget(target, options) { - var parts = ['group', 'host', 'application', 'item']; - var filters = _.map(parts, function (p) { - return target[p].filter; - }); - return this.getItems.apply(this, _toConsumableArray(filters).concat([options])); - } - }, { - key: 'getHostsFromTarget', - value: function getHostsFromTarget(target) { - var parts = ['group', 'host', 'application']; - var filters = _.map(parts, function (p) { - return target[p].filter; - }); - return Promise.all([this.getHosts.apply(this, _toConsumableArray(filters)), this.getApps.apply(this, _toConsumableArray(filters))]).then(function (results) { - var _results = _slicedToArray(results, 2), - hosts = _results[0], - apps = _results[1]; - - if (apps.appFilterEmpty) { - apps = []; - } - return [hosts, apps]; - }); - } - }, { - key: 'getAllGroups', - value: function getAllGroups() { - return this.cachingProxy.getGroups(); - } - }, { - key: 'getGroups', - value: function getGroups(groupFilter) { - return this.getAllGroups().then(function (groups) { - return findByFilter(groups, groupFilter); - }); - } - }, { - key: 'getAllHosts', - value: function getAllHosts(groupFilter) { - var _this = this; - - return this.getGroups(groupFilter).then(function (groups) { - var groupids = _.map(groups, 'groupid'); - return _this.cachingProxy.getHosts(groupids); - }); - } - }, { - key: 'getHosts', - value: function getHosts(groupFilter, hostFilter) { - return this.getAllHosts(groupFilter).then(function (hosts) { - return findByFilter(hosts, hostFilter); - }); - } - }, { - key: 'getAllApps', - value: function getAllApps(groupFilter, hostFilter) { - var _this2 = this; - - return this.getHosts(groupFilter, hostFilter).then(function (hosts) { - var hostids = _.map(hosts, 'hostid'); - return _this2.cachingProxy.getApps(hostids); - }); - } - }, { - key: 'getApps', - value: function getApps(groupFilter, hostFilter, appFilter) { - var _this3 = this; - - return this.getHosts(groupFilter, hostFilter).then(function (hosts) { - var hostids = _.map(hosts, 'hostid'); - if (appFilter) { - return _this3.cachingProxy.getApps(hostids).then(function (apps) { - return filterByQuery(apps, appFilter); - }); - } else { - return { - appFilterEmpty: true, - hostids: hostids - }; - } - }); - } - }, { - key: 'getAllItems', - value: function getAllItems(groupFilter, hostFilter, appFilter) { - var _this4 = this; - - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - return this.getApps(groupFilter, hostFilter, appFilter).then(function (apps) { - if (apps.appFilterEmpty) { - return _this4.cachingProxy.getItems(apps.hostids, undefined, options.itemtype); - } else { - var appids = _.map(apps, 'applicationid'); - return _this4.cachingProxy.getItems(undefined, appids, options.itemtype); - } - }).then(function (items) { - if (!options.showDisabledItems) { - items = _.filter(items, { 'status': '0' }); - } - - return items; - }).then(this.expandUserMacro.bind(this)); - } - }, { - key: 'expandUserMacro', - value: function expandUserMacro(items) { - var hostids = getHostIds(items); - return this.getMacros(hostids).then(function (macros) { - _.forEach(items, function (item) { - if (utils.containsMacro(item.name)) { - item.name = utils.replaceMacro(item, macros); - } - }); - return items; - }); - } - }, { - key: 'getItems', - value: function getItems(groupFilter, hostFilter, appFilter, itemFilter) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - return this.getAllItems(groupFilter, hostFilter, appFilter, options).then(function (items) { - return filterByQuery(items, itemFilter); - }); - } - }, { - key: 'getITServices', - value: function getITServices(itServiceFilter) { - return this.cachingProxy.getITServices().then(function (itServices) { - return findByFilter(itServices, itServiceFilter); - }); - } - }, { - key: 'getTriggers', - value: function getTriggers(groupFilter, hostFilter, appFilter, options) { - var _this5 = this; - - var promises = [this.getGroups(groupFilter), this.getHosts(groupFilter, hostFilter), this.getApps(groupFilter, hostFilter, appFilter)]; - - return Promise.all(promises).then(function (results) { - var filteredGroups = results[0]; - var filteredHosts = results[1]; - var filteredApps = results[2]; - var query = {}; - - if (appFilter) { - query.applicationids = _.flatten(_.map(filteredApps, 'applicationid')); - } - if (hostFilter) { - query.hostids = _.map(filteredHosts, 'hostid'); - } - if (groupFilter) { - query.groupids = _.map(filteredGroups, 'groupid'); - } - - return query; - }).then(function (query) { - return _this5.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options); - }); - } - }]); - - return Zabbix; - }(); - - return Zabbix; - } - - /////////////////////////////////////////////////////////////////////////////// - - /** - * Find group, host, app or item by given name. - * @param list list of groups, apps or other - * @param name visible name - * @return array with finded element or empty array - */ - function findByName(list, name) { - var finded = _.find(list, { 'name': name }); - if (finded) { - return [finded]; - } else { - return []; - } - } - - /** - * Different hosts can contains applications and items with same name. - * For this reason use _.filter, which return all elements instead _.find, - * which return only first finded. - * @param {[type]} list list of elements - * @param {[type]} name app name - * @return {[type]} array with finded element or empty array - */ - function filterByName(list, name) { - var finded = _.filter(list, { 'name': name }); - if (finded) { - return finded; - } else { - return []; - } - } - - function filterByRegex(list, regex) { - var filterPattern = utils.buildRegex(regex); - return _.filter(list, function (zbx_obj) { - return filterPattern.test(zbx_obj.name); - }); - } - - function findByFilter(list, filter) { - if (utils.isRegex(filter)) { - return filterByRegex(list, filter); - } else { - return findByName(list, filter); - } - } - - function filterByQuery(list, filter) { - if (utils.isRegex(filter)) { - return filterByRegex(list, filter); - } else { - return filterByName(list, filter); - } - } - - function getHostIds(items) { - var hostIds = _.map(items, function (item) { - return _.map(item.hosts, 'hostid'); - }); - return _.uniq(_.flatten(hostIds)); - } - return { - setters: [function (_angular) { - angular = _angular.default; - }, function (_lodash) { - _ = _lodash.default; - }, function (_utils) { - utils = _utils; - }, function (_zabbixAPIServiceJs) {}, function (_zabbixCachingProxyServiceJs) {}, function (_zabbixDBConnector) {}], - execute: function () { - _slicedToArray = function () { - function sliceIterator(arr, i) { - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if (Symbol.iterator in Object(arr)) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; - }(); - - _createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; - }(); - - angular.module('grafana.services').factory('Zabbix', ZabbixFactory); - } - }; -}); -//# sourceMappingURL=zabbix.js.map diff --git a/dist/datasource-zabbix/zabbix.js.map b/dist/datasource-zabbix/zabbix.js.map deleted file mode 100644 index f21cf83..0000000 --- a/dist/datasource-zabbix/zabbix.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/datasource-zabbix/zabbix.js"],"names":["ZabbixFactory","zabbixAPIService","ZabbixCachingProxy","ZabbixDBConnector","Zabbix","url","options","username","password","basicAuth","withCredentials","cacheTTL","enableDirectDBConnection","sqlDatasourceId","ZabbixAPI","zabbixAPI","dbConnector","cacheOptions","enabled","ttl","cachingProxy","getHistory","bind","getMacros","getItemsByIDs","getHistoryDB","getTrendsDB","getTrend","getEvents","getAlerts","getHostAlerts","getAcknowledges","getITService","getSLA","getVersion","login","target","parts","filters","_","map","p","filter","getItems","Promise","all","getHosts","getApps","then","results","hosts","apps","appFilterEmpty","getGroups","groupFilter","getAllGroups","findByFilter","groups","groupids","hostFilter","getAllHosts","hostids","appFilter","filterByQuery","undefined","itemtype","appids","showDisabledItems","items","expandUserMacro","getHostIds","forEach","utils","containsMacro","item","name","replaceMacro","macros","itemFilter","getAllItems","itServiceFilter","getITServices","itServices","promises","filteredGroups","filteredHosts","filteredApps","query","applicationids","flatten","getTriggers","findByName","list","finded","find","filterByName","filterByRegex","regex","filterPattern","buildRegex","zbx_obj","test","isRegex","hostIds","uniq","angular","module","factory"],"mappings":"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","file":"zabbix.js","sourcesContent":["import angular from 'angular';\nimport _ from 'lodash';\nimport * as utils from './utils';\nimport './zabbixAPI.service.js';\nimport './zabbixCachingProxy.service.js';\nimport './zabbixDBConnector';\n\n// Use factory() instead service() for multiple data sources support.\n// Each Zabbix data source instance should initialize its own API instance.\n\n/** @ngInject */\nfunction ZabbixFactory(zabbixAPIService, ZabbixCachingProxy, ZabbixDBConnector) {\n\n class Zabbix {\n constructor(url, options) {\n let {\n username, password, basicAuth, withCredentials, cacheTTL,\n enableDirectDBConnection, sqlDatasourceId\n } = options;\n\n // Initialize Zabbix API\n var ZabbixAPI = zabbixAPIService;\n this.zabbixAPI = new ZabbixAPI(url, username, password, basicAuth, withCredentials);\n\n if (enableDirectDBConnection) {\n this.dbConnector = new ZabbixDBConnector(sqlDatasourceId);\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 return Zabbix;\n}\n\nangular\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 diff --git a/dist/datasource-zabbix/zabbixDBConnector.js b/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js similarity index 52% rename from dist/datasource-zabbix/zabbixDBConnector.js rename to dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js index 535e596..3e04924 100644 --- a/dist/datasource-zabbix/zabbixDBConnector.js +++ b/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js @@ -1,9 +1,9 @@ 'use strict'; -System.register(['angular', 'lodash'], function (_export, _context) { +System.register(['lodash'], function (_export, _context) { "use strict"; - var angular, _, _createClass, DEFAULT_QUERY_LIMIT, HISTORY_TO_TABLE_MAP, TREND_TO_TABLE_MAP, consolidateByFunc, consolidateByTrendColumns, TEST_MYSQL_QUERY, itemid_format, TEST_POSTGRES_QUERY; + var _, _createClass, DEFAULT_QUERY_LIMIT, HISTORY_TO_TABLE_MAP, TREND_TO_TABLE_MAP, consolidateByFunc, consolidateByTrendColumns, ZabbixDBConnector, TEST_MYSQL_QUERY, itemid_format, TEST_POSTGRES_QUERY; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -11,156 +11,6 @@ System.register(['angular', 'lodash'], function (_export, _context) { } } - /** @ngInject */ - function ZabbixDBConnectorFactory(datasourceSrv, backendSrv) { - var ZabbixDBConnector = function () { - function ZabbixDBConnector(sqlDataSourceId) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - _classCallCheck(this, ZabbixDBConnector); - - var limit = options.limit; - - - this.sqlDataSourceId = sqlDataSourceId; - this.limit = limit || DEFAULT_QUERY_LIMIT; - - this.loadSQLDataSource(sqlDataSourceId); - } - - /** - * Try to load DS with given id to check it's exist. - * @param {*} datasourceId ID of SQL data source - */ - - - _createClass(ZabbixDBConnector, [{ - key: 'loadSQLDataSource', - value: function loadSQLDataSource(datasourceId) { - var _this = this; - - var ds = _.find(datasourceSrv.getAll(), { 'id': datasourceId }); - if (ds) { - return datasourceSrv.loadDatasource(ds.name).then(function (ds) { - _this.sqlDataSourceType = ds.meta.id; - return ds; - }); - } else { - return Promise.reject('SQL Data Source with ID ' + datasourceId + ' not found'); - } - } - }, { - key: 'testSQLDataSource', - value: function testSQLDataSource() { - var testQuery = TEST_MYSQL_QUERY; - if (this.sqlDataSourceType === 'postgres') { - testQuery = TEST_POSTGRES_QUERY; - } - return this.invokeSQLQuery(testQuery); - } - }, { - key: 'getHistory', - value: function getHistory(items, timeFrom, timeTill, options) { - var _this2 = this; - - var intervalMs = options.intervalMs, - consolidateBy = options.consolidateBy; - - var intervalSec = Math.ceil(intervalMs / 1000); - - consolidateBy = consolidateBy || 'avg'; - var aggFunction = consolidateByFunc[consolidateBy]; - - // Group items by value type and perform request for each value type - var grouped_items = _.groupBy(items, 'value_type'); - var promises = _.map(grouped_items, function (items, value_type) { - var itemids = _.map(items, 'itemid').join(', '); - var table = HISTORY_TO_TABLE_MAP[value_type]; - - var dialect = _this2.sqlDataSourceType; - var query = buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, dialect); - - query = compactSQLQuery(query); - return _this2.invokeSQLQuery(query); - }); - - return Promise.all(promises).then(function (results) { - return _.flatten(results); - }); - } - }, { - key: 'getTrends', - value: function getTrends(items, timeFrom, timeTill, options) { - var _this3 = this; - - var intervalMs = options.intervalMs, - consolidateBy = options.consolidateBy; - - var intervalSec = Math.ceil(intervalMs / 1000); - - consolidateBy = consolidateBy || 'avg'; - var aggFunction = consolidateByFunc[consolidateBy]; - - // Group items by value type and perform request for each value type - var grouped_items = _.groupBy(items, 'value_type'); - var promises = _.map(grouped_items, function (items, value_type) { - var itemids = _.map(items, 'itemid').join(', '); - var table = TREND_TO_TABLE_MAP[value_type]; - var valueColumn = _.includes(['avg', 'min', 'max'], consolidateBy) ? consolidateBy : 'avg'; - valueColumn = consolidateByTrendColumns[valueColumn]; - - var dialect = _this3.sqlDataSourceType; - var query = buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn, dialect); - - query = compactSQLQuery(query); - return _this3.invokeSQLQuery(query); - }); - - return Promise.all(promises).then(function (results) { - return _.flatten(results); - }); - } - }, { - key: 'handleGrafanaTSResponse', - value: function handleGrafanaTSResponse(history, items) { - var addHostName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - - return convertGrafanaTSResponse(history, items, addHostName); - } - }, { - key: 'invokeSQLQuery', - value: function invokeSQLQuery(query) { - var queryDef = { - refId: 'A', - format: 'time_series', - datasourceId: this.sqlDataSourceId, - rawSql: query, - maxDataPoints: this.limit - }; - - return backendSrv.datasourceRequest({ - url: '/api/tsdb/query', - method: 'POST', - data: { - queries: [queryDef] - } - }).then(function (response) { - var results = response.data.results; - if (results['A']) { - return results['A'].series; - } else { - return null; - } - }); - } - }]); - - return ZabbixDBConnector; - }(); - - return ZabbixDBConnector; - } - /////////////////////////////////////////////////////////////////////////////// function convertGrafanaTSResponse(time_series, items, addHostName) { @@ -239,9 +89,7 @@ System.register(['angular', 'lodash'], function (_export, _context) { } return { - setters: [function (_angular) { - angular = _angular.default; - }, function (_lodash) { + setters: [function (_lodash) { _ = _lodash.default; }], execute: function () { @@ -287,7 +135,154 @@ System.register(['angular', 'lodash'], function (_export, _context) { 'min': 'value_min', 'max': 'value_max' }; - angular.module('grafana.services').factory('ZabbixDBConnector', ZabbixDBConnectorFactory);TEST_MYSQL_QUERY = 'SELECT itemid AS metric, clock AS time_sec, value_avg AS value FROM trends_uint LIMIT 1'; + + _export('ZabbixDBConnector', ZabbixDBConnector = function () { + function ZabbixDBConnector(sqlDataSourceId, options, backendSrv, datasourceSrv) { + _classCallCheck(this, ZabbixDBConnector); + + this.backendSrv = backendSrv; + this.datasourceSrv = datasourceSrv; + + var limit = options.limit; + this.sqlDataSourceId = sqlDataSourceId; + this.limit = limit || DEFAULT_QUERY_LIMIT; + + this.loadSQLDataSource(sqlDataSourceId); + } + + /** + * Try to load DS with given id to check it's exist. + * @param {*} datasourceId ID of SQL data source + */ + + + _createClass(ZabbixDBConnector, [{ + key: 'loadSQLDataSource', + value: function loadSQLDataSource(datasourceId) { + var _this = this; + + var ds = _.find(this.datasourceSrv.getAll(), { 'id': datasourceId }); + if (ds) { + return this.datasourceSrv.loadDatasource(ds.name).then(function (ds) { + _this.sqlDataSourceType = ds.meta.id; + return ds; + }); + } else { + return Promise.reject('SQL Data Source with ID ' + datasourceId + ' not found'); + } + } + }, { + key: 'testSQLDataSource', + value: function testSQLDataSource() { + var testQuery = TEST_MYSQL_QUERY; + if (this.sqlDataSourceType === 'postgres') { + testQuery = TEST_POSTGRES_QUERY; + } + return this.invokeSQLQuery(testQuery); + } + }, { + key: 'getHistory', + value: function getHistory(items, timeFrom, timeTill, options) { + var _this2 = this; + + var intervalMs = options.intervalMs, + consolidateBy = options.consolidateBy; + + var intervalSec = Math.ceil(intervalMs / 1000); + + consolidateBy = consolidateBy || 'avg'; + var aggFunction = consolidateByFunc[consolidateBy]; + + // Group items by value type and perform request for each value type + var grouped_items = _.groupBy(items, 'value_type'); + var promises = _.map(grouped_items, function (items, value_type) { + var itemids = _.map(items, 'itemid').join(', '); + var table = HISTORY_TO_TABLE_MAP[value_type]; + + var dialect = _this2.sqlDataSourceType; + var query = buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, dialect); + + query = compactSQLQuery(query); + return _this2.invokeSQLQuery(query); + }); + + return Promise.all(promises).then(function (results) { + return _.flatten(results); + }); + } + }, { + key: 'getTrends', + value: function getTrends(items, timeFrom, timeTill, options) { + var _this3 = this; + + var intervalMs = options.intervalMs, + consolidateBy = options.consolidateBy; + + var intervalSec = Math.ceil(intervalMs / 1000); + + consolidateBy = consolidateBy || 'avg'; + var aggFunction = consolidateByFunc[consolidateBy]; + + // Group items by value type and perform request for each value type + var grouped_items = _.groupBy(items, 'value_type'); + var promises = _.map(grouped_items, function (items, value_type) { + var itemids = _.map(items, 'itemid').join(', '); + var table = TREND_TO_TABLE_MAP[value_type]; + var valueColumn = _.includes(['avg', 'min', 'max'], consolidateBy) ? consolidateBy : 'avg'; + valueColumn = consolidateByTrendColumns[valueColumn]; + + var dialect = _this3.sqlDataSourceType; + var query = buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn, dialect); + + query = compactSQLQuery(query); + return _this3.invokeSQLQuery(query); + }); + + return Promise.all(promises).then(function (results) { + return _.flatten(results); + }); + } + }, { + key: 'handleGrafanaTSResponse', + value: function handleGrafanaTSResponse(history, items) { + var addHostName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + return convertGrafanaTSResponse(history, items, addHostName); + } + }, { + key: 'invokeSQLQuery', + value: function invokeSQLQuery(query) { + var queryDef = { + refId: 'A', + format: 'time_series', + datasourceId: this.sqlDataSourceId, + rawSql: query, + maxDataPoints: this.limit + }; + + return this.backendSrv.datasourceRequest({ + url: '/api/tsdb/query', + method: 'POST', + data: { + queries: [queryDef] + } + }).then(function (response) { + var results = response.data.results; + if (results['A']) { + return results['A'].series; + } else { + return null; + } + }); + } + }]); + + return ZabbixDBConnector; + }()); + + _export('ZabbixDBConnector', ZabbixDBConnector); + + TEST_MYSQL_QUERY = 'SELECT itemid AS metric, clock AS time_sec, value_avg AS value FROM trends_uint LIMIT 1'; itemid_format = 'FM99999999999999999999'; TEST_POSTGRES_QUERY = '\n SELECT to_char(itemid, \'' + itemid_format + '\') AS metric, clock AS time, value_avg AS value\n FROM trends_uint LIMIT 1\n'; } diff --git a/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js.map b/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js.map new file mode 100644 index 0000000..3c00e4f --- /dev/null +++ b/dist/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js.map @@ -0,0 +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 diff --git a/dist/datasource-zabbix/zabbix/connectors/zabbixConnector.js b/dist/datasource-zabbix/zabbix/connectors/zabbixConnector.js new file mode 100644 index 0000000..f6f1280 --- /dev/null +++ b/dist/datasource-zabbix/zabbix/connectors/zabbixConnector.js @@ -0,0 +1,106 @@ +"use strict"; + +System.register([], function (_export, _context) { + "use strict"; + + var _createClass, ZabbixConnector; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + 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; + }; + }(); + + ZabbixConnector = function () { + function ZabbixConnector() { + _classCallCheck(this, ZabbixConnector); + } + + _createClass(ZabbixConnector, [{ + key: "testDataSource", + value: function testDataSource() {} + }, { + key: "getHistory", + value: function getHistory() {} + }, { + key: "getTrends", + value: function getTrends() {} + }, { + key: "getGroups", + value: function getGroups() {} + }, { + key: "getHosts", + value: function getHosts() {} + }, { + key: "getApps", + value: function getApps() {} + }, { + key: "getItems", + value: function getItems() {} + }, { + key: "getItemsByIDs", + value: function getItemsByIDs() {} + }, { + key: "getMacros", + value: function getMacros() {} + }, { + key: "getGlobalMacros", + value: function getGlobalMacros() {} + }, { + key: "getLastValue", + value: function getLastValue() {} + }, { + key: "getTriggers", + value: function getTriggers() {} + }, { + key: "getEvents", + value: function getEvents() {} + }, { + key: "getAlerts", + value: function getAlerts() {} + }, { + key: "getHostAlerts", + value: function getHostAlerts() {} + }, { + key: "getAcknowledges", + value: function getAcknowledges() {} + }, { + key: "getITService", + value: function getITService() {} + }, { + key: "getSLA", + value: function getSLA() {} + }, { + key: "getVersion", + value: function getVersion() {} + }]); + + return ZabbixConnector; + }(); + + _export("default", ZabbixConnector); + } + }; +}); +//# sourceMappingURL=zabbixConnector.js.map diff --git a/dist/datasource-zabbix/zabbix/connectors/zabbixConnector.js.map b/dist/datasource-zabbix/zabbix/connectors/zabbixConnector.js.map new file mode 100644 index 0000000..e79a83b --- /dev/null +++ b/dist/datasource-zabbix/zabbix/connectors/zabbixConnector.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../../src/datasource-zabbix/zabbix/connectors/zabbixConnector.js"],"names":["ZabbixConnector"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIqBA,qB;AAEnB,mCAAc;AAAA;AAAE;;;;2CAEC,CAAE;;;uCAEN,CAAE;;;sCAEH,CAAE;;;sCAEF,CAAE;;;qCAEH,CAAE;;;oCAEH,CAAE;;;qCAED,CAAE;;;0CAEG,CAAE;;;sCAEN,CAAE;;;4CAEI,CAAE;;;yCAEL,CAAE;;;wCAEH,CAAE;;;sCAEJ,CAAE;;;sCAEF,CAAE;;;0CAEE,CAAE;;;4CAEA,CAAE;;;yCAEL,CAAE;;;mCAER,CAAE;;;uCAEE,CAAE;;;;;;yBAxCIA,e","file":"zabbixConnector.js","sourcesContent":["/**\n * Base class for all Zabbix connectors\n */\n\nexport default class ZabbixConnector {\n\n constructor() {}\n\n testDataSource() {}\n\n getHistory() {}\n\n getTrends() {}\n\n getGroups() {}\n\n getHosts() {}\n\n getApps() {}\n\n getItems() {}\n\n getItemsByIDs() {}\n\n getMacros() {}\n\n getGlobalMacros() {}\n\n getLastValue() {}\n\n getTriggers() {}\n\n getEvents() {}\n\n getAlerts() {}\n\n getHostAlerts() {}\n\n getAcknowledges() {}\n\n getITService() {}\n\n getSLA() {}\n\n getVersion() {}\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 new file mode 100644 index 0000000..496e9e4 --- /dev/null +++ b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js @@ -0,0 +1,547 @@ +'use strict'; + +System.register(['lodash', '../../../utils', './zabbixAPICore'], function (_export, _context) { + "use strict"; + + var _, utils, ZabbixAPICoreService, _slicedToArray, _createClass, ZabbixAPIConnector; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function filterTriggersByAcknowledge(triggers, acknowledged) { + if (acknowledged === 0) { + return _.filter(triggers, function (trigger) { + return trigger.lastEvent.acknowledged === "0"; + }); + } else if (acknowledged === 1) { + return _.filter(triggers, function (trigger) { + return trigger.lastEvent.acknowledged === "1"; + }); + } else { + return triggers; + } + } + + function isNotAuthorized(message) { + return message === "Session terminated, re-login, please." || message === "Not authorised." || message === "Not authorized."; + } + return { + setters: [function (_lodash) { + _ = _lodash.default; + }, function (_utils) { + utils = _utils; + }, function (_zabbixAPICore) { + ZabbixAPICoreService = _zabbixAPICore.ZabbixAPICoreService; + }], + execute: function () { + _slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; + }(); + + _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + _export('ZabbixAPIConnector', ZabbixAPIConnector = function () { + + /** @ngInject */ + function ZabbixAPIConnector(api_url, username, password, basicAuth, withCredentials, backendSrv) { + _classCallCheck(this, ZabbixAPIConnector); + + this.url = api_url; + this.username = username; + this.password = password; + this.auth = ""; + + this.requestOptions = { + basicAuth: basicAuth, + withCredentials: withCredentials + }; + + this.loginPromise = null; + this.loginErrorCount = 0; + this.maxLoginAttempts = 3; + + this.zabbixAPICore = new ZabbixAPICoreService(backendSrv); + + this.getTrend = this.getTrend_ZBXNEXT1193; + //getTrend = getTrend_30; + } + + ////////////////////////// + // Core method wrappers // + ////////////////////////// + + _createClass(ZabbixAPIConnector, [{ + key: 'request', + value: function request(method, params) { + var _this = this; + + return this.zabbixAPICore.request(this.url, method, params, this.requestOptions, this.auth).catch(function (error) { + if (isNotAuthorized(error.data)) { + // Handle auth errors + _this.loginErrorCount++; + if (_this.loginErrorCount > _this.maxLoginAttempts) { + _this.loginErrorCount = 0; + return null; + } else { + return _this.loginOnce().then(function () { + return _this.request(method, params); + }); + } + } else { + // Handle API errors + var message = error.data ? error.data : error.statusText; + return Promise.reject(message); + } + }); + } + }, { + key: 'loginOnce', + value: function loginOnce() { + var _this2 = this; + + if (!this.loginPromise) { + this.loginPromise = Promise.resolve(this.login().then(function (auth) { + _this2.auth = auth; + _this2.loginPromise = null; + return auth; + })); + } + return this.loginPromise; + } + }, { + key: 'login', + value: function login() { + return this.zabbixAPICore.login(this.url, this.username, this.password, this.requestOptions); + } + }, { + key: 'getVersion', + value: function getVersion() { + return this.zabbixAPICore.getVersion(this.url, this.requestOptions); + } + }, { + key: 'acknowledgeEvent', + value: function acknowledgeEvent(eventid, message) { + var params = { + eventids: eventid, + message: message + }; + + return this.request('event.acknowledge', params); + } + }, { + key: 'getGroups', + value: function getGroups() { + var params = { + output: ['name'], + sortfield: 'name', + real_hosts: true + }; + + return this.request('hostgroup.get', params); + } + }, { + key: 'getHosts', + value: function getHosts(groupids) { + var params = { + output: ['name', 'host'], + sortfield: 'name' + }; + if (groupids) { + params.groupids = groupids; + } + + return this.request('host.get', params); + } + }, { + key: 'getApps', + value: function getApps(hostids) { + var params = { + output: 'extend', + hostids: hostids + }; + + return this.request('application.get', params); + } + }, { + key: 'getItems', + value: function getItems(hostids, appids, itemtype) { + var params = { + output: ['name', 'key_', 'value_type', 'hostid', 'status', 'state'], + sortfield: 'name', + webitems: true, + filter: {}, + selectHosts: ['hostid', 'name'] + }; + if (hostids) { + params.hostids = hostids; + } + if (appids) { + params.applicationids = appids; + } + if (itemtype === 'num') { + // Return only numeric metrics + params.filter.value_type = [0, 3]; + } + if (itemtype === 'text') { + // Return only text metrics + params.filter.value_type = [1, 2, 4]; + } + + return this.request('item.get', params).then(utils.expandItems); + } + }, { + key: 'getItemsByIDs', + value: function getItemsByIDs(itemids) { + var params = { + itemids: itemids, + output: ['name', 'key_', 'value_type', 'hostid', 'status', 'state'], + webitems: true, + selectHosts: ['hostid', 'name'] + }; + + return this.request('item.get', params).then(utils.expandItems); + } + }, { + key: 'getMacros', + value: function getMacros(hostids) { + var params = { + output: 'extend', + hostids: hostids + }; + + return this.request('usermacro.get', params); + } + }, { + key: 'getGlobalMacros', + value: function getGlobalMacros() { + var params = { + output: 'extend', + globalmacro: true + }; + + return this.request('usermacro.get', params); + } + }, { + key: 'getLastValue', + value: function getLastValue(itemid) { + var params = { + output: ['lastvalue'], + itemids: itemid + }; + return this.request('item.get', params).then(function (items) { + return items.length ? items[0].lastvalue : null; + }); + } + }, { + key: 'getHistory', + value: function getHistory(items, timeFrom, timeTill) { + var _this3 = this; + + // Group items by value type and perform request for each value type + var grouped_items = _.groupBy(items, 'value_type'); + var promises = _.map(grouped_items, function (items, value_type) { + var itemids = _.map(items, 'itemid'); + var params = { + output: 'extend', + history: value_type, + itemids: itemids, + sortfield: 'clock', + sortorder: 'ASC', + time_from: timeFrom + }; + + // Relative queries (e.g. last hour) don't include an end time + if (timeTill) { + params.time_till = timeTill; + } + + return _this3.request('history.get', params); + }); + + return Promise.all(promises).then(_.flatten); + } + }, { + key: 'getTrend_ZBXNEXT1193', + value: function getTrend_ZBXNEXT1193(items, timeFrom, timeTill) { + var _this4 = this; + + // Group items by value type and perform request for each value type + var grouped_items = _.groupBy(items, 'value_type'); + var promises = _.map(grouped_items, function (items, value_type) { + var itemids = _.map(items, 'itemid'); + var params = { + output: 'extend', + trend: value_type, + itemids: itemids, + sortfield: 'clock', + sortorder: 'ASC', + time_from: timeFrom + }; + + // Relative queries (e.g. last hour) don't include an end time + if (timeTill) { + params.time_till = timeTill; + } + + return _this4.request('trend.get', params); + }); + + return Promise.all(promises).then(_.flatten); + } + }, { + key: 'getTrend_30', + value: function getTrend_30(items, time_from, time_till, value_type) { + var self = this; + var itemids = _.map(items, 'itemid'); + + var params = { + output: ["itemid", "clock", value_type], + itemids: itemids, + time_from: time_from + }; + + // Relative queries (e.g. last hour) don't include an end time + if (time_till) { + params.time_till = time_till; + } + + return self.request('trend.get', params); + } + }, { + key: 'getITService', + value: function getITService(serviceids) { + var params = { + output: 'extend', + serviceids: serviceids + }; + return this.request('service.get', params); + } + }, { + key: 'getSLA', + value: function getSLA(serviceids, timeRange) { + var _timeRange = _slicedToArray(timeRange, 2), + timeFrom = _timeRange[0], + timeTo = _timeRange[1]; + + var params = { + serviceids: serviceids, + intervals: [{ + from: timeFrom, + to: timeTo + }] + }; + return this.request('service.getsla', params); + } + }, { + key: 'getTriggers', + value: function getTriggers(groupids, hostids, applicationids, options) { + var showTriggers = options.showTriggers, + maintenance = options.maintenance, + timeFrom = options.timeFrom, + timeTo = options.timeTo; + + + var params = { + output: 'extend', + groupids: groupids, + hostids: hostids, + applicationids: applicationids, + expandDescription: true, + expandData: true, + expandComment: true, + monitored: true, + skipDependent: true, + //only_true: true, + filter: { + value: 1 + }, + selectGroups: ['name'], + selectHosts: ['name', 'host', 'maintenance_status'], + selectItems: ['name', 'key_', 'lastvalue'], + selectLastEvent: 'extend', + selectTags: 'extend' + }; + + if (showTriggers) { + params.filter.value = showTriggers; + } + + if (maintenance) { + params.maintenance = true; + } + + if (timeFrom || timeTo) { + params.lastChangeSince = timeFrom; + params.lastChangeTill = timeTo; + } + + return this.request('trigger.get', params); + } + }, { + key: 'getEvents', + value: function getEvents(objectids, timeFrom, timeTo, showEvents) { + var params = { + output: 'extend', + time_from: timeFrom, + time_till: timeTo, + objectids: objectids, + select_acknowledges: 'extend', + selectHosts: 'extend', + value: showEvents + }; + + return this.request('event.get', params); + } + }, { + key: 'getAcknowledges', + value: function getAcknowledges(eventids) { + var params = { + output: 'extend', + eventids: eventids, + preservekeys: true, + select_acknowledges: 'extend', + sortfield: 'clock', + sortorder: 'DESC' + }; + + return this.request('event.get', params).then(function (events) { + return _.filter(events, function (event) { + return event.acknowledges.length; + }); + }); + } + }, { + key: 'getAlerts', + value: function getAlerts(itemids, timeFrom, timeTo) { + var params = { + output: 'extend', + itemids: itemids, + expandDescription: true, + expandData: true, + expandComment: true, + monitored: true, + skipDependent: true, + //only_true: true, + // filter: { + // value: 1 + // }, + selectLastEvent: 'extend' + }; + + if (timeFrom || timeTo) { + params.lastChangeSince = timeFrom; + params.lastChangeTill = timeTo; + } + + return this.request('trigger.get', params); + } + }, { + key: 'getHostAlerts', + value: function getHostAlerts(hostids, applicationids, options) { + var minSeverity = options.minSeverity, + acknowledged = options.acknowledged, + count = options.count, + timeFrom = options.timeFrom, + timeTo = options.timeTo; + + var params = { + output: 'extend', + hostids: hostids, + min_severity: minSeverity, + filter: { value: 1 }, + expandDescription: true, + expandData: true, + expandComment: true, + monitored: true, + skipDependent: true, + selectLastEvent: 'extend', + selectGroups: 'extend', + selectHosts: ['host', 'name'] + }; + + if (count && acknowledged !== 0 && acknowledged !== 1) { + params.countOutput = true; + } + + if (applicationids && applicationids.length) { + params.applicationids = applicationids; + } + + if (timeFrom || timeTo) { + params.lastChangeSince = timeFrom; + params.lastChangeTill = timeTo; + } + + return this.request('trigger.get', params).then(function (triggers) { + if (!count || acknowledged === 0 || acknowledged === 1) { + triggers = filterTriggersByAcknowledge(triggers, acknowledged); + if (count) { + triggers = triggers.length; + } + } + return triggers; + }); + } + }]); + + return ZabbixAPIConnector; + }()); + + _export('ZabbixAPIConnector', ZabbixAPIConnector); + } + }; +}); +//# sourceMappingURL=zabbixAPIConnector.js.map diff --git a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js.map b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js.map new file mode 100644 index 0000000..d3ff2b4 --- /dev/null +++ b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js.map @@ -0,0 +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 diff --git a/dist/datasource-zabbix/zabbixAPICore.service.js b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js similarity index 85% rename from dist/datasource-zabbix/zabbixAPICore.service.js rename to dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js index fef6be4..8159f64 100644 --- a/dist/datasource-zabbix/zabbixAPICore.service.js +++ b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js @@ -1,9 +1,9 @@ -'use strict'; +"use strict"; -System.register(['angular'], function (_export, _context) { +System.register([], function (_export, _context) { "use strict"; - var angular, _createClass, ZabbixAPICoreService, ZabbixAPIError; + var _createClass, ZabbixAPICoreService, ZabbixAPIError; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -12,9 +12,7 @@ System.register(['angular'], function (_export, _context) { } return { - setters: [function (_angular) { - angular = _angular.default; - }], + setters: [], execute: function () { _createClass = function () { function defineProperties(target, props) { @@ -34,7 +32,7 @@ System.register(['angular'], function (_export, _context) { }; }(); - ZabbixAPICoreService = function () { + _export("ZabbixAPICoreService", ZabbixAPICoreService = function () { /** @ngInject */ function ZabbixAPICoreService(backendSrv) { @@ -50,7 +48,7 @@ System.register(['angular'], function (_export, _context) { _createClass(ZabbixAPICoreService, [{ - key: 'request', + key: "request", value: function request(api_url, method, params, options, auth) { var requestData = { jsonrpc: '2.0', @@ -87,7 +85,7 @@ System.register(['angular'], function (_export, _context) { return this.datasourceRequest(requestOptions); } }, { - key: 'datasourceRequest', + key: "datasourceRequest", value: function datasourceRequest(requestOptions) { return this.backendSrv.datasourceRequest(requestOptions).then(function (response) { if (!response.data) { @@ -103,7 +101,7 @@ System.register(['angular'], function (_export, _context) { }); } }, { - key: 'login', + key: "login", value: function login(api_url, username, password, options) { var params = { user: username, @@ -112,16 +110,18 @@ System.register(['angular'], function (_export, _context) { return this.request(api_url, 'user.login', params, options, null); } }, { - key: 'getVersion', + key: "getVersion", value: function getVersion(api_url, options) { return this.request(api_url, 'apiinfo.version', [], options); } }]); return ZabbixAPICoreService; - }(); + }()); - _export('ZabbixAPIError', ZabbixAPIError = function () { + _export("ZabbixAPICoreService", ZabbixAPICoreService); + + _export("ZabbixAPIError", ZabbixAPIError = function () { function ZabbixAPIError(error) { _classCallCheck(this, ZabbixAPIError); @@ -132,7 +132,7 @@ System.register(['angular'], function (_export, _context) { } _createClass(ZabbixAPIError, [{ - key: 'toString', + key: "toString", value: function toString() { return this.name + " " + this.data; } @@ -141,10 +141,8 @@ System.register(['angular'], function (_export, _context) { return ZabbixAPIError; }()); - _export('ZabbixAPIError', ZabbixAPIError); - - angular.module('grafana.services').service('zabbixAPICoreService', ZabbixAPICoreService); + _export("ZabbixAPIError", ZabbixAPIError); } }; }); -//# sourceMappingURL=zabbixAPICore.service.js.map +//# sourceMappingURL=zabbixAPICore.js.map diff --git a/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js.map b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js.map new file mode 100644 index 0000000..390eb21 --- /dev/null +++ b/dist/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js.map @@ -0,0 +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 diff --git a/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js b/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js new file mode 100644 index 0000000..0402178 --- /dev/null +++ b/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js @@ -0,0 +1,283 @@ +'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 new file mode 100644 index 0000000..732292c --- /dev/null +++ b/dist/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js.map @@ -0,0 +1 @@ +{"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 new file mode 100644 index 0000000..8dd5e59 --- /dev/null +++ b/dist/datasource-zabbix/zabbix/zabbix.js @@ -0,0 +1,385 @@ +'use strict'; + +System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnector', './connectors/sql/zabbixDBConnector', './proxy/zabbixCachingProxy'], function (_export, _context) { + "use strict"; + + var _, utils, ZabbixAPIConnector, ZabbixDBConnector, ZabbixCachingProxy, _slicedToArray, _createClass, Zabbix; + + 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"); + } + } + + // angular + // .module('grafana.services') + // .factory('Zabbix', ZabbixFactory); + + /////////////////////////////////////////////////////////////////////////////// + + /** + * Find group, host, app or item by given name. + * @param list list of groups, apps or other + * @param name visible name + * @return array with finded element or empty array + */ + function findByName(list, name) { + var finded = _.find(list, { 'name': name }); + if (finded) { + return [finded]; + } else { + return []; + } + } + + /** + * Different hosts can contains applications and items with same name. + * For this reason use _.filter, which return all elements instead _.find, + * which return only first finded. + * @param {[type]} list list of elements + * @param {[type]} name app name + * @return {[type]} array with finded element or empty array + */ + function filterByName(list, name) { + var finded = _.filter(list, { 'name': name }); + if (finded) { + return finded; + } else { + return []; + } + } + + function filterByRegex(list, regex) { + var filterPattern = utils.buildRegex(regex); + return _.filter(list, function (zbx_obj) { + return filterPattern.test(zbx_obj.name); + }); + } + + function findByFilter(list, filter) { + if (utils.isRegex(filter)) { + return filterByRegex(list, filter); + } else { + return findByName(list, filter); + } + } + + function filterByQuery(list, filter) { + if (utils.isRegex(filter)) { + return filterByRegex(list, filter); + } else { + return filterByName(list, filter); + } + } + + function getHostIds(items) { + var hostIds = _.map(items, function (item) { + return _.map(item.hosts, 'hostid'); + }); + return _.uniq(_.flatten(hostIds)); + } + return { + setters: [function (_lodash) { + _ = _lodash.default; + }, function (_utils) { + utils = _utils; + }, function (_connectorsZabbix_apiZabbixAPIConnector) { + ZabbixAPIConnector = _connectorsZabbix_apiZabbixAPIConnector.ZabbixAPIConnector; + }, function (_connectorsSqlZabbixDBConnector) { + ZabbixDBConnector = _connectorsSqlZabbixDBConnector.ZabbixDBConnector; + }, function (_proxyZabbixCachingProxy) { + ZabbixCachingProxy = _proxyZabbixCachingProxy.ZabbixCachingProxy; + }], + execute: function () { + _slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; + }(); + + _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + _export('Zabbix', Zabbix = function () { + + /** @ngInject */ + function Zabbix(url, options, backendSrv, datasourceSrv) { + _classCallCheck(this, Zabbix); + + var username = options.username, + password = options.password, + basicAuth = options.basicAuth, + withCredentials = options.withCredentials, + cacheTTL = options.cacheTTL, + enableDirectDBConnection = options.enableDirectDBConnection, + 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); + + // 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); + + if (enableDirectDBConnection) { + this.getHistoryDB = this.cachingProxy.getHistoryDB.bind(this.cachingProxy); + this.getTrendsDB = this.cachingProxy.getTrendsDB.bind(this.cachingProxy); + } + + 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); + } + + _createClass(Zabbix, [{ + key: 'getItemsFromTarget', + value: function getItemsFromTarget(target, options) { + var parts = ['group', 'host', 'application', 'item']; + var filters = _.map(parts, function (p) { + return target[p].filter; + }); + return this.getItems.apply(this, _toConsumableArray(filters).concat([options])); + } + }, { + key: 'getHostsFromTarget', + value: function getHostsFromTarget(target) { + var parts = ['group', 'host', 'application']; + var filters = _.map(parts, function (p) { + return target[p].filter; + }); + return Promise.all([this.getHosts.apply(this, _toConsumableArray(filters)), this.getApps.apply(this, _toConsumableArray(filters))]).then(function (results) { + var _results = _slicedToArray(results, 2), + hosts = _results[0], + apps = _results[1]; + + if (apps.appFilterEmpty) { + apps = []; + } + return [hosts, apps]; + }); + } + }, { + key: 'getAllGroups', + value: function getAllGroups() { + return this.cachingProxy.getGroups(); + } + }, { + key: 'getGroups', + value: function getGroups(groupFilter) { + return this.getAllGroups().then(function (groups) { + return findByFilter(groups, groupFilter); + }); + } + }, { + key: 'getAllHosts', + value: function getAllHosts(groupFilter) { + var _this = this; + + return this.getGroups(groupFilter).then(function (groups) { + var groupids = _.map(groups, 'groupid'); + return _this.cachingProxy.getHosts(groupids); + }); + } + }, { + key: 'getHosts', + value: function getHosts(groupFilter, hostFilter) { + return this.getAllHosts(groupFilter).then(function (hosts) { + return findByFilter(hosts, hostFilter); + }); + } + }, { + key: 'getAllApps', + value: function getAllApps(groupFilter, hostFilter) { + var _this2 = this; + + return this.getHosts(groupFilter, hostFilter).then(function (hosts) { + var hostids = _.map(hosts, 'hostid'); + return _this2.cachingProxy.getApps(hostids); + }); + } + }, { + key: 'getApps', + value: function getApps(groupFilter, hostFilter, appFilter) { + var _this3 = this; + + return this.getHosts(groupFilter, hostFilter).then(function (hosts) { + var hostids = _.map(hosts, 'hostid'); + if (appFilter) { + return _this3.cachingProxy.getApps(hostids).then(function (apps) { + return filterByQuery(apps, appFilter); + }); + } else { + return { + appFilterEmpty: true, + hostids: hostids + }; + } + }); + } + }, { + key: 'getAllItems', + value: function getAllItems(groupFilter, hostFilter, appFilter) { + var _this4 = this; + + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + return this.getApps(groupFilter, hostFilter, appFilter).then(function (apps) { + if (apps.appFilterEmpty) { + return _this4.cachingProxy.getItems(apps.hostids, undefined, options.itemtype); + } else { + var appids = _.map(apps, 'applicationid'); + return _this4.cachingProxy.getItems(undefined, appids, options.itemtype); + } + }).then(function (items) { + if (!options.showDisabledItems) { + items = _.filter(items, { 'status': '0' }); + } + + return items; + }).then(this.expandUserMacro.bind(this)); + } + }, { + key: 'expandUserMacro', + value: function expandUserMacro(items) { + var hostids = getHostIds(items); + return this.getMacros(hostids).then(function (macros) { + _.forEach(items, function (item) { + if (utils.containsMacro(item.name)) { + item.name = utils.replaceMacro(item, macros); + } + }); + return items; + }); + } + }, { + key: 'getItems', + value: function getItems(groupFilter, hostFilter, appFilter, itemFilter) { + var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + return this.getAllItems(groupFilter, hostFilter, appFilter, options).then(function (items) { + return filterByQuery(items, itemFilter); + }); + } + }, { + key: 'getITServices', + value: function getITServices(itServiceFilter) { + return this.cachingProxy.getITServices().then(function (itServices) { + return findByFilter(itServices, itServiceFilter); + }); + } + }, { + key: 'getTriggers', + value: function getTriggers(groupFilter, hostFilter, appFilter, options) { + var _this5 = this; + + var promises = [this.getGroups(groupFilter), this.getHosts(groupFilter, hostFilter), this.getApps(groupFilter, hostFilter, appFilter)]; + + return Promise.all(promises).then(function (results) { + var filteredGroups = results[0]; + var filteredHosts = results[1]; + var filteredApps = results[2]; + var query = {}; + + if (appFilter) { + query.applicationids = _.flatten(_.map(filteredApps, 'applicationid')); + } + if (hostFilter) { + query.hostids = _.map(filteredHosts, 'hostid'); + } + if (groupFilter) { + query.groupids = _.map(filteredGroups, 'groupid'); + } + + return query; + }).then(function (query) { + return _this5.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options); + }); + } + }]); + + return Zabbix; + }()); + + _export('Zabbix', Zabbix); + } + }; +}); +//# sourceMappingURL=zabbix.js.map diff --git a/dist/datasource-zabbix/zabbix/zabbix.js.map b/dist/datasource-zabbix/zabbix/zabbix.js.map new file mode 100644 index 0000000..cbdb31a --- /dev/null +++ b/dist/datasource-zabbix/zabbix/zabbix.js.map @@ -0,0 +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 diff --git a/dist/datasource-zabbix/zabbixAPI.service.js b/dist/datasource-zabbix/zabbixAPI.service.js deleted file mode 100644 index 790fd36..0000000 --- a/dist/datasource-zabbix/zabbixAPI.service.js +++ /dev/null @@ -1,559 +0,0 @@ -'use strict'; - -System.register(['angular', 'lodash', './utils', './zabbixAPICore.service'], function (_export, _context) { - "use strict"; - - var angular, _, utils, _slicedToArray, _createClass; - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - /** @ngInject */ - function ZabbixAPIServiceFactory(alertSrv, zabbixAPICoreService) { - var ZabbixAPI = function () { - function ZabbixAPI(api_url, username, password, basicAuth, withCredentials) { - _classCallCheck(this, ZabbixAPI); - - this.url = api_url; - this.username = username; - this.password = password; - this.auth = ""; - - this.requestOptions = { - basicAuth: basicAuth, - withCredentials: withCredentials - }; - - this.loginPromise = null; - this.loginErrorCount = 0; - this.maxLoginAttempts = 3; - - this.alertSrv = alertSrv; - this.zabbixAPICore = zabbixAPICoreService; - - this.getTrend = this.getTrend_ZBXNEXT1193; - //getTrend = getTrend_30; - } - - ////////////////////////// - // Core method wrappers // - ////////////////////////// - - _createClass(ZabbixAPI, [{ - key: 'request', - value: function request(method, params) { - var _this = this; - - return this.zabbixAPICore.request(this.url, method, params, this.requestOptions, this.auth).catch(function (error) { - if (isNotAuthorized(error.data)) { - // Handle auth errors - _this.loginErrorCount++; - if (_this.loginErrorCount > _this.maxLoginAttempts) { - _this.loginErrorCount = 0; - return null; - } else { - return _this.loginOnce().then(function () { - return _this.request(method, params); - }); - } - } else { - // Handle API errors - var message = error.data ? error.data : error.statusText; - _this.alertAPIError(message); - } - }); - } - }, { - key: 'alertAPIError', - value: function alertAPIError(message) { - var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5000; - - this.alertSrv.set("Zabbix API Error", message, 'error', timeout); - } - }, { - key: 'loginOnce', - value: function loginOnce() { - var _this2 = this; - - if (!this.loginPromise) { - this.loginPromise = Promise.resolve(this.login().then(function (auth) { - _this2.auth = auth; - _this2.loginPromise = null; - return auth; - })); - } - return this.loginPromise; - } - }, { - key: 'login', - value: function login() { - return this.zabbixAPICore.login(this.url, this.username, this.password, this.requestOptions); - } - }, { - key: 'getVersion', - value: function getVersion() { - return this.zabbixAPICore.getVersion(this.url, this.requestOptions); - } - }, { - key: 'acknowledgeEvent', - value: function acknowledgeEvent(eventid, message) { - var params = { - eventids: eventid, - message: message - }; - - return this.request('event.acknowledge', params); - } - }, { - key: 'getGroups', - value: function getGroups() { - var params = { - output: ['name'], - sortfield: 'name', - real_hosts: true - }; - - return this.request('hostgroup.get', params); - } - }, { - key: 'getHosts', - value: function getHosts(groupids) { - var params = { - output: ['name', 'host'], - sortfield: 'name' - }; - if (groupids) { - params.groupids = groupids; - } - - return this.request('host.get', params); - } - }, { - key: 'getApps', - value: function getApps(hostids) { - var params = { - output: 'extend', - hostids: hostids - }; - - return this.request('application.get', params); - } - }, { - key: 'getItems', - value: function getItems(hostids, appids, itemtype) { - var params = { - output: ['name', 'key_', 'value_type', 'hostid', 'status', 'state'], - sortfield: 'name', - webitems: true, - filter: {}, - selectHosts: ['hostid', 'name'] - }; - if (hostids) { - params.hostids = hostids; - } - if (appids) { - params.applicationids = appids; - } - if (itemtype === 'num') { - // Return only numeric metrics - params.filter.value_type = [0, 3]; - } - if (itemtype === 'text') { - // Return only text metrics - params.filter.value_type = [1, 2, 4]; - } - - return this.request('item.get', params).then(utils.expandItems); - } - }, { - key: 'getItemsByIDs', - value: function getItemsByIDs(itemids) { - var params = { - itemids: itemids, - output: ['name', 'key_', 'value_type', 'hostid', 'status', 'state'], - webitems: true, - selectHosts: ['hostid', 'name'] - }; - - return this.request('item.get', params).then(utils.expandItems); - } - }, { - key: 'getMacros', - value: function getMacros(hostids) { - var params = { - output: 'extend', - hostids: hostids - }; - - return this.request('usermacro.get', params); - } - }, { - key: 'getGlobalMacros', - value: function getGlobalMacros() { - var params = { - output: 'extend', - globalmacro: true - }; - - return this.request('usermacro.get', params); - } - }, { - key: 'getLastValue', - value: function getLastValue(itemid) { - var params = { - output: ['lastvalue'], - itemids: itemid - }; - return this.request('item.get', params).then(function (items) { - return items.length ? items[0].lastvalue : null; - }); - } - }, { - key: 'getHistory', - value: function getHistory(items, timeFrom, timeTill) { - var _this3 = this; - - // Group items by value type and perform request for each value type - var grouped_items = _.groupBy(items, 'value_type'); - var promises = _.map(grouped_items, function (items, value_type) { - var itemids = _.map(items, 'itemid'); - var params = { - output: 'extend', - history: value_type, - itemids: itemids, - sortfield: 'clock', - sortorder: 'ASC', - time_from: timeFrom - }; - - // Relative queries (e.g. last hour) don't include an end time - if (timeTill) { - params.time_till = timeTill; - } - - return _this3.request('history.get', params); - }); - - return Promise.all(promises).then(_.flatten); - } - }, { - key: 'getTrend_ZBXNEXT1193', - value: function getTrend_ZBXNEXT1193(items, timeFrom, timeTill) { - var _this4 = this; - - // Group items by value type and perform request for each value type - var grouped_items = _.groupBy(items, 'value_type'); - var promises = _.map(grouped_items, function (items, value_type) { - var itemids = _.map(items, 'itemid'); - var params = { - output: 'extend', - trend: value_type, - itemids: itemids, - sortfield: 'clock', - sortorder: 'ASC', - time_from: timeFrom - }; - - // Relative queries (e.g. last hour) don't include an end time - if (timeTill) { - params.time_till = timeTill; - } - - return _this4.request('trend.get', params); - }); - - return Promise.all(promises).then(_.flatten); - } - }, { - key: 'getTrend_30', - value: function getTrend_30(items, time_from, time_till, value_type) { - var self = this; - var itemids = _.map(items, 'itemid'); - - var params = { - output: ["itemid", "clock", value_type], - itemids: itemids, - time_from: time_from - }; - - // Relative queries (e.g. last hour) don't include an end time - if (time_till) { - params.time_till = time_till; - } - - return self.request('trend.get', params); - } - }, { - key: 'getITService', - value: function getITService(serviceids) { - var params = { - output: 'extend', - serviceids: serviceids - }; - return this.request('service.get', params); - } - }, { - key: 'getSLA', - value: function getSLA(serviceids, timeRange) { - var _timeRange = _slicedToArray(timeRange, 2), - timeFrom = _timeRange[0], - timeTo = _timeRange[1]; - - var params = { - serviceids: serviceids, - intervals: [{ - from: timeFrom, - to: timeTo - }] - }; - return this.request('service.getsla', params); - } - }, { - key: 'getTriggers', - value: function getTriggers(groupids, hostids, applicationids, options) { - var showTriggers = options.showTriggers, - maintenance = options.maintenance, - timeFrom = options.timeFrom, - timeTo = options.timeTo; - - - var params = { - output: 'extend', - groupids: groupids, - hostids: hostids, - applicationids: applicationids, - expandDescription: true, - expandData: true, - expandComment: true, - monitored: true, - skipDependent: true, - //only_true: true, - filter: { - value: 1 - }, - selectGroups: ['name'], - selectHosts: ['name', 'host', 'maintenance_status'], - selectItems: ['name', 'key_', 'lastvalue'], - selectLastEvent: 'extend', - selectTags: 'extend' - }; - - if (showTriggers) { - params.filter.value = showTriggers; - } - - if (maintenance) { - params.maintenance = true; - } - - if (timeFrom || timeTo) { - params.lastChangeSince = timeFrom; - params.lastChangeTill = timeTo; - } - - return this.request('trigger.get', params); - } - }, { - key: 'getEvents', - value: function getEvents(objectids, timeFrom, timeTo, showEvents) { - var params = { - output: 'extend', - time_from: timeFrom, - time_till: timeTo, - objectids: objectids, - select_acknowledges: 'extend', - selectHosts: 'extend', - value: showEvents - }; - - return this.request('event.get', params); - } - }, { - key: 'getAcknowledges', - value: function getAcknowledges(eventids) { - var params = { - output: 'extend', - eventids: eventids, - preservekeys: true, - select_acknowledges: 'extend', - sortfield: 'clock', - sortorder: 'DESC' - }; - - return this.request('event.get', params).then(function (events) { - return _.filter(events, function (event) { - return event.acknowledges.length; - }); - }); - } - }, { - key: 'getAlerts', - value: function getAlerts(itemids, timeFrom, timeTo) { - var params = { - output: 'extend', - itemids: itemids, - expandDescription: true, - expandData: true, - expandComment: true, - monitored: true, - skipDependent: true, - //only_true: true, - // filter: { - // value: 1 - // }, - selectLastEvent: 'extend' - }; - - if (timeFrom || timeTo) { - params.lastChangeSince = timeFrom; - params.lastChangeTill = timeTo; - } - - return this.request('trigger.get', params); - } - }, { - key: 'getHostAlerts', - value: function getHostAlerts(hostids, applicationids, options) { - var minSeverity = options.minSeverity, - acknowledged = options.acknowledged, - count = options.count, - timeFrom = options.timeFrom, - timeTo = options.timeTo; - - var params = { - output: 'extend', - hostids: hostids, - min_severity: minSeverity, - filter: { value: 1 }, - expandDescription: true, - expandData: true, - expandComment: true, - monitored: true, - skipDependent: true, - selectLastEvent: 'extend', - selectGroups: 'extend', - selectHosts: ['host', 'name'] - }; - - if (count && acknowledged !== 0 && acknowledged !== 1) { - params.countOutput = true; - } - - if (applicationids && applicationids.length) { - params.applicationids = applicationids; - } - - if (timeFrom || timeTo) { - params.lastChangeSince = timeFrom; - params.lastChangeTill = timeTo; - } - - return this.request('trigger.get', params).then(function (triggers) { - if (!count || acknowledged === 0 || acknowledged === 1) { - triggers = filterTriggersByAcknowledge(triggers, acknowledged); - if (count) { - triggers = triggers.length; - } - } - return triggers; - }); - } - }]); - - return ZabbixAPI; - }(); - - return ZabbixAPI; - } - - function filterTriggersByAcknowledge(triggers, acknowledged) { - if (acknowledged === 0) { - return _.filter(triggers, function (trigger) { - return trigger.lastEvent.acknowledged === "0"; - }); - } else if (acknowledged === 1) { - return _.filter(triggers, function (trigger) { - return trigger.lastEvent.acknowledged === "1"; - }); - } else { - return triggers; - } - } - - function isNotAuthorized(message) { - return message === "Session terminated, re-login, please." || message === "Not authorised." || message === "Not authorized."; - } - - return { - setters: [function (_angular) { - angular = _angular.default; - }, function (_lodash) { - _ = _lodash.default; - }, function (_utils) { - utils = _utils; - }, function (_zabbixAPICoreService) {}], - execute: function () { - _slicedToArray = function () { - function sliceIterator(arr, i) { - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if (Symbol.iterator in Object(arr)) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; - }(); - - _createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; - }(); - - angular.module('grafana.services').factory('zabbixAPIService', ZabbixAPIServiceFactory); - } - }; -}); -//# sourceMappingURL=zabbixAPI.service.js.map diff --git a/dist/datasource-zabbix/zabbixAPI.service.js.map b/dist/datasource-zabbix/zabbixAPI.service.js.map deleted file mode 100644 index 70fa475..0000000 --- a/dist/datasource-zabbix/zabbixAPI.service.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/datasource-zabbix/zabbixAPI.service.js"],"names":["ZabbixAPIServiceFactory","alertSrv","zabbixAPICoreService","ZabbixAPI","api_url","username","password","basicAuth","withCredentials","url","auth","requestOptions","loginPromise","loginErrorCount","maxLoginAttempts","zabbixAPICore","getTrend","getTrend_ZBXNEXT1193","method","params","request","catch","isNotAuthorized","error","data","loginOnce","then","message","statusText","alertAPIError","timeout","set","Promise","resolve","login","getVersion","eventid","eventids","output","sortfield","real_hosts","groupids","hostids","appids","itemtype","webitems","filter","selectHosts","applicationids","value_type","utils","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","acknowledged","count","min_severity","countOutput","triggers","filterTriggersByAcknowledge","trigger","lastEvent","angular","module","factory"],"mappings":"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","file":"zabbixAPI.service.js","sourcesContent":["import angular from 'angular';\nimport _ from 'lodash';\nimport * as utils from './utils';\nimport './zabbixAPICore.service';\n\n/** @ngInject */\nfunction ZabbixAPIServiceFactory(alertSrv, zabbixAPICoreService) {\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 */\n class ZabbixAPI {\n\n constructor(api_url, username, password, basicAuth, withCredentials) {\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.alertSrv = alertSrv;\n this.zabbixAPICore = zabbixAPICoreService;\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 this.alertAPIError(message);\n }\n });\n }\n\n alertAPIError(message, timeout = 5000) {\n this.alertSrv.set(\n \"Zabbix API Error\",\n message,\n 'error',\n timeout\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\n return ZabbixAPI;\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\nangular\n .module('grafana.services')\n .factory('zabbixAPIService', ZabbixAPIServiceFactory);\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbixAPICore.service.js.map b/dist/datasource-zabbix/zabbixAPICore.service.js.map deleted file mode 100644 index 7316ea1..0000000 --- a/dist/datasource-zabbix/zabbixAPICore.service.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/datasource-zabbix/zabbixAPICore.service.js"],"names":["angular","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","module","service"],"mappings":";;;;;;;;;;;;;;;AAIOA,a;;;;;;;;;;;;;;;;;;;;;AAEDC,0B;;AAEJ;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;;;;;;;;AAGHd,cACGiC,MADH,CACU,kBADV,EAEGC,OAFH,CAEW,sBAFX,EAEmCjC,oBAFnC","file":"zabbixAPICore.service.js","sourcesContent":["/**\n * General Zabbix API methods\n */\n\nimport angular from 'angular';\n\nclass 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\nangular\n .module('grafana.services')\n .service('zabbixAPICoreService', ZabbixAPICoreService);\n"]} \ No newline at end of file diff --git a/dist/datasource-zabbix/zabbixCachingProxy.service.js b/dist/datasource-zabbix/zabbixCachingProxy.service.js deleted file mode 100644 index 5e657ec..0000000 --- a/dist/datasource-zabbix/zabbixCachingProxy.service.js +++ /dev/null @@ -1,291 +0,0 @@ -'use strict'; - -System.register(['angular', 'lodash'], function (_export, _context) { - "use strict"; - - var angular, _, _createClass; - - 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"); - } - } - - // Use factory() instead service() for multiple datasources support. - // Each datasource instance must initialize its own cache. - - /** @ngInject */ - function ZabbixCachingProxyFactory() { - var 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; - }(); - - return ZabbixCachingProxy; - } - - /** - * 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 (_angular) { - angular = _angular.default; - }, 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; - }; - }(); - - angular.module('grafana.services').factory('ZabbixCachingProxy', ZabbixCachingProxyFactory);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.service.js.map diff --git a/dist/datasource-zabbix/zabbixCachingProxy.service.js.map b/dist/datasource-zabbix/zabbixCachingProxy.service.js.map deleted file mode 100644 index 5edd381..0000000 --- a/dist/datasource-zabbix/zabbixCachingProxy.service.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/datasource-zabbix/zabbixCachingProxy.service.js"],"names":["ZabbixCachingProxyFactory","ZabbixCachingProxy","zabbixAPI","zabbixDBConnector","cacheOptions","dbConnector","cacheEnabled","enabled","ttl","cache","groups","hosts","applications","items","history","trends","macros","globalMacros","itServices","historyPromises","getHistory","callAPIRequestOnce","_","bind","getHistoryRequestHash","getHistoryDB","getDBQueryHash","getTrendsDB","getTrends","groupPromises","getGroupsOnce","getGroups","getRequestHash","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","hash","isExpired","Promise","resolve","value","then","result","proxyRequest","groupids","hostids","appids","itemtype","itemids","promises","all","flatten","time_from","time_till","historyStorage","full_history","expired","filter","keyBy","item","itemid","length","grouped_history","groupBy","forEach","map","func","promiseKeeper","argsHashFunc","arguments","apply","args","requestStamp","arg","undefined","isArray","sort","toString","join","getHash","stamp","consolidateBy","intervalMs","angular","module","factory","String","prototype","i","chr","len","charCodeAt","indexBy"],"mappings":"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","file":"zabbixCachingProxy.service.js","sourcesContent":["import angular from 'angular';\nimport _ from 'lodash';\n\n// Use factory() instead service() for multiple datasources support.\n// Each datasource instance must initialize its own cache.\n\n/** @ngInject */\nfunction ZabbixCachingProxyFactory() {\n\n 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 return ZabbixCachingProxy;\n}\n\nangular\n .module('grafana.services')\n .factory('ZabbixCachingProxy', ZabbixCachingProxyFactory);\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/zabbixDBConnector.js.map b/dist/datasource-zabbix/zabbixDBConnector.js.map deleted file mode 100644 index 24c998d..0000000 --- a/dist/datasource-zabbix/zabbixDBConnector.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/datasource-zabbix/zabbixDBConnector.js"],"names":["ZabbixDBConnectorFactory","datasourceSrv","backendSrv","ZabbixDBConnector","sqlDataSourceId","options","limit","DEFAULT_QUERY_LIMIT","loadSQLDataSource","datasourceId","ds","_","find","getAll","loadDatasource","name","then","sqlDataSourceType","meta","id","Promise","reject","testQuery","TEST_MYSQL_QUERY","TEST_POSTGRES_QUERY","invokeSQLQuery","items","timeFrom","timeTill","intervalMs","consolidateBy","intervalSec","Math","ceil","aggFunction","consolidateByFunc","grouped_items","groupBy","promises","map","value_type","itemids","join","table","HISTORY_TO_TABLE_MAP","dialect","query","buildSQLHistoryQuery","compactSQLQuery","all","flatten","results","TREND_TO_TABLE_MAP","valueColumn","includes","consolidateByTrendColumns","buildSQLTrendsQuery","history","addHostName","convertGrafanaTSResponse","queryDef","refId","format","rawSql","maxDataPoints","datasourceRequest","url","method","data","queries","response","series","time_series","hosts","uniqBy","grafanaSeries","itemid","item","alias","keys","length","host","hostid","datapoints","cloneDeep","points","target","sortBy","replace","buildPostgresHistoryQuery","buildMysqlHistoryQuery","buildPostgresTrendsQuery","buildMysqlTrendsQuery","time_expression","itemid_format","angular","module","factory"],"mappings":"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","file":"zabbixDBConnector.js","sourcesContent":["import angular from 'angular';\nimport _ 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\n/** @ngInject */\nfunction ZabbixDBConnectorFactory(datasourceSrv, backendSrv) {\n\n class ZabbixDBConnector {\n\n constructor(sqlDataSourceId, options = {}) {\n let {limit} = options;\n\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(datasourceSrv.getAll(), {'id': datasourceId});\n if (ds) {\n return 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 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 return ZabbixDBConnector;\n}\n\nangular\n .module('grafana.services')\n .factory('ZabbixDBConnector', ZabbixDBConnectorFactory);\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 diff --git a/src/datasource-zabbix/datasource.js b/src/datasource-zabbix/datasource.js index 9c5dca5..f0aa06f 100644 --- a/src/datasource-zabbix/datasource.js +++ b/src/datasource-zabbix/datasource.js @@ -6,14 +6,14 @@ import * as metricFunctions from './metricFunctions'; import * as c from './constants'; import dataProcessor from './dataProcessor'; import responseHandler from './responseHandler'; -import './zabbix.js'; import './zabbixAlerting.service.js'; -import {ZabbixAPIError} from './zabbixAPICore.service.js'; +import { Zabbix } from './zabbix/zabbix'; +import {ZabbixAPIError} from './zabbix/connectors/zabbix_api/zabbixAPICore'; class ZabbixAPIDatasource { /** @ngInject */ - constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, zabbixAlertingSrv, Zabbix) { + constructor(instanceSettings, templateSrv, alertSrv, dashboardSrv, backendSrv, datasourceSrv, zabbixAlertingSrv) { this.templateSrv = templateSrv; this.alertSrv = alertSrv; this.dashboardSrv = dashboardSrv; @@ -63,7 +63,7 @@ class ZabbixAPIDatasource { sqlDatasourceId: this.sqlDatasourceId }; - this.zabbix = new Zabbix(this.url, zabbixOptions); + this.zabbix = new Zabbix(this.url, zabbixOptions, backendSrv, datasourceSrv); } //////////////////////// diff --git a/src/datasource-zabbix/zabbix.js b/src/datasource-zabbix/zabbix.js deleted file mode 100644 index 694a5d8..0000000 --- a/src/datasource-zabbix/zabbix.js +++ /dev/null @@ -1,276 +0,0 @@ -import angular from 'angular'; -import _ from 'lodash'; -import * as utils from './utils'; -import './zabbixAPI.service.js'; -import './zabbixCachingProxy.service.js'; -import './zabbixDBConnector'; - -// Use factory() instead service() for multiple data sources support. -// Each Zabbix data source instance should initialize its own API instance. - -/** @ngInject */ -function ZabbixFactory(zabbixAPIService, ZabbixCachingProxy, ZabbixDBConnector) { - - class Zabbix { - constructor(url, options) { - let { - username, password, basicAuth, withCredentials, cacheTTL, - enableDirectDBConnection, sqlDatasourceId - } = options; - - // Initialize Zabbix API - var ZabbixAPI = zabbixAPIService; - this.zabbixAPI = new ZabbixAPI(url, username, password, basicAuth, withCredentials); - - if (enableDirectDBConnection) { - this.dbConnector = new ZabbixDBConnector(sqlDatasourceId); - } - - // Initialize caching proxy for requests - let cacheOptions = { - enabled: true, - ttl: cacheTTL - }; - this.cachingProxy = new ZabbixCachingProxy(this.zabbixAPI, this.dbConnector, 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); - - if (enableDirectDBConnection) { - this.getHistoryDB = this.cachingProxy.getHistoryDB.bind(this.cachingProxy); - this.getTrendsDB = this.cachingProxy.getTrendsDB.bind(this.cachingProxy); - } - - 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); - } - - getItemsFromTarget(target, options) { - let parts = ['group', 'host', 'application', 'item']; - let filters = _.map(parts, p => target[p].filter); - return this.getItems(...filters, options); - } - - getHostsFromTarget(target) { - let parts = ['group', 'host', 'application']; - let filters = _.map(parts, p => target[p].filter); - return Promise.all([ - this.getHosts(...filters), - this.getApps(...filters), - ]).then((results) => { - let [hosts, apps] = results; - if (apps.appFilterEmpty) { - apps = []; - } - return [hosts, apps]; - }); - } - - getAllGroups() { - return this.cachingProxy.getGroups(); - } - - getGroups(groupFilter) { - return this.getAllGroups() - .then(groups => findByFilter(groups, groupFilter)); - } - - /** - * Get list of host belonging to given groups. - */ - getAllHosts(groupFilter) { - return this.getGroups(groupFilter) - .then(groups => { - let groupids = _.map(groups, 'groupid'); - return this.cachingProxy.getHosts(groupids); - }); - } - - getHosts(groupFilter, hostFilter) { - return this.getAllHosts(groupFilter) - .then(hosts => findByFilter(hosts, hostFilter)); - } - - /** - * Get list of applications belonging to given groups and hosts. - */ - getAllApps(groupFilter, hostFilter) { - return this.getHosts(groupFilter, hostFilter) - .then(hosts => { - let hostids = _.map(hosts, 'hostid'); - return this.cachingProxy.getApps(hostids); - }); - } - - getApps(groupFilter, hostFilter, appFilter) { - return this.getHosts(groupFilter, hostFilter) - .then(hosts => { - let hostids = _.map(hosts, 'hostid'); - if (appFilter) { - return this.cachingProxy.getApps(hostids) - .then(apps => filterByQuery(apps, appFilter)); - } else { - return { - appFilterEmpty: true, - hostids: hostids - }; - } - }); - } - - getAllItems(groupFilter, hostFilter, appFilter, options = {}) { - return this.getApps(groupFilter, hostFilter, appFilter) - .then(apps => { - if (apps.appFilterEmpty) { - return this.cachingProxy.getItems(apps.hostids, undefined, options.itemtype); - } else { - let appids = _.map(apps, 'applicationid'); - return this.cachingProxy.getItems(undefined, appids, options.itemtype); - } - }) - .then(items => { - if (!options.showDisabledItems) { - items = _.filter(items, {'status': '0'}); - } - - return items; - }) - .then(this.expandUserMacro.bind(this)); - } - - expandUserMacro(items) { - let hostids = getHostIds(items); - return this.getMacros(hostids) - .then(macros => { - _.forEach(items, item => { - if (utils.containsMacro(item.name)) { - item.name = utils.replaceMacro(item, macros); - } - }); - return items; - }); - } - - getItems(groupFilter, hostFilter, appFilter, itemFilter, options = {}) { - return this.getAllItems(groupFilter, hostFilter, appFilter, options) - .then(items => filterByQuery(items, itemFilter)); - } - - getITServices(itServiceFilter) { - return this.cachingProxy.getITServices() - .then(itServices => findByFilter(itServices, itServiceFilter)); - } - - /** - * Build query - convert target filters to array of Zabbix items - */ - getTriggers(groupFilter, hostFilter, appFilter, options) { - let promises = [ - this.getGroups(groupFilter), - this.getHosts(groupFilter, hostFilter), - this.getApps(groupFilter, hostFilter, appFilter) - ]; - - return Promise.all(promises) - .then(results => { - let filteredGroups = results[0]; - let filteredHosts = results[1]; - let filteredApps = results[2]; - let query = {}; - - if (appFilter) { - query.applicationids = _.flatten(_.map(filteredApps, 'applicationid')); - } - if (hostFilter) { - query.hostids = _.map(filteredHosts, 'hostid'); - } - if (groupFilter) { - query.groupids = _.map(filteredGroups, 'groupid'); - } - - return query; - }).then(query => { - return this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options); - }); - } - } - - return Zabbix; -} - -angular - .module('grafana.services') - .factory('Zabbix', ZabbixFactory); - -/////////////////////////////////////////////////////////////////////////////// - -/** - * Find group, host, app or item by given name. - * @param list list of groups, apps or other - * @param name visible name - * @return array with finded element or empty array - */ -function findByName(list, name) { - var finded = _.find(list, {'name': name}); - if (finded) { - return [finded]; - } else { - return []; - } -} - -/** - * Different hosts can contains applications and items with same name. - * For this reason use _.filter, which return all elements instead _.find, - * which return only first finded. - * @param {[type]} list list of elements - * @param {[type]} name app name - * @return {[type]} array with finded element or empty array - */ -function filterByName(list, name) { - var finded = _.filter(list, {'name': name}); - if (finded) { - return finded; - } else { - return []; - } -} - -function filterByRegex(list, regex) { - var filterPattern = utils.buildRegex(regex); - return _.filter(list, function (zbx_obj) { - return filterPattern.test(zbx_obj.name); - }); -} - -function findByFilter(list, filter) { - if (utils.isRegex(filter)) { - return filterByRegex(list, filter); - } else { - return findByName(list, filter); - } -} - -function filterByQuery(list, filter) { - if (utils.isRegex(filter)) { - return filterByRegex(list, filter); - } else { - return filterByName(list, filter); - } -} - -function getHostIds(items) { - let hostIds = _.map(items, item => { - return _.map(item.hosts, 'hostid'); - }); - return _.uniq(_.flatten(hostIds)); -} diff --git a/src/datasource-zabbix/zabbixDBConnector.js b/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js similarity index 53% rename from src/datasource-zabbix/zabbixDBConnector.js rename to src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js index 8e595ad..3e8f2a7 100644 --- a/src/datasource-zabbix/zabbixDBConnector.js +++ b/src/datasource-zabbix/zabbix/connectors/sql/zabbixDBConnector.js @@ -1,4 +1,3 @@ -import angular from 'angular'; import _ from 'lodash'; const DEFAULT_QUERY_LIMIT = 10000; @@ -29,137 +28,129 @@ const consolidateByTrendColumns = { 'max': 'value_max' }; -/** @ngInject */ -function ZabbixDBConnectorFactory(datasourceSrv, backendSrv) { +export class ZabbixDBConnector { - class ZabbixDBConnector { + constructor(sqlDataSourceId, options, backendSrv, datasourceSrv) { + this.backendSrv = backendSrv; + this.datasourceSrv = datasourceSrv; - constructor(sqlDataSourceId, options = {}) { - let {limit} = options; + let limit = options.limit; + this.sqlDataSourceId = sqlDataSourceId; + this.limit = limit || DEFAULT_QUERY_LIMIT; - this.sqlDataSourceId = sqlDataSourceId; - this.limit = limit || DEFAULT_QUERY_LIMIT; + this.loadSQLDataSource(sqlDataSourceId); + } - this.loadSQLDataSource(sqlDataSourceId); - } - - /** - * Try to load DS with given id to check it's exist. - * @param {*} datasourceId ID of SQL data source - */ - loadSQLDataSource(datasourceId) { - let ds = _.find(datasourceSrv.getAll(), {'id': datasourceId}); - if (ds) { - return datasourceSrv.loadDatasource(ds.name) - .then(ds => { - this.sqlDataSourceType = ds.meta.id; - return ds; - }); - } else { - return Promise.reject(`SQL Data Source with ID ${datasourceId} not found`); - } - } - - /** - * Try to invoke test query for one of Zabbix database tables. - */ - testSQLDataSource() { - let testQuery = TEST_MYSQL_QUERY; - if (this.sqlDataSourceType === 'postgres') { - testQuery = TEST_POSTGRES_QUERY; - } - return this.invokeSQLQuery(testQuery); - } - - getHistory(items, timeFrom, timeTill, options) { - let {intervalMs, consolidateBy} = options; - let intervalSec = Math.ceil(intervalMs / 1000); - - consolidateBy = consolidateBy || 'avg'; - let aggFunction = consolidateByFunc[consolidateBy]; - - // Group items by value type and perform request for each value type - let grouped_items = _.groupBy(items, 'value_type'); - let promises = _.map(grouped_items, (items, value_type) => { - let itemids = _.map(items, 'itemid').join(', '); - let table = HISTORY_TO_TABLE_MAP[value_type]; - - let dialect = this.sqlDataSourceType; - let query = buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, dialect); - - query = compactSQLQuery(query); - return this.invokeSQLQuery(query); - }); - - return Promise.all(promises).then(results => { - return _.flatten(results); - }); - } - - getTrends(items, timeFrom, timeTill, options) { - let {intervalMs, consolidateBy} = options; - let intervalSec = Math.ceil(intervalMs / 1000); - - consolidateBy = consolidateBy || 'avg'; - let aggFunction = consolidateByFunc[consolidateBy]; - - // Group items by value type and perform request for each value type - let grouped_items = _.groupBy(items, 'value_type'); - let promises = _.map(grouped_items, (items, value_type) => { - let itemids = _.map(items, 'itemid').join(', '); - let table = TREND_TO_TABLE_MAP[value_type]; - let valueColumn = _.includes(['avg', 'min', 'max'], consolidateBy) ? consolidateBy : 'avg'; - valueColumn = consolidateByTrendColumns[valueColumn]; - - let dialect = this.sqlDataSourceType; - let query = buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn, dialect); - - query = compactSQLQuery(query); - return this.invokeSQLQuery(query); - }); - - return Promise.all(promises).then(results => { - return _.flatten(results); - }); - } - - handleGrafanaTSResponse(history, items, addHostName = true) { - return convertGrafanaTSResponse(history, items, addHostName); - } - - invokeSQLQuery(query) { - let queryDef = { - refId: 'A', - format: 'time_series', - datasourceId: this.sqlDataSourceId, - rawSql: query, - maxDataPoints: this.limit - }; - - return backendSrv.datasourceRequest({ - url: '/api/tsdb/query', - method: 'POST', - data: { - queries: [queryDef], - } - }) - .then(response => { - let results = response.data.results; - if (results['A']) { - return results['A'].series; - } else { - return null; - } + /** + * Try to load DS with given id to check it's exist. + * @param {*} datasourceId ID of SQL data source + */ + loadSQLDataSource(datasourceId) { + let ds = _.find(this.datasourceSrv.getAll(), {'id': datasourceId}); + if (ds) { + return this.datasourceSrv.loadDatasource(ds.name) + .then(ds => { + this.sqlDataSourceType = ds.meta.id; + return ds; }); + } else { + return Promise.reject(`SQL Data Source with ID ${datasourceId} not found`); } } - return ZabbixDBConnector; -} + /** + * Try to invoke test query for one of Zabbix database tables. + */ + testSQLDataSource() { + let testQuery = TEST_MYSQL_QUERY; + if (this.sqlDataSourceType === 'postgres') { + testQuery = TEST_POSTGRES_QUERY; + } + return this.invokeSQLQuery(testQuery); + } -angular - .module('grafana.services') - .factory('ZabbixDBConnector', ZabbixDBConnectorFactory); + getHistory(items, timeFrom, timeTill, options) { + let {intervalMs, consolidateBy} = options; + let intervalSec = Math.ceil(intervalMs / 1000); + + consolidateBy = consolidateBy || 'avg'; + let aggFunction = consolidateByFunc[consolidateBy]; + + // Group items by value type and perform request for each value type + let grouped_items = _.groupBy(items, 'value_type'); + let promises = _.map(grouped_items, (items, value_type) => { + let itemids = _.map(items, 'itemid').join(', '); + let table = HISTORY_TO_TABLE_MAP[value_type]; + + let dialect = this.sqlDataSourceType; + let query = buildSQLHistoryQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, dialect); + + query = compactSQLQuery(query); + return this.invokeSQLQuery(query); + }); + + return Promise.all(promises).then(results => { + return _.flatten(results); + }); + } + + getTrends(items, timeFrom, timeTill, options) { + let {intervalMs, consolidateBy} = options; + let intervalSec = Math.ceil(intervalMs / 1000); + + consolidateBy = consolidateBy || 'avg'; + let aggFunction = consolidateByFunc[consolidateBy]; + + // Group items by value type and perform request for each value type + let grouped_items = _.groupBy(items, 'value_type'); + let promises = _.map(grouped_items, (items, value_type) => { + let itemids = _.map(items, 'itemid').join(', '); + let table = TREND_TO_TABLE_MAP[value_type]; + let valueColumn = _.includes(['avg', 'min', 'max'], consolidateBy) ? consolidateBy : 'avg'; + valueColumn = consolidateByTrendColumns[valueColumn]; + + let dialect = this.sqlDataSourceType; + let query = buildSQLTrendsQuery(itemids, table, timeFrom, timeTill, intervalSec, aggFunction, valueColumn, dialect); + + query = compactSQLQuery(query); + return this.invokeSQLQuery(query); + }); + + return Promise.all(promises).then(results => { + return _.flatten(results); + }); + } + + handleGrafanaTSResponse(history, items, addHostName = true) { + return convertGrafanaTSResponse(history, items, addHostName); + } + + invokeSQLQuery(query) { + let queryDef = { + refId: 'A', + format: 'time_series', + datasourceId: this.sqlDataSourceId, + rawSql: query, + maxDataPoints: this.limit + }; + + return this.backendSrv.datasourceRequest({ + url: '/api/tsdb/query', + method: 'POST', + data: { + queries: [queryDef], + } + }) + .then(response => { + let results = response.data.results; + if (results['A']) { + return results['A'].series; + } else { + return null; + } + }); + } +} /////////////////////////////////////////////////////////////////////////////// diff --git a/src/datasource-zabbix/zabbix/connectors/zabbixConnector.js b/src/datasource-zabbix/zabbix/connectors/zabbixConnector.js new file mode 100644 index 0000000..eb0ba14 --- /dev/null +++ b/src/datasource-zabbix/zabbix/connectors/zabbixConnector.js @@ -0,0 +1,46 @@ +/** + * Base class for all Zabbix connectors + */ + +export default class ZabbixConnector { + + constructor() {} + + testDataSource() {} + + getHistory() {} + + getTrends() {} + + getGroups() {} + + getHosts() {} + + getApps() {} + + getItems() {} + + getItemsByIDs() {} + + getMacros() {} + + getGlobalMacros() {} + + getLastValue() {} + + getTriggers() {} + + getEvents() {} + + getAlerts() {} + + getHostAlerts() {} + + getAcknowledges() {} + + getITService() {} + + getSLA() {} + + getVersion() {} +} diff --git a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js new file mode 100644 index 0000000..ab77e84 --- /dev/null +++ b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.js @@ -0,0 +1,484 @@ +import _ from 'lodash'; +import * as utils from '../../../utils'; +import { ZabbixAPICoreService } from './zabbixAPICore'; + +/** + * Zabbix API Wrapper. + * Creates Zabbix API instance with given parameters (url, credentials and other). + * Wraps API calls and provides high-level methods. + */ +export class ZabbixAPIConnector { + + /** @ngInject */ + constructor(api_url, username, password, basicAuth, withCredentials, backendSrv) { + this.url = api_url; + this.username = username; + this.password = password; + this.auth = ""; + + this.requestOptions = { + basicAuth: basicAuth, + withCredentials: withCredentials + }; + + this.loginPromise = null; + this.loginErrorCount = 0; + this.maxLoginAttempts = 3; + + this.zabbixAPICore = new ZabbixAPICoreService(backendSrv); + + this.getTrend = this.getTrend_ZBXNEXT1193; + //getTrend = getTrend_30; + } + + ////////////////////////// + // Core method wrappers // + ////////////////////////// + + request(method, params) { + return this.zabbixAPICore.request(this.url, method, params, this.requestOptions, this.auth) + .catch(error => { + if (isNotAuthorized(error.data)) { + // Handle auth errors + this.loginErrorCount++; + if (this.loginErrorCount > this.maxLoginAttempts) { + this.loginErrorCount = 0; + return null; + } else { + return this.loginOnce() + .then(() => this.request(method, params)); + } + } else { + // Handle API errors + let message = error.data ? error.data : error.statusText; + return Promise.reject(message); + } + }); + } + + /** + * When API unauthenticated or auth token expired each request produce login() + * call. But auth token is common to all requests. This function wraps login() method + * and call it once. If login() already called just wait for it (return its promise). + * @return login promise + */ + loginOnce() { + if (!this.loginPromise) { + this.loginPromise = Promise.resolve( + this.login().then(auth => { + this.auth = auth; + this.loginPromise = null; + return auth; + }) + ); + } + return this.loginPromise; + } + + /** + * Get authentication token. + */ + login() { + return this.zabbixAPICore.login(this.url, this.username, this.password, this.requestOptions); + } + + /** + * Get Zabbix API version + */ + getVersion() { + return this.zabbixAPICore.getVersion(this.url, this.requestOptions); + } + + //////////////////////////////// + // Zabbix API method wrappers // + //////////////////////////////// + + acknowledgeEvent(eventid, message) { + var params = { + eventids: eventid, + message: message + }; + + return this.request('event.acknowledge', params); + } + + getGroups() { + var params = { + output: ['name'], + sortfield: 'name', + real_hosts: true + }; + + return this.request('hostgroup.get', params); + } + + getHosts(groupids) { + var params = { + output: ['name', 'host'], + sortfield: 'name' + }; + if (groupids) { + params.groupids = groupids; + } + + return this.request('host.get', params); + } + + getApps(hostids) { + var params = { + output: 'extend', + hostids: hostids + }; + + return this.request('application.get', params); + } + + /** + * Get Zabbix items + * @param {[type]} hostids host ids + * @param {[type]} appids application ids + * @param {String} itemtype 'num' or 'text' + * @return {[type]} array of items + */ + getItems(hostids, appids, itemtype) { + var params = { + output: [ + 'name', 'key_', + 'value_type', + 'hostid', + 'status', + 'state' + ], + sortfield: 'name', + webitems: true, + filter: {}, + selectHosts: ['hostid', 'name'] + }; + if (hostids) { + params.hostids = hostids; + } + if (appids) { + params.applicationids = appids; + } + if (itemtype === 'num') { + // Return only numeric metrics + params.filter.value_type = [0, 3]; + } + if (itemtype === 'text') { + // Return only text metrics + params.filter.value_type = [1, 2, 4]; + } + + return this.request('item.get', params) + .then(utils.expandItems); + } + + getItemsByIDs(itemids) { + var params = { + itemids: itemids, + output: [ + 'name', 'key_', + 'value_type', + 'hostid', + 'status', + 'state' + ], + webitems: true, + selectHosts: ['hostid', 'name'] + }; + + return this.request('item.get', params) + .then(utils.expandItems); + } + + getMacros(hostids) { + var params = { + output: 'extend', + hostids: hostids + }; + + return this.request('usermacro.get', params); + } + + getGlobalMacros() { + var params = { + output: 'extend', + globalmacro: true + }; + + return this.request('usermacro.get', params); + } + + getLastValue(itemid) { + var params = { + output: ['lastvalue'], + itemids: itemid + }; + return this.request('item.get', params) + .then(items => items.length ? items[0].lastvalue : null); + } + + /** + * Perform history query from Zabbix API + * + * @param {Array} items Array of Zabbix item objects + * @param {Number} timeFrom Time in seconds + * @param {Number} timeTill Time in seconds + * @return {Array} Array of Zabbix history objects + */ + getHistory(items, timeFrom, timeTill) { + + // Group items by value type and perform request for each value type + let grouped_items = _.groupBy(items, 'value_type'); + let promises = _.map(grouped_items, (items, value_type) => { + let itemids = _.map(items, 'itemid'); + let params = { + output: 'extend', + history: value_type, + itemids: itemids, + sortfield: 'clock', + sortorder: 'ASC', + time_from: timeFrom + }; + + // Relative queries (e.g. last hour) don't include an end time + if (timeTill) { + params.time_till = timeTill; + } + + return this.request('history.get', params); + }); + + return Promise.all(promises).then(_.flatten); + } + + /** + * Perform trends query from Zabbix API + * Use trends api extension from ZBXNEXT-1193 patch. + * + * @param {Array} items Array of Zabbix item objects + * @param {Number} time_from Time in seconds + * @param {Number} time_till Time in seconds + * @return {Array} Array of Zabbix trend objects + */ + getTrend_ZBXNEXT1193(items, timeFrom, timeTill) { + + // Group items by value type and perform request for each value type + let grouped_items = _.groupBy(items, 'value_type'); + let promises = _.map(grouped_items, (items, value_type) => { + let itemids = _.map(items, 'itemid'); + let params = { + output: 'extend', + trend: value_type, + itemids: itemids, + sortfield: 'clock', + sortorder: 'ASC', + time_from: timeFrom + }; + + // Relative queries (e.g. last hour) don't include an end time + if (timeTill) { + params.time_till = timeTill; + } + + return this.request('trend.get', params); + }); + + return Promise.all(promises).then(_.flatten); + } + + getTrend_30(items, time_from, time_till, value_type) { + var self = this; + var itemids = _.map(items, 'itemid'); + + var params = { + output: ["itemid", + "clock", + value_type + ], + itemids: itemids, + time_from: time_from + }; + + // Relative queries (e.g. last hour) don't include an end time + if (time_till) { + params.time_till = time_till; + } + + return self.request('trend.get', params); + } + + getITService(serviceids) { + var params = { + output: 'extend', + serviceids: serviceids + }; + return this.request('service.get', params); + } + + getSLA(serviceids, timeRange) { + let [timeFrom, timeTo] = timeRange; + var params = { + serviceids: serviceids, + intervals: [{ + from: timeFrom, + to: timeTo + }] + }; + return this.request('service.getsla', params); + } + + getTriggers(groupids, hostids, applicationids, options) { + let {showTriggers, maintenance, timeFrom, timeTo} = options; + + let params = { + output: 'extend', + groupids: groupids, + hostids: hostids, + applicationids: applicationids, + expandDescription: true, + expandData: true, + expandComment: true, + monitored: true, + skipDependent: true, + //only_true: true, + filter: { + value: 1 + }, + selectGroups: ['name'], + selectHosts: ['name', 'host', 'maintenance_status'], + selectItems: ['name', 'key_', 'lastvalue'], + selectLastEvent: 'extend', + selectTags: 'extend' + }; + + if (showTriggers) { + params.filter.value = showTriggers; + } + + if (maintenance) { + params.maintenance = true; + } + + if (timeFrom || timeTo) { + params.lastChangeSince = timeFrom; + params.lastChangeTill = timeTo; + } + + return this.request('trigger.get', params); + } + + getEvents(objectids, timeFrom, timeTo, showEvents) { + var params = { + output: 'extend', + time_from: timeFrom, + time_till: timeTo, + objectids: objectids, + select_acknowledges: 'extend', + selectHosts: 'extend', + value: showEvents + }; + + return this.request('event.get', params); + } + + getAcknowledges(eventids) { + var params = { + output: 'extend', + eventids: eventids, + preservekeys: true, + select_acknowledges: 'extend', + sortfield: 'clock', + sortorder: 'DESC' + }; + + return this.request('event.get', params) + .then(events => { + return _.filter(events, (event) => event.acknowledges.length); + }); + } + + getAlerts(itemids, timeFrom, timeTo) { + var params = { + output: 'extend', + itemids: itemids, + expandDescription: true, + expandData: true, + expandComment: true, + monitored: true, + skipDependent: true, + //only_true: true, + // filter: { + // value: 1 + // }, + selectLastEvent: 'extend' + }; + + if (timeFrom || timeTo) { + params.lastChangeSince = timeFrom; + params.lastChangeTill = timeTo; + } + + return this.request('trigger.get', params); + } + + getHostAlerts(hostids, applicationids, options) { + let {minSeverity, acknowledged, count, timeFrom, timeTo} = options; + let params = { + output: 'extend', + hostids: hostids, + min_severity: minSeverity, + filter: { value: 1 }, + expandDescription: true, + expandData: true, + expandComment: true, + monitored: true, + skipDependent: true, + selectLastEvent: 'extend', + selectGroups: 'extend', + selectHosts: ['host', 'name'] + }; + + if (count && acknowledged !== 0 && acknowledged !== 1) { + params.countOutput = true; + } + + if (applicationids && applicationids.length) { + params.applicationids = applicationids; + } + + if (timeFrom || timeTo) { + params.lastChangeSince = timeFrom; + params.lastChangeTill = timeTo; + } + + return this.request('trigger.get', params) + .then((triggers) => { + if (!count || acknowledged === 0 || acknowledged === 1) { + triggers = filterTriggersByAcknowledge(triggers, acknowledged); + if (count) { + triggers = triggers.length; + } + } + return triggers; + }); + } +} + +function filterTriggersByAcknowledge(triggers, acknowledged) { + if (acknowledged === 0) { + return _.filter(triggers, (trigger) => trigger.lastEvent.acknowledged === "0"); + } else if (acknowledged === 1) { + return _.filter(triggers, (trigger) => trigger.lastEvent.acknowledged === "1"); + } else { + return triggers; + } +} + +function isNotAuthorized(message) { + return ( + message === "Session terminated, re-login, please." || + message === "Not authorised." || + message === "Not authorized." + ); +} diff --git a/src/datasource-zabbix/zabbixAPICore.service.js b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js similarity index 93% rename from src/datasource-zabbix/zabbixAPICore.service.js rename to src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js index a466c5b..a8875c9 100644 --- a/src/datasource-zabbix/zabbixAPICore.service.js +++ b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js @@ -2,9 +2,7 @@ * General Zabbix API methods */ -import angular from 'angular'; - -class ZabbixAPICoreService { +export class ZabbixAPICoreService { /** @ngInject */ constructor(backendSrv) { @@ -101,7 +99,3 @@ export class ZabbixAPIError { return this.name + " " + this.data; } } - -angular - .module('grafana.services') - .service('zabbixAPICoreService', ZabbixAPICoreService); diff --git a/src/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js b/src/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js new file mode 100644 index 0000000..4cd36f7 --- /dev/null +++ b/src/datasource-zabbix/zabbix/proxy/zabbixCachingProxy.js @@ -0,0 +1,231 @@ +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 new file mode 100644 index 0000000..fc36e73 --- /dev/null +++ b/src/datasource-zabbix/zabbix/zabbix.js @@ -0,0 +1,268 @@ +// 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'; + +export class Zabbix { + + /** @ngInject */ + constructor(url, options, backendSrv, datasourceSrv) { + let { + 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); + + // 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); + + if (enableDirectDBConnection) { + this.getHistoryDB = this.cachingProxy.getHistoryDB.bind(this.cachingProxy); + this.getTrendsDB = this.cachingProxy.getTrendsDB.bind(this.cachingProxy); + } + + 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); + } + + getItemsFromTarget(target, options) { + let parts = ['group', 'host', 'application', 'item']; + let filters = _.map(parts, p => target[p].filter); + return this.getItems(...filters, options); + } + + getHostsFromTarget(target) { + let parts = ['group', 'host', 'application']; + let filters = _.map(parts, p => target[p].filter); + return Promise.all([ + this.getHosts(...filters), + this.getApps(...filters), + ]).then((results) => { + let [hosts, apps] = results; + if (apps.appFilterEmpty) { + apps = []; + } + return [hosts, apps]; + }); + } + + getAllGroups() { + return this.cachingProxy.getGroups(); + } + + getGroups(groupFilter) { + return this.getAllGroups() + .then(groups => findByFilter(groups, groupFilter)); + } + + /** + * Get list of host belonging to given groups. + */ + getAllHosts(groupFilter) { + return this.getGroups(groupFilter) + .then(groups => { + let groupids = _.map(groups, 'groupid'); + return this.cachingProxy.getHosts(groupids); + }); + } + + getHosts(groupFilter, hostFilter) { + return this.getAllHosts(groupFilter) + .then(hosts => findByFilter(hosts, hostFilter)); + } + + /** + * Get list of applications belonging to given groups and hosts. + */ + getAllApps(groupFilter, hostFilter) { + return this.getHosts(groupFilter, hostFilter) + .then(hosts => { + let hostids = _.map(hosts, 'hostid'); + return this.cachingProxy.getApps(hostids); + }); + } + + getApps(groupFilter, hostFilter, appFilter) { + return this.getHosts(groupFilter, hostFilter) + .then(hosts => { + let hostids = _.map(hosts, 'hostid'); + if (appFilter) { + return this.cachingProxy.getApps(hostids) + .then(apps => filterByQuery(apps, appFilter)); + } else { + return { + appFilterEmpty: true, + hostids: hostids + }; + } + }); + } + + getAllItems(groupFilter, hostFilter, appFilter, options = {}) { + return this.getApps(groupFilter, hostFilter, appFilter) + .then(apps => { + if (apps.appFilterEmpty) { + return this.cachingProxy.getItems(apps.hostids, undefined, options.itemtype); + } else { + let appids = _.map(apps, 'applicationid'); + return this.cachingProxy.getItems(undefined, appids, options.itemtype); + } + }) + .then(items => { + if (!options.showDisabledItems) { + items = _.filter(items, {'status': '0'}); + } + + return items; + }) + .then(this.expandUserMacro.bind(this)); + } + + expandUserMacro(items) { + let hostids = getHostIds(items); + return this.getMacros(hostids) + .then(macros => { + _.forEach(items, item => { + if (utils.containsMacro(item.name)) { + item.name = utils.replaceMacro(item, macros); + } + }); + return items; + }); + } + + getItems(groupFilter, hostFilter, appFilter, itemFilter, options = {}) { + return this.getAllItems(groupFilter, hostFilter, appFilter, options) + .then(items => filterByQuery(items, itemFilter)); + } + + getITServices(itServiceFilter) { + return this.cachingProxy.getITServices() + .then(itServices => findByFilter(itServices, itServiceFilter)); + } + + /** + * Build query - convert target filters to array of Zabbix items + */ + getTriggers(groupFilter, hostFilter, appFilter, options) { + let promises = [ + this.getGroups(groupFilter), + this.getHosts(groupFilter, hostFilter), + this.getApps(groupFilter, hostFilter, appFilter) + ]; + + return Promise.all(promises) + .then(results => { + let filteredGroups = results[0]; + let filteredHosts = results[1]; + let filteredApps = results[2]; + let query = {}; + + if (appFilter) { + query.applicationids = _.flatten(_.map(filteredApps, 'applicationid')); + } + if (hostFilter) { + query.hostids = _.map(filteredHosts, 'hostid'); + } + if (groupFilter) { + query.groupids = _.map(filteredGroups, 'groupid'); + } + + return query; + }).then(query => { + return this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options); + }); + } +} + +// angular +// .module('grafana.services') +// .factory('Zabbix', ZabbixFactory); + +/////////////////////////////////////////////////////////////////////////////// + +/** + * Find group, host, app or item by given name. + * @param list list of groups, apps or other + * @param name visible name + * @return array with finded element or empty array + */ +function findByName(list, name) { + var finded = _.find(list, {'name': name}); + if (finded) { + return [finded]; + } else { + return []; + } +} + +/** + * Different hosts can contains applications and items with same name. + * For this reason use _.filter, which return all elements instead _.find, + * which return only first finded. + * @param {[type]} list list of elements + * @param {[type]} name app name + * @return {[type]} array with finded element or empty array + */ +function filterByName(list, name) { + var finded = _.filter(list, {'name': name}); + if (finded) { + return finded; + } else { + return []; + } +} + +function filterByRegex(list, regex) { + var filterPattern = utils.buildRegex(regex); + return _.filter(list, function (zbx_obj) { + return filterPattern.test(zbx_obj.name); + }); +} + +function findByFilter(list, filter) { + if (utils.isRegex(filter)) { + return filterByRegex(list, filter); + } else { + return findByName(list, filter); + } +} + +function filterByQuery(list, filter) { + if (utils.isRegex(filter)) { + return filterByRegex(list, filter); + } else { + return filterByName(list, filter); + } +} + +function getHostIds(items) { + let hostIds = _.map(items, item => { + return _.map(item.hosts, 'hostid'); + }); + return _.uniq(_.flatten(hostIds)); +} diff --git a/src/datasource-zabbix/zabbixAPI.service.js b/src/datasource-zabbix/zabbixAPI.service.js deleted file mode 100644 index 43e4fea..0000000 --- a/src/datasource-zabbix/zabbixAPI.service.js +++ /dev/null @@ -1,504 +0,0 @@ -import angular from 'angular'; -import _ from 'lodash'; -import * as utils from './utils'; -import './zabbixAPICore.service'; - -/** @ngInject */ -function ZabbixAPIServiceFactory(alertSrv, zabbixAPICoreService) { - - /** - * Zabbix API Wrapper. - * Creates Zabbix API instance with given parameters (url, credentials and other). - * Wraps API calls and provides high-level methods. - */ - class ZabbixAPI { - - constructor(api_url, username, password, basicAuth, withCredentials) { - this.url = api_url; - this.username = username; - this.password = password; - this.auth = ""; - - this.requestOptions = { - basicAuth: basicAuth, - withCredentials: withCredentials - }; - - this.loginPromise = null; - this.loginErrorCount = 0; - this.maxLoginAttempts = 3; - - this.alertSrv = alertSrv; - this.zabbixAPICore = zabbixAPICoreService; - - this.getTrend = this.getTrend_ZBXNEXT1193; - //getTrend = getTrend_30; - } - - ////////////////////////// - // Core method wrappers // - ////////////////////////// - - request(method, params) { - return this.zabbixAPICore.request(this.url, method, params, this.requestOptions, this.auth) - .catch(error => { - if (isNotAuthorized(error.data)) { - // Handle auth errors - this.loginErrorCount++; - if (this.loginErrorCount > this.maxLoginAttempts) { - this.loginErrorCount = 0; - return null; - } else { - return this.loginOnce() - .then(() => this.request(method, params)); - } - } else { - // Handle API errors - let message = error.data ? error.data : error.statusText; - this.alertAPIError(message); - } - }); - } - - alertAPIError(message, timeout = 5000) { - this.alertSrv.set( - "Zabbix API Error", - message, - 'error', - timeout - ); - } - - /** - * When API unauthenticated or auth token expired each request produce login() - * call. But auth token is common to all requests. This function wraps login() method - * and call it once. If login() already called just wait for it (return its promise). - * @return login promise - */ - loginOnce() { - if (!this.loginPromise) { - this.loginPromise = Promise.resolve( - this.login().then(auth => { - this.auth = auth; - this.loginPromise = null; - return auth; - }) - ); - } - return this.loginPromise; - } - - /** - * Get authentication token. - */ - login() { - return this.zabbixAPICore.login(this.url, this.username, this.password, this.requestOptions); - } - - /** - * Get Zabbix API version - */ - getVersion() { - return this.zabbixAPICore.getVersion(this.url, this.requestOptions); - } - - //////////////////////////////// - // Zabbix API method wrappers // - //////////////////////////////// - - acknowledgeEvent(eventid, message) { - var params = { - eventids: eventid, - message: message - }; - - return this.request('event.acknowledge', params); - } - - getGroups() { - var params = { - output: ['name'], - sortfield: 'name', - real_hosts: true - }; - - return this.request('hostgroup.get', params); - } - - getHosts(groupids) { - var params = { - output: ['name', 'host'], - sortfield: 'name' - }; - if (groupids) { - params.groupids = groupids; - } - - return this.request('host.get', params); - } - - getApps(hostids) { - var params = { - output: 'extend', - hostids: hostids - }; - - return this.request('application.get', params); - } - - /** - * Get Zabbix items - * @param {[type]} hostids host ids - * @param {[type]} appids application ids - * @param {String} itemtype 'num' or 'text' - * @return {[type]} array of items - */ - getItems(hostids, appids, itemtype) { - var params = { - output: [ - 'name', 'key_', - 'value_type', - 'hostid', - 'status', - 'state' - ], - sortfield: 'name', - webitems: true, - filter: {}, - selectHosts: ['hostid', 'name'] - }; - if (hostids) { - params.hostids = hostids; - } - if (appids) { - params.applicationids = appids; - } - if (itemtype === 'num') { - // Return only numeric metrics - params.filter.value_type = [0, 3]; - } - if (itemtype === 'text') { - // Return only text metrics - params.filter.value_type = [1, 2, 4]; - } - - return this.request('item.get', params) - .then(utils.expandItems); - } - - getItemsByIDs(itemids) { - var params = { - itemids: itemids, - output: [ - 'name', 'key_', - 'value_type', - 'hostid', - 'status', - 'state' - ], - webitems: true, - selectHosts: ['hostid', 'name'] - }; - - return this.request('item.get', params) - .then(utils.expandItems); - } - - getMacros(hostids) { - var params = { - output: 'extend', - hostids: hostids - }; - - return this.request('usermacro.get', params); - } - - getGlobalMacros() { - var params = { - output: 'extend', - globalmacro: true - }; - - return this.request('usermacro.get', params); - } - - getLastValue(itemid) { - var params = { - output: ['lastvalue'], - itemids: itemid - }; - return this.request('item.get', params) - .then(items => items.length ? items[0].lastvalue : null); - } - - /** - * Perform history query from Zabbix API - * - * @param {Array} items Array of Zabbix item objects - * @param {Number} timeFrom Time in seconds - * @param {Number} timeTill Time in seconds - * @return {Array} Array of Zabbix history objects - */ - getHistory(items, timeFrom, timeTill) { - - // Group items by value type and perform request for each value type - let grouped_items = _.groupBy(items, 'value_type'); - let promises = _.map(grouped_items, (items, value_type) => { - let itemids = _.map(items, 'itemid'); - let params = { - output: 'extend', - history: value_type, - itemids: itemids, - sortfield: 'clock', - sortorder: 'ASC', - time_from: timeFrom - }; - - // Relative queries (e.g. last hour) don't include an end time - if (timeTill) { - params.time_till = timeTill; - } - - return this.request('history.get', params); - }); - - return Promise.all(promises).then(_.flatten); - } - - /** - * Perform trends query from Zabbix API - * Use trends api extension from ZBXNEXT-1193 patch. - * - * @param {Array} items Array of Zabbix item objects - * @param {Number} time_from Time in seconds - * @param {Number} time_till Time in seconds - * @return {Array} Array of Zabbix trend objects - */ - getTrend_ZBXNEXT1193(items, timeFrom, timeTill) { - - // Group items by value type and perform request for each value type - let grouped_items = _.groupBy(items, 'value_type'); - let promises = _.map(grouped_items, (items, value_type) => { - let itemids = _.map(items, 'itemid'); - let params = { - output: 'extend', - trend: value_type, - itemids: itemids, - sortfield: 'clock', - sortorder: 'ASC', - time_from: timeFrom - }; - - // Relative queries (e.g. last hour) don't include an end time - if (timeTill) { - params.time_till = timeTill; - } - - return this.request('trend.get', params); - }); - - return Promise.all(promises).then(_.flatten); - } - - getTrend_30(items, time_from, time_till, value_type) { - var self = this; - var itemids = _.map(items, 'itemid'); - - var params = { - output: ["itemid", - "clock", - value_type - ], - itemids: itemids, - time_from: time_from - }; - - // Relative queries (e.g. last hour) don't include an end time - if (time_till) { - params.time_till = time_till; - } - - return self.request('trend.get', params); - } - - getITService(serviceids) { - var params = { - output: 'extend', - serviceids: serviceids - }; - return this.request('service.get', params); - } - - getSLA(serviceids, timeRange) { - let [timeFrom, timeTo] = timeRange; - var params = { - serviceids: serviceids, - intervals: [{ - from: timeFrom, - to: timeTo - }] - }; - return this.request('service.getsla', params); - } - - getTriggers(groupids, hostids, applicationids, options) { - let {showTriggers, maintenance, timeFrom, timeTo} = options; - - let params = { - output: 'extend', - groupids: groupids, - hostids: hostids, - applicationids: applicationids, - expandDescription: true, - expandData: true, - expandComment: true, - monitored: true, - skipDependent: true, - //only_true: true, - filter: { - value: 1 - }, - selectGroups: ['name'], - selectHosts: ['name', 'host', 'maintenance_status'], - selectItems: ['name', 'key_', 'lastvalue'], - selectLastEvent: 'extend', - selectTags: 'extend' - }; - - if (showTriggers) { - params.filter.value = showTriggers; - } - - if (maintenance) { - params.maintenance = true; - } - - if (timeFrom || timeTo) { - params.lastChangeSince = timeFrom; - params.lastChangeTill = timeTo; - } - - return this.request('trigger.get', params); - } - - getEvents(objectids, timeFrom, timeTo, showEvents) { - var params = { - output: 'extend', - time_from: timeFrom, - time_till: timeTo, - objectids: objectids, - select_acknowledges: 'extend', - selectHosts: 'extend', - value: showEvents - }; - - return this.request('event.get', params); - } - - getAcknowledges(eventids) { - var params = { - output: 'extend', - eventids: eventids, - preservekeys: true, - select_acknowledges: 'extend', - sortfield: 'clock', - sortorder: 'DESC' - }; - - return this.request('event.get', params) - .then(events => { - return _.filter(events, (event) => event.acknowledges.length); - }); - } - - getAlerts(itemids, timeFrom, timeTo) { - var params = { - output: 'extend', - itemids: itemids, - expandDescription: true, - expandData: true, - expandComment: true, - monitored: true, - skipDependent: true, - //only_true: true, - // filter: { - // value: 1 - // }, - selectLastEvent: 'extend' - }; - - if (timeFrom || timeTo) { - params.lastChangeSince = timeFrom; - params.lastChangeTill = timeTo; - } - - return this.request('trigger.get', params); - } - - getHostAlerts(hostids, applicationids, options) { - let {minSeverity, acknowledged, count, timeFrom, timeTo} = options; - let params = { - output: 'extend', - hostids: hostids, - min_severity: minSeverity, - filter: { value: 1 }, - expandDescription: true, - expandData: true, - expandComment: true, - monitored: true, - skipDependent: true, - selectLastEvent: 'extend', - selectGroups: 'extend', - selectHosts: ['host', 'name'] - }; - - if (count && acknowledged !== 0 && acknowledged !== 1) { - params.countOutput = true; - } - - if (applicationids && applicationids.length) { - params.applicationids = applicationids; - } - - if (timeFrom || timeTo) { - params.lastChangeSince = timeFrom; - params.lastChangeTill = timeTo; - } - - return this.request('trigger.get', params) - .then((triggers) => { - if (!count || acknowledged === 0 || acknowledged === 1) { - triggers = filterTriggersByAcknowledge(triggers, acknowledged); - if (count) { - triggers = triggers.length; - } - } - return triggers; - }); - } - } - - return ZabbixAPI; -} - -function filterTriggersByAcknowledge(triggers, acknowledged) { - if (acknowledged === 0) { - return _.filter(triggers, (trigger) => trigger.lastEvent.acknowledged === "0"); - } else if (acknowledged === 1) { - return _.filter(triggers, (trigger) => trigger.lastEvent.acknowledged === "1"); - } else { - return triggers; - } -} - -function isNotAuthorized(message) { - return ( - message === "Session terminated, re-login, please." || - message === "Not authorised." || - message === "Not authorized." - ); -} - -angular - .module('grafana.services') - .factory('zabbixAPIService', ZabbixAPIServiceFactory); diff --git a/src/datasource-zabbix/zabbixCachingProxy.service.js b/src/datasource-zabbix/zabbixCachingProxy.service.js deleted file mode 100644 index 7ccd816..0000000 --- a/src/datasource-zabbix/zabbixCachingProxy.service.js +++ /dev/null @@ -1,245 +0,0 @@ -import angular from 'angular'; -import _ from 'lodash'; - -// Use factory() instead service() for multiple datasources support. -// Each datasource instance must initialize its own cache. - -/** @ngInject */ -function ZabbixCachingProxyFactory() { - - 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); - } - } - - return ZabbixCachingProxy; -} - -angular - .module('grafana.services') - .factory('ZabbixCachingProxy', ZabbixCachingProxyFactory); - -/** - * 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;}