同步操作将从 程序猿的游戏历险记/prometheus-spring-boot-starter 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
首先,本人很懒(orz),虽然说日常写完项目代码后是都需要进行相关代码段的测试的,但事与愿违,有很多情况你可能会忘了测试,或者测试了感觉没问题实际上问题没暴露(主观测试很容易让测试结果按照你的想法输出),然后把代码merge,然后提交到测试服务器,然后就去睡大觉了,第二天醒来以后,发现程序运行各种bug,这时候你就开始把前一天的代码重新拉出来开始看……等等,我先收集一下bug吧,然后打开服务器,打开输出日志……天哪,由于是测试服务器,你可能会开很多的日志(比如:sql日志,格式化了还带参数;接口调用日志等等等等),有可能某个同事由于闲的蛋疼,特意对于某个出错的功能试了十几遍……面对成千上万行的日志,针对性的找出相应的异常实在是一件令人头疼的事。所以就需要每当工程出异常了,直接通知我不就好了嘛?
ExceptionNoticeConfig
中aop的配置:exceptionNoticeAop(ExceptionHandler exceptionHandler)
的一个条件中添加了matchIfMissing = true
来保证默认情况下的aop对象的正常加载 @Bean
@ConditionalOnProperty(name = "exceptionnotice.enable-check-annotation", havingValue = "true", matchIfMissing = true)
@ConditionalOnMissingBean(ExceptionNoticeAop.class)
public ExceptionNoticeAop exceptionNoticeAop(ExceptionHandler exceptionHandler) {
ExceptionNoticeAop aop = new ExceptionNoticeAop(exceptionHandler);
return aop;
}
exceptionnotice.phone-num
和exceptionnotice.web-hook
,新版本改为exceptionnotice.dingding.phone-num
和exceptionnotice.dingding.web-hook
;同理邮件的配置前缀为exceptionnotice.email
exceptionnotice.phone-num
现在可以添加多个手机号了(逗号分隔)
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=***
(***表示某个包路径)即可
重要: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)
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配置
将本工程通过maven打包(maven install)到本地工程
再其他maven工程的pom.xml
文件中做如下配置
<dependency>
<groupId>com.kuding</groupId>
<artifactId>prometheus-spring-boot-starter</artifactId>
<version>0.2</version>
</dependency>
application.properties
中需要配置前缀为exceptionnotice
的相关属性写文档确实是很麻烦的一件事,后面会继续完善这个架子与文档orz
使用该框架后,假如啥东西配对了,一旦有异常出现,效果应该会是这个样子:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。