【监控报警体系建设】系统自动添加所有出入口监控
前情回顾
通过之前的两篇文章我们已经确定了监控与报警的标准
[【监控报警体系建设】监控标准与最佳实践]
[【监控报警体系建设】报警标准与最佳实践]
- 监控标准有了,但是开发人员的能力各有所长,不一定所有人都能做或会做
- 每次开发时都需要时时刻刻记着要在一个固定的位置添加监控,实在是太不程序员了
所以我们需要把这些固定需要添加监控的地方,自动生成监控。
哪些地方呢?
- 项目入口: 项目对外提供的http接口、dubbo接口
- 项目出口: 项目调用的RPC接口,包括http接口、dubbo接口、redis操作、数据库访问
怎么做呢?
- 由于我是java程序员,所以我依托于spring框架。
- 不管你是对外接口,还是调用rpc。都是需要一个spring bean去执行这些逻辑的。所以只要我们找到这些类,然后对这些对象加一个动态代理。就可以为这些操作都添加监控了
- 怎么找到这些类呢?看下面
dubbo接口
- dubbo中的提供者和消费者都是通过
ServiceBean和ReferenceBean去创建对应的接口的 - 所以在项目启动时通过spring的BeanPostProcessor接口,拦截这些bean即可
![在这里插入图片描述]()
HTTP入口
- 同理,http拦截controller和RequestMapping即可
![在这里插入图片描述]()
feign调用http
- 同理,feign拦截FeignClient
- 这里要说明的一点是,我只是拦截了feign的http请求。如果你的项目是通过netty,okhttp,jdk原生http,spring httpTemplate。等框架发送的http请求,这里是拦截不住的
- 但是你只要实现了对应框架的类,都是可以拦截到的(应该不会有人在自己的项目里使用多种不同的http发送实现吧)
![在这里插入图片描述]()
mybatis调用
- 同理,拦截MetricMapperFactoryBean(mybatis的代理创建工厂类)
- 但是这里不能直接创建监控代理,因为这是个工厂,工厂创建出来的对象才是真实的执行sql的对象,所以我们给工厂创建一个工厂拦截器代理。
- 当工厂创建一个mybatis的mapper对象实现时,我们再给这个mapper对象添加监控动态代理


redis调用
- 这里同mybatis代理一样,拦截的是redis连接的创建工厂
- 因此同样先创建一个工厂代理,由工厂代理再创建连接的监控代理

自动警告提示
- 不知道各位客官有没有遇到过系统突然运行卡顿,然后逐步排查,定位的过程
- 现在既然有了监控,那么当某项监控项超出一定数值后,自动在日志中增加警告级别的日志
key: dubbo_method_invoke ,tag: is invoke too long,time: 2300
- 在排查问题时非常实用
异常调用收集
- 系统日常运行过程中,可能会有很多调用失败的场景
- 在前面监控项的基础上可以自动收集调用失败的数据
- 自动添加 monitor_key_error 作为所有失败的 key,原 key 加原 tag 作为本次的 tag 即可
- 当数据收集到 grafana 上后,即可配置报警规则实现全面覆盖异常调用监控
大部分场景的自动监控就完成了
- 另外这些我都已经帮你写好了,并且上传到了github上。就叫监控包吧
- 下面是使用说明,如果对你有用。一定要回来关注我啊
- 我的微信公众号叫【无所事事D杂货铺】
![image.png]()
监控包使用说明
- 引入maven依赖
- spring扫描到com.wsss包,加载包内的类
监控配置和规则
- 引入包后,可以自动对RPC接口增加调用监控,默认是开启的,可以通过一下配置关闭
actuator.rpc.dubbo.enhance.enable:false dubbo监控开关
actuator.db.mybatis.enhance.enable:false mybatis监控开关
actuator.http.enhance.enable:false http监控开关
actuator.http.feign.enhance.enable:false feign监控开关
actuator.redis.template.enhance.enable:false redis监控开关
actuator.bean.definition.remove.enable:false 移除默认jvmThread监控
开关
- 监控key的生成规则为
- dubbo服务端:p_应用名_类名_方法名
- dubbo客户端:c_应用名_类名_方法名
- http接口:http_应用名_类名, tag:方法名
- mybatis:mybatis_mapper_应用名_类名, tag:方法名
- redis:redis_metrics_应用名, tag:方法名
- feign:feign_应用名_类名, tag:方法名
- 调用异常的key:monitor_key_error, tag:监控key_tag
- 注意事项
- 本监控包未将任何maven依赖传递下去,需要自行添加依赖
- dubbo监控仅测试过2.7.23版本,其他版本可能不兼容
- JDK8或JDK17请使用对应的版本
手动编码对要监控的点增加监控
// 耗时+计次监控
Monitor.TimeContext timeContext = Monitor.timer("key");
try {
// 业务操作
} catch (Exception e) {
// 错误率
timeContext.error();
log.error("downFromS3 error",e);
} finally {
timeContext.end();
}
// 计次监控,不传num默认为1
Monitor.counter("key").end(num);
Monitor.counter("key").end();
// 非静态方法,需要注入
monitor.gauge("key",Object,ToDoubleFunction)
注解方式加监控,仅限spring管理的bean
// key为class的simpleName+_+methodName
@TimerMonitor
public void test() {
}





浙公网安备 33010602011771号