Skip to content

Commit

Permalink
Merge branch 'release-2.0.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
alexanderzobnin committed Jul 23, 2015
2 parents 2f1d3c3 + 0df92cf commit ab5247c
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 53 deletions.
58 changes: 46 additions & 12 deletions zabbix/datasource.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
'use strict';
define([
'angular',
'lodash',
Expand All @@ -8,7 +7,7 @@ define([
'./queryCtrl'
],
function (angular, _, kbn) {
//'use strict';
'use strict';

var module = angular.module('grafana.services');

Expand All @@ -26,21 +25,56 @@ function (angular, _, kbn) {
this.basicAuth = datasource.basicAuth;
this.withCredentials = datasource.withCredentials;

// TODO: fix passing username and password from config.html
this.username = datasource.meta.username;
this.password = datasource.meta.password;

// Use trends instead history since specified time
this.trends = datasource.meta.trends;
this.trendsFrom = datasource.meta.trendsFrom || '7d';

// Limit metrics per panel for templated request
this.limitmetrics = datasource.meta.limitmetrics || 100;
if (datasource.jsonData) {
this.username = datasource.jsonData.username;
this.password = datasource.jsonData.password;

// Use trends instead history since specified time
this.trends = datasource.jsonData.trends;
this.trendsFrom = datasource.jsonData.trendsFrom || '7d';

// Limit metrics per panel for templated request
this.limitmetrics = datasource.jsonData.limitMetrics || 100;
} else {
// DEPRECATED. Loads settings from plugin.json file.
// For backward compatibility only.
this.username = datasource.meta.username;
this.password = datasource.meta.password;
this.trends = datasource.meta.trends;
this.trendsFrom = datasource.meta.trendsFrom || '7d';
this.limitmetrics = datasource.meta.limitmetrics || 100;
}

// Initialize Zabbix API
this.zabbixAPI = new ZabbixAPI(this.url, this.username, this.password, this.basicAuth, this.withCredentials);
}

/**
* Test connection to Zabbix API
*
* @return {object} Connection status and Zabbix API version
*/
ZabbixAPIDatasource.prototype.testDatasource = function() {
var self = this;
return this.zabbixAPI.getZabbixAPIVersion().then(function (apiVersion) {
return self.zabbixAPI.performZabbixAPILogin().then(function (auth) {
if (auth) {
return {
status: "success",
title: "Success",
message: "Zabbix API version: " + apiVersion
};
} else {
return {
status: "error",
title: "Invalid user name or password",
message: "Zabbix API version: " + apiVersion
};
}
});
});
};

/**
* Calls for each panel in dashboard.
*
Expand Down
36 changes: 32 additions & 4 deletions zabbix/partials/config.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,44 @@ <h5>Zabbix API details</h5>
User
</li>
<li>
<input type="text" class="tight-form-input input-large" ng-model='current.jsonData.zabbixUser' placeholder=""></input>
<input type="text" class="tight-form-input input-large" ng-model='current.jsonData.username' placeholder=""></input>
</li>
<li class="tight-form-item">
Password
</li>
<li>
<input type="password" class="tight-form-input input-large" ng-model='current.jsonData.zabbixPassword' placeholder=""></input>
<input type="password" class="tight-form-input input-large" ng-model='current.jsonData.password' placeholder=""></input>
</li>
</ul>
<div class="clearfix"></div>
</div>
<div class="tight-form">
<ul class="tight-form-list">
<li class="tight-form-item" style="width: 80px">
Trends
</li>
<li class="tight-form-item">
Enable&nbsp;
<input class="cr1" id="current.jsonData.trends" type="checkbox" ng-model="current.jsonData.trends" ng-checked="current.jsonData.trends">
<label for="current.jsonData.trends" class="cr1"></label>
</li>
<li class="tight-form-item" ng-if="current.jsonData.trends">
Use trends from
</li>
<li ng-if="current.jsonData.trends">
<input type="text" class="tight-form-input input-small" ng-model='current.basicAuthUser' placeholder="7d"></input>
</li>
</ul>
<div class="clearfix"></div>
</div>
<div class="tight-form last">
<ul class="tight-form-list">
<li class="tight-form-item" style="width: 80px">
Metrics limit
</li>
<li>
<input type="text" class="tight-form-input input-small" ng-model='current.jsonData.limitMetrics' placeholder="100"></input>
</li>
</ul>
<div class="clearfix"></div>
</div>


66 changes: 34 additions & 32 deletions zabbix/queryCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ function (angular, _) {
$scope.init = function() {
$scope.targetLetters = targetLetters;
$scope.metric = {
hostGroupList: ["Loading..."],
hostList: ["Loading..."],
applicationList: ["Loading..."],
itemList: ["Loading..."]
hostGroupList: [],
hostList: [{name: '*', visible_name: 'All'}],
applicationList: [{name: '*', visible_name: 'All'}],
itemList: [{name: 'All'}]
};

// Update host group, host, application and item lists
Expand Down Expand Up @@ -120,10 +120,9 @@ function (angular, _) {
* Update list of host groups
*/
$scope.updateGroupList = function() {
$scope.metric.groupList = [{name: '*', visible_name: 'All'}];
addTemplatedVariables($scope.metric.groupList);

$scope.datasource.zabbixAPI.performHostGroupSuggestQuery().then(function (groups) {
$scope.metric.groupList = [{name: '*', visible_name: 'All'}];
addTemplatedVariables($scope.metric.groupList);
$scope.metric.groupList = $scope.metric.groupList.concat(groups);
});
};
Expand All @@ -132,51 +131,54 @@ function (angular, _) {
* Update list of hosts
*/
$scope.updateHostList = function() {
$scope.metric.hostList = [{name: '*', visible_name: 'All'}];
addTemplatedVariables($scope.metric.hostList);

var groups = $scope.target.group ? zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.group.name)) : undefined;
$scope.datasource.zabbixAPI.hostFindQuery(groups).then(function (hosts) {
$scope.metric.hostList = $scope.metric.hostList.concat(hosts);
});
if (groups) {
$scope.datasource.zabbixAPI.hostFindQuery(groups).then(function (hosts) {
$scope.metric.hostList = [{name: '*', visible_name: 'All'}];
addTemplatedVariables($scope.metric.hostList);
$scope.metric.hostList = $scope.metric.hostList.concat(hosts);
});
}
};

/**
* Update list of host applications
*/
$scope.updateAppList = function() {
$scope.metric.applicationList = [{name: '*', visible_name: 'All'}];
addTemplatedVariables($scope.metric.applicationList);

var groups = $scope.target.group ? zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.group.name)) : undefined;
var hosts = $scope.target.host ? zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.host.name)) : undefined;
$scope.datasource.zabbixAPI.appFindQuery(hosts, groups).then(function (apps) {
apps = _.map(_.uniq(_.map(apps, 'name')), function (appname) {
return {name: appname};
if (groups && hosts) {
$scope.datasource.zabbixAPI.appFindQuery(hosts, groups).then(function (apps) {
apps = _.map(_.uniq(_.map(apps, 'name')), function (appname) {
return {name: appname};
});
$scope.metric.applicationList = [{name: '*', visible_name: 'All'}];
addTemplatedVariables($scope.metric.applicationList);
$scope.metric.applicationList = $scope.metric.applicationList.concat(apps);
});
$scope.metric.applicationList = $scope.metric.applicationList.concat(apps);
});
}
};

/**
* Update list of items
*/
$scope.updateItemList = function() {
$scope.metric.itemList = [{name: 'All'}];
addTemplatedVariables($scope.metric.itemList);

var groups = $scope.target.group ? zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.group.name)) : undefined;
var hosts = $scope.target.host ? zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.host.name)) : undefined;
var apps = $scope.target.application ? zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.application.name)) : undefined;
$scope.datasource.zabbixAPI.itemFindQuery(groups, hosts, apps).then(function (items) {
// Show only unique item names
var uniq_items = _.map(_.uniq(items, function (item) {
return zabbixHelperSrv.expandItemName(item);
}), function (item) {
return {name: zabbixHelperSrv.expandItemName(item)};
if (groups && hosts && apps) {
$scope.datasource.zabbixAPI.itemFindQuery(groups, hosts, apps).then(function (items) {
// Show only unique item names
var uniq_items = _.map(_.uniq(items, function (item) {
return zabbixHelperSrv.expandItemName(item);
}), function (item) {
return {name: zabbixHelperSrv.expandItemName(item)};
});
$scope.metric.itemList = [{name: 'All'}];
addTemplatedVariables($scope.metric.itemList);
$scope.metric.itemList = $scope.metric.itemList.concat(uniq_items);
});
$scope.metric.itemList = $scope.metric.itemList.concat(uniq_items);
});
}
};

/**
Expand Down
46 changes: 41 additions & 5 deletions zabbix/zabbixAPIWrapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,42 @@ function (angular, _) {
// API method wrappers //
/////////////////////////

/**
* Request version of the Zabbix API.
*
* @return {string} Zabbix API version
*/
p.getZabbixAPIVersion = function() {
var options = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
url: this.url,
data: {
jsonrpc: '2.0',
method: 'apiinfo.version',
params: [],
id: 1
}
};

if (this.basicAuth || this.withCredentials) {
options.withCredentials = true;
}
if (this.basicAuth) {
options.headers = options.headers || {};
options.headers.Authorization = this.basicAuth;
}

return backendSrv.datasourceRequest(options).then(function (result) {
if (!result.data) {
return null;
}
return result.data.result;
});
};

/**
* Perform history query from Zabbix API
*
Expand Down Expand Up @@ -303,7 +339,7 @@ function (angular, _) {
var params = {
output: ['name']
};
if (group[0] !== '*') {
if (group && group[0] !== '*') {
params.filter = {
name: group
};
Expand Down Expand Up @@ -338,7 +374,7 @@ function (angular, _) {
var params = {
output: ['host', 'name']
};
if (hostnames[0] !== '*') {
if (hostnames && hostnames[0] !== '*') {
params.filter = {
name: hostnames
};
Expand All @@ -356,7 +392,7 @@ function (angular, _) {
var params = {
output: ['name']
};
if (application[0] !== '*') {
if (application && application[0] !== '*') {
params.filter = {
name: application
};
Expand Down Expand Up @@ -385,7 +421,7 @@ function (angular, _) {
promises.push(this.getGroupByName(groups));
}
// Get applicationids from names
if (apps) {
if (apps && apps[0] !== '*') {
promises.push(this.getAppByName(apps));
}

Expand All @@ -405,7 +441,7 @@ function (angular, _) {
return object.hostid;
}), 'hostid');
}
if (apps) {
if (apps && apps[0] !== '*') {
applicationids = _.map(_.filter(results, function (object) {
return object.applicationid;
}), 'applicationid');
Expand Down

0 comments on commit ab5247c

Please sign in to comment.