From 744280798a98c34885162e9f66e05f2e3edaa606 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Fri, 29 Apr 2022 12:15:24 +0300 Subject: [PATCH] Fallback for SLA in Zabbix 6.0, fixes #1408 --- .../zabbix_api/zabbixAPIConnector.ts | 59 +++++++++++++++++++ src/datasource-zabbix/zabbix/zabbix.ts | 16 ++++- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts index 7e63b23..2a34b41 100644 --- a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts +++ b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts @@ -385,6 +385,65 @@ export class ZabbixAPIConnector { return this.request('service.getsla', params); } + async getSLA60(serviceids, timeRange, options) { + 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 = { + output: 'extend', + serviceids, + }; + + const slaObjects = await this.request('sla.get', params); + if (slaObjects.length === 0) { + return {}; + } + const sla = slaObjects[0]; + + const periods = intervals.map(interval => ({ + period_from: interval.from, + period_to: interval.to, + })); + const sliParams: any = { + slaid: sla.slaid, + serviceids, + period_from: timeFrom, + period_to: timeTo, + periods: Math.min(intervals.length, 100), + }; + + const sliResponse = await this.request('sla.getsli', sliParams); + if (sliResponse.length === 0) { + return {}; + } + + const slaLikeResponse: any = {}; + sliResponse.serviceids.forEach((serviceid) => { + slaLikeResponse[serviceid] = { + sla: [] + }; + }); + sliResponse.sli.forEach((sliItem, i) => { + sliItem.forEach((sli, j) => { + slaLikeResponse[sliResponse.serviceids[j]].sla.push({ + downtimeTime: sli.downtime, + okTime: sli.uptime, + sla: sli.sli, + from: sliResponse.periods[i].period_from, + to: sliResponse.periods[i].period_to + }); + }); + }); + return slaLikeResponse; + } + getProblems(groupids, hostids, applicationids, options): Promise { const { timeFrom, timeTo, recent, severities, limit, acknowledged, tags } = options; diff --git a/src/datasource-zabbix/zabbix/zabbix.ts b/src/datasource-zabbix/zabbix/zabbix.ts index beabc19..48af066 100644 --- a/src/datasource-zabbix/zabbix/zabbix.ts +++ b/src/datasource-zabbix/zabbix/zabbix.ts @@ -184,6 +184,11 @@ export class Zabbix implements ZabbixConnector { return version ? semver.lt(version, '5.4.0') : true; } + supportSLA() { + const version = this.version || this.zabbixAPI.version; + return version ? semver.gte(version, '6.0.0') : true; + } + isZabbix54OrHigher() { const version = this.version || this.zabbixAPI.version; return version ? semver.gte(version, '5.4.0') : false; @@ -496,14 +501,19 @@ export class Zabbix implements ZabbixConnector { } } - getSLA(itservices, timeRange, target, options) { + async getSLA(itservices, timeRange, target, options) { const itServiceIds = _.map(itservices, 'serviceid'); - return this.zabbixAPI.getSLA(itServiceIds, timeRange, options) - .then(slaResponse => { + if (this.supportSLA()) { + const slaResponse = await this.zabbixAPI.getSLA60(itServiceIds, timeRange, options); return _.map(itServiceIds, serviceid => { const itservice = _.find(itservices, { 'serviceid': serviceid }); return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse); }); + } + const slaResponse = await this.zabbixAPI.getSLA(itServiceIds, timeRange, options); + return _.map(itServiceIds, serviceid => { + const itservice = _.find(itservices, { 'serviceid': serviceid }); + return responseHandler.handleSLAResponse(itservice, target.slaProperty, slaResponse); }); } }