96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
import logging
|
|
import os
|
|
import requests
|
|
import urllib
|
|
import json
|
|
|
|
try:
|
|
from alerta.plugins import app # alerta >= 5.0
|
|
except ImportError:
|
|
from alerta.app import app # alerta < 5.0
|
|
from alerta.plugins import PluginBase
|
|
|
|
LOG = logging.getLogger("alerta.plugins.matrix")
|
|
|
|
MATRIX_HOMESERVER_URL = [
|
|
os.environ.get("MATRIX_HOMESERVER") or app.config["MATRIX_HOMESERVER"],
|
|
"/_matrix/client/r0/rooms/",
|
|
urllib.parse.quote(os.environ.get("MATRIX_ROOM") or app.config["MATRIX_ROOM"], ":"),
|
|
"/send/m.room.message"
|
|
]
|
|
MATRIX_ACCESS_TOKEN = os.environ.get("MATRIX_ACCESS_TOKEN") or app.config["MATRIX_ACCESS_TOKEN"]
|
|
MATRIX_MESSAGE_TYPE = os.environ.get("MATRIX_MESSAGE_TYPE") or app.config.get("MATRIX_MESSAGE_TYPE", "notice")
|
|
MATRIX_MESSAGE_TYPES = {
|
|
"text": "m.text",
|
|
"notice": "m.notice"
|
|
}
|
|
DASHBOARD_URL = os.environ.get("DASHBOARD_URL") or app.config.get("DASHBOARD_URL", "")
|
|
SEVERITY_ICON = {
|
|
"critical": "🔴 ",
|
|
"warning": "⚠️ ",
|
|
"ok": "✅ ",
|
|
"cleared": "✅ ",
|
|
"normal": "✅ ",
|
|
}
|
|
|
|
|
|
class SendMessage(PluginBase):
|
|
def pre_receive(self, alert):
|
|
return alert
|
|
|
|
def post_receive(self, alert):
|
|
|
|
if alert.repeat:
|
|
return
|
|
|
|
severity = SEVERITY_ICON.get(alert.severity, "")
|
|
|
|
body = "{}{}: {} alert for {} \n{} - {} - {} \n{} \nDate: {}".format(
|
|
severity,
|
|
alert.environment,
|
|
alert.severity.capitalize(),
|
|
",".join(alert.service),
|
|
alert.resource,
|
|
alert.event,
|
|
alert.value,
|
|
alert.text,
|
|
alert.create_time,
|
|
)
|
|
|
|
formatted_body = "{}<strong>{}: {} alert for {} </br>{} - {} - {} </strong></br>{} </br><strong>Date: </strong> {} | <a rel='noopener' href='{}/#/alert/{}'>View alert</a>".format(
|
|
severity,
|
|
alert.environment,
|
|
alert.severity.capitalize(),
|
|
",".join(alert.service),
|
|
alert.resource,
|
|
alert.event,
|
|
alert.value,
|
|
alert.text,
|
|
alert.create_time,
|
|
DASHBOARD_URL,
|
|
alert.id,
|
|
)
|
|
|
|
payload = {
|
|
"msgtype": MATRIX_MESSAGE_TYPES.get(MATRIX_MESSAGE_TYPE, "m.notice"),
|
|
"format": "org.matrix.custom.html",
|
|
"body": body,
|
|
"formatted_body": formatted_body,
|
|
}
|
|
|
|
LOG.debug("Matrix: %s", payload)
|
|
|
|
try:
|
|
r = requests.post(
|
|
"".join(MATRIX_HOMESERVER_URL),
|
|
headers={"Authorization": "Bearer " + MATRIX_ACCESS_TOKEN},
|
|
data=json.dumps(payload).encode("utf-8"),
|
|
timeout=2,
|
|
)
|
|
except Exception as e:
|
|
raise RuntimeError("Matrix: ERROR - %s" % e)
|
|
|
|
LOG.debug("Matrix: %s - %s", r.status_code, r.text)
|
|
|
|
def status_change(self, alert, status, text):
|
|
return
|