queryCtrl and utils module refactor. Suppress "use strict" warnings in modules.

This commit is contained in:
Alexander Zobnin
2016-03-15 20:14:23 +03:00
parent 8b37478131
commit 775c2ddac1
5 changed files with 292 additions and 302 deletions

View File

@@ -5,6 +5,7 @@
"curly": true, "curly": true,
"eqnull": true, "eqnull": true,
"strict": true, "strict": true,
"module": true,
"devel": true, "devel": true,
"eqeqeq": true, "eqeqeq": true,
"forin": false, "forin": false,

View File

@@ -17,6 +17,8 @@ module.exports = function(grunt) {
'**/*', '**/*',
'!**/datasource.js', '!**/datasource.js',
'!**/module.js', '!**/module.js',
'!**/queryCtrl.js',
'!**/utils.js',
'!**/*.scss' '!**/*.scss'
], ],
dest: 'dist/src' dest: 'dist/src'
@@ -47,8 +49,10 @@ module.exports = function(grunt) {
cwd: 'src', cwd: 'src',
expand: true, expand: true,
src: [ src: [
'**/**/datasource.js',
'**/**/module.js', '**/**/module.js',
'**/**/datasource.js',
'**/**/queryCtrl.js',
'**/**/utils.js',
], ],
dest: 'dist/src', dest: 'dist/src',
ext:'.js' ext:'.js'

View File

@@ -1,7 +1,7 @@
//import angular from 'angular'; //import angular from 'angular';
import _ from 'lodash'; import _ from 'lodash';
import {parse as dateMathParse} from 'app/core/utils/datemath'; import * as dateMath from 'app/core/utils/datemath';
import Utils from './utils'; import * as utils from './utils';
import metricFunctions from './metricFunctions'; import metricFunctions from './metricFunctions';
import {zabbixHelperSrv} from './helperFunctions'; import {zabbixHelperSrv} from './helperFunctions';
import {ZabbixAPI} from './zabbixAPI'; import {ZabbixAPI} from './zabbixAPI';
@@ -29,7 +29,7 @@ export class ZabbixAPIDatasource {
// Set cache update interval // Set cache update interval
var ttl = instanceSettings.jsonData.cacheTTL || '1h'; var ttl = instanceSettings.jsonData.cacheTTL || '1h';
this.cacheTTL = Utils.parseInterval(ttl); this.cacheTTL = utils.parseInterval(ttl);
// Initialize Zabbix API // Initialize Zabbix API
this.zabbixAPI = new ZabbixAPI(this.url, this.username, this.password, this.basicAuth, this.withCredentials); this.zabbixAPI = new ZabbixAPI(this.url, this.username, this.password, this.basicAuth, this.withCredentials);
@@ -103,9 +103,9 @@ export class ZabbixAPIDatasource {
var self = this; var self = this;
// get from & to in seconds // get from & to in seconds
var from = Math.ceil(dateMathParse(options.range.from) / 1000); var from = Math.ceil(dateMath.parse(options.range.from) / 1000);
var to = Math.ceil(dateMathParse(options.range.to) / 1000); var to = Math.ceil(dateMath.parse(options.range.to) / 1000);
var useTrendsFrom = Math.ceil(dateMathParse('now-' + this.trendsFrom) / 1000); var useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);
// Create request for each target // Create request for each target
var promises = _.map(options.targets, function(target) { var promises = _.map(options.targets, function(target) {
@@ -330,8 +330,8 @@ export class ZabbixAPIDatasource {
///////////////// /////////////////
annotationQuery(options) { annotationQuery(options) {
var from = Math.ceil(dateMathParse(options.rangeRaw.from) / 1000); var from = Math.ceil(dateMath.parse(options.rangeRaw.from) / 1000);
var to = Math.ceil(dateMathParse(options.rangeRaw.to) / 1000); var to = Math.ceil(dateMath.parse(options.rangeRaw.to) / 1000);
var annotation = options.annotation; var annotation = options.annotation;
var self = this; var self = this;
var showEvents = annotation.showOkEvents ? [0, 1] : 1; var showEvents = annotation.showOkEvents ? [0, 1] : 1;
@@ -347,9 +347,9 @@ export class ZabbixAPIDatasource {
.then(function(triggers) { .then(function(triggers) {
// Filter triggers by description // Filter triggers by description
if (Utils.isRegex(annotation.trigger)) { if (utils.isRegex(annotation.trigger)) {
triggers = _.filter(triggers, function(trigger) { triggers = _.filter(triggers, function(trigger) {
return Utils.buildRegex(annotation.trigger).test(trigger.description); return utils.buildRegex(annotation.trigger).test(trigger.description);
}); });
} else if (annotation.trigger) { } else if (annotation.trigger) {
triggers = _.filter(triggers, function(trigger) { triggers = _.filter(triggers, function(trigger) {
@@ -393,7 +393,7 @@ export class ZabbixAPIDatasource {
// Show event type (OK or Problem) // Show event type (OK or Problem)
title += Number(e.value) ? 'Problem' : 'OK'; title += Number(e.value) ? 'Problem' : 'OK';
var formatted_acknowledges = Utils.formatAcknowledges(e.acknowledges); var formatted_acknowledges = utils.formatAcknowledges(e.acknowledges);
return { return {
annotation: annotation, annotation: annotation,
time: e.clock * 1000, time: e.clock * 1000,

View File

@@ -1,242 +1,237 @@
define([ /*define([
'app/plugins/sdk', 'app/plugins/sdk',
'angular', 'angular',
'lodash', 'lodash',
'./metricFunctions', './metricFunctions',
'./utils' './utils'
], ],*/
function (sdk, angular, _, metricFunctions, utils) {
'use strict';
var ZabbixQueryCtrl = (function(_super) { import {QueryCtrl} from 'app/plugins/sdk';
import _ from 'lodash';
import * as utils from './utils';
import metricFunctions from './metricFunctions';
// ZabbixQueryCtrl constructor export class ZabbixQueryCtrl extends QueryCtrl {
function ZabbixQueryCtrl($scope, $injector, $sce, $q, templateSrv) {
// Call superclass constructor // ZabbixQueryCtrl constructor
_super.call(this, $scope, $injector); constructor($scope, $injector, $sce, $q, templateSrv) {
this.editorModes = { // Call superclass constructor
0: 'num', super($scope, $injector);
1: 'itservice',
2: 'text' this.editorModes = {
0: 'num',
1: 'itservice',
2: 'text'
};
// Map functions for bs-typeahead
this.getGroupNames = _.partial(getMetricNames, this, 'groupList');
this.getHostNames = _.partial(getMetricNames, this, 'filteredHosts');
this.getApplicationNames = _.partial(getMetricNames, this, 'filteredApplications');
this.getItemNames = _.partial(getMetricNames, this, 'filteredItems');
this.init = function() {
this.templateSrv = templateSrv;
var target = this.target;
var scopeDefaults = {
metric: {}
}; };
_.defaults(this, scopeDefaults);
// Map functions for bs-typeahead // Load default values
this.getGroupNames = _.partial(getMetricNames, this, 'groupList'); var targetDefaults = {
this.getHostNames = _.partial(getMetricNames, this, 'filteredHosts'); mode: 0,
this.getApplicationNames = _.partial(getMetricNames, this, 'filteredApplications'); group: { filter: "" },
this.getItemNames = _.partial(getMetricNames, this, 'filteredItems'); host: { filter: "" },
application: { filter: "" },
this.init = function() { item: { filter: "" },
functions: [],
this.templateSrv = templateSrv;
var target = this.target;
var scopeDefaults = {
metric: {}
};
_.defaults(this, scopeDefaults);
// Load default values
var targetDefaults = {
mode: 0,
group: { filter: "" },
host: { filter: "" },
application: { filter: "" },
item: { filter: "" },
functions: [],
};
_.defaults(target, targetDefaults);
// Create function instances from saved JSON
target.functions = _.map(target.functions, function(func) {
return metricFunctions.createFuncInstance(func.def, func.params);
});
if (target.mode === 0 ||
target.mode === 2) {
this.downsampleFunctionList = [
{name: "avg", value: "avg"},
{name: "min", value: "min"},
{name: "max", value: "max"}
];
// Set avg by default
if (!target.downsampleFunction) {
target.downsampleFunction = this.downsampleFunctionList[0];
}
this.initFilters();
}
else if (target.mode === 1) {
this.slaPropertyList = [
{name: "Status", property: "status"},
{name: "SLA", property: "sla"},
{name: "OK time", property: "okTime"},
{name: "Problem time", property: "problemTime"},
{name: "Down time", property: "downtimeTime"}
];
this.itserviceList = [{name: "test"}];
this.updateITServiceList();
}
}; };
_.defaults(target, targetDefaults);
this.init(); // Create function instances from saved JSON
} target.functions = _.map(target.functions, function(func) {
return metricFunctions.createFuncInstance(func.def, func.params);
ZabbixQueryCtrl.templateUrl = 'partials/query.editor.html';
ZabbixQueryCtrl.prototype = Object.create(_super.prototype);
ZabbixQueryCtrl.prototype.constructor = ZabbixQueryCtrl;
var p = ZabbixQueryCtrl.prototype;
p.initFilters = function () {
this.filterGroups();
this.filterHosts();
this.filterApplications();
this.filterItems();
};
p.filterHosts = function () {
var self = this;
var groupFilter = this.templateSrv.replace(this.target.group.filter);
this.datasource.queryProcessor.filterHosts(groupFilter).then(function(hosts) {
self.metric.filteredHosts = hosts;
}); });
};
p.filterGroups = function() { if (target.mode === 0 ||
var self = this; target.mode === 2) {
this.datasource.queryProcessor.filterGroups().then(function(groups) {
self.metric.groupList = groups;
});
};
p.filterApplications = function () { this.downsampleFunctionList = [
var self = this; {name: "avg", value: "avg"},
var groupFilter = this.templateSrv.replace(this.target.group.filter); {name: "min", value: "min"},
var hostFilter = this.templateSrv.replace(this.target.host.filter); {name: "max", value: "max"}
this.datasource.queryProcessor.filterApplications(groupFilter, hostFilter) ];
.then(function(apps) {
self.metric.filteredApplications = apps;
});
};
p.filterItems = function () { // Set avg by default
var self = this; if (!target.downsampleFunction) {
var item_type = this.editorModes[this.target.mode]; target.downsampleFunction = this.downsampleFunctionList[0];
var groupFilter = this.templateSrv.replace(this.target.group.filter); }
var hostFilter = this.templateSrv.replace(this.target.host.filter);
var appFilter = this.templateSrv.replace(this.target.application.filter);
this.datasource.queryProcessor.filterItems(groupFilter, hostFilter, appFilter,
item_type, this.target.showDisabledItems).then(function(items) {
self.metric.filteredItems = items;
});
};
p.onTargetPartChange = function (targetPart) { this.initFilters();
var regexStyle = {'color': '#CCA300'}; }
targetPart.isRegex = utils.isRegex(targetPart.filter); else if (target.mode === 1) {
targetPart.style = targetPart.isRegex ? regexStyle : {}; this.slaPropertyList = [
}; {name: "Status", property: "status"},
{name: "SLA", property: "sla"},
p.onTargetBlur = function() { {name: "OK time", property: "okTime"},
this.initFilters(); {name: "Problem time", property: "problemTime"},
this.parseTarget(); {name: "Down time", property: "downtimeTime"}
this.panelCtrl.refresh(); ];
}; this.itserviceList = [{name: "test"}];
this.updateITServiceList();
p.parseTarget = function() {
// Parse target
};
// Validate target and set validation info
p.validateTarget = function () {};
p.targetChanged = function() {
this.panelCtrl.refresh();
};
p.addFunction = function(funcDef) {
var newFunc = metricFunctions.createFuncInstance(funcDef);
newFunc.added = true;
this.target.functions.push(newFunc);
this.moveAliasFuncLast();
if (newFunc.params.length && newFunc.added ||
newFunc.def.params.length === 0) {
this.targetChanged();
} }
}; };
p.removeFunction = function(func) { this.init();
this.target.functions = _.without(this.target.functions, func);
this.targetChanged();
};
p.moveAliasFuncLast = function() {
var aliasFunc = _.find(this.target.functions, function(func) {
return func.def.name === 'alias' ||
func.def.name === 'aliasByNode' ||
func.def.name === 'aliasByMetric';
});
if (aliasFunc) {
this.target.functions = _.without(this.target.functions, aliasFunc);
this.target.functions.push(aliasFunc);
}
};
/**
* Switch query editor to specified mode.
* Modes:
* 0 - items
* 1 - IT services
* 2 - Text metrics
*/
p.switchEditorMode = function (mode) {
this.target.mode = mode;
this.init();
};
/////////////////
// IT Services //
/////////////////
/**
* Update list of IT services
*/
p.updateITServiceList = function () {
var self = this;
this.datasource.zabbixAPI.getITService().then(function (iteservices) {
self.itserviceList = [];
self.itserviceList = self.itserviceList.concat(iteservices);
});
};
/**
* Call when IT service is selected.
*/
p.selectITService = function () {
if (!_.isEqual(this.oldTarget, this.target) && _.isEmpty(this.target.errors)) {
this.oldTarget = angular.copy(this.target);
this.panelCtrl.refresh();
}
};
return ZabbixQueryCtrl;
})(sdk.QueryCtrl);
return ZabbixQueryCtrl;
// Get list of metric names for bs-typeahead directive
function getMetricNames(scope, metricList) {
return _.uniq(_.map(scope.metric[metricList], 'name'));
} }
}); initFilters() {
this.filterGroups();
this.filterHosts();
this.filterApplications();
this.filterItems();
}
filterHosts() {
var self = this;
var groupFilter = this.templateSrv.replace(this.target.group.filter);
this.datasource.queryProcessor.filterHosts(groupFilter).then(function(hosts) {
self.metric.filteredHosts = hosts;
});
}
filterGroups() {
var self = this;
this.datasource.queryProcessor.filterGroups().then(function(groups) {
self.metric.groupList = groups;
});
}
filterApplications() {
var self = this;
var groupFilter = this.templateSrv.replace(this.target.group.filter);
var hostFilter = this.templateSrv.replace(this.target.host.filter);
this.datasource.queryProcessor.filterApplications(groupFilter, hostFilter)
.then(function(apps) {
self.metric.filteredApplications = apps;
});
}
filterItems() {
var self = this;
var item_type = this.editorModes[this.target.mode];
var groupFilter = this.templateSrv.replace(this.target.group.filter);
var hostFilter = this.templateSrv.replace(this.target.host.filter);
var appFilter = this.templateSrv.replace(this.target.application.filter);
this.datasource.queryProcessor.filterItems(groupFilter, hostFilter, appFilter,
item_type, this.target.showDisabledItems).then(function(items) {
self.metric.filteredItems = items;
});
}
onTargetPartChange(targetPart) {
var regexStyle = {'color': '#CCA300'};
targetPart.isRegex = utils.isRegex(targetPart.filter);
targetPart.style = targetPart.isRegex ? regexStyle : {};
}
onTargetBlur() {
this.initFilters();
this.parseTarget();
this.panelCtrl.refresh();
}
parseTarget() {
// Parse target
}
// Validate target and set validation info
validateTarget() {
// validate
}
targetChanged() {
this.panelCtrl.refresh();
}
addFunction(funcDef) {
var newFunc = metricFunctions.createFuncInstance(funcDef);
newFunc.added = true;
this.target.functions.push(newFunc);
this.moveAliasFuncLast();
if (newFunc.params.length && newFunc.added ||
newFunc.def.params.length === 0) {
this.targetChanged();
}
}
removeFunction(func) {
this.target.functions = _.without(this.target.functions, func);
this.targetChanged();
}
moveAliasFuncLast() {
var aliasFunc = _.find(this.target.functions, function(func) {
return func.def.name === 'alias' ||
func.def.name === 'aliasByNode' ||
func.def.name === 'aliasByMetric';
});
if (aliasFunc) {
this.target.functions = _.without(this.target.functions, aliasFunc);
this.target.functions.push(aliasFunc);
}
}
/**
* Switch query editor to specified mode.
* Modes:
* 0 - items
* 1 - IT services
* 2 - Text metrics
*/
switchEditorMode(mode) {
this.target.mode = mode;
this.init();
}
/////////////////
// IT Services //
/////////////////
/**
* Update list of IT services
*/
updateITServiceList() {
var self = this;
this.datasource.zabbixAPI.getITService().then(function (iteservices) {
self.itserviceList = [];
self.itserviceList = self.itserviceList.concat(iteservices);
});
}
/**
* Call when IT service is selected.
*/
selectITService() {
if (!_.isEqual(this.oldTarget, this.target) && _.isEmpty(this.target.errors)) {
this.oldTarget = angular.copy(this.target);
this.panelCtrl.refresh();
}
}
}
// Set templateUrl as static property
ZabbixQueryCtrl.templateUrl = 'partials/query.editor.html';
// Get list of metric names for bs-typeahead directive
function getMetricNames(scope, metricList) {
return _.uniq(_.map(scope.metric[metricList], 'name'));
}

View File

@@ -1,77 +1,67 @@
define([ import _ from 'lodash';
'lodash', import moment from 'moment';
'moment'
],
function (_, moment) {
'use strict';
function Utils() {
/** /**
* Expand Zabbix item name * Expand Zabbix item name
* *
* @param {string} name item name, ie "CPU $2 time" * @param {string} name item name, ie "CPU $2 time"
* @param {string} key item key, ie system.cpu.util[,system,avg1] * @param {string} key item key, ie system.cpu.util[,system,avg1]
* @return {string} expanded name, ie "CPU system time" * @return {string} expanded name, ie "CPU system time"
*/ */
this.expandItemName = function(name, key) { export function expandItemName(name, key) {
// extract params from key: // extract params from key:
// "system.cpu.util[,system,avg1]" --> ["", "system", "avg1"] // "system.cpu.util[,system,avg1]" --> ["", "system", "avg1"]
var key_params = key.substring(key.indexOf('[') + 1, key.lastIndexOf(']')).split(','); var key_params = key.substring(key.indexOf('[') + 1, key.lastIndexOf(']')).split(',');
// replace item parameters
for (var i = key_params.length; i >= 1; i--) {
name = name.replace('$' + i, key_params[i - 1]);
}
return name;
};
// Pattern for testing regex
var regexPattern = /^\/(.*)\/([gmi]*)$/m;
this.isRegex = function (str) {
return regexPattern.test(str);
};
this.buildRegex = function (str) {
var matches = str.match(regexPattern);
var pattern = matches[1];
var flags = matches[2] !== "" ? matches[2] : undefined;
return new RegExp(pattern, flags);
};
this.parseInterval = function(interval) {
var intervalPattern = /(^[\d]+)(y|M|w|d|h|m|s)/g;
var momentInterval = intervalPattern.exec(interval);
return moment.duration(Number(momentInterval[1]), momentInterval[2]).valueOf();
};
/**
* Format acknowledges.
*
* @param {array} acknowledges array of Zabbix acknowledge objects
* @return {string} HTML-formatted table
*/
this.formatAcknowledges = function(acknowledges) {
if (acknowledges.length) {
var formatted_acknowledges = '<br><br>Acknowledges:<br><table><tr><td><b>Time</b></td>'
+ '<td><b>User</b></td><td><b>Comments</b></td></tr>';
_.each(_.map(acknowledges, function (ack) {
var timestamp = moment.unix(ack.clock);
return '<tr><td><i>' + timestamp.format("DD MMM YYYY HH:mm:ss") + '</i></td><td>' + ack.alias
+ ' (' + ack.name + ' ' + ack.surname + ')' + '</td><td>' + ack.message + '</td></tr>';
}), function (ack) {
formatted_acknowledges = formatted_acknowledges.concat(ack);
});
formatted_acknowledges = formatted_acknowledges.concat('</table>');
return formatted_acknowledges;
} else {
return '';
}
};
// replace item parameters
for (var i = key_params.length; i >= 1; i--) {
name = name.replace('$' + i, key_params[i - 1]);
} }
return name;
}
return new Utils(); // Pattern for testing regex
}); var regexPattern = /^\/(.*)\/([gmi]*)$/m;
export function isRegex(str) {
return regexPattern.test(str);
}
export function buildRegex(str) {
var matches = str.match(regexPattern);
var pattern = matches[1];
var flags = matches[2] !== "" ? matches[2] : undefined;
return new RegExp(pattern, flags);
}
export function parseInterval(interval) {
var intervalPattern = /(^[\d]+)(y|M|w|d|h|m|s)/g;
var momentInterval = intervalPattern.exec(interval);
return moment.duration(Number(momentInterval[1]), momentInterval[2]).valueOf();
}
/**
* Format acknowledges.
*
* @param {array} acknowledges array of Zabbix acknowledge objects
* @return {string} HTML-formatted table
*/
export function formatAcknowledges(acknowledges) {
if (acknowledges.length) {
var formatted_acknowledges = '<br><br>Acknowledges:<br><table><tr><td><b>Time</b></td>'
+ '<td><b>User</b></td><td><b>Comments</b></td></tr>';
_.each(_.map(acknowledges, function (ack) {
var timestamp = moment.unix(ack.clock);
return '<tr><td><i>' + timestamp.format("DD MMM YYYY HH:mm:ss") + '</i></td><td>' + ack.alias
+ ' (' + ack.name + ' ' + ack.surname + ')' + '</td><td>' + ack.message + '</td></tr>';
}), function (ack) {
formatted_acknowledges = formatted_acknowledges.concat(ack);
});
formatted_acknowledges = formatted_acknowledges.concat('</table>');
return formatted_acknowledges;
} else {
return '';
}
}