From 39a8670647c590930f55819ea332f13f88ee099d Mon Sep 17 00:00:00 2001 From: shenyang Date: Wed, 9 Mar 2022 14:10:18 +0800 Subject: [PATCH] add dingtalk and aiops alert --- elastalert/alerts.py | 86 +++++++++++++++++++++++++++++++++++++++++++ elastalert/loaders.py | 4 +- 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/elastalert/alerts.py b/elastalert/alerts.py index f2f31853f..58d1133af 100644 --- a/elastalert/alerts.py +++ b/elastalert/alerts.py @@ -2184,3 +2184,89 @@ def get_info(self): 'type': 'hivealerter', 'hive_host': self.rule.get('hive_connection', {}).get('hive_host', '') } + +class DingTalkAlerter(Alerter): + + required_options = frozenset(['dingtalk_webhook', 'dingtalk_msgtype']) + + def __init__(self, rule): + super(DingTalkAlerter, self).__init__(rule) + self.dingtalk_webhook_url = self.rule['dingtalk_webhook'] + self.dingtalk_msgtype = self.rule.get('dingtalk_msgtype', 'text') + self.dingtalk_isAtAll = self.rule.get('dingtalk_isAtAll', False) + self.digtalk_title = self.rule.get('dingtalk_title', '') + + def format_body(self, body): + return body.encode('utf8') + + def alert(self, matches): + headers = { + "Content-Type": "application/json", + "Accept": "application/json;charset=utf-8" + } + body = self.create_alert_body(matches) + payload = { + "msgtype": self.dingtalk_msgtype, + "text": { + "content": body + }, + "at": { + "isAtAll":False + } + } + try: + response = requests.post(self.dingtalk_webhook_url, + data=json.dumps(payload, cls=DateTimeEncoder), + headers=headers) + response.raise_for_status() + except RequestException as e: + raise EAException("Error request to Dingtalk: {0}".format(str(e))) + + def get_info(self): + return { + "type": "dingtalk", + "dingtalk_webhook": self.dingtalk_webhook_url + } + pass + +class AIOpsAlerter(Alerter): + + required_options = frozenset(['aiops_webhook', 'aiops_appid']) + + def __init__(self, rule): + super(AIOpsAlerter, self).__init__(rule) + self.aiops_webhook_url = self.rule['aiops_webhook'] + self.aiops_app_key = self.rule['aiops_appid'] + self.aiops_priority = self.rule.get('aiops_priority', 1) + + def format_body(self, body): + return body.encode('utf8') + + def alert(self, matches): + headers = { + "Content-Type": "application/json", + "Accept": "application/json;charset=utf-8" + } + body = self.create_alert_body(matches) + payload = { + "app": self.aiops_app_key, + "eventType": "trigger", + "eventId": "12345", + "alarmName": self.create_title(matches), + "alarmContent": body, + "priority": self.aiops_priority + } + try: + response = requests.post(self.aiops_webhook_url, + data=json.dumps(payload, cls=DateTimeEncoder), + headers=headers) + response.raise_for_status() + except RequestException as e: + raise EAException("Error request to aiops: {0}".format(str(e))) + + def get_info(self): + return { + "type": "aiops", + "aiops_webhook": self.aiops_webhook_url + } + pass diff --git a/elastalert/loaders.py b/elastalert/loaders.py index 771194768..87675efad 100644 --- a/elastalert/loaders.py +++ b/elastalert/loaders.py @@ -77,7 +77,9 @@ class RulesLoader(object): 'servicenow': alerts.ServiceNowAlerter, 'alerta': alerts.AlertaAlerter, 'post': alerts.HTTPPostAlerter, - 'hivealerter': alerts.HiveAlerter + 'hivealerter': alerts.HiveAlerter, + 'dingtalk': alerts.DingTalkAlerter, + 'aiops': alerts.AIOpsAlerter } # A partial ordering of alert types. Relative order will be preserved in the resulting alerts list