Skip to content

Commit

Permalink
Able to use both time and range for trends config, #364
Browse files Browse the repository at this point in the history
  • Loading branch information
alexanderzobnin committed Apr 18, 2017
1 parent e83a1bc commit e241a5f
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 80 deletions.
48 changes: 29 additions & 19 deletions dist/datasource-zabbix/datasource.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/datasource-zabbix/datasource.js.map

Large diffs are not rendered by default.

55 changes: 35 additions & 20 deletions dist/datasource-zabbix/partials/config.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,51 +27,66 @@ <h3 class="page-heading">Zabbix API details</h3>
</input>
</div>

<gf-form-switch class="gf-form" label-class="width-7"
label="Trends"
checked="ctrl.current.jsonData.trends"
switch-class="max-width-5">
</gf-form-switch>
<div class="gf-form-inline">
<div class="gf-form">
<label class="gf-form-label width-7">Trends</label>
</div>
<gf-form-switch class="gf-form" label-class="width-5"
label="Enable"
checked="ctrl.current.jsonData.trends"
switch-class="max-width-6">
</gf-form-switch>
<div class="gf-form" ng-if="ctrl.current.jsonData.trends">
<span class="gf-form-label width-7">
Use from
After
<info-popover mode="right-normal">
Time after which trends will be used.
Best practice is to set this value to your history storage period (7d, 30d, etc).
</info-popover>
</span>
<input class="gf-form-input max-width-5"
type="text"
ng-model='ctrl.current.jsonData.trendsFrom'
placeholder="7d">
type="text"
ng-model='ctrl.current.jsonData.trendsFrom'
placeholder="7d">
</input>
</div>
<div class="gf-form" ng-if="ctrl.current.jsonData.trends">
<span class="gf-form-label width-7">
Range
<info-popover mode="right-normal">
Time range width after which trends will be used instead of history.
It's better to set this value in range of 4 to 7 days to prevent loading large amount of history data.
</info-popover>
</span>
<input class="gf-form-input max-width-5" type="text" ng-model='ctrl.current.jsonData.trendsRange' placeholder="4d">
</input>
</div>
</div>

<div class="gf-form">
<span class="gf-form-label width-12">
Cache update interval
Cache TTL
<info-popover mode="right-normal">
Zabbix data source caches metric names in memory. Specify how often data will be updated.
</info-popover>
</span>
<input class="gf-form-input max-width-4"
type="text"
ng-model='ctrl.current.jsonData.cacheTTL'
placeholder="1h">
<input class="gf-form-input max-width-5"
type="text"
ng-model='ctrl.current.jsonData.cacheTTL'
placeholder="1h">
</input>
</div>
</div>

<div class="gf-form-group">
<h3 class="page-heading">Alerting</h3>
<gf-form-switch class="gf-form" label-class="width-8"
<gf-form-switch class="gf-form" label-class="width-9"
label="Enable alerting"
checked="ctrl.current.jsonData.alerting">
</gf-form-switch>
<gf-form-switch class="gf-form" label-class="width-8"
<gf-form-switch class="gf-form" label-class="width-9"
label="Add thresholds"
checked="ctrl.current.jsonData.addThresholds">
</gf-form-switch>
<div class="gf-form max-width-20">
<span class="gf-form-label width-8">Min severity</span>
<span class="gf-form-label width-9">Min severity</span>
<div class="gf-form-select-wrapper max-width-16">
<select class="gf-form-input" ng-model="ctrl.current.jsonData.alertingMinSeverity"
ng-options="s.val as s.text for s in [
Expand Down
48 changes: 29 additions & 19 deletions dist/test/datasource-zabbix/datasource.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ var ZabbixAPIDatasource = function () {
// Use trends instead history since specified time
this.trends = instanceSettings.jsonData.trends;
this.trendsFrom = instanceSettings.jsonData.trendsFrom || '7d';
this.trendsRange = instanceSettings.jsonData.trendsRange || '4d';

// Set cache update interval
var ttl = instanceSettings.jsonData.cacheTTL || '1h';
Expand Down Expand Up @@ -109,7 +110,10 @@ var ZabbixAPIDatasource = function () {
var timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);

var useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);
var useTrends = timeFrom <= useTrendsFrom && this.trends;
var useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);
var useTrends = this.trends && (timeFrom <= useTrendsFrom || timeTo - timeFrom >= useTrendsRange);

console.log(useTrends);

// Get alerts for current panel
if (this.alertingEnabled) {
Expand Down Expand Up @@ -192,10 +196,12 @@ var ZabbixAPIDatasource = function () {
var getHistoryPromise = void 0;

if (useTrends) {
var valueType = _this2.getTrendValueType(target);
getHistoryPromise = _this2.zabbix.getTrend(items, timeFrom, timeTo).then(function (history) {
return _responseHandler2.default.handleTrends(history, items, valueType);
});
(function () {
var valueType = _this2.getTrendValueType(target);
getHistoryPromise = _this2.zabbix.getTrend(items, timeFrom, timeTo).then(function (history) {
return _responseHandler2.default.handleTrends(history, items, valueType);
});
})();
} else {
// Use history
getHistoryPromise = _this2.zabbix.getHistory(items, timeFrom, timeTo).then(function (history) {
Expand Down Expand Up @@ -242,18 +248,20 @@ var ZabbixAPIDatasource = function () {

// Apply aggregations
if (aggregationFunctions.length) {
var dp = _lodash2.default.map(timeseries_data, 'datapoints');
dp = sequence(aggregationFunctions)(dp);
(function () {
var dp = _lodash2.default.map(timeseries_data, 'datapoints');
dp = sequence(aggregationFunctions)(dp);

var aggFuncNames = _lodash2.default.map(metricFunctions.getCategories()['Aggregate'], 'name');
var lastAgg = _lodash2.default.findLast(target.functions, function (func) {
return _lodash2.default.includes(aggFuncNames, func.def.name);
});
var aggFuncNames = _lodash2.default.map(metricFunctions.getCategories()['Aggregate'], 'name');
var lastAgg = _lodash2.default.findLast(target.functions, function (func) {
return _lodash2.default.includes(aggFuncNames, func.def.name);
});

timeseries_data = [{
target: lastAgg.text,
datapoints: dp
}];
timeseries_data = [{
target: lastAgg.text,
datapoints: dp
}];
})();
}

// Apply alias functions
Expand All @@ -273,10 +281,12 @@ var ZabbixAPIDatasource = function () {
return func.def.name === 'timeShift';
});
if (timeShiftFunc) {
var shift = timeShiftFunc.params[0];
_lodash2.default.forEach(timeseries_data, function (series) {
series.datapoints = _dataProcessor2.default.unShiftTimeSeries(shift, series.datapoints);
});
(function () {
var shift = timeShiftFunc.params[0];
_lodash2.default.forEach(timeseries_data, function (series) {
series.datapoints = _dataProcessor2.default.unShiftTimeSeries(shift, series.datapoints);
});
})();
}
}
}, {
Expand Down
9 changes: 8 additions & 1 deletion src/datasource-zabbix/datasource.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class ZabbixAPIDatasource {
// Use trends instead history since specified time
this.trends = instanceSettings.jsonData.trends;
this.trendsFrom = instanceSettings.jsonData.trendsFrom || '7d';
this.trendsRange = instanceSettings.jsonData.trendsRange || '4d';

// Set cache update interval
var ttl = instanceSettings.jsonData.cacheTTL || '1h';
Expand Down Expand Up @@ -61,7 +62,13 @@ class ZabbixAPIDatasource {
let timeTo = Math.ceil(dateMath.parse(options.range.to) / 1000);

let useTrendsFrom = Math.ceil(dateMath.parse('now-' + this.trendsFrom) / 1000);
let useTrends = (timeFrom <= useTrendsFrom) && this.trends;
let useTrendsRange = Math.ceil(utils.parseInterval(this.trendsRange) / 1000);
let useTrends = this.trends && (
(timeFrom <= useTrendsFrom) ||
(timeTo - timeFrom >= useTrendsRange)
);

console.log(useTrends);

// Get alerts for current panel
if (this.alertingEnabled) {
Expand Down
55 changes: 35 additions & 20 deletions src/datasource-zabbix/partials/config.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,51 +27,66 @@ <h3 class="page-heading">Zabbix API details</h3>
</input>
</div>

<gf-form-switch class="gf-form" label-class="width-7"
label="Trends"
checked="ctrl.current.jsonData.trends"
switch-class="max-width-5">
</gf-form-switch>
<div class="gf-form-inline">
<div class="gf-form">
<label class="gf-form-label width-7">Trends</label>
</div>
<gf-form-switch class="gf-form" label-class="width-5"
label="Enable"
checked="ctrl.current.jsonData.trends"
switch-class="max-width-6">
</gf-form-switch>
<div class="gf-form" ng-if="ctrl.current.jsonData.trends">
<span class="gf-form-label width-7">
Use from
After
<info-popover mode="right-normal">
Time after which trends will be used.
Best practice is to set this value to your history storage period (7d, 30d, etc).
</info-popover>
</span>
<input class="gf-form-input max-width-5"
type="text"
ng-model='ctrl.current.jsonData.trendsFrom'
placeholder="7d">
type="text"
ng-model='ctrl.current.jsonData.trendsFrom'
placeholder="7d">
</input>
</div>
<div class="gf-form" ng-if="ctrl.current.jsonData.trends">
<span class="gf-form-label width-7">
Range
<info-popover mode="right-normal">
Time range width after which trends will be used instead of history.
It's better to set this value in range of 4 to 7 days to prevent loading large amount of history data.
</info-popover>
</span>
<input class="gf-form-input max-width-5" type="text" ng-model='ctrl.current.jsonData.trendsRange' placeholder="4d">
</input>
</div>
</div>

<div class="gf-form">
<span class="gf-form-label width-12">
Cache update interval
Cache TTL
<info-popover mode="right-normal">
Zabbix data source caches metric names in memory. Specify how often data will be updated.
</info-popover>
</span>
<input class="gf-form-input max-width-4"
type="text"
ng-model='ctrl.current.jsonData.cacheTTL'
placeholder="1h">
<input class="gf-form-input max-width-5"
type="text"
ng-model='ctrl.current.jsonData.cacheTTL'
placeholder="1h">
</input>
</div>
</div>

<div class="gf-form-group">
<h3 class="page-heading">Alerting</h3>
<gf-form-switch class="gf-form" label-class="width-8"
<gf-form-switch class="gf-form" label-class="width-9"
label="Enable alerting"
checked="ctrl.current.jsonData.alerting">
</gf-form-switch>
<gf-form-switch class="gf-form" label-class="width-8"
<gf-form-switch class="gf-form" label-class="width-9"
label="Add thresholds"
checked="ctrl.current.jsonData.addThresholds">
</gf-form-switch>
<div class="gf-form max-width-20">
<span class="gf-form-label width-8">Min severity</span>
<span class="gf-form-label width-9">Min severity</span>
<div class="gf-form-select-wrapper max-width-16">
<select class="gf-form-input" ng-model="ctrl.current.jsonData.alertingMinSeverity"
ng-options="s.val as s.text for s in [
Expand Down

0 comments on commit e241a5f

Please sign in to comment.