美文网首页
APM Server端Java探针调研

APM Server端Java探针调研

作者: 麦芽maiya | 来源:发表于2020-08-24 13:56 被阅读0次

    引用:https://www.jianshu.com/p/f74d0065d3bf

    一、需求

    Tomcat:

    (1)模块启动时间

    (2)模块交互耗时

    二、现状

    现代APM体系,基本都是参考Google的Dapper(大规模分布式系统的跟踪系统)的体系来做的。通过跟踪请求的处理过程,来对应用系统在前后端处理、服务端调用的性能消耗进行跟踪,关于Dapper的介绍可以看这个链接:http://bigbully.github.io/Dapper-translation/

    下面重点选5个比较有名的server端探针进行简单介绍:

    2.1 Pinpoint(开源)

    github地址:https://github.com/naver/pinpoint

    java领域的性能分析的开源项目,这个是一个韩国团队开源出来的,通过JavaAgent的机制来做字节码代码植入,实现加入traceid和抓取性能数据的目的。

    NewRelic、Oneapm之类的工具在java平台上的性能分析也是类似的机制。

    2.2 Zipkin(开源)

    官网:OpenZipkin · http://zipkin.io/

    github地址:https://github.com/openzipkin/zipkin

    这个是twitter开源出来的,也是参考Dapper的体系来做的。

    Zipkin的java应用端是通过一个叫Brave的组件来实现对应用内部的性能分析数据采集。

    Brave的github地址:https://github.com/openzipkin/brave

    这个组件通过实现一系列的java拦截器,来做到对http/servlet请求、数据库访问的调用过程跟踪。

    然后通过在spring之类的配置文件里加入这些拦截器,完成对java应用的性能数据采集。

    2.3 CAT(开源)

    github地址:https://github.com/dianping/cat

    这个是大众点评开源出来的,实现的功能也还是蛮丰富的,国内也有一些公司在用了。

    不过他实现跟踪的手段,是要在代码里硬编码写一些“埋点”,也就是侵入式的。

    这样做有利有弊,好处是可以在自己需要的地方加埋点,比较有针对性;坏处是必须改动现有系统,很多开发团队不愿意。

    2.4 NewRelic(闭源,代码不混淆)

    https://newrelic.com/java

    2.5 听云(闭源,代码混淆)

    http://www.tingyun.com/tingyun_server.html

    探针能力介绍:http://doc.tingyun.com/server/html/phpzhichiliebiao.html

    三、探针能力汇总

    3.1 支持

    (1)应用运行环境:PHP, Java, .NET,Node.js, Python,Ruby等

    (2)云:阿里云、腾讯云、AWS、金山云、青云、华为云等

    (3)Database:MySQL, Oracle, MS SQL Server, PostgreSQL等

    (4)Framework:Spring, Yii,Django,Tomcat,JBoss,WebLogic等

    (5)NoSQL:Memcached,MongoDB,Redis等非关系型数据库服务

    (6)API:监控HTTP、Dubbo、Thrift协议下当前应用调用的外部服务,如微博、微信第三方API接口等,并支持跨应用分析

    3.2 核心功能

    (1)web应用过程:分析url调用过程中性能消耗原因,抓取超过阈值url的详细数据

    (2)数据库性能:支持多种数据库类型的监测,定位并追踪慢SQL语句问题

    (3)错误分析:记录错误发生时的详细信息,统计应用错误率,定位问题具体至代码行

    (4)外部API调用:可以监测所有服务端应用外部调用API的耗时,并进行汇总统计

    (5)线程剖析:可以实现生产环境下实时在线的线程剖析,可在运行时了解代码性能

    (6)NoSQL分析:实时监控Memcache, MongoDB,Redis等NoSQL数据库的性能问题

    (7)JVM性能:实时监控 JVM 运行状态,通过图表展示 JVM 内存分配情况、内存使用情况、垃圾收集信息、类加载数量、JVM 线程信息以及会话信息。

    (8)HTTP 会话:分析每个应用程序的 HTTP 会话数,包括:活跃、过期、拒绝的会话。

    四、详细介绍(只关注能解决需求的部分)

    用竞品的server探针监控Tomcat+Spring MVC的demo。在demo里只实现了path=/hello/hello的GET请求。如下:

    这里写图片描述

    以下是使用听云和NewRelic分别监控到的Tomcat接收GET请求后的调用追踪及其耗时。

    4.1 听云

    慢事务追踪

    这里写图片描述

    这里写图片描述

    4.2 NewRelic

    慢事务追踪

    这里写图片描述

    这里写图片描述

    4.3 监控 Tomcat 中 Java 应用的主要特点

    监视分布式应用程序的跨应用程序追踪

    将主要业务轨迹的关键业务进行拓扑分析

    用性能剖析分析方法调用栈轨迹

    五、Server探针Demo SDK

    (1)监控功能:模块交互耗时

    监测Tomcat + Spring MVC搭建的服务,当后端收到“GET http://localhost:8080/hello/hello”请求时,HelloController模块的printHello的调用耗时。

    printHello调用如下,里面人为增加2s延迟。

    这里写图片描述

    (2)Server探针功能:

    监控模块的函数调用耗时

    (3)Server探针实现方式:

    通过JVM的JavaAgent的机制来做字节码代码,在目标模块的函数调用前后打点。

    代码行数:1270行

    实现时间:一天

    NewRelic代码行数:8w行

    (4)实验结果:

    这里写图片描述

    六、调研结论

    目前竞品(NewRelic、听云)的方案能满足需求。

    有可参考的竞品:NewRelic,虽然不开源,但代码反编译后未混淆,可以基本读懂。

    相关文章

      网友评论

          本文标题:APM Server端Java探针调研

          本文链接:https://www.haomeiwen.com/subject/ohlvjktx.html