SLA: add interval option, closes #885
This commit is contained in:
@@ -351,6 +351,8 @@ export class ZabbixDatasource {
|
|||||||
itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);
|
itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
options.slaInterval = target.slaInterval;
|
||||||
|
|
||||||
return this.zabbix.getITServices(itServiceFilter)
|
return this.zabbix.getITServices(itServiceFilter)
|
||||||
.then(itservices => {
|
.then(itservices => {
|
||||||
if (options.isOldVersion) {
|
if (options.isOldVersion) {
|
||||||
|
|||||||
@@ -48,7 +48,12 @@ function migrateQueryType(target) {
|
|||||||
delete target.mode;
|
delete target.mode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function migrateSLA(target) {
|
||||||
|
if (target.queryType === c.MODE_ITSERVICE && !target.slaInterval) {
|
||||||
|
target.slaInterval = 'none';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function migrate(target) {
|
export function migrate(target) {
|
||||||
@@ -59,6 +64,7 @@ export function migrate(target) {
|
|||||||
}
|
}
|
||||||
migratePercentileAgg(target);
|
migratePercentileAgg(target);
|
||||||
migrateQueryType(target);
|
migrateQueryType(target);
|
||||||
|
migrateSLA(target);
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
</input>
|
</input>
|
||||||
</div>
|
</div>
|
||||||
<div class="gf-form">
|
<div class="gf-form">
|
||||||
<label class="gf-form-label query-keyword">Property</label>
|
<label class="gf-form-label query-keyword width-7">Property</label>
|
||||||
<div class="gf-form-select-wrapper">
|
<div class="gf-form-select-wrapper">
|
||||||
<select class="gf-form-input"
|
<select class="gf-form-input"
|
||||||
ng-change="ctrl.onTargetBlur()"
|
ng-change="ctrl.onTargetBlur()"
|
||||||
@@ -49,6 +49,16 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="gf-form">
|
||||||
|
<label class="gf-form-label query-keyword width-7">Interval</label>
|
||||||
|
<div class="gf-form-select-wrapper">
|
||||||
|
<select class="gf-form-input"
|
||||||
|
ng-change="ctrl.onTargetBlur()"
|
||||||
|
ng-model="ctrl.target.slaInterval"
|
||||||
|
ng-options="i.value as i.text for i in ctrl.slaIntervals">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="gf-form gf-form--grow">
|
<div class="gf-form gf-form--grow">
|
||||||
<div class="gf-form-label gf-form-label--grow"></div>
|
<div class="gf-form-label gf-form-label--grow"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ function getTargetDefaults() {
|
|||||||
function getSLATargetDefaults() {
|
function getSLATargetDefaults() {
|
||||||
return {
|
return {
|
||||||
slaProperty: { name: "SLA", property: "sla" },
|
slaProperty: { name: "SLA", property: "sla" },
|
||||||
|
slaInterval: 'none',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,6 +94,16 @@ export class ZabbixQueryController extends QueryCtrl {
|
|||||||
{name: "Down time", property: "downtimeTime"}
|
{name: "Down time", property: "downtimeTime"}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
this.slaIntervals = [
|
||||||
|
{ text: 'No interval', value: 'none' },
|
||||||
|
{ text: 'Auto', value: 'auto' },
|
||||||
|
{ text: '1 hour', value: '1h' },
|
||||||
|
{ text: '12 hours', value: '12h' },
|
||||||
|
{ text: '24 hours', value: '1d' },
|
||||||
|
{ text: '1 week', value: '1w' },
|
||||||
|
{ text: '1 month', value: '1M' },
|
||||||
|
];
|
||||||
|
|
||||||
this.ackFilters = [
|
this.ackFilters = [
|
||||||
{text: 'all triggers', value: 2},
|
{text: 'all triggers', value: 2},
|
||||||
{text: 'unacknowledged', value: 0},
|
{text: 'unacknowledged', value: 0},
|
||||||
|
|||||||
@@ -366,11 +366,21 @@ export class ZabbixAPIConnector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getSLA(serviceids, timeRange, options) {
|
getSLA(serviceids, timeRange, options) {
|
||||||
const intervals = buildSLAIntervals(timeRange, options.intervalMs);
|
const [timeFrom, timeTo] = timeRange;
|
||||||
const params = {
|
let intervals = [{ from: timeFrom, to: timeTo }];
|
||||||
|
if (options.slaInterval === 'auto') {
|
||||||
|
const interval = getSLAInterval(options.intervalMs);
|
||||||
|
intervals = buildSLAIntervals(timeRange, interval);
|
||||||
|
} else if (options.slaInterval !== 'none') {
|
||||||
|
const interval = utils.parseInterval(options.slaInterval) / 1000;
|
||||||
|
intervals = buildSLAIntervals(timeRange, interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
const params: any = {
|
||||||
serviceids,
|
serviceids,
|
||||||
intervals
|
intervals
|
||||||
};
|
};
|
||||||
|
|
||||||
return this.request('service.getsla', params);
|
return this.request('service.getsla', params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -667,19 +677,18 @@ function getSLAInterval(intervalMs) {
|
|||||||
return Math.max(interval, MIN_SLA_INTERVAL);
|
return Math.max(interval, MIN_SLA_INTERVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildSLAIntervals(timeRange, intervalMs) {
|
function buildSLAIntervals(timeRange, interval) {
|
||||||
let [timeFrom, timeTo] = timeRange;
|
let [timeFrom, timeTo] = timeRange;
|
||||||
const slaInterval = getSLAInterval(intervalMs);
|
|
||||||
const intervals = [];
|
const intervals = [];
|
||||||
|
|
||||||
// Align time range with calculated interval
|
// Align time range with calculated interval
|
||||||
timeFrom = Math.floor(timeFrom / slaInterval) * slaInterval;
|
timeFrom = Math.floor(timeFrom / interval) * interval;
|
||||||
timeTo = Math.ceil(timeTo / slaInterval) * slaInterval;
|
timeTo = Math.ceil(timeTo / interval) * interval;
|
||||||
|
|
||||||
for (let i = timeFrom; i <= timeTo - slaInterval; i += slaInterval) {
|
for (let i = timeFrom; i <= timeTo - interval; i += interval) {
|
||||||
intervals.push({
|
intervals.push({
|
||||||
from : i,
|
from : i,
|
||||||
to : (i + slaInterval)
|
to : (i + interval)
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user