对于互联网公司。监控就像自己的眼睛,没有眼睛的人,面临的灾难可想而知,所谓无监控不调优,目前的监控总共分几类:
一类 服务级别监控:(服务是否可用,磁盘是否足够,cpu是否高)这个创业公司都是直接用云的赋能服务,目前简单的监控,容器化后,k8s帮我做了很多
二类 业务级别监控:(QPS、RT、失败比例、错误日志等)业务级别的监控,一般大的公司都有针对自己的特点对开源框架的组合。之前公司采用的是:
监控埋点日志->KAFKA->influshdb-> 前端grafana展示 。
目前创业公司,时间和资源有限,就在考虑一种简单的能快速上线的方案。下面采用的就是简单的基于钉钉的监控:
首先平时一直在用钉钉,比较赞的地方,钉钉提供了非常方便可以定义的钉钉机器人,可以通过webhook方式推送消息和格式。
具体可参考: https://open-doc.dingtalk.com/docs/doc.htm?treeId=257&articleId=105735&docType=1
具体实现:
简单版本实现: 通过每个服务接口异常进行捕获,对异常消息进行处理同时采用线程池(单线程:纯内存操作不是IO操作)方式推送消息到本地队列,队列限制大小(可配置),避免无限制推送
然后推送模块定时按一定频率(可配置)获取消息。然后推送消息到钉钉机器人。引入方式各个服务接入jar
后续版本扩展:
是否可以同样多种推送方式(邮件、短信、钉钉)
是否支持多种存储消息方式(内存队列、MQ、Redis)
是否可以接入简单的统计(方法执行时间、方法访问量、超时告警等)
1、整体流程
2、实现细节(Spring boot接入)
具体源码就不公开了
1、利用spring boot的自动注入功能。在spring.factories 中增加启动注入
2、利用ConditionalOnProperty注解中增加配置 只有注解启用时候才会加载成功
@Configuration @EnableConfigurationProperties(DingtalkProperties.class) @ConditionalOnProperty(value = "monitor.alert.dingtalk.enble",havingValue ="true")
3、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等 |
可自定义修改 |
4、接入方式(jar包引入)
告警通知需要满足条件:
- @AccessService注解的类或方法中抛出的异常
- 配置文件中启用了监控(即enable:true)
5、通知效果