#!/usr/bin/env python3 import os import sys from dateutil import parser import json, logging from flask import Flask, request from rocketchat_API.rocketchat import RocketChat from requests import sessions listenPort = 29120 listenIP = '::1' botUser = '{{ prometheus_alertmanager.rocketchatbot.user }}' botPass = '{{ prometheus_alertmanager.rocketchatbot.pass }}' botChatURL ='{{ prometheus_alertmanager.rocketchatbot.url }}' app = Flask(__name__) app.secret_key = os.urandom(128) api_session = sessions.Session() api = RocketChat(botUser, botPass, server_url=botChatURL, session=api_session) @app.route('//alert', methods = ['POST']) def postAlertmanager(chatName): try: content = json.loads(request.get_data()) res = True for alert in content['alerts']: message = "" if alert['status'] == "firing": message += ":warning: " else: message += ":white_check_mark: " message += " [**"+alert['status']+"**] " if 'description' in alert['annotations']: message += alert['annotations']['description'] if alert['status'] == "firing": message += " @here" message += "\n" if 'name' in alert['labels']: message += "Instance: "+alert['labels'].get('instance', 'unknown')+"("+alert['labels']['name']+")\n" else: message += "Instance: "+alert['labels'].get('instance', 'unknown')+"\n" if 'info' in alert['annotations']: message += "Info: "+alert['annotations']['info']+"\n" if 'summary' in alert['annotations']: message += "Summary: "+alert['annotations']['summary']+"\n" if alert['status'] == "resolved": correctDate = parser.parse(alert['endsAt']).strftime('%Y-%m-%d %H:%M:%S') message += "Resolved: "+correctDate+"\n" elif alert['status'] == "firing": correctDate = parser.parse(alert['startsAt']).strftime('%Y-%m-%d %H:%M:%S') message += "Started: "+correctDate+"\n" message += "labels: \n" message += "```\n" labels = "" for l in alert['labels']: labels += l + " : "+alert['labels'][l] + "\n" message += labels + "```\n" res &= api.chat_post_message(message, channel=chatName, alias='Alertmanager').ok if res: return "Alert OK", 200 else: return "Alert fail", 200 except Exception as error: api.chat_post_message("Error to read json: "+str(error), channel=chatName, alias='Alertmanager') app.logger.info("\t%s",error) return "Alert fail", 200 if __name__ == '__main__': if len(sys.argv) == 1: logging.basicConfig(level=logging.INFO) app.run(host=listenIP, port=listenPort) else: from gevent.pywsgi import WSGIServer http_server = WSGIServer((listenIP, listenPort), app) http_server.serve_forever()