blob: b425de49ee50267456672419405ca05e576edae9 [file] [log] [blame]
Michal Kobusaa3accf2019-06-05 12:25:09 +02001# Copyright 2018: Mirantis Inc.
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Michal Kobus211ee922019-04-15 17:44:06 +020016import os
Mateusz Matuszkowiak2820c662018-11-21 12:07:25 +010017
18RESOLVED_STATUSES = ('UP', 'OK', 'resolved')
19
20
Michal Kobus211ee922019-04-15 17:44:06 +020021def create_file(file_path):
22 if not os.path.exists(file_path):
23 with open(file_path, 'w+'):
24 return file_path
25
26
Michal Kobuse7589f72020-09-11 14:29:37 +020027def _format_subject(alert, add_links=False):
28 if add_links:
29 severity = alert['labels']['severity'].upper()
30 name = alert['labels']['alertname']
31 return '[{}] {}'.format(severity, name)
32
Michal Kobus23ba2f72018-12-03 17:11:20 +010033 subject = alert['annotations']['summary']
Michal Kobusba987052018-11-30 13:01:08 +010034 host = alert['labels'].get('host')
35 if host is not None:
Michal Kobus23ba2f72018-12-03 17:11:20 +010036 return '[{}] {}'.format(host, subject)
37 return subject
Michal Kobusba987052018-11-30 13:01:08 +010038
39
Michal Kobus23ba2f72018-12-03 17:11:20 +010040def _remove_advice(description):
41 return description.split(' Modify the')[0]
42
43
Michal Kobuse7589f72020-09-11 14:29:37 +020044def _get_prometheus_link(alert):
45 # switch from Console to Graph tab to show trends
46 condition_url = alert['generatorURL'].replace('g0.tab=1', 'g0.tab=0')
47
Michal Kobus043c5992020-09-30 16:26:08 +020048 # list alert firing instances in the cluster
49 # via query: ALERTS{alertname="<alertname>",alertstate="firing"}
Michal Kobuse7589f72020-09-11 14:29:37 +020050 alert_query = ('g1.range_input=1h&'
Michal Kobus043c5992020-09-30 16:26:08 +020051 'g1.expr=ALERTS%7Balertname%3D%22'
52 '{}'
53 '%22%2Calertstate%3D%22firing%22%7D&'
54 'g1.tab=0').format(alert['labels']['alertname'])
Michal Kobuse7589f72020-09-11 14:29:37 +020055 return '{}&{}'.format(condition_url, alert_query)
Michal Kobus23ba2f72018-12-03 17:11:20 +010056
57
Michal Kobuse7589f72020-09-11 14:29:37 +020058def _format_description(alert, add_links=False):
59 description_old = _remove_advice(alert['annotations']['description'])
60
61 if not add_links:
62 return description_old
63
64 msg = ('To check trends of the alert underlying condition metric '
65 ' and alert occurrence click on Prometheus UI link')
66
67 prometheus_url = _get_prometheus_link(alert)
68 return '{}\n\n{}:\n{}'.format(description_old, msg, prometheus_url)
69
70
71def alert_fields_and_action(alert, add_links=False):
Mateusz Matuszkowiak2820c662018-11-21 12:07:25 +010072 fields = []
Mateusz Matuszkowiak2820c662018-11-21 12:07:25 +010073
74 if alert['status'] in RESOLVED_STATUSES:
Mateusz Matuszkowiak2820c662018-11-21 12:07:25 +010075 action = 'close_case'
Michal Kobusafbf4d02018-11-28 14:18:05 +010076 fields.append(alert['labels'])
Mateusz Matuszkowiak2820c662018-11-21 12:07:25 +010077 else:
Michal Kobusafbf4d02018-11-28 14:18:05 +010078 action = 'create_case'
Michal Kobusba987052018-11-30 13:01:08 +010079 # Order of keys matters
Michal Kobuse7589f72020-09-11 14:29:37 +020080 fields.append(_format_subject(alert, add_links))
81 fields.append(_format_description(alert, add_links))
Mateusz Matuszkowiak2820c662018-11-21 12:07:25 +010082 fields.append(alert['labels'])
83 return fields, action