New Relic性能监控(二)应用监控APM

2018-04-12 琅琊书生

本系列文章基于公司使用New Relic的经验,鉴于国内较少有这方面的文章,因此把我工作中了解到的知识分享给大家,希望可以给需要的朋友带来帮助。

上期文章我们对New Relic的监控产品组成做了整体的介绍,今天我们主要来介绍下服务端应用监控产品New Relic APM。

什么是APM

APM全称是Application Performance Management,即应用程序性能监控。APM可以全方位监控系统运行状态,能够让我们获取详细的数据,包括系统响应时间,吞吐量,定位缓慢的事务,找到应用的瓶颈。

APM原理

New Relic APM目前支持以下七种语言: Ruby, Java, Node.js, PHP, .NET, Python, Go,有兴趣的朋友可以在官方网站查到如何启用New Relic APM。这里以java为例。New Relic提供了一个java agent的jar包。在应用程序启动时,指定加载该agent,并做好相应的设置,New Relic就可以监控你的java应用,并定期将收集到数据上报到New Relic的服务器。

可以看到,New Relic这种非侵入式的应用监控非常易于使用。事实上,除了Go语言之外,其他支持的六种语言都是以这种agent的方式实现监控。Go比较特殊。由于Go是编译成本地代码(不同于java的字节码之类有中间代码存在的语言),所以需要使用者使用New Relic提供的Go SDK,在代码中自行植入监控代码。

APM并不是一个新鲜的东西,早在很多年前就已经存在。那么是什么使得New Relic胜出呢?答案是Saas。近几年云计算的发展迅速,越来越多的应用正在开始以服务的方式提供。早先的APM使用非常不便,用户需要本地部署服务器用以存放数据,被监控的应用要保证正确的配置以便能够将数据上传;还需要组建数据分析团队,针对收集到的数据,结合应用的业务场景作出具体的分析工作。这些工作都要耗费很多的资源。New Relic把这一切简化,以服务的方式提供APM功能。用户只需要加载对应语言的agent,就能够自动监控应用,上报数据,分析结果等。所有的工作都有New Relic提供的工具来完成。

New Relic APM
图 1: New Relic APM工作模式

APM采集的数据分析

图二为New Relic上某一应用的APM主页。

New Relic APM Application
图2: 某一应用的APM页面

该页面分为两大块:左边的菜单栏和右侧的图表。
左边侧边栏分为三个组,分别为监控数据,事件和报告。

监控数据是New Relic收集到的数据汇总。New Relic可以检测到应用与其他服务之间的关联和依赖关系,包括数据库和外部依赖。这里有个非常重要的概念:事务(Transaction)。这里的事务并非是数据库事务,而是应用对一次请求的处理。从接到请求到响应处理完成的过程为称为一次事务。New Relic能够精确的监控到一次事务中耗费在各个阶段的时间。在图二中,黄色部分为数据库处理时间,浅蓝色为JVM中耗费的时间。通过这些数据我们能清楚的了解不同的事务在处理过程中的瓶颈所在。比如有的事务在数据库端要耗费大量时间,意味着有可能需要作优化查询。

New Relic还可以列出每个事务耗费的时间,图三为最为耗时的事务列表:

耗时的事务列表
图三:事务列表

各事务按所耗费的时间多少排序,让我们能够了解最为耗费时间的处理流程,寻找可以优化的区域。每一个事务都有非常详细的数据。图四为某一事务的详细时间话费统计。

精细的事务时间耗费统计
精细统计
图四:精细的事务时间耗费统计

图中可以看出,该事务在数据库查询操作上耗费了大量的时间(图中棕色部分)。而下方的表格则给出了具体的数据,数据库查询 Postgres xyf_size_offset select 是耗时最久的部分,占整个事务一半多的时间。那么整个应用所有的数据库操作在性能表现上是什么情况呢?图五就是这方面的统计。

Db Access
图五:数据库访问性能统计

我们发现,刚才的那个数据库操作不仅是那个事务中性能最差的,在所有的数据库操作中都是耗时最久的。
针对java应用,APM还提供JVM性能监控数据,包括内存使用,线程数等等。

告警

APM支持告警设置。用户可以设置监控指标和期望的性能表现。一旦指标在一定时间内未能达到要求,则自动发出告警。告警可以发送到邮箱或者其他一些即时通讯工具,使得运维人员能及时获知系统异常情况。

Alert
图六:告警

总结

New Relic APM使用方便,数据全面,数据展示详细,非常值得一试。


gougoujiang
6 声望1 粉丝

混过开发,搞过自动化,入坑DEVOPS;