From 29d902326aabfca37ae3eef21d872fb78b98de73 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Thu, 7 May 2020 13:38:55 +0300 Subject: [PATCH] Move problems query to the data source --- src/datasource-zabbix/constants.ts | 1 + src/datasource-zabbix/datasource.ts | 80 +++++++++- .../partials/query.editor.html | 14 +- src/datasource-zabbix/problemsHandler.ts | 137 ++++++++++++++++++ src/datasource-zabbix/query.controller.js | 9 +- src/datasource-zabbix/utils.ts | 16 ++ 6 files changed, 246 insertions(+), 11 deletions(-) create mode 100644 src/datasource-zabbix/problemsHandler.ts diff --git a/src/datasource-zabbix/constants.ts b/src/datasource-zabbix/constants.ts index 79d2edc..6917eff 100644 --- a/src/datasource-zabbix/constants.ts +++ b/src/datasource-zabbix/constants.ts @@ -8,6 +8,7 @@ export const MODE_ITSERVICE = 1; export const MODE_TEXT = 2; export const MODE_ITEMID = 3; export const MODE_TRIGGERS = 4; +export const MODE_PROBLEMS = 5; // Triggers severity export const SEV_NOT_CLASSIFIED = 0; diff --git a/src/datasource-zabbix/datasource.ts b/src/datasource-zabbix/datasource.ts index e4a0bb6..178c290 100644 --- a/src/datasource-zabbix/datasource.ts +++ b/src/datasource-zabbix/datasource.ts @@ -1,5 +1,6 @@ import _ from 'lodash'; import config from 'grafana/app/core/config'; +import { contextSrv } from 'grafana/app/core/core'; import * as dateMath from 'grafana/app/core/utils/datemath'; import * as utils from './utils'; import * as migrations from './migrations'; @@ -7,9 +8,11 @@ import * as metricFunctions from './metricFunctions'; import * as c from './constants'; import dataProcessor from './dataProcessor'; import responseHandler from './responseHandler'; +import problemsHandler from './problemsHandler'; import { Zabbix } from './zabbix/zabbix'; import { ZabbixAPIError } from './zabbix/connectors/zabbix_api/zabbixAPICore'; import { VariableQueryTypes } from './types'; +import { getDataSourceSrv } from '@grafana/runtime'; const DEFAULT_ZABBIX_VERSION = 3; @@ -37,7 +40,7 @@ export class ZabbixDatasource { enableDebugLog: boolean; zabbix: any; - replaceTemplateVars: (templateSrv: any, target: any, scopedVars?: any) => any; + replaceTemplateVars: (target: any, scopedVars?: any) => any; /** @ngInject */ constructor(instanceSettings, private templateSrv, private zabbixAlertingSrv) { @@ -181,6 +184,9 @@ export class ZabbixDatasource { } else if (target.queryType === c.MODE_TRIGGERS) { // Triggers query return this.queryTriggersData(target, timeRange); + } else if (target.queryType === c.MODE_PROBLEMS) { + // Problems query + return this.queryProblems(target, timeRange, options); } else { return []; } @@ -384,6 +390,78 @@ export class ZabbixDatasource { }); } + queryProblems(target, timeRange, options) { + const [timeFrom, timeTo] = timeRange; + const userIsEditor = contextSrv.isEditor || contextSrv.isGrafanaAdmin; + + let proxies; + let showAckButton = true; + + // const showEvents = this.panel.showEvents.value; + const showEvents = target.showEvents?.value || 1; + // const showProxy = this.panel.hostProxy; + const showProxy = target.hostProxy; + + const getProxiesPromise = showProxy ? this.zabbix.getProxies() : () => []; + showAckButton = !this.disableReadOnlyUsersAck || userIsEditor; + + // Replace template variables + const groupFilter = this.replaceTemplateVars(target.group?.filter, options.scopedVars); + const hostFilter = this.replaceTemplateVars(target.host?.filter, options.scopedVars); + const appFilter = this.replaceTemplateVars(target.application?.filter, options.scopedVars); + const proxyFilter = this.replaceTemplateVars(target.proxy?.filter, options.scopedVars); + + const triggerFilter = this.replaceTemplateVars(target.trigger?.filter, options.scopedVars); + const tagsFilter = this.replaceTemplateVars(target.tags?.filter, options.scopedVars); + + const replacedTarget = { + ...target, + trigger: { filter: triggerFilter }, + tags: { filter: tagsFilter }, + }; + + const triggersOptions: any = { + showTriggers: showEvents + }; + + if (showEvents !== 1) { + triggersOptions.timeFrom = timeFrom; + triggersOptions.timeTo = timeTo; + } + + const problemsPromises = Promise.all([ + this.zabbix.getTriggers(groupFilter, hostFilter, appFilter, triggersOptions, proxyFilter), + getProxiesPromise + ]) + .then(([triggers, sourceProxies]) => { + proxies = _.keyBy(sourceProxies, 'proxyid'); + const eventids = _.compact(triggers.map(trigger => { + return trigger.lastEvent.eventid; + })); + return Promise.all([ + this.zabbix.getExtendedEventData(eventids), + Promise.resolve(triggers) + ]); + }) + .then(([events, triggers]) => { + problemsHandler.addEventTags(events, triggers); + problemsHandler.addAcknowledges(events, triggers); + return triggers; + }) + .then(triggers => problemsHandler.setMaintenanceStatus(triggers)) + .then(triggers => problemsHandler.setAckButtonStatus(triggers, showAckButton)) + .then(triggers => problemsHandler.filterTriggersPre(triggers, replacedTarget)) + .then(triggers => problemsHandler.addTriggerDataSource(triggers, target)) + .then(triggers => problemsHandler.addTriggerHostProxy(triggers, proxies)); + + return problemsPromises.then(problems => { + const problemsDataFrame = problemsHandler.toDataFrame(problems); + console.log(problems); + console.log(problemsDataFrame); + return problemsDataFrame; + }); + } + /** * Test connection to Zabbix API and external history DB. */ diff --git a/src/datasource-zabbix/partials/query.editor.html b/src/datasource-zabbix/partials/query.editor.html index c713b74..14487b6 100644 --- a/src/datasource-zabbix/partials/query.editor.html +++ b/src/datasource-zabbix/partials/query.editor.html @@ -54,7 +54,7 @@ -
+
@@ -91,7 +91,7 @@
-
+
@@ -124,7 +124,7 @@ }">
-
+
-