1 Star 0 Fork 218

lisc / prometheus-spring-boot-starter

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

一个异常通知的spring-boot-start框架 prometheus-spring-boot-starter

前言

首先,本人很懒(orz),虽然说日常写完项目代码后是都需要进行相关代码段的测试的,但事与愿违,有很多情况你可能会忘了测试,或者测试了感觉没问题实际上问题没暴露(主观测试很容易让测试结果按照你的想法输出),然后把代码merge,然后提交到测试服务器,然后就去睡大觉了,第二天醒来以后,发现程序运行各种bug,这时候你就开始把前一天的代码重新拉出来开始看……等等,我先收集一下bug吧,然后打开服务器,打开输出日志……天哪,由于是测试服务器,你可能会开很多的日志(比如:sql日志,格式化了还带参数;接口调用日志等等等等),有可能某个同事由于闲的蛋疼,特意对于某个出错的功能试了十几遍……面对成千上万行的日志,针对性的找出相应的异常实在是一件令人头疼的事。所以就需要每当工程出异常了,直接通知我不就好了嘛?

更新(重要)

  1. 修改了一些bug(dingdingAt字段的位置问题,注解拼写的问题),去除了ExexceptionNotice中的phoneNum字段(没有用)
  2. 新增邮件通知(详情参照下面的文档)
  3. 配置文件的结构改变(重要):钉钉相关配置之前有两个:exceptionnotice.phone-numexceptionnotice.web-hook,新版本改为exceptionnotice.dingding.phone-numexceptionnotice.dingding.web-hook;同理邮件的配置前缀为exceptionnotice.email
  4. 钉钉的配置exceptionnotice.phone-num现在可以添加多个手机号了(逗号分隔)
  5. 自定义配置NoticeSendComponent:现在可以自定义配置发送方式,只需要继承INoticeSendComponet接口即可:

import org.springframework.stereotype.Component;

import com.kuding.content.ExceptionNotice;
import com.kuding.message.INoticeSendComponent;

@Component
public class MyNoticeSendComponent implements INoticeSendComponent{

	@Override
	public void send(ExceptionNotice exceptionNotice) {
		// TODO 你自己的通知处理
	}	
}

如何做

整体流程如下图

架构

本框架遵循spring-boot-starter的配置原则通过ExceptionNoticeConfig来进行自动化配置,当然会有相应的配置类ExceptionNoticeProperty

(0.2版本),异常通知的方式目前有钉钉邮件两种

a). 钉钉的配置类为DingDingExceptionNoticeProperty,在application.properties中配置的前缀为exceptionnotice.dingding

b). 邮件的配置类为EmailExceptionNoticeProperty,在application.properties中的前缀为exceptionnotice.email

本架构核心类为ExceptionHandler,此类用于搜集被引用工程中的异常信息;搜集信息有两种方式,第一种方式是直接调用ExceptionHandler中的createNotice方法,例如在线程池中处理异常时:


	public class ThreadExceptionHandler implements AsyncUncaughtExceptionHandler {
	
		private final Log logger = LogFactory.getLog(getClass());
	
		@Autowired
		private ExceptionHandler exceptionHandler;
		@Autowired
		private CurrentTenantIdentifierResolverImpl currentTenantIdentifierResolver;
	
		@Override
		public void handleUncaughtException(Throwable ex, Method method, Object... params) {
			logger.error("线程错误" + method.getName(), ex);
			exceptionHandler.createNotice(ex,
					String.format("%s:%s", currentTenantIdentifierResolver.currentTenantId(), method.getName()), params);
		}
	
	}

重要:同一天内的相同方法抛出的相同异常每天只处理一次,当一天结束后,异常将会重新做处理

另外一种是通过@ExceptionListener注解的方式来进行使用,例如:

@Service
@Transactional
@ExceptionListener
public class ManagerTopUpStrategyService extends BaseService<ManagerTopUpStrategy, ManagerTopUpStrategyDao> {

	@Override
	protected Class<ManagerTopUpStrategy> getType() {
		return ManagerTopUpStrategy.class;
	}

}

通过注解的方式需要通过application.properties(或者在application.yml)将exceptionnotice.enable-check-annotation配置为true

在处理异常时,ExceptionHandler会将异常中的stackTrace的追踪信息按照包路径进行过滤,需要过滤的包路径可以在application.properties配置exceptionnotice.filter-trace=***(***表示某个包路径)即可

ExceptionHandler整理好相关的异常数据后,就可以通过实现INoticeSendComponent的相关类来进行通知了;

  • 钉钉通知的实现比较简单,只需要在application.properties添加如下配置:

exceptionnotice.notice-type=dingding

exceptionnotice.dingding.phone-num=手机号
exceptionnotice.dingding.web-hook=https://oapi.dingtalk.com/robot/send?access_token=.........

其中web-hook表示的是钉钉机器人的的地址, 至于钉钉如何配置钉钉机器人请点此链接:钉钉机器人

  • 邮件通知是基于spring-boot-starter-mail来实现的,所以需要用到spring boot的email相关配置,当然,你可能还需要开启邮箱的stmp服务。
spring.mail.host=smtp.163.com(各家的不一样)
spring.mail.username=登陆邮箱
spring.mail.password=密码
spring.mail.port=端口号(一般是25)
  • spring的email配置好后便可以配置邮件异常通知的相关配置了:

exceptionnotice.notice-type=email

exceptionnotice.email.from=发件人邮箱
exceptionnotice.email.to=收件人邮箱(复)
exceptionnotice.email.cc=抄送人邮箱(复)
exceptionnotice.email.bcc=秘密抄送人邮箱(复)

异常信息也可以做一层数据存储,存储的方式是Redis存储,redis需要spring-boot的redis自动化配置(自行查找相关配置),当然,也可以不开启redis存储。

异常的redis配置需要再application.properties中做如下配置

exceptionnotice.redis-key=存储的键
exceptionnotice.enable-redis-storage=是否开启redis配置

咋安装

  1. 将本工程通过maven打包(maven install)到本地工程

  2. 再其他maven工程的pom.xml文件中做如下配置

		<dependency>
			<groupId>com.kuding</groupId>
			<artifactId>prometheus-spring-boot-starter</artifactId>
			<version>0.2</version>
		</dependency>
  1. application.properties中需要配置前缀为exceptionnotice的相关属性

说在最后

  1. 写文档确实是很麻烦的一件事,后面会继续完善这个架子与文档orz

  2. 使用该框架后,假如啥东西配对了,一旦有异常出现,效果应该会是这个样子:

效果

  1. 邮箱的话应该是这个样子

效果2

空文件

简介

一个管理异常通知的神奇starter,实现了钉钉消息提醒与邮件提醒 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/scwork/prometheus-spring-boot-starter.git
git@gitee.com:scwork/prometheus-spring-boot-starter.git
scwork
prometheus-spring-boot-starter
prometheus-spring-boot-starter
master

搜索帮助