一个监控系统要监控些什么?


从粒度上,从小到大可以列出:一两行代码、一个方法、一个服务接口、一个服务的调用链、一个应用服务(应用端口、jvm的cpu和内存占用等)、硬件(cpu、网卡、硬盘等)。

对方法的监控,可以扩展到对http链接/连接池的监控、对数据库连接/连接池的监控、对其它服务的调用等。

对一两行代码进行监控,不可避免的要侵入到被监控端。对方法、服务接口的监控,可以利用在适当位置织入AOP的切面。一个服务的调用链,则对服务的调用双方都有***。对应用、硬件的监控,和应用本身脱钩,但是对服务器有***。


从监控方法上,可以在被监控端注入agent、可以监控日志、可以用JMX工具、可以在服务器上跑脚本,等等。

注入agent需要注意性能和健壮性、可扩展性。不能因为agent而影响到被监控者的性能、功能;也不能因为监控系统增加了新的监控功能,而使得旧的agent无法正常运行。

监控日志虽然不需要直接侵入被监控者的代码,但是通常都要求被监控者按一定规则输出日志。这是另一种形式的代码***。另外,日志监控会有一定的延迟和不可靠性。例如,如果一段时间内都没有日志,监控系统如何判断此时是没有业务调用,还是应用已经OOM了?

JMX工具提供的是标准接口,除了JVM之外,应该还可以监控一些内存中的实时数据。服务器脚本方面,对开发人员来说可能会涉及一些学习成本。


除了监控外,监控系统还需要具备报警和统计分析功能。

报警功能一定要保证实时性和可靠性。

统计分析功能要小心数据库的增长。