diff --git a/src/datasource-zabbix/datasource.ts b/src/datasource-zabbix/datasource.ts index 97b415d..6ad2cc5 100644 --- a/src/datasource-zabbix/datasource.ts +++ b/src/datasource-zabbix/datasource.ts @@ -351,6 +351,8 @@ export class ZabbixDatasource { itServiceFilter = this.replaceTemplateVars(target.itServiceFilter, options.scopedVars); } + options.slaInterval = target.slaInterval; + return this.zabbix.getITServices(itServiceFilter) .then(itservices => { if (options.isOldVersion) { diff --git a/src/datasource-zabbix/migrations.ts b/src/datasource-zabbix/migrations.ts index 3023b90..0d300b0 100644 --- a/src/datasource-zabbix/migrations.ts +++ b/src/datasource-zabbix/migrations.ts @@ -48,7 +48,12 @@ function migrateQueryType(target) { delete target.mode; } } +} +function migrateSLA(target) { + if (target.queryType === c.MODE_ITSERVICE && !target.slaInterval) { + target.slaInterval = 'none'; + } } export function migrate(target) { @@ -59,6 +64,7 @@ export function migrate(target) { } migratePercentileAgg(target); migrateQueryType(target); + migrateSLA(target); return target; } diff --git a/src/datasource-zabbix/partials/query.editor.html b/src/datasource-zabbix/partials/query.editor.html index 2841971..c7b0b37 100644 --- a/src/datasource-zabbix/partials/query.editor.html +++ b/src/datasource-zabbix/partials/query.editor.html @@ -40,7 +40,7 @@
- +
+ +
+
diff --git a/src/datasource-zabbix/query.controller.js b/src/datasource-zabbix/query.controller.js index a4bf66e..2515869 100644 --- a/src/datasource-zabbix/query.controller.js +++ b/src/datasource-zabbix/query.controller.js @@ -35,6 +35,7 @@ function getTargetDefaults() { function getSLATargetDefaults() { return { slaProperty: { name: "SLA", property: "sla" }, + slaInterval: 'none', }; } @@ -93,6 +94,16 @@ export class ZabbixQueryController extends QueryCtrl { {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 = [ {text: 'all triggers', value: 2}, {text: 'unacknowledged', value: 0}, diff --git a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts index 657fdab..89dc84f 100644 --- a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts +++ b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts @@ -366,11 +366,21 @@ export class ZabbixAPIConnector { } getSLA(serviceids, timeRange, options) { - const intervals = buildSLAIntervals(timeRange, options.intervalMs); - const params = { + const [timeFrom, timeTo] = timeRange; + 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, intervals }; + return this.request('service.getsla', params); } @@ -667,19 +677,18 @@ function getSLAInterval(intervalMs) { return Math.max(interval, MIN_SLA_INTERVAL); } -function buildSLAIntervals(timeRange, intervalMs) { +function buildSLAIntervals(timeRange, interval) { let [timeFrom, timeTo] = timeRange; - const slaInterval = getSLAInterval(intervalMs); const intervals = []; // Align time range with calculated interval - timeFrom = Math.floor(timeFrom / slaInterval) * slaInterval; - timeTo = Math.ceil(timeTo / slaInterval) * slaInterval; + timeFrom = Math.floor(timeFrom / interval) * interval; + 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({ from : i, - to : (i + slaInterval) + to : (i + interval) }); }