深入浅出Prometheus:原理、应用、源码与拓展详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 应用程序监控(APM)

APM 主要是针对应用程序的监控,包括应用程序的运行状态监控、性能监控、日志监控及调用链跟踪等。调用链跟踪是指追踪整个请求过程,从用户发送请求(通常指浏览器或者应用客户端)到后端API服务,以及API服务和关联的中间件或者其他组件之间的调用,构建出一个完整的调用拓扑结构。不仅如此,APM还可以监控组件内部方法的调用层次(Controller→Service→DAO),获取每个函数的执行耗时,从而为性能调优提供数据支撑。

如图1-4所示为Pinpoint官网提供的调用链跟踪示例。

图1-4

从图1-4可以看出,一个用户的请求,首先到达Tomcat内的前端服务,前端服务使用 Memcached 缓存获取常用数据,然后调用另一个 Tomcat 内的后端服务,最终到达数据库,在每条连接线上都显示了请求相应的耗时,简单直观。通过Pinpoint的拓扑图,不仅可以获取整个应用的组件调用关系,还可以获取每个组件相应的耗时。应用监控工具除了有Pinpoint,还有Twitter开源的Zipkin、美团开源的CAT等,国内的商业化APM厂商有听云、OneAPM等。

通过APM除了可以截获方法调用,还可以截获TCP、HTTP网络请求,从而获得执行耗时最长的方法和SQL语句、延迟最大的API等信息。商业化的SaaS APM还能够提供全国甚至全球的模拟请求测试,这主要是利用分布在各地的测试节点模拟用户的请求,获取相应的耗时,例如一个网站在北京和广州的访问分别延迟多久。

如图1-5所示是宜信开源的 UAVstack监控系统,它通过 MOF中间层增强框架结合JAVA Agent的字节码修改技术,修改Tomcat等其他核心处理类,达到截获请求的目的,从而获取每次请求的执行耗时及调用层次。

图1-5

UAVStack会在每个应用容器环境中都部署一个监控代理程序(MonitorAgent),同时在每个 JEE 中间件、JSE 应用或者其他 JVM 语言应用程序中都植入监控探针(MonitorFramework,MOF),随JVM进程一同启动。

监控探针通过自我发现机制来绘制各应用服务之间的服务图谱,获取应用对外提供的服务组件(Rest、Servlet、WebService、Dubbo等)、客户端组件(JDBC、HttpClient、Redis、MQ等),以及输出的日志组件和调用链信息。

监控代理程序会定时拉取监控探针的数据、日志和调用链。此外,监控代理程序也会采集应用容器环境的系统指标(如 CPU、内存等),通过统一的归集机制将数据推送给后台服务。

数据后台整合处理业务指标、日志指标、调用链指标、应用环境指标、应用集群指标、服务组件指标、线程栈和客户端体验数据等,形成全维度的指标。最终,用户可以在计算机上查看各指标的图表,也可以在平板计算机或手机上查看,实现移动运维。

上述监控系统在实现上有重叠的部分,应用监控也需要关心应用所在宿主机的状况,所以和主机监控也有所重叠。

一个好的监控系统需要聚合多个关联指标,在企业选型和落地的时候需要一种完善的解决方案,以避免重复采集指标及资源浪费;并且在部署的时候需要严格控制采集器(Agent)的资源使用大小,以避免因为采集器本身的问题(如Bug、死锁等)影响业务的正常运行,这就得不偿失了。

我们通常的做法是将采集器运行在容器内,并且通过容器限制采集器对CPU和内存的使用;然后需要对采集器做一些安全方面的检测和加固,以避免存在安全漏洞和安全隐患。