Merge branch 'akotynski-threshold_regex'

This commit is contained in:
Alexander Zobnin
2017-10-24 11:40:19 +03:00
12 changed files with 348 additions and 26 deletions

4
.travis.yml Normal file
View File

@@ -0,0 +1,4 @@
language: node_js
node_js:
- "6"
script: npm run build

View File

@@ -112,7 +112,7 @@ System.register(['lodash', 'app/core/utils/datemath', './utils', './migrations',
} }
function getTriggerThreshold(expression) { function getTriggerThreshold(expression) {
var thresholdPattern = /.*[<>]([\d\.]+)/; var thresholdPattern = /.*[<>=]{1,2}([\d\.]+)/;
var finded_thresholds = expression.match(thresholdPattern); var finded_thresholds = expression.match(thresholdPattern);
if (finded_thresholds && finded_thresholds.length >= 2) { if (finded_thresholds && finded_thresholds.length >= 2) {
var threshold = finded_thresholds[1]; var threshold = finded_thresholds[1];

File diff suppressed because one or more lines are too long

View File

@@ -11,6 +11,7 @@ describe('ZabbixDatasource', () => {
beforeEach(() => { beforeEach(() => {
ctx.instanceSettings = { ctx.instanceSettings = {
jsonData: { jsonData: {
alerting: true,
username: 'zabbix', username: 'zabbix',
password: 'zabbix', password: 'zabbix',
trends: true, trends: true,
@@ -28,12 +29,12 @@ describe('ZabbixDatasource', () => {
ctx.zabbix = () => {}; ctx.zabbix = () => {};
ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix); ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix);
ctx.ds.alertQuery = () => Q.when([]);
}); });
describe('When querying data', () => { describe('When querying data', () => {
beforeEach(() => { beforeEach(() => {
ctx.ds.replaceTemplateVars = (str) => str; ctx.ds.replaceTemplateVars = (str) => str;
ctx.ds.alertQuery = () => Q.when([]);
}); });
ctx.options = { ctx.options = {
@@ -147,7 +148,7 @@ describe('ZabbixDatasource', () => {
describe('When invoking metricFindQuery()', () => { describe('When invoking metricFindQuery()', () => {
beforeEach(() => { beforeEach(() => {
ctx.ds.replaceTemplateVars = (str) => str; ctx.ds.replaceTemplateVars = (str) => str;
ctx.ds.zabbix = { ctx.ds.zabbix = {
getGroups: () => Q.when([]), getGroups: () => Q.when([]),
getHosts: () => Q.when([]), getHosts: () => Q.when([]),
getApps: () => Q.when([]), getApps: () => Q.when([]),
@@ -234,4 +235,106 @@ describe('ZabbixDatasource', () => {
}); });
}); });
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.length).to.equal(1);
expect(resp.thresholds[0]).to.equal(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).to.equal(1);
expect(resp.thresholds[0]).to.equal(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).to.equal(1);
expect(resp.thresholds[0]).to.equal(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).to.equal(1);
expect(resp.thresholds[0]).to.equal(50);
return resp;
});
});
});
}); });

View File

@@ -2,7 +2,7 @@
/* globals global: false */ /* globals global: false */
import prunk from 'prunk'; import prunk from 'prunk';
import {jsdom} from 'jsdom'; import {JSDOM} from 'jsdom';
import chai from 'chai'; import chai from 'chai';
// import sinon from 'sinon'; // import sinon from 'sinon';
import sinonChai from 'sinon-chai'; import sinonChai from 'sinon-chai';
@@ -36,11 +36,11 @@ prunk.mock('app/core/table_model', {});
prunk.mock('angular', angularMocks); prunk.mock('angular', angularMocks);
prunk.mock('jquery', 'module not found'); prunk.mock('jquery', 'module not found');
// Setup jsdom
// Required for loading angularjs // Required for loading angularjs
global.document = jsdom('<html><head><script></script></head><body></body></html>'); let dom = new JSDOM('<html><head><script></script></head><body></body></html>');
global.window = global.document.parentWindow; // Setup jsdom
global.navigator = window.navigator = {}; global.window = dom.window;
global.document = global.window.document;
global.Node = window.Node; global.Node = window.Node;
// Setup Chai // Setup Chai

View File

@@ -840,7 +840,7 @@ function filterEnabledTargets(targets) {
} }
function getTriggerThreshold(expression) { function getTriggerThreshold(expression) {
var thresholdPattern = /.*[<>]([\d\.]+)/; var thresholdPattern = /.*[<>=]{1,2}([\d\.]+)/;
var finded_thresholds = expression.match(thresholdPattern); var finded_thresholds = expression.match(thresholdPattern);
if (finded_thresholds && finded_thresholds.length >= 2) { if (finded_thresholds && finded_thresholds.length >= 2) {
var threshold = finded_thresholds[1]; var threshold = finded_thresholds[1];

View File

@@ -25,6 +25,7 @@ describe('ZabbixDatasource', function () {
beforeEach(function () { beforeEach(function () {
ctx.instanceSettings = { ctx.instanceSettings = {
jsonData: { jsonData: {
alerting: true,
username: 'zabbix', username: 'zabbix',
password: 'zabbix', password: 'zabbix',
trends: true, trends: true,
@@ -42,9 +43,6 @@ describe('ZabbixDatasource', function () {
ctx.zabbix = function () {}; ctx.zabbix = function () {};
ctx.ds = new _module.Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix); ctx.ds = new _module.Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix);
ctx.ds.alertQuery = function () {
return _q2.default.when([]);
};
}); });
describe('When querying data', function () { describe('When querying data', function () {
@@ -52,6 +50,9 @@ describe('ZabbixDatasource', function () {
ctx.ds.replaceTemplateVars = function (str) { ctx.ds.replaceTemplateVars = function (str) {
return str; return str;
}; };
ctx.ds.alertQuery = function () {
return _q2.default.when([]);
};
}); });
ctx.options = { ctx.options = {
@@ -323,4 +324,115 @@ describe('ZabbixDatasource', function () {
done(); 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.length).to.equal(1);
expect(resp.thresholds[0]).to.equal(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).to.equal(1);
expect(resp.thresholds[0]).to.equal(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).to.equal(1);
expect(resp.thresholds[0]).to.equal(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).to.equal(1);
expect(resp.thresholds[0]).to.equal(50);
return resp;
});
});
});
}); });

View File

@@ -53,11 +53,11 @@ _prunk2.default.mock('app/core/table_model', {});
_prunk2.default.mock('angular', angularMocks); _prunk2.default.mock('angular', angularMocks);
_prunk2.default.mock('jquery', 'module not found'); _prunk2.default.mock('jquery', 'module not found');
// Setup jsdom
// Required for loading angularjs // Required for loading angularjs
global.document = (0, _jsdom.jsdom)('<html><head><script></script></head><body></body></html>'); var dom = new _jsdom.JSDOM('<html><head><script></script></head><body></body></html>');
global.window = global.document.parentWindow; // Setup jsdom
global.navigator = window.navigator = {}; global.window = dom.window;
global.document = global.window.document;
global.Node = window.Node; global.Node = window.Node;
// Setup Chai // Setup Chai

View File

@@ -37,7 +37,7 @@
"grunt-sass": "^1.1.0", "grunt-sass": "^1.1.0",
"grunt-systemjs-builder": "^0.2.5", "grunt-systemjs-builder": "^0.2.5",
"grunt": "~0.4.5", "grunt": "~0.4.5",
"jsdom": "~3.1.2", "jsdom": "~11.3.0",
"jshint-stylish": "^2.1.0", "jshint-stylish": "^2.1.0",
"load-grunt-tasks": "~3.2.0", "load-grunt-tasks": "~3.2.0",
"mocha": "^2.4.5", "mocha": "^2.4.5",

View File

@@ -730,7 +730,7 @@ function filterEnabledTargets(targets) {
} }
function getTriggerThreshold(expression) { function getTriggerThreshold(expression) {
let thresholdPattern = /.*[<>]([\d\.]+)/; let thresholdPattern = /.*[<>=]{1,2}([\d\.]+)/;
let finded_thresholds = expression.match(thresholdPattern); let finded_thresholds = expression.match(thresholdPattern);
if (finded_thresholds && finded_thresholds.length >= 2) { if (finded_thresholds && finded_thresholds.length >= 2) {
let threshold = finded_thresholds[1]; let threshold = finded_thresholds[1];

View File

@@ -11,6 +11,7 @@ describe('ZabbixDatasource', () => {
beforeEach(() => { beforeEach(() => {
ctx.instanceSettings = { ctx.instanceSettings = {
jsonData: { jsonData: {
alerting: true,
username: 'zabbix', username: 'zabbix',
password: 'zabbix', password: 'zabbix',
trends: true, trends: true,
@@ -28,12 +29,12 @@ describe('ZabbixDatasource', () => {
ctx.zabbix = () => {}; ctx.zabbix = () => {};
ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix); ctx.ds = new Datasource(ctx.instanceSettings, ctx.templateSrv, ctx.alertSrv, ctx.dashboardSrv, ctx.zabbixAlertingSrv, ctx.zabbix);
ctx.ds.alertQuery = () => Q.when([]);
}); });
describe('When querying data', () => { describe('When querying data', () => {
beforeEach(() => { beforeEach(() => {
ctx.ds.replaceTemplateVars = (str) => str; ctx.ds.replaceTemplateVars = (str) => str;
ctx.ds.alertQuery = () => Q.when([]);
}); });
ctx.options = { ctx.options = {
@@ -147,7 +148,7 @@ describe('ZabbixDatasource', () => {
describe('When invoking metricFindQuery()', () => { describe('When invoking metricFindQuery()', () => {
beforeEach(() => { beforeEach(() => {
ctx.ds.replaceTemplateVars = (str) => str; ctx.ds.replaceTemplateVars = (str) => str;
ctx.ds.zabbix = { ctx.ds.zabbix = {
getGroups: () => Q.when([]), getGroups: () => Q.when([]),
getHosts: () => Q.when([]), getHosts: () => Q.when([]),
getApps: () => Q.when([]), getApps: () => Q.when([]),
@@ -234,4 +235,106 @@ describe('ZabbixDatasource', () => {
}); });
}); });
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.length).to.equal(1);
expect(resp.thresholds[0]).to.equal(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).to.equal(1);
expect(resp.thresholds[0]).to.equal(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).to.equal(1);
expect(resp.thresholds[0]).to.equal(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).to.equal(1);
expect(resp.thresholds[0]).to.equal(50);
return resp;
});
});
});
}); });

View File

@@ -2,7 +2,7 @@
/* globals global: false */ /* globals global: false */
import prunk from 'prunk'; import prunk from 'prunk';
import {jsdom} from 'jsdom'; import {JSDOM} from 'jsdom';
import chai from 'chai'; import chai from 'chai';
// import sinon from 'sinon'; // import sinon from 'sinon';
import sinonChai from 'sinon-chai'; import sinonChai from 'sinon-chai';
@@ -36,11 +36,11 @@ prunk.mock('app/core/table_model', {});
prunk.mock('angular', angularMocks); prunk.mock('angular', angularMocks);
prunk.mock('jquery', 'module not found'); prunk.mock('jquery', 'module not found');
// Setup jsdom
// Required for loading angularjs // Required for loading angularjs
global.document = jsdom('<html><head><script></script></head><body></body></html>'); let dom = new JSDOM('<html><head><script></script></head><body></body></html>');
global.window = global.document.parentWindow; // Setup jsdom
global.navigator = window.navigator = {}; global.window = dom.window;
global.document = global.window.document;
global.Node = window.Node; global.Node = window.Node;
// Setup Chai // Setup Chai