热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BTrace:Java开发人员工具箱中的隐藏宝石

这篇文章是关于BTrace的,我正在考虑将其作为Java开发人员的隐藏宝藏。BTrace是用于Java平台的安全,动态跟踪工具。BTrace可用于动态跟
这篇文章是关于BTrace的 ,我正在考虑将其作为Java开发人员的隐藏宝藏。 BTrace是用于Java平台的安全,动态跟踪工具。 BTrace可用于动态跟踪正在运行的Java程序(类似于DTrace,适用于OpenSolaris应用程序和OS)。

不久,该工具允许注入跟踪点,而无需在运行时重新启动或重新配置Java应用程序。 而且,尽管有多种方法可以做到这一点,但我今天要讨论的方法是使用标准JDK捆绑包中的JVisualVM工具。

太酷了, BTrace本身使用Java语言定义注入跟踪点。 如果您曾经进行过面向方面的编程(AOP),则该方法看起来非常熟悉。

因此,让我们开始一个问题:我们有一个使用NoSQL数据库之一(例如,让它成为MongoDB)的应用程序,突然开始出现明显的性能下降。 开发人员怀疑应用程序运行过多的查询或更新,但不能自信地说。 BTrace在这里可以提供帮助。

首先,让我们运行JVisualVM并安装BTrace插件:

JVisualVM应该重新启动以使插件出现。 现在,当我们的应用程序启动并运行时,让我们在JVisualVM应用程序树中右键单击它:

将出现以下非常直观的BTrace编辑器(带有简单的工具栏):

在这里可以定义跟踪工具并将其动态注入正在运行的应用程序中。 BTrace有一个非常丰富的模型来定义应该精确跟踪的内容:方法,构造函数,方法返回,错误等。 它还支持开箱即用的聚合,因此在应用程序运行时很容易收集大量指标。 对于我们的问题,我们想查看与MongoDB相关的哪些方法正在执行。

当我的应用程序使用Spring Data MongoDB时 ,我对应用程序正在调用org.springframework.data.mongodb.core.MongoOperations接口的任何实现的方法以及每次调用需要多长时间感兴趣。 所以我定义了一个非常简单的BTrace脚本:

import com.sun.btrace.*;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;@BTrace
public class TracingScript {@TLS private static String method;@OnMethod(clazz = '+org.springframework.data.mongodb.core.MongoOperations', method = '/.*/')public static void onMongo( @ProbeClassName String className, @ProbeMethodName String probeMethod, AnyType[] args ) {method = strcat( strcat( className, '::' ), probeMethod );}@OnMethod(clazz = '+org.springframework.data.mongodb.core.MongoOperations', method = '/.*/', location = @Location( Kind.RETURN ) )public static void onMongoReturn( @Duration long duration ) {println( strcat( strcat( strcat( strcat( 'Method ', method ), ' executed in ' ), str( duration / 1000 ) ), 'ms' ) );}
}

让我简要解释一下我在做什么。 基本上,我想知道何时调用org.springframework.data.mongodb.core.MongoOperations的任何实现的任何方法( onMongo标记)和调用持续时间( onMongoReturn依次标记)。 线程局部变量方法保存完整的合格方法名称(带有类),而由于使用了有用的BTrace预定义注释, duration参数保存了方法执行时间(以纳秒为单位)。 尽管它是纯Java,但BTrace仅允许使用Java类的一小部分。 这不是问题,因为com.sun.btrace.BTraceUtils类提供了许多有用的方法(fe, strcat )来填补空白。 运行此脚本将产生以下输出:

** Compiling the BTrace script ...
*** Compiled
** Instrumenting 1 classes ...
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 25ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 3ms
Method org.springframework.data.mongodb.core.MongoTemplate::getDb executed in 22ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 19ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 3ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::getDb executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 6ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 0ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::getDb executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 6ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 1ms
Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 0ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 2ms
Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 1ms
...

如您所见,输出包含一堆内部类,可以通过提供更精确的方法名称模板(或者甚至可以跟踪MongoDB驱动程序)来消除它们。

我才刚刚开始发现BTrace,但是使用该功能强大的工具对开发人员来说, 无疑是很有价值的。

参考: BTrace:我们的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上的Java开发人员工具箱中的隐藏宝石 。


翻译自: https://www.javacodegeeks.com/2012/08/btrace-hidden-gem-in-java-developer.html



推荐阅读
author-avatar
手机用户2502928627
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有