最近在看公司的监控平台实现,大概做一个总结
从整个系统架构上来讲,分为Server和Client两层:
Server端
- 图形化显示
- 权限
包含不同产品,应用,集群,监控项配置等
- 报警等功能
包含某一项或多项监控项到达阈值时的短信/邮件等消息
Client端
- 消息发送
对收集的监控项发送到Server
- 信息采集
采集系统相关或业务相关信息
- 通用业务代理
包括对异常,日志,RPC调用,数据库调用等通用的接口/实现进行代理,实现采集功能扩展
因为看的是Client代码,所以主要对这块进行一个分析和总结。从技术上来说当数据已经采集到Server端后其实和普通的业务系统差别不大。
消息发送
- 目前使用BIO的长连接,当然可以考虑使用MQ,主要看是否有环境支持及开发效率
信息采集
当前将采集的信息分为两层,见下图:
举例:采集异常信息的时候可以分为ExceptionCollector,内部可以分不同的Exception类型或日志类型做为Aggregator。
通用业务代理
通过Javassist动态代理类对常用的工具/类进行扩展,比如代理的Log4j日志采集,dubbo注册实现代理等。
这里的需要对被代理的工具/类源码有非常深刻的了解。
当系统启动时会通过java.lang.instrument包实现用代理后的类代替掉JVM中原始类
java.lang.instrument.Instrumentation基本功能和用法:
http://blog.csdn.net/yczz/article/details/51656386
启动应用是添加的代理:
反编译后结果:
执行初始化:
总结:
当然这只是宽泛的总结,真正在实现的时候还有很多坑要踩。