“ arthas是一个Java开源诊断神器。

今天分享一个非常重要的命令trace,官网定义这个方法的功能如下:方法内部调用路径,并输出方法路径上的每个节点上耗时 trace命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

trace一些高级用法也是离不开ognl语法支持,有兴趣的童鞋可以多去研究研究ognl的语法。trace对于lambda表达式支持不好。

效果展示

[arthas@71728]$ trace com.fun.frame.httpclient.FanLibrary getHttpResponse

Press Q or Ctrl+C to abort.

Affect(class-cnt:2 , method-cnt:1) cost in 107 ms.

`---ts=2020-05-16 14:38:18;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@14dad5dc

`---[49.749941ms] com.fun.frame.httpclient.FanLibrary:getHttpResponse()

+---[0.100454ms] com.fun.frame.httpclient.FanLibrary:isRightRequest() #322

+---[0.732549ms] com.fun.frame.httpclient.FanLibrary:beforeRequest() #323

+---[0.014092ms] com.alibaba.fastjson.JSONObject:() #324

+---[0.107529ms] com.fun.base.bean.RequestInfo:() #325

+---[0.014428ms] com.fun.utils.Time:getTimeStamp() #327

+---[39.088784ms] org.apache.http.impl.client.CloseableHttpClient:execute() #328

+---[0.007822ms] com.fun.utils.Time:getTimeStamp() #329

+---[0.027006ms] com.fun.frame.httpclient.FanLibrary:getStatus() #332

+---[0.037918ms] com.fun.frame.httpclient.FanLibrary:afterResponse() #333

+---[0.548651ms] com.fun.frame.httpclient.FanLibrary:getContent() #334

+---[1.198112ms] com.fun.frame.httpclient.FanLibrary:getJsonResponse() #336

+---[0.030268ms] com.alibaba.fastjson.JSONObject:putAll() #336

+---[0.010035ms] com.fun.frame.httpclient.FanLibrary:getMark() #340

+---[1.491255ms] com.fun.db.mysql.MySqlTest:saveApiTestDate() #340

+---[0.01706ms] org.apache.http.client.methods.CloseableHttpResponse:close() #342

`---[0.655007ms] com.fun.base.bean.RequestInfo:isBlack() #348

arthas命令trace追踪方法链路

代码

package com.fun

import com.alibaba.fastjson.JSONObject

import com.fun.frame.httpclient.FanLibrary

import org.apache.http.client.methods.HttpGet

class sd extends FanLibrary {

public static void main(String[] args) {

while (true) {

String url = "https://api.apiopen.top/getAllUrl"

HttpGet get = getHttpGet(url)

JSONObject response = getHttpResponse(get)

output(response)

output(test())

sleep(5000)

}

testOver()

}

static String test() {

sleep(1000)

for (int i = 0; i < 5; i++) {

getRandomInt(100)

}

ArrayList list = Arrays.asList(32, 432, 432, 423, 423, 32)

list.stream().forEach({x -> output(x)})

DEFAULT_STRING

}

}

其中gethttpresponse()方法代码:

/**

* 获取响应实体

*

会自动设置cookie,但是需要各个项目再自行实现cookie管理

*

该方法只会处理文本信息,对于文件处理可以调用两个过期的方法解决

*

* @param request 请求对象

* @return 返回json类型的对象

*/

public static JSONObject getHttpResponse(HttpRequestBase request) {

if (!isRightRequest(request)) RequestException.fail(request);

beforeRequest(request);

JSONObject res = new JSONObject();

RequestInfo requestInfo = new RequestInfo(request);

if (HEADER_KEY) output("===========request header===========", Arrays.asList(request.getAllHeaders()));

long start = Time.getTimeStamp();

try (CloseableHttpResponse response = ClientManage.httpsClient.execute(request)) {

long end = Time.getTimeStamp();

long elapsed_time = end - start;

if (HEADER_KEY) output("===========response header===========", Arrays.asList(response.getAllHeaders()));

int status = getStatus(response, res);

JSONObject setCookies = afterResponse(response);

String content = getContent(response);

int data_size = content.length();

res.putAll(getJsonResponse(content, setCookies));

int code = iBase == null ? -2 : iBase.checkCode(res, requestInfo);

if (iBase != null && !iBase.isRight(res))

new AlertOver("响应状态码错误:" + status, "状态码错误:" + status, requestInfo.getUrl(), requestInfo).sendSystemMessage();

MySqlTest.saveApiTestDate(requestInfo, data_size, elapsed_time, status, getMark(), code, LOCAL_IP, COMPUTER_USER_NAME);

if (SAVE_KEY) FunRequest.save(request, res);

} catch (Exception e) {

logger.warn("获取请求相应失败!", e);

if (!requestInfo.isBlack())

new AlertOver("接口请求失败", requestInfo.toString(), requestInfo.getUrl(), requestInfo).sendSystemMessage();

} finally {

HEADER_KEY = false;

if (!requestInfo.isBlack()) {

lastRequest = request;

}

}

return res;

}郑重声明:“FunTester”首发,欢迎关注交流,禁止第三方转载。更多原创文章:Fhaohaizi@163.com。

热文精选

java 方法 链路 trace_arthas命令trace追踪方法链路相关推荐

  1. arthas使用示例:trace追踪方法调用路径及统计方法耗时

    介绍 参数说明 举例 总结

  2. java的jps命令怎么使用_jps命令的使用方法

    jps(Java Virtual Machine Process Status Tool) 是java提供的一个显示当前所有java进程pid的命令,适合在linux/unix平台上简单察看当前jav ...

  3. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

  4. Java学习第八天<什么是方法><方法的定义和调用><方法的重载><命令行传参><可变参数><递归详解>

    什么是方法 System.out.println(); 调用系统类里的标准输出对象(out)中的方法println public class Demo01 {//main 方法public stati ...

  5. Java虚拟机中获得Runtime实例的方法是什么?

    Runtime类用于表示Java虚拟机运行时的状态,它用于封装Java虚拟机进程.每次使用"java"命令启动Java虚拟机时都会对应一个Runtime实例,并且只有一个实例,应用 ...

  6. java如何用c 的方法_JAVA如何调用C/C++方法

    JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能.解决JAVA对本地操作的一种方法就是JNI. JAVA通过JNI调用本地方法, ...

  7. 将Java程序变成可执行文件的一个简单方法

    将Java程序变成可执行文件的一个简单方法 运行Java程序(SWING或SWT的桌面程序)可以直接执行.class文件或将所有的.class文件及相关的其他文件压缩成.jar文件,然后使用javaw ...

  8. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  9. Java Web项目中解决中文乱码方法总结

    一.了解常识: 1.UTF-8国际编码,GBK中文编码.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.web tomcat:默认是ISO8859-1,不 ...

最新文章

  1. 中级实训第一天的自学报告
  2. 阿里的“扫地僧”,2年“抄”了20万页古籍
  3. 安卓socks5代理客户端_内网Mysql代理浅析
  4. 能在xcode5中开发基于IOS7sdk的应用程序兼容ios4.3之后的系统吗?
  5. Android 开发笔记 ListView异步加载图片
  6. python 线程之threading(五)
  7. Leetcode1712. 将数组分成三个子数组的方案数[C++题解]:双指针和前缀和
  8. SQL Server 堆表行存储大小(Record Size)
  9. 四叶草社交平台——十天冲刺(4)
  10. Serverless 实战 —— 基于 Serverless 的 VuePress 极简静态网站
  11. java反射性能问题_Java反射应用实例java反射的性能问题 | 学步园
  12. SVN 安装与使用教程总结
  13. 45. 圆圈中最后剩下的数字
  14. Delphi运行期错误
  15. FREETYPE旋转功能初探
  16. 文本在线查重(Online Copy Detection)的实现
  17. 图形化——可视化在线绘图引擎
  18. TCP/UDP 协议格式
  19. 【学习记录——unity 3D】Stealth秘密行动游戏制作(一)
  20. android12.0(S) 通知栏不显示闹钟和静音图标 bug

热门文章

  1. 计算机专业兴趣小组 名字,信息技术兴趣小组
  2. java:为什么字符串比较时要用equals方法而不是==运算符
  3. 信息学奥赛一本通 1019:浮点数向零舍入 | OpenJudge NOI 1.2 06
  4. 信息学奥赛一本通(2034:【例5.1】反序输出)
  5. 信息学奥赛一本通(1062:最高的分数)
  6. 训练日志 2019.1.13
  7. Best Cow Line(POJ-3617)
  8. 44 SD配置-销售凭证设置-定义状态参数文件
  9. linux查看vnc进程命令_linux命令:VNC服务的配置及使用
  10. 文件md5码怎么生成_Linux 系统文件校验方法--MD5,SHA1,PGP,SHA256,SHA512