在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:prometheus-spring-boot-starter开源软件地址:https://gitee.com/ITEater/prometheus-spring-boot-starter开源软件介绍:一个异常通知的spring-boot-start框架 prometheus-spring-boot-starter更新预告2021-10-15 团队版准备更新到0.7.0-team,主要更新的是各个模块组件化,同时加入个人版中的微服务通知体系,目前代码进入测试阶段,readme暂时没有更新,有想帮忙更新的小伙伴可以留言https://gitee.com/ITEater/prometheus-spring-boot-starter/tree/team-0.7.0/ 前言的前言:2020-11-03更新(大更新)
2020-03-22更新(个人版更新)
2020-01-03更新(大更新)
2019-06-24更新
前言对于工程的开发,必然会伴随着各种bug,工程量越大,出现bug的概率也会越高。一般对于代码量较小的工程来说,一个人可能就足够去做开发与维护;但是对于代码量较大的工程往往是需要一个小团队协作开发。当工程基本完成,开始部署测试环境或者生产环境时,这些环境并不能像开发环境一样能快速的调试与维护,线上的工程一旦出现异常时,开发团队就需要主动感知异常并协调处理,当然人不能一天24小时去盯着线上工程,所以就需要一种机制来自动化的对异常进行通知,并精确到谁负责的那块代码。这样会极大地方便后续的运维。因此,本项目上线 系统需求当前版本最快上手
<dependency> <groupId>com.kuding</groupId> <artifactId>prometheus-spring-boot-starter</artifactId> <version>0.6.0-personal</version> </dependency>
prometheus: enabled: true dingding: enabled: true phone-num: - 要@的人的手机号 access-token: 钉钉通知的所给的url的后面的accessToken的参数的值 sign-secret: 钉钉的签名秘钥 enable-signature-check: true exceptionnotice: enabled: true included-trace-package: com.kuding
@Component@ExceptionListener // 异常通知的监控来自这个注解public class NoticeComponents { public void someMethod(String name) { System.out.println("这是一个参数:" + name); throw new NullPointerException("第一个异常"); } public void anotherMethod(String name, int age) { System.out.println("这又是一个参数" + age); throw new IllegalArgumentException(name + ":" + age); }}
@RunWith(SpringRunner.class)@SpringBootTestpublic class DemoApplicationTests { @Autowired private NoticeComponents noticeComponents; @Test public void contextLoads() { noticeComponents.someMethod("hello"); }} 当运行单元测试后,假如钉钉配置没有问题的话,你的钉钉中就会出现如下类似的消息:假如在你配置的钉钉中出现类似这个信息的化,恭喜你,你成功的产生了一个异常通知。
咋做的本框架遵循spring boot starter的自动化配置规范而开发的自动化异常通知框架,整体业务流程如下: 配置本框架配置主要分为4部分:
全局配置
prometheus: enabled: true project-enviroment: develop project-name: demo 具体说明如下:
全局配置主要分以上三项,主要用于表明工程的名称、环境与全局开关,工程所处环境分了如下几个:- dev:开发环境- test:测试环境- pre:预部署环境- release:正式环境- roll_back:回滚环境以上5种环境基本够用。
prometheus: exceptionnotice: enabled: true included-trace-package: com.havefun enable-async: true exclude-exceptions: - com.havefun.exceptions.TestException include-header-name: - tenant-id listen-type: web strategy: enabled: true frequency-type: showcount notice-show-count: 100# notice-time-interval: 2h
@RestController@RequestMapping("/demo")public class DemoController { @Autowired private DingdingNoticeService dingdingNoticeService; @Autowired private CustomService customService; @PostMapping("/dingding1/{pathParam}") @ExceptionListener public String dingding1(@PathVariable @ApiParam(value = "来个路径参数", required = true) String pathParam, @RequestParam @ApiParam(value = "来个参数", required = true) String param, @RequestHeader @ApiParam(value = "来个请求头", required = true) String headParam, @RequestBody @ApiParam(value = "来个请求体", required = true) String body) { dingdingNoticeService.dinding1(); return "Keep on going never give up."; } ...more code 具体效果如下:
prometheus.exceptionnotice.exclude-exceptions=java.lang.IllegalArgumentException,com.yourpackage.YourLogicException
一般而言,一个方法出现异常信息,意味着每当同样的方式进行调用时都会抛出相同的异常方法,放任不管的话,钉钉异常通知与邮件异常通知会重复的收到同一个异常,所以为了限制发送频率,默认情况下,某个方法出现的异常需要通知,那么这条通知每天只会出现一次。当然这样也可能会出现问题,假如邮件或钉钉信息没有收到,很可能会漏掉此通知,所以这里创造了一个通知的策略。
exceptionnotice.strategy.enabled=true
对应的配置为: exceptionnotice.strategy.frequency-type=timeout/showcount
基本上以上策略足够使用,假如说还有更好的配置策略可以连系我 通知配置
prometheus: dingding: enabled: true phone-num: - 钉钉通知人的手机号 access-token: 钉钉机器人的手机号 sign-secret: 钉钉机器人秘钥 enable-signature-check: true dingding-text-type: markdown
开启签名验证时,需要在钉钉机器人的安全设置中选中加签设置:
spring: mail: host: smtp.xxx.com port: 25 username: 开启smtp权限的邮箱用户名 password: 密码prometheus: email: enabled: true email-text-type: text to: - 发给谁 bcc: - 秘密抄送给谁 cc: - 抄送给谁
外援配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 加入依赖后开始配置邮件信息 spring: mail: host: smtp.xxx.com port: 25 username: 开启smtp权限的邮箱用户名 password: 密码
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 注解
自定义Config
@FunctionalInterfacepublic interface INoticeSendComponent<T extends PromethuesNotice> { public void send(T notice);}
配置好以后需要加入到现有的配置体系中,所以需要增加一个spring的config配置并实现 @Configurationpublic class CustomSendComponentConfig implements ExceptionSendComponentConfigure { @Autowired private MySendExceptionComponent mySendExceptionComponent; @Override public void addSendComponent(ExceptionHandler exceptionHandler) { exceptionHandler.registerNoticeSendComponent(mySendExceptionComponent); }} 这样,自定义的消息通知系统就可以通过 @PutMapping("/custom") @ExceptionListener("Tom") public String custom() { customService.custom(); return "Whatever is worth doing is worth doing well."; }//2020-01-03 20:30:46.480 ERROR 1576 --- [ometheus-task-1] c.h.components.MySendExceptionComponent : Tom-->[java.lang.NullPointerException:自定义通知第一个] 微服务监控通知前言因为我目前用的是社区版的consul注册中心,所以对于微服务的治理consul还可以过得去,问题在于加入说微服务在运行的过程中出现致命错误(堆栈溢出、服务中断等)或者连接的组件(数据库、mq等)出现问题时,作为我来说很难感知到。当然,微服务治理做的比较好的是需要花钱的(例如阿里云的EDAS)。因为有钉钉或者其他通知的接口,所以把微服务治理中服务的异常通知这一块就放在了这个工程中,同时把目前现有的功能组件化。这样也大大提高了各个组件间的协调能力。 咋做的一般而言微服务的治理往往需要另外一个微服务来进行处理,这个微服务主要是进行对注册中心中微服务进行手动的相关操作的(例如重启、注销等),所以,微服务监控通知也要在此微服务中导入。启动此服务的第一步会执行一个初始化的过程,先发现现有微服务中心中所有的微服务,结合配置信息,找出三类微服务相关的异常1. 服务缺失2. 服务实例数量不够3. 服务健康检查不通过将以上三类异常服务信息进行搜集并利用 配置prometheus: enabled: true project-enviroment: develop dingding: enabled: true phone-num: 15129072758 access-token: sign-secret: enable-signature-check: true service-monitor: auto-discovery: true enabled: true service-check-notice-interval: 3m service-exist-check-interval: 3m monitor-services: have-fun: service-count: 3 health-check-url: /actuator/health health-check-headers: test: - aaa check-interval: 2m enabled: true 以上就是全部的异常通知配置,通知相关配置在上文有讲过,这里说一下
以上就是服务监控的所有配置 TODO 还没写完,微服务监控后面再写 |
请发表评论