对于互联网公司。监控就像本身的眼睛,没有眼睛的人,面临的灾难可想而知,所谓无监控不调优,目前的监控总共分几类:前端
一类 服务级别监控:(服务是否可用,磁盘是否足够,cpu是否高)这个创业公司都是直接用云的赋能服务,目前简单的监控,容器化后,k8s帮我作了不少web
二类 业务级别监控:(QPS、RT、失败比例、错误日志等)业务级别的监控,通常大的公司都有针对本身的特色对开源框架的组合。以前公司采用的是:spring
监控埋点日志->KAFKA->influshdb-> 前端grafana展现 。 api
目前创业公司,时间和资源有限,就在考虑一种简单的能快速上线的方案。下面采用的就是简单的基于钉钉的监控:app
首先平时一直在用钉钉,比较赞的地方,钉钉提供了很是方即可以定义的钉钉机器人,能够经过webhook方式推送消息和格式。框架
具体可参考: https://open-doc.dingtalk.com/docs/doc.htm?treeId=257&articleId=105735&docType=1url
具体实现:
简单版本实现: 经过每一个服务接口异常进行捕获,对异常消息进行处理同时采用线程池(单线程:纯内存操做不是IO操做)方式推送消息到本地队列,队列限制大小(可配置),避免无限制推送spa
而后推送模块定时按必定频率(可配置)获取消息。而后推送消息到钉钉机器人。引入方式各个服务接入jar线程
后续版本扩展:日志
是否能够一样多种推送方式(邮件、短信、钉钉)
是否支持多种存储消息方式(内存队列、MQ、Redis)
是否能够接入简单的统计(方法执行时间、方法访问量、超时告警等)
一、总体流程
二、实现细节(Spring boot接入)
具体源码就不公开了
一、利用spring boot的自动注入功能。在spring.factories 中增长启动注入
二、利用ConditionalOnProperty注解中增长配置 只有注解启用时候才会加载成功
@Configuration @EnableConfigurationProperties(DingtalkProperties.class) @ConditionalOnProperty(value = "monitor.alert.dingtalk.enble",havingValue ="true")
三、DingtalkProperties中配置参数
配置参数:
1 monitor: 2 alert: 3 dingtalk: 4 enble: true 5 phone: [xxxx,xxxx] 6 url: https://oapi.dingtalk.com/robot/send? access_token=
这样服务接入的时候更灵活,简单~
参数名 |
可选值 |
默认值 |
描述 |
示例 |
---|---|---|---|---|
enable |
true| false |
false |
true 启用 false 禁用 |
如上 |
phone |
手机号 |
无 |
通知人手机号,多我的用逗号隔开 |
如上 |
url |
url地址 |
无 |
通知的地址,必填项 |
如上 |
level |
short|full |
short |
通知信息是否缩短 short:通知内容最长500个字符 full:通知内容不作缩短 |
建议默认值 |
capacity |
整数 |
100 |
存储异常信息个数,超过阈值不进行推送 |
建议默认值 |
pull-interval |
整数 |
5000 |
报警时间间隔(ms) |
可自定义修改 |
at-all |
true| false |
false |
组内全部都会被通知 |
建议默认值 |
env |
字符串 |
Spring激活环境 |
dev|test|pro等 |
可自定义修改 |
applicationName |
字符串 |
Spring应用名称 |
order-service|user-service等 |
可自定义修改 |
四、接入方式(jar包引入)
告警通知须要知足条件:
- @AccessService注解的类或方法中抛出的异常
- 配置文件中启用了监控(即enable:true)
五、通知效果