SLA: add interval option, closes #885

This commit is contained in:
Alexander Zobnin
2020-05-20 13:36:00 +03:00
parent 552b709740
commit 4c462e72dc
5 changed files with 47 additions and 9 deletions

View File

@@ -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) {

View File

@@ -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;
} }

View File

@@ -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>

View File

@@ -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},

View File

@@ -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)
}); });
} }