diff --git a/defaults/main.yml b/defaults/main.yml index da978c2..08428ae 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,5 +1,6 @@ prometheus_alertmanager: telegrambot: False + rocketchatbot: False args: "web.listen-address": "[::1]:9093" config: diff --git a/files/prometheus-rocketchat-bot.service b/files/prometheus-rocketchat-bot.service new file mode 100644 index 0000000..48102d0 --- /dev/null +++ b/files/prometheus-rocketchat-bot.service @@ -0,0 +1,14 @@ +[Unit] +Description=Sends alerts via rocketchat +After=network.target + +[Service] +ExecStart=/usr/local/bin/prometheus-rocketchat-bot.py PROD + +DynamicUser=yes +NoNewPrivileges=True +ProtectSystem=strict + +[Install] +WantedBy=multi-user.target + diff --git a/handlers/main.yml b/handlers/main.yml index 0c29ac6..185ec9f 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -8,3 +8,9 @@ enabled: True daemon_reload: True state: restarted +- name: restart rocketchat bot + service: + name: prometheus-rocketchat-bot + enabled: True + daemon_reload: True + state: restarted diff --git a/tasks/main.yml b/tasks/main.yml index f2083ff..1038c40 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -8,7 +8,7 @@ src: prometheus-alertmanager.j2 dest: /etc/default/prometheus-alertmanager -- name: wrtie alertmanager config +- name: write alertmanager config notify: restart alertmanager copy: owner: root @@ -27,7 +27,6 @@ - python3-dateutil - python3-gevent - python3-pip -# - python3-telegram-bot - pip: name: python-telegram-bot executable: pip3 @@ -46,3 +45,32 @@ dest: /etc/systemd/system owner: root group: root + +- name: setup rocketchat bot + when: prometheus_alertmanager.rocketchatbot + block: + - name: install dependencies + apt: + pkg: + - python3-flask + - python3-dateutil + - python3-gevent + - python3-pip + - pip: + name: rocketchat_API + executable: pip3 + - name: deploy rocketchat bot + notify: restart rocketchat bot + template: + src: rocketchat-bot.py.j2 + dest: /usr/local/bin/prometheus-rocketchat-bot.py + mode: 0755 + owner: root + group: root + - name: Copy systemd service file + notify: restart rocketchat bot + copy: + src: prometheus-rocketchat-bot.service + dest: /etc/systemd/system + owner: root + group: root diff --git a/templates/rocketchat-bot.py.j2 b/templates/rocketchat-bot.py.j2 new file mode 100755 index 0000000..4ff28af --- /dev/null +++ b/templates/rocketchat-bot.py.j2 @@ -0,0 +1,67 @@ +#!/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()) + for alert in content['alerts']: + message = "Status: "+alert['status']+"\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 'description' in alert['annotations']: + message += "Description: "+alert['annotations']['description']+"\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 + "```" + if api.chat_post_message(message, channel=chatName, alias='Alertmanager').ok: + return "Alert OK", 200 + else: + return "Alert fail", 200 + except Exception as error: + bot.sendMessage(chat_id=chatID, text="Error to read json: "+str(error)) + 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()