全部产品
云市场

方法追踪

更新时间:2019-01-07 11:45:00

简介

EDAS 方法追踪能够帮助您在应用运行时出现问题时,进行快速的问题排查,典型的场景包括:

  • 应用运行时突然发现执行某一个业务逻辑耗时很长,此时希望能够有一种方式定位运行时代码各个部分的耗时,以确定耗时点在什么地方。
  • 应用运行时一切正常,绝大部分情况下,业务运行都非常顺畅,但某一例用户反馈,当传入 XXX 参数时,业务响应非常缓慢。此时希望能够有一种方式针对特定的方法入参来观察代码执行情况。
  • 一个比较复杂的程序方法,其中业务逻辑较为复杂,在真正运行时,无法确定具体调用了那些逻辑,以及调用时序。此时希望能够有一种方式详细的展现出方法执行的具体逻辑、时序等。

此外,以上的任何一种场景,都希望代码无入侵,可以在应用运行时不停机的情况下,定位问题。

EDAS 方法追踪采用 JVM 字节码增强的技术,对选中方法的所有方法调用增加必要的耗时与调用序列记录的增强,从而达到观看执行过程中的具体执行序列的目的。

使用限制

以下限制项,如果确实影响您的业务或者排查场景,请提交工单,我们将针对某些限制进行改进或配置白名单。

  1. 原则上,只允许追踪业务的类,所以在正式开始追踪之前,会按照包名进行过滤。

  2. 为了防止方法调用次数太多而造成日志打爆的情况,我们在输出的过程中会进行采样输出,默认的策略为输出每秒进入该方法的十次调用。

  3. 当 EDAS 控制台重新进入或进行界面刷新之后,将无法获取历史的追踪记录,且之前已经被拉取的追踪信息将不再保留。

  4. 自动停止策略:进入未活跃状态十分钟后,EDAS 将自动卸载追踪模块,并将方法还原至初始状态(未增强之前)。

  5. 参数打印:目前 EDAS 只支持打印 Java 基本类型的输出(string, char, int, float, double, short, boolean)。

  6. 如选中的字符串输出过长,EDAS 将截取前 100 个字符进行输出。

  7. 在使用的过程中,如果发生了 JVM 实例重启的情况,需要重新启用追踪才能生效(先停止再启动)。

  8. 目前最多支持输出 10000 条追踪日志,达到 10000 条之后,需要重启追踪才能重新输出。

  9. 目前版本不支持通过 Docker 方式创建的应用。

环境检测

由于方法追踪功能运行时采用 JVM 字节码增强的技术实现,为保证应用的正常运行,在某些环境检测项目没有通过的情况下,此工具不能继续使用。

在使用之前,EDAS 会自动检查以下项目:

  1. Ali-Tomcat 的状态必须处于运行中
  2. CPU 利用率低于60%
  3. 空闲系统内存大于100M
  4. JVM PermGen 或 Metaspace 空闲空间大于20M。

如果上述检测项没有通过时,建议您处理完对应的告警项,再单击重试

使用指南

  1. 登录 EDAS 控制台

  2. 在左侧导航栏选择应用管理 > 应用列表,再在应用列表中单击需要检测的应用。

  3. 在应用详情页面左侧的导航栏中,单击应用诊断

  4. 在应用诊断页面中的单击方法追踪页签。

    说明:

    如没有看到方法追踪页签,请按如下步骤进行重试:

    1. 确认使用 Chrome 浏览器(目前只在 Chrome 下进行了官方测试),并强制刷新页面。

    2. 如果登录的账号为子账号,请确认主账号已经授予该账号的相应权限。

      权限项检查路径为:应用管理 > 应用诊断 > 方法追踪工具授权

  5. 在开始进行检测前,EDAS 会对应用所在机器进行环境检测,在环境检测的提示对话框中,勾选我确认上述条件,接受并继续。, 并单击确定使用开始环境检测。

    当所有项目检测通过后,将跳转至追踪页面。

  6. 设置追踪参数。

    注意类名方法名是必填项,在此处需要填入想追踪的类与方法。

    具体选项说明如下:

    • 类名:必填,需要填入以包路径开头的全路径名,如 com.test.alibaba.demo.HelloWorldServlet;同时,EDAS 不允许追踪以下的包路径开头的类:

      • java.*
      • javax.*
      • com.google.*
      • com.alibaba.*
      • com.aliyun.*
      • com.taobao.*
      • org.apache.*
      • org.dom4j.*
      • org.springframework.*
      • redis.clients.*

      当输入完整的包路径之后,EDAS 将向您所选择的机器上自动查询是否有该类存在。

      • 如果所输入的类存在,将在下拉显示区域自动显示该类。此时,您需要选中提示中的类以继续。
      • 如果所输入的类不存在,将在下拉显示区域将提示“该类不存在”。
    • 方法名:必填,当选择完相应的类名之后,系统将自动搜索对应类下的所有方法,并将在文本框的下方自动提示所获取到的方法列表。

      在显示界面中对应左边的小图标表示方法定义的修饰符,其中:

      • public: 绿色的锁
      • protected: 黄色的钥匙
      • private: 红色的锁
      • package: 蓝色的方块
      • abstract: 无图标

      在下拉提示的选择框中,选中您所需要追踪的方法后继续。

      • 仅异常追踪:方法的执行结果有两种情况:正常返回与发生了异常结束。“仅异常追踪”意思是仅仅当方法是异常结束的时候,才会将追踪的结果打印并输出。

      • 打印返回值:当勾选此选项时,将在结果输出界面打印方法的返回值。其中如果方法的返回类型是 void 时,将输出 null

    选中相应的方法之后,开始追踪按钮将变成蓝色,为可用状态。

  7. 单击开始追踪 ,将对选中的方法进行追踪,有调用经过此方法时,将在结果显示区域显示的调用情况。

    注意:在开始方法追踪之后, EDAS 将周期性的检测此方法追踪是否为活跃状态。如果发现在10分钟内为非活跃状态,EDAS 将自动停止方法追踪,将所追踪的方法还原至原始状态。

  8. 查看方法调用。

    当方法追踪开始之后,EDAS 将把产生的调用日志展示在 EDAS 控制台上,如下图所示:

    追踪结果

    显示区域的左边,为每一条记录即为每一次调用所产生的日志,其中:

    • 表格左边有 44-62/150 字样,意思是当前浏览器共获取了150条记录,当前只显示了行号为 44 - 62 的追踪记录。

    • 在表格的底部,提示 “请输入 h 键显示帮助信息”。输入后,可见到该区域使用的一些快捷键使用帮助:

      • h : 显示帮助文档
      • Ctrl + g: 实时展示所获取的最新数据,由于随着调用数量的越来越多,不可能把所有的记录都渲染出来并显示,Ctrl + g 类似于 tail 功能,每次有新的数据进来之后,都会显示最新获取的数据。
      • g: 跳转至某条记录:搜索某行号的追踪信息,并选中展示详情。
      • Ctrl + cESC:终止当前执行的命令
      • Ctrl + h: 向下翻页:每次向下翻十条追踪信息
      • Ctrl + l: 向上翻页:每次向上翻十条追踪信息
      • j: 选中下一条追踪信息
      • k: 选中上一条追踪信息
      • Enter 或者双击:放大或者还原选中的追踪信息

    显示区域的右边,为所选中记录的详情展示,详情页面可以双击/回车进行放大,放大之后可按 ESC 键还原至初始状态;这个页面只是一些基本的信息展示,其中:

    • 追踪详情:展示选中方法内部每一次方法调用的耗时及其执行序列,蓝色的耗时为执行此方法的总耗时,红色的耗时意味着此次方法调用占用了总耗时的 30% 以上。
    • 输出详情:展示输出执行过程中的异常、返回值、选中的输入参数(在表单的更多选项处选择)
    • 方法堆栈详情:展示调用被追踪方法之前的堆栈信息。
  9. 查看追踪方法源码。

    单击反编译,会获取当前追踪方法(所在的类)反编译后的源码(见下图)。

    单击方法追踪中每条调用信息的方法名(如图中 doPost),可以跳转至(调用)对应源码处。

    可以通过勾选/去勾选显示反编译源码来控制是否显示源码窗口。

    方法追踪-反编译

  10. 停止追踪。

    在方法追踪开始之后,开始追踪按钮将变成停止追踪 。单击停止追踪,EDAS 将被追踪的方法还原至初始状态(增强之前的状态),且 EDAS 将以机器为维度记录追踪信息,下次再次进入此页面之后,将预填上一次的追踪信息。

    在停止状态下,如果您修改某些项目(如追踪另外的方法)后,再次单击开始追踪后将按照最新的表单信息提交并继续。

快速预览

追踪结果