From 331372fe8715f452536cc85fea57fa58e7f9c204 Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Fri, 17 Dec 2021 21:37:46 +0800 Subject: [PATCH] =?UTF-8?q?[manager]=20=E5=91=8A=E8=AD=A6=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E9=82=AE=E4=BB=B6=E8=BD=AC=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manager/pom.xml | 5 ++ .../component/alerter/DispatchAlarm.java | 52 ++++++++++++++++++- .../manager/service/NoticeConfigService.java | 8 +++ .../service/impl/NoticeConfigServiceImpl.java | 16 ++++++ 4 files changed, 80 insertions(+), 1 deletion(-) diff --git a/manager/pom.xml b/manager/pom.xml index 6578dc0..d291aa6 100644 --- a/manager/pom.xml +++ b/manager/pom.xml @@ -83,6 +83,11 @@ ${mysql.version} + + + org.springframework.boot + spring-boot-starter-mail + io.springfox diff --git a/manager/src/main/java/com/usthe/manager/component/alerter/DispatchAlarm.java b/manager/src/main/java/com/usthe/manager/component/alerter/DispatchAlarm.java index 764c9e9..9345752 100644 --- a/manager/src/main/java/com/usthe/manager/component/alerter/DispatchAlarm.java +++ b/manager/src/main/java/com/usthe/manager/component/alerter/DispatchAlarm.java @@ -6,10 +6,17 @@ import com.usthe.alert.pojo.entity.Alert; import com.usthe.alert.service.AlertService; import com.usthe.common.util.CommonConstants; import com.usthe.manager.pojo.entity.Monitor; +import com.usthe.manager.pojo.entity.NoticeReceiver; import com.usthe.manager.service.MonitorService; +import com.usthe.manager.service.NoticeConfigService; import lombok.extern.slf4j.Slf4j; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Component; +import java.util.Date; +import java.util.List; + /** * 告警信息入库分发 * @author tom @@ -23,13 +30,18 @@ public class DispatchAlarm { private AlerterDataQueue dataQueue; private AlertService alertService; private MonitorService monitorService; + private NoticeConfigService noticeConfigService; + private JavaMailSender javaMailSender; public DispatchAlarm(AlerterWorkerPool workerPool, AlerterDataQueue dataQueue, + JavaMailSender javaMailSender,NoticeConfigService noticeConfigService, AlertService alertService, MonitorService monitorService) { this.workerPool = workerPool; this.dataQueue = dataQueue; this.alertService = alertService; this.monitorService = monitorService; + this.noticeConfigService = noticeConfigService; + this.javaMailSender = javaMailSender; startDispatch(); } @@ -86,8 +98,46 @@ public class DispatchAlarm { private void sendAlertDataListener(Alert alert) { // todo 转发配置的邮件 微信 webhook - + List receivers = matchReceiverByNoticeRules(alert); + // todo 发送通知这里暂时单线程 + for (NoticeReceiver receiver : receivers) { + switch (receiver.getType()) { + // todo 短信通知 + case 0: break; + case 1: sendEmailAlert(receiver, alert); break; + case 2: sendWebHookAlert(receiver, alert); break; + case 3: sendWeChatAlert(receiver, alert); break; + default: break; + } + } + } + private void sendWeChatAlert(NoticeReceiver receiver, Alert alert) { + + } + + private void sendWebHookAlert(NoticeReceiver receiver, Alert alert) { + + } + + private void sendEmailAlert(NoticeReceiver receiver, Alert alert) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setSubject("TanCloud探云-监控告警"); + message.setFrom("gongchao@tancloud.cn"); + message.setTo(receiver.getEmail()); + message.setSentDate(new Date()); + message.setText("探云TanCloud-监控告警\n" + + "告警目标对象: " + alert.getTarget() + "\n" + + "所属监控ID: " + alert.getMonitorId() + "\n" + + "所属监控名称: " + alert.getMonitorName() + "\n" + + "告警级别: " + alert.getPriority() + "\n" + + "告警详情: \n" + alert.getContent()); + javaMailSender.send(message); + } + + private List matchReceiverByNoticeRules(Alert alert) { + // todo 使用缓存 + return noticeConfigService.getReceiverFilterRule(alert); } diff --git a/manager/src/main/java/com/usthe/manager/service/NoticeConfigService.java b/manager/src/main/java/com/usthe/manager/service/NoticeConfigService.java index 838279d..e483d31 100644 --- a/manager/src/main/java/com/usthe/manager/service/NoticeConfigService.java +++ b/manager/src/main/java/com/usthe/manager/service/NoticeConfigService.java @@ -1,5 +1,6 @@ package com.usthe.manager.service; +import com.usthe.alert.pojo.entity.Alert; import com.usthe.manager.pojo.entity.NoticeReceiver; import com.usthe.manager.pojo.entity.NoticeRule; import org.springframework.data.jpa.domain.Specification; @@ -62,4 +63,11 @@ public interface NoticeConfigService { * @param ruleId 通知策略ID */ void deleteNoticeRule(Long ruleId); + + /** + * 根据告警信息与所有通知策略匹配,过滤出需要通知的接收人 + * @param alert 告警信息 + * @return 接收人 + */ + List getReceiverFilterRule(Alert alert); } diff --git a/manager/src/main/java/com/usthe/manager/service/impl/NoticeConfigServiceImpl.java b/manager/src/main/java/com/usthe/manager/service/impl/NoticeConfigServiceImpl.java index d66c0ae..569a03b 100644 --- a/manager/src/main/java/com/usthe/manager/service/impl/NoticeConfigServiceImpl.java +++ b/manager/src/main/java/com/usthe/manager/service/impl/NoticeConfigServiceImpl.java @@ -1,5 +1,6 @@ package com.usthe.manager.service.impl; +import com.usthe.alert.pojo.entity.Alert; import com.usthe.manager.dao.NoticeReceiverDao; import com.usthe.manager.dao.NoticeRuleDao; import com.usthe.manager.pojo.entity.NoticeReceiver; @@ -11,7 +12,10 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 消息通知配置实现 @@ -68,4 +72,16 @@ public class NoticeConfigServiceImpl implements NoticeConfigService { public void deleteNoticeRule(Long ruleId) { noticeRuleDao.deleteById(ruleId); } + + @Override + public List getReceiverFilterRule(Alert alert) { + // todo 使用缓存 + List rules = noticeRuleDao.findAll(); + // todo 暂时规则是全部转发 后面实现更多匹配规则:告警状态选择 监控类型选择等 + Set receiverIds = rules.stream() + .filter(item -> item.isFilterAll() && item.isEnable()) + .map(NoticeRule::getReceiverId) + .collect(Collectors.toSet()); + return noticeReceiverDao.findAllById(receiverIds); + } }