diff --git a/ops_bot/alertmanager.py b/ops_bot/alertmanager.py index 2864058..fb2a175 100644 --- a/ops_bot/alertmanager.py +++ b/ops_bot/alertmanager.py @@ -2,9 +2,21 @@ from typing import Any, Dict, List, Tuple from fastapi import Request -from ops_bot.common import COLOR_ALARM, COLOR_OK, COLOR_UNKNOWN +from ops_bot.common import ( + COLOR_ALARM, + COLOR_INFO, + COLOR_OK, + COLOR_UNKNOWN, + COLOR_WARNING, +) from ops_bot.config import RoutingKey +severity_colors = { + "warning": COLOR_WARNING, + "info": COLOR_INFO, + "critical": COLOR_ALARM, +} + def prometheus_alert_to_markdown( alert_data: Dict, # type: ignore[type-arg] @@ -13,33 +25,35 @@ def prometheus_alert_to_markdown( Converts a prometheus alert json to markdown """ messages = [] - ignore_labels = ["grafana_folder", "alertname"] + ignore_labels = ["grafana_folder"] for alert in alert_data["alerts"]: title = ( alert["annotations"]["description"] if hasattr(alert["annotations"], "description") else alert["annotations"]["summary"] ) - severity = alert.get("severity", "critical") - if alert["status"] == "resolved": + labels = alert.get("labels", {}) + severity = labels.get("severity", "unknown") + status = alert.get("status", "unknown-status") + if status == "resolved": color = COLOR_OK - elif severity == "critical": - color = COLOR_ALARM else: - color = COLOR_UNKNOWN + color = severity_colors.get(severity, COLOR_UNKNOWN) - status = alert["status"] generatorURL = alert.get("generatorURL") - plain = f"{status}: {title}" - header_str = f"{status.upper()}[{status}]" + plain = f"{status.upper()}[{severity}]: {title}" + header_str = f"{status.upper()}[{severity}]" formatted = f"{header_str}: [{title}]({generatorURL})" - for label_name, label_value in alert["labels"].items(): + label_strings = [] + for label_name, label_value in labels.items(): if label_name.startswith("__"): continue if label_name in ignore_labels: continue - plain += "\n* **{0}**: {1}".format(label_name.capitalize(), label_value) - formatted += "\n* **{0}**: {1}".format(label_name.capitalize(), label_value) + label_strings.append((f"**{label_name.capitalize()}**: {label_value}")) + labels_final = ", ".join(label_strings) + plain += f" \n{labels_final}" + formatted += f"
{labels_final}" messages.append((plain, formatted)) return messages diff --git a/ops_bot/common.py b/ops_bot/common.py index 787c361..13a6409 100644 --- a/ops_bot/common.py +++ b/ops_bot/common.py @@ -1,4 +1,5 @@ COLOR_OK = "#33cc33" # green COLOR_ALARM = "#dc3545" # red -COLOR_UNKNOWN = "#ffc107" # orange COLOR_INFO = "#17a2b8" # blue +COLOR_WARNING = "#ffc107" # orange +COLOR_UNKNOWN = "#ffa500" # yellowish diff --git a/tests/test_alertmanager.py b/tests/test_alertmanager.py index 0cab9fa..0fa0999 100644 --- a/tests/test_alertmanager.py +++ b/tests/test_alertmanager.py @@ -54,5 +54,18 @@ def test_alertmanager(): assert len(r) == 1 plain, formatted = r[0] - assert "firing" in plain and "Instance webserver.example.com down" in plain - assert "firing" in formatted and "Instance webserver.example.com down" in formatted + print(formatted) + assert ( + "FIRING" in plain + and "Instance" in plain + and "webserver.example.com" in plain + and "Instance webserver.example.com down" in plain + and "critical" in plain + ) + assert ( + "FIRING" in formatted + and "Instance" in formatted + and "webserver.example.com" in formatted + and "Instance webserver.example.com down" in formatted + and "critical" in formatted + )