diff --git a/spug_api/apps/alarm/models.py b/spug_api/apps/alarm/models.py index 1fa175e..daab305 100644 --- a/spug_api/apps/alarm/models.py +++ b/spug_api/apps/alarm/models.py @@ -13,6 +13,7 @@ class Alarm(models.Model, ModelMixin): ('2', '短信'), ('3', '钉钉'), ('4', '邮件'), + ('5', '企业微信'), ) STATUS = ( ('1', '报警发生'), @@ -67,6 +68,7 @@ class Contact(models.Model, ModelMixin): email = models.CharField(max_length=255, null=True) ding = models.CharField(max_length=255, null=True) wx_token = models.CharField(max_length=255, null=True) + qy_wx = models.CharField(max_length=255, null=True) created_at = models.CharField(max_length=20, default=human_datetime) created_by = models.ForeignKey(User, models.PROTECT, related_name='+') diff --git a/spug_api/apps/alarm/views.py b/spug_api/apps/alarm/views.py index 834796d..9252fe8 100644 --- a/spug_api/apps/alarm/views.py +++ b/spug_api/apps/alarm/views.py @@ -60,6 +60,7 @@ class ContactView(View): Argument('email', required=False), Argument('ding', required=False), Argument('wx_token', required=False), + Argument('qy_wx', required=False), ).parse(request.body) if error is None: if form.id: diff --git a/spug_api/apps/monitor/scheduler.py b/spug_api/apps/monitor/scheduler.py index 21253f7..188ff4b 100644 --- a/spug_api/apps/monitor/scheduler.py +++ b/spug_api/apps/monitor/scheduler.py @@ -53,6 +53,8 @@ class Scheduler: spug.notify_by_dd(event, obj) elif mode == '4': spug.notify_by_email(event, obj) + elif mode == '5': + spug.notify_by_qy_wx(event, obj) def _handle_notify(self, obj, is_notified, out): if obj.latest_status == 0: diff --git a/spug_api/libs/spug.py b/spug_api/libs/spug.py index 04437e2..bb98865 100644 --- a/spug_api/libs/spug.py +++ b/spug_api/libs/spug.py @@ -89,3 +89,28 @@ def notify_by_dd(event, obj): requests.post(url, json=data) else: Notify.make_notify(notify_source, '1', '发送报警信息失败', '未找到可用的通知对象,请确保设置了相关报警联系人的钉钉。') + + +def notify_by_qy_wx(event, obj): + _, u_ids = _parse_args(obj.grp) + users = set(x.qy_wx for x in Contact.objects.filter(id__in=u_ids, qy_wx__isnull=False)) + if users: + color, title = ('warning', '监控告警通知') if event == '1' else ('info', '告警恢复通知') + texts = [ + f'## {title}', + f'**告警名称:** {obj.name} ', + f'**告警时间:** {human_datetime()} ', + f'**告警描述:** {obj.out} ', + ] + if event == '2': + texts.append(f'**持续时间:** {obj.duration} ') + data = { + 'msgtype': 'markdown', + 'markdown': { + 'content': '\n'.join(texts) + '\n> 来自 Spug运维平台' + } + } + for url in users: + requests.post(url, json=data) + else: + Notify.make_notify(notify_source, '1', '发送报警信息失败', '未找到可用的通知对象,请确保设置了相关报警联系人的企业微信。') diff --git a/spug_web/src/pages/alarm/contact/Form.js b/spug_web/src/pages/alarm/contact/Form.js index f475605..e888cf6 100644 --- a/spug_web/src/pages/alarm/contact/Form.js +++ b/spug_web/src/pages/alarm/contact/Form.js @@ -65,7 +65,12 @@ class ComForm extends React.Component { {getFieldDecorator('ding', {initialValue: info['ding']})( - + + )} + + + {getFieldDecorator('qy_wx', {initialValue: info['qy_wx']})( + )} diff --git a/spug_web/src/pages/alarm/contact/Table.js b/spug_web/src/pages/alarm/contact/Table.js index 46a453a..2bd5e3f 100644 --- a/spug_web/src/pages/alarm/contact/Table.js +++ b/spug_web/src/pages/alarm/contact/Table.js @@ -36,6 +36,10 @@ class ComTable extends React.Component { title: '钉钉', dataIndex: 'ding', ellipsis: true + }, { + title: '企业微信', + dataIndex: 'qy_wx', + ellipsis: true }, { title: '操作', render: info => ( diff --git a/spug_web/src/pages/monitor/Form.js b/spug_web/src/pages/monitor/Form.js index 89dc0e3..714d09c 100644 --- a/spug_web/src/pages/monitor/Form.js +++ b/spug_web/src/pages/monitor/Form.js @@ -29,7 +29,9 @@ class ComForm extends React.Component { {label: '微信', 'value': '1'}, {label: '短信', 'value': '2', disabled: true}, {label: '钉钉', 'value': '3'}, - {label: '邮件', 'value': '4'}] + {label: '邮件', 'value': '4'}, + {label: '企业微信', 'value': '5'}, + ] } } @@ -165,7 +167,8 @@ class ComForm extends React.Component { this.setState({showTmp: true})}>从模板添加}> - this.handleExtra('4', cleanCommand(e))}/> + this.handleExtra('4', cleanCommand(e))}/> {getFieldDecorator('desc', {initialValue: info['desc']})(