{"version":3,"file":"AlertTabCtrl.d3377d127a336a69beb5.js","mappings":"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","sources":["webpack://grafana/./public/app/angular/promiseToDigest.ts","webpack://grafana/./public/app/features/alerting/AlertTabCtrl.ts","webpack://grafana/./public/app/features/alerting/state/ThresholdMapper.ts"],"sourcesContent":["import { IScope } from 'angular';\n\nexport const promiseToDigest = ($scope: IScope) => (promise: Promise) => promise.finally($scope.$evalAsync);\n","import { find, map, reduce, remove } from 'lodash';\n\nimport { DataQuery, DataSourceApi, rangeUtil } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport coreModule from 'app/angular/core_module';\nimport { promiseToDigest } from 'app/angular/promiseToDigest';\nimport appEvents from 'app/core/app_events';\nimport config from 'app/core/config';\nimport { QueryPart } from 'app/features/alerting/state/query_part';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { CoreEvents } from 'app/types';\n\nimport { ShowConfirmModalEvent } from '../../types/events';\nimport { DashboardSrv } from '../dashboard/services/DashboardSrv';\nimport { DatasourceSrv } from '../plugins/datasource_srv';\n\nimport { getDefaultCondition } from './getAlertingValidationMessage';\nimport { ThresholdMapper } from './state/ThresholdMapper';\nimport alertDef from './state/alertDef';\n\nexport class AlertTabCtrl {\n panel: PanelModel;\n panelCtrl: any;\n subTabIndex: number;\n conditionTypes: any;\n alert: any;\n conditionModels: any;\n evalFunctions: any;\n evalOperators: any;\n noDataModes: any;\n executionErrorModes: any;\n addNotificationSegment: any;\n notifications: any;\n alertNotifications: any;\n error?: string;\n appSubUrl: string;\n alertHistory: any;\n newAlertRuleTag: any;\n alertingMinIntervalSecs: number;\n alertingMinInterval: string;\n frequencyWarning: any;\n\n static $inject = ['$scope', 'dashboardSrv', 'uiSegmentSrv', 'datasourceSrv'];\n\n constructor(\n private $scope: any,\n private dashboardSrv: DashboardSrv,\n private uiSegmentSrv: any,\n private datasourceSrv: DatasourceSrv\n ) {\n this.panelCtrl = $scope.ctrl;\n this.panel = this.panelCtrl.panel;\n this.$scope.ctrl = this;\n this.subTabIndex = 0;\n this.evalFunctions = alertDef.evalFunctions;\n this.evalOperators = alertDef.evalOperators;\n this.conditionTypes = alertDef.conditionTypes;\n this.noDataModes = alertDef.noDataModes;\n this.executionErrorModes = alertDef.executionErrorModes;\n this.appSubUrl = config.appSubUrl;\n this.panelCtrl._enableAlert = this.enable;\n this.alertingMinIntervalSecs = config.alertingMinInterval;\n this.alertingMinInterval = rangeUtil.secondsToHms(config.alertingMinInterval);\n }\n\n $onInit() {\n this.addNotificationSegment = this.uiSegmentSrv.newPlusButton();\n\n // subscribe to graph threshold handle changes\n const thresholdChangedEventHandler = this.graphThresholdChanged.bind(this);\n this.panelCtrl.events.on(CoreEvents.thresholdChanged, thresholdChangedEventHandler);\n\n // set panel alert edit mode\n this.$scope.$on('$destroy', () => {\n this.panelCtrl.events.off(CoreEvents.thresholdChanged, thresholdChangedEventHandler);\n this.panelCtrl.editingThresholds = false;\n this.panelCtrl.render();\n });\n\n // build notification model\n this.notifications = [];\n this.alertNotifications = [];\n this.alertHistory = [];\n\n return promiseToDigest(this.$scope)(\n getBackendSrv()\n .get('/api/alert-notifications/lookup')\n .then((res: any) => {\n this.notifications = res;\n\n this.initModel();\n this.validateModel();\n })\n );\n }\n\n getAlertHistory() {\n promiseToDigest(this.$scope)(\n getBackendSrv()\n .get(`/api/annotations?dashboardId=${this.panelCtrl.dashboard.id}&panelId=${this.panel.id}&limit=50&type=alert`)\n .then((res: any) => {\n this.alertHistory = map(res, (ah) => {\n ah.time = this.dashboardSrv.getCurrent()?.formatDate(ah.time, 'MMM D, YYYY HH:mm:ss');\n ah.stateModel = alertDef.getStateDisplayModel(ah.newState);\n ah.info = alertDef.getAlertAnnotationInfo(ah);\n return ah;\n });\n })\n );\n }\n\n getNotificationIcon(type: string): string {\n switch (type) {\n case 'email':\n return 'envelope';\n case 'slack':\n return 'slack';\n case 'victorops':\n return 'fa fa-pagelines';\n case 'webhook':\n return 'cube';\n case 'pagerduty':\n return 'fa fa-bullhorn';\n case 'opsgenie':\n return 'bell';\n case 'hipchat':\n return 'fa fa-mail-forward';\n case 'pushover':\n return 'mobile-android';\n case 'kafka':\n return 'arrow-random';\n case 'teams':\n return 'fa fa-windows';\n }\n return 'bell';\n }\n\n getNotifications() {\n return Promise.resolve(\n this.notifications.map((item: any) => {\n return this.uiSegmentSrv.newSegment(item.name);\n })\n );\n }\n\n notificationAdded() {\n const model: any = find(this.notifications, {\n name: this.addNotificationSegment.value,\n });\n if (!model) {\n return;\n }\n\n this.alertNotifications.push({\n name: model.name,\n iconClass: this.getNotificationIcon(model.type),\n isDefault: false,\n uid: model.uid,\n });\n\n // avoid duplicates using both id and uid to be backwards compatible.\n if (!find(this.alert.notifications, (n) => n.id === model.id || n.uid === model.uid)) {\n this.alert.notifications.push({ uid: model.uid });\n }\n\n // reset plus button\n this.addNotificationSegment.value = this.uiSegmentSrv.newPlusButton().value;\n this.addNotificationSegment.html = this.uiSegmentSrv.newPlusButton().html;\n this.addNotificationSegment.fake = true;\n }\n\n removeNotification(an: any) {\n // remove notifiers referred to by id and uid to support notifiers added\n // before and after we added support for uid\n remove(this.alert.notifications, (n: any) => n.uid === an.uid || n.id === an.id);\n remove(this.alertNotifications, (n: any) => n.uid === an.uid || n.id === an.id);\n }\n\n addAlertRuleTag() {\n if (this.newAlertRuleTag.name) {\n this.alert.alertRuleTags[this.newAlertRuleTag.name] = this.newAlertRuleTag.value;\n }\n this.newAlertRuleTag.name = '';\n this.newAlertRuleTag.value = '';\n }\n\n removeAlertRuleTag(tagName: string) {\n delete this.alert.alertRuleTags[tagName];\n }\n\n initModel() {\n const alert = (this.alert = this.panel.alert);\n if (!alert) {\n return;\n }\n\n this.checkFrequency();\n\n alert.conditions = alert.conditions || [];\n if (alert.conditions.length === 0) {\n alert.conditions.push(getDefaultCondition());\n }\n\n alert.noDataState = alert.noDataState || config.alertingNoDataOrNullValues;\n alert.executionErrorState = alert.executionErrorState || config.alertingErrorOrTimeout;\n alert.frequency = alert.frequency || '1m';\n alert.handler = alert.handler || 1;\n alert.notifications = alert.notifications || [];\n alert.for = alert.for || '0m';\n alert.alertRuleTags = alert.alertRuleTags || {};\n\n const defaultName = this.panel.title + ' alert';\n alert.name = alert.name || defaultName;\n\n this.conditionModels = reduce(\n alert.conditions,\n (memo, value) => {\n memo.push(this.buildConditionModel(value));\n return memo;\n },\n [] as string[]\n );\n\n ThresholdMapper.alertToGraphThresholds(this.panel);\n\n for (const addedNotification of alert.notifications) {\n let identifier = addedNotification.uid;\n // lookup notifier type by uid\n let model: any = find(this.notifications, { uid: identifier });\n\n // fallback using id if uid is missing\n if (!model && addedNotification.id) {\n identifier = addedNotification.id;\n model = find(this.notifications, { id: identifier });\n }\n\n if (!model) {\n appEvents.publish(\n new ShowConfirmModalEvent({\n title: 'Notifier with invalid identifier is detected',\n text: `Do you want to delete notifier with invalid identifier: ${identifier} from the dashboard JSON?`,\n text2: 'After successful deletion, make sure to save the dashboard for storing the update JSON.',\n icon: 'trash-alt',\n confirmText: 'Delete',\n yesText: 'Delete',\n onConfirm: async () => {\n this.removeNotification(addedNotification);\n },\n })\n );\n }\n\n if (model && model.isDefault === false) {\n model.iconClass = this.getNotificationIcon(model.type);\n this.alertNotifications.push(model);\n }\n }\n\n for (const notification of this.notifications) {\n if (notification.isDefault) {\n notification.iconClass = this.getNotificationIcon(notification.type);\n this.alertNotifications.push(notification);\n }\n }\n\n this.panelCtrl.editingThresholds = true;\n this.panelCtrl.render();\n }\n\n checkFrequency() {\n this.frequencyWarning = '';\n\n if (!this.alert.frequency) {\n return;\n }\n\n if (!this.alert.frequency.match(/^\\d+([dhms])$/)) {\n this.frequencyWarning =\n 'Invalid frequency, has to be numeric followed by one of the following units: \"d, h, m, s\"';\n return;\n }\n\n try {\n const frequencySecs = rangeUtil.intervalToSeconds(this.alert.frequency);\n if (frequencySecs < this.alertingMinIntervalSecs) {\n this.frequencyWarning =\n 'A minimum evaluation interval of ' +\n this.alertingMinInterval +\n ' have been configured in Grafana and will be used for this alert rule. ' +\n 'Please contact the administrator to configure a lower interval.';\n }\n } catch (err) {\n this.frequencyWarning = err;\n }\n }\n\n graphThresholdChanged(evt: any) {\n for (const condition of this.alert.conditions) {\n if (condition.type === 'query') {\n condition.evaluator.params[evt.handleIndex] = evt.threshold.value;\n this.evaluatorParamsChanged();\n break;\n }\n }\n }\n\n validateModel() {\n if (!this.alert) {\n return;\n }\n\n let firstTarget;\n let foundTarget: DataQuery | null = null;\n\n const promises: Array> = [];\n for (const condition of this.alert.conditions) {\n if (condition.type !== 'query') {\n continue;\n }\n\n for (const target of this.panel.targets) {\n if (!firstTarget) {\n firstTarget = target;\n }\n if (condition.query.params[0] === target.refId) {\n foundTarget = target;\n break;\n }\n }\n\n if (!foundTarget) {\n if (firstTarget) {\n condition.query.params[0] = firstTarget.refId;\n foundTarget = firstTarget;\n } else {\n this.error = 'Could not find any metric queries';\n return;\n }\n }\n\n const datasourceName = foundTarget.datasource || this.panel.datasource;\n promises.push(\n this.datasourceSrv.get(datasourceName).then(\n ((foundTarget) => (ds: DataSourceApi) => {\n if (!ds.meta.alerting) {\n return Promise.reject('The datasource does not support alerting queries');\n } else if (ds.targetContainsTemplate && ds.targetContainsTemplate(foundTarget)) {\n return Promise.reject('Template variables are not supported in alert queries');\n }\n return Promise.resolve();\n })(foundTarget)\n )\n );\n }\n Promise.all(promises).then(\n () => {\n this.error = '';\n this.$scope.$apply();\n },\n (e) => {\n this.error = e;\n this.$scope.$apply();\n }\n );\n }\n\n buildConditionModel(source: any) {\n const cm: any = { source: source, type: source.type };\n\n cm.queryPart = new QueryPart(source.query, alertDef.alertQueryDef);\n cm.reducerPart = alertDef.createReducerPart(source.reducer);\n cm.evaluator = source.evaluator;\n cm.operator = source.operator;\n\n return cm;\n }\n\n handleQueryPartEvent(conditionModel: any, evt: any) {\n switch (evt.name) {\n case 'action-remove-part': {\n break;\n }\n case 'get-part-actions': {\n return Promise.resolve([]);\n }\n case 'part-param-changed': {\n this.validateModel();\n }\n case 'get-param-options': {\n const result = this.panel.targets.map((target) => {\n return this.uiSegmentSrv.newSegment({ value: target.refId });\n });\n\n return Promise.resolve(result);\n }\n default: {\n return Promise.resolve();\n }\n }\n\n return Promise.resolve();\n }\n\n handleReducerPartEvent(conditionModel: any, evt: any) {\n switch (evt.name) {\n case 'action': {\n conditionModel.source.reducer.type = evt.action.value;\n conditionModel.reducerPart = alertDef.createReducerPart(conditionModel.source.reducer);\n this.evaluatorParamsChanged();\n break;\n }\n case 'get-part-actions': {\n const result = [];\n for (const type of alertDef.reducerTypes) {\n if (type.value !== conditionModel.source.reducer.type) {\n result.push(type);\n }\n }\n return Promise.resolve(result);\n }\n }\n\n return Promise.resolve();\n }\n\n addCondition(type: string) {\n const condition = getDefaultCondition();\n // add to persited model\n this.alert.conditions.push(condition);\n // add to view model\n this.conditionModels.push(this.buildConditionModel(condition));\n }\n\n removeCondition(index: number) {\n this.alert.conditions.splice(index, 1);\n this.conditionModels.splice(index, 1);\n }\n\n delete() {\n appEvents.publish(\n new ShowConfirmModalEvent({\n title: 'Delete Alert',\n text: 'Are you sure you want to delete this alert rule?',\n text2: 'You need to save dashboard for the delete to take effect',\n icon: 'trash-alt',\n yesText: 'Delete',\n onConfirm: () => {\n delete this.panel.alert;\n this.alert = null;\n this.panel.thresholds = [];\n this.conditionModels = [];\n this.panelCtrl.alertState = null;\n this.panelCtrl.render();\n },\n })\n );\n }\n\n enable = () => {\n this.panel.alert = {};\n this.initModel();\n this.panel.alert.for = '5m'; //default value for new alerts. for existing alerts we use 0m to avoid breaking changes\n };\n\n evaluatorParamsChanged() {\n ThresholdMapper.alertToGraphThresholds(this.panel);\n this.panelCtrl.render();\n }\n\n evaluatorTypeChanged(evaluator: any) {\n // ensure params array is correct length\n switch (evaluator.type) {\n case 'lt':\n case 'gt': {\n evaluator.params = [evaluator.params[0]];\n break;\n }\n case 'within_range':\n case 'outside_range': {\n evaluator.params = [evaluator.params[0], evaluator.params[1]];\n break;\n }\n case 'no_value': {\n evaluator.params = [];\n }\n }\n\n this.evaluatorParamsChanged();\n }\n\n clearHistory() {\n appEvents.publish(\n new ShowConfirmModalEvent({\n title: 'Delete Alert History',\n text: 'Are you sure you want to remove all history & annotations for this alert?',\n icon: 'trash-alt',\n yesText: 'Yes',\n onConfirm: () => {\n promiseToDigest(this.$scope)(\n getBackendSrv()\n .post('/api/annotations/mass-delete', {\n dashboardId: this.panelCtrl.dashboard.id,\n panelId: this.panel.id,\n })\n .then(() => {\n this.alertHistory = [];\n this.panelCtrl.refresh();\n })\n );\n },\n })\n );\n }\n}\n\nexport function alertTab() {\n 'use strict';\n return {\n restrict: 'E',\n scope: true,\n templateUrl: 'public/app/features/alerting/partials/alert_tab.html',\n controller: AlertTabCtrl,\n };\n}\n\ncoreModule.directive('alertTab', alertTab);\n","import { config } from 'app/core/config';\nimport { PanelModel } from 'app/features/dashboard/state';\n\nexport const hiddenReducerTypes = ['percent_diff', 'percent_diff_abs'];\nexport class ThresholdMapper {\n static alertToGraphThresholds(panel: PanelModel) {\n if (!panel.alert || config.unifiedAlertingEnabled) {\n return false; // no update when no alerts\n }\n\n for (let i = 0; i < panel.alert.conditions.length; i++) {\n const condition = panel.alert.conditions[i];\n if (condition.type !== 'query') {\n continue;\n }\n\n const evaluator = condition.evaluator;\n const thresholds: any[] = (panel.thresholds = []);\n const visible = hiddenReducerTypes.indexOf(condition.reducer?.type) === -1;\n\n switch (evaluator.type) {\n case 'gt': {\n const value = evaluator.params[0];\n thresholds.push({ value: value, op: 'gt', visible });\n break;\n }\n case 'lt': {\n const value = evaluator.params[0];\n thresholds.push({ value: value, op: 'lt', visible });\n break;\n }\n case 'outside_range': {\n const value1 = evaluator.params[0];\n const value2 = evaluator.params[1];\n\n if (value1 > value2) {\n thresholds.push({ value: value1, op: 'gt', visible });\n thresholds.push({ value: value2, op: 'lt', visible });\n } else {\n thresholds.push({ value: value1, op: 'lt', visible });\n thresholds.push({ value: value2, op: 'gt', visible });\n }\n\n break;\n }\n case 'within_range': {\n const value1 = evaluator.params[0];\n const value2 = evaluator.params[1];\n\n if (value1 > value2) {\n thresholds.push({ value: value1, op: 'lt', visible });\n thresholds.push({ value: value2, op: 'gt', visible });\n } else {\n thresholds.push({ value: value1, op: 'gt', visible });\n thresholds.push({ value: value2, op: 'lt', visible });\n }\n break;\n }\n }\n break;\n }\n\n for (const t of panel.thresholds) {\n t.fill = panel.options.alertThreshold;\n t.line = panel.options.alertThreshold;\n t.colorMode = 'critical';\n }\n\n const updated = true;\n return updated;\n }\n}\n"],"names":["promiseToDigest","$scope","promise","AlertTabCtrl","dashboardSrv","uiSegmentSrv","datasourceSrv","thresholdChangedEventHandler","res","ah","type","item","model","n","an","tagName","alert","defaultName","memo","value","addedNotification","identifier","notification","err","evt","condition","firstTarget","foundTarget","promises","target","datasourceName","ds","e","source","cm","conditionModel","result","index","evaluator","alertTab","hiddenReducerTypes","ThresholdMapper","panel","i","thresholds","visible","value1","value2","t"],"sourceRoot":""}