From cf34fd501dd05db792b8ef67eea209d589d7fc18 Mon Sep 17 00:00:00 2001 From: JesseBot Date: Tue, 16 Jul 2024 09:57:38 +0200 Subject: [PATCH] Formatting release: use description for summary; allow greater control over HEX codes used for colors of message text; clean up styling and duplicate info (#15) * allow changing colors of header line and always use first sentence of description as summary for collapsible * remove second runbook_url in description * additional formatting and setting new defaults for colors to be a bit more spacechalk :) * clean up formatting more * fix typo * clean up colors a bit more formatting * catch typo of missing + in resolved msg formatting * clean up readme --- .env.default | 8 ++++++++ README.md | 3 ++- package-lock.json | 4 ++-- package.json | 2 +- src/utils.js | 49 +++++++++++++++++++++++++++++++++++------------ 5 files changed, 50 insertions(+), 16 deletions(-) diff --git a/.env.default b/.env.default index 7f74c08..c234c27 100644 --- a/.env.default +++ b/.env.default @@ -51,3 +51,11 @@ GRAFANA_DATASOURCE="default" # comment to disable silence link ALERTMANAGER_URL="https://alertmanager.example.com" + +# colors for alert message text. These are HEX codes. +COLOR_CRITICAL="#f2748a" # red +COLOR_ERROR="#f289f9" # orange +COLOR_WARNING="#fdcd36" # yellow +COLOR_INFO="#7aa2f7" # blue +COLOR_RECOVERED="#a8fd57" +COLOR_DEFAULT="#585858" # grey diff --git a/README.md b/README.md index f95df28..110f738 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ A bot to receive Prometheus Alertmanager webhook events and forward them to chos * Configurable room per alert receiver * Automatic joining of configured rooms. Private rooms require an invite * Secret key authentication with Alertmanager -* HTML formatted messages +* 🎨 HTML formatted messages + * You can now choose the text colors for each severity too! * Optionally mentions `@room` on firing alerts * Optionally set the bot user's display name and avatar diff --git a/package-lock.json b/package-lock.json index 955706d..001c9e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "matrix-alertmanager", - "version": "0.11.2", + "version": "0.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "matrix-alertmanager", - "version": "0.11.2", + "version": "0.12.0", "license": "MIT", "dependencies": { "dotenv": "^16.0.0", diff --git a/package.json b/package.json index f5b8193..44530d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-alertmanager", - "version": "0.11.2", + "version": "0.12.0", "description": "Prometheus Alertmanager bot for Matrix", "main": "src/app.js", "scripts": { diff --git a/src/utils.js b/src/utils.js index 65ceea5..c03e95d 100644 --- a/src/utils.js +++ b/src/utils.js @@ -25,8 +25,8 @@ const utils = { let parts = [] let summary = "" - if (data.annotations.hasOwnProperty("summary")) { - summary = data.annotations.summary; + if (data.annotations.hasOwnProperty("description")) { + summary = data.annotations.description.split('.')[0]; } else if (data.labels.hasOwnProperty("alertname")) { summary = data.labels.alertname; } @@ -42,20 +42,45 @@ const utils = { let color = (function (severity) { switch (severity) { case 'critical': - return '#E41227'; // red + if (process.env.COLOR_CRITICAL) { + return process.env.COLOR_CRITICAL; + } else { + return '#f2748a'; // red + } case 'error': - return '#FF4507'; // orange + if (process.env.COLOR_ERROR) { + return process.env.COLOR_ERROR; + } else { + return '#f289f9'; // magenta + } case 'warning': - return '#FFE608'; // yellow + if (process.env.COLOR_WARNING) { + return process.env.COLOR_WARNING; + } else { + return '#fdcd36'; // yellow + } case 'info': - return '#1661B8'; // blue + if (process.env.COLOR_INFO) { + return process.env.COLOR_INFO; + } else { + return '#7aa2f7'; // blue + } default: - return '#999999'; // grey + if (process.env.COLOR_DEFAULT) { + return process.env.COLOR_DEFAULT; + } else { + return '#7aa2f7'; // grey + } } })(data.labels.severity); - parts.push('FIRING: ' + summary + env + '') + parts.push('FIRING: ' + summary + env + '') } else if (data.status === 'resolved') { - parts.push('RESOLVED: ' + summary + env + '') + if (process.env.COLOR_RECOVERED) { + let resolved_color = process.env.COLOR_RECOVERED + } else { + let resolved_color = "#a8fd57" + } + parts.push('RESOLVED: ' + summary + env + '') } else { parts.push('' + data.status.toUpperCase() + ': ' + summary + env + '') } @@ -63,14 +88,14 @@ const utils = { parts.push('
\n') Object.keys(data.labels).forEach((label) => { - parts.push('' + label + ': ' + data.labels[label] + '
\n') + parts.push('' + label + ': ' + data.labels[label] + '
\n') }); parts.push('
\n') Object.keys(data.annotations).forEach((annotation) => { - if (annotation != "summary" && !annotation.startsWith("logs_")) { - parts.push('' + annotation + ': ' + data.annotations[annotation] + '
\n') + if (annotation != "summary" && annotation != "runbook_url" && !annotation.startsWith("logs_")) { + parts.push('' + annotation + ': ' + data.annotations[annotation] + '
\n') } }) parts.push('')