`
leadyu
  • 浏览: 51566 次
  • 性别: Icon_minigender_1
  • 来自: 广州,福州
文章分类
社区版块
存档分类
最新评论

Jwebap项目(四)——性能监控工具Jwebap: 0.5.8版本发布

阅读更多
一直想写一篇关于Jwebap(jwebap.sourceforge.net)项目的介绍文章,鉴于0.5.8版本的发布,我整理了下发表出来,希望大家感兴趣。

引用
背景
最初,在06年底由于要帮助几个大型项目进行性能上的优化,有了开发一个专用于profiling组件的想法,于是有了Jwebap,慢慢的到了07年6月份开始有了最初的方案,在11月终于在sourceforge上发布了第一个版本。

Jwebap能带来什么?
Jwebap是一个用于J2EE工程(EJB以及WebModule系统)进行性能监控的组件,它有几个特点:

1)基于ASM实现类的静态增强,可以无缝的部署于J2EE系统,对系统的开销几乎可以忽略

2)部署和使用非常的简单,整个Jwebap的部署只需要部署jwebap_core_**.jar以及需要使用的各种plugin_**.jar,然后配置jwebap.xml和web.xml就可以完成所有的部署,比起绝大多数的profiling容易的多。

同时Jwebap提供Web Console进行整个Jwebap的管理和数据展现。在API层提供一套默认的视图框架供plugin开发者使用,可以只用Jar包就开发出相当漂亮的Web界面。

3)Jwebap的开发分为两个部分Jwebap-core部分,Jwebap-plugin部分。core部分基于jdk14提供了类静态增强,轨迹生命管理,Plugin管理,视图框架等等,在这个基础上开发plugin。我觉得,好的profiling应该能够根据不同的人群按需使用,同时在功能不断复杂和强大的过程中仍然能够保证较轻的架子。

目前,0.5.8提供了基于jdk14的三个plugin:method监控,jdbc监控,http监控。这些可以算是基于plugin架构开发的示例。以后会开发更多的plugin,比如memory_monitor_plugin。甚至可以基于一些专属平台开发功能更强的插件。当然,Jwebap也可以不仅仅停留在profiling,日后,可以基于测试人员和质量保证,开发人员等方面开发适用的plugin,做到按需分配。


Jwebap的部署

Jwebap的部署相当简单,0.5.8版本提供了一个把plugin和core打在一起的包:jwebap_0.5.8_all.jar。然后对于jwebap.xml和web.xml的配置可以参看doc目录下的User-Guide。目前,0.5.8版本能够做到的功能有:

Jdbc监控:可以监控J2EE系统的所有Jdbc调用,包括Jndi数据源,可以过滤SQL时间,由哪些程序调用,哪些连接泄露。

Method监控:可以通过配置Method Plugin的'detect-class'参数,配置多个想要监控的包或类,Jwebap Console就可以跟踪这些类的方法执行,进行时间过滤,可以统计开销,和方法的调用堆栈,方法打开了多少Jdbc连接等等。

Http监控:可以监控http请求,进行时间过滤,可以进行请求的开销统计,请求打开了多少Jdbc连接等等。


贴几张示例图,有兴趣的朋友可以下载试用(jwebap.sourceforge.net),欢迎在这里进行交流:
  • 描述: Jdbc Traces 1
  • 大小: 148.2 KB
  • 描述: Jdbc Traces 2
  • 大小: 118.4 KB
  • 描述: Method Traces
  • 大小: 98.6 KB
分享到:
评论
92 楼 meikefu 2008-03-25  
jwebapp注入的方法都使用反射Method.invoke来调用源方法,开销比较大,如果换成直接调用是否能降低开销
91 楼 leadyu 2008-03-25  


Method m = Method.getMethod("void test()");
ClassWriter cw = new ClassWriter(true);
cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "test.AA", null, "java/lang/Object", null);
			
// 方法字节码访问者代理,在ASM中可以方便的使用它来完成指令的生成
GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC, m,null, null, cw);

// 定义i变量
int result = mg.newLocal(Type.getType(Integer.class));

//调用new指令分配内存
mg.newInstance(Type.getType(Integer.class));
mg.dup();
// 压栈2
mg.push(2);
// 调用构造函数
mg.invokeConstructor(Type.getType(Integer.class), Method.getMethod("void <init>(int)"));
// 付值
mg.storeLocal(result);
mg.returnValue();
mg.endMethod();
			
cw.visitEnd();


关于VM指令的使用,对象的创建,VM Spec上有比较详细的说明,可以参考。

另外,jwebap发布0.5.9版本,后面我会写一篇文章介绍0.5.9版本,欢迎大家关注。
90 楼 meikefu 2008-03-24  
用asm怎样实现 Integer i = new Integer(2)这样类似的指令?
89 楼 leadyu 2008-03-20  
meikefu 写道
能否把detect的监控的httptrace都过滤调

可以配置PageDetectFilter的excludeUrls参数:/detect;/detect/*;*.js;*.jpg;*.htm;*.html;*.gif;*.png;*.css;*.swf
88 楼 meikefu 2008-03-20  
能否把detect的监控的httptrace都过滤调
87 楼 leadyu 2008-03-17  
alizv 写道
我按照文档上的配置后出现无法监视JDBC的情况.截图如下:

你这个问题也是duplicate class definde问题,可以看看前面的帖子,已有过说明。

首先,先保证jwebapListener的启动顺序是配置在最前面的,特别是采用spring架构时。

第二,如果第一步还没解决问题,那么保证mysql.jar没有配置在过高层级的类路径中(比如中间件的类路径),最好和jwebap.jar在一个层级。
86 楼 alizv 2008-03-17  
我按照文档上的配置后出现无法监视JDBC的情况.截图如下:
85 楼 leadyu 2008-03-13  
一直以来,有一些网友发邮件反映,jwebap启动正常,但是获取数据库连接时发生StaticHandleFactory类找不到错误。

这个错误,是由于driver-class对应的驱动jar包类路径高于jwebap.jar,而导致驱动运行时找不到jwebap的类(当然,这层依赖关系是jwebap启动时注入到驱动的),所以解决办法就是把驱动包 和jwebap.jar配在同一个层级的类路径上。当然,配在什么类路径上,是很灵活的,没有特定限制,根据系统架构不同,可能不同。所以,简单来说,要避免这个问题的方法:

尽量的把jwebap.jar的类路径层级配高,最好配在server级别,当然配在web下大多数情况下也能正常工作,但是如果你把驱动本身配的层级很高,或者你是EJB应用,那么最好把jwebap.jar配在server级别
84 楼 leadyu 2008-03-13  
javatar 写道
最好JDBC等配置能在Ext界面上输入


多谢javatar兄的建议,以后plugin的配置全部在界面完成,关于plugin的部署方式,我已经有初步的方案,呵呵,我准备在0.6.*版本实现。

先透露点初步的想法,欢迎交流:

引用
plugin独立jar包,plugin的粒度较Component粗,比如有个plugin可以是‘性能监控套件’而里面包含多个Component协同工作(比如内存监控Component,Jdbc监控Compinent等等)

plugin内部的多个Component可以是内聚的,互相影响的,plugin更多的是部署上的意义,以及视图,功能等扩展上的意义,而Jwebap内部还是以Component为单位进行管理。

plugin的jar包,MATA-INF下存放plugin的部署描述文件(包括Component的定义以及视图扩展定义),而Jwebap启动后,可以在视图上修改plugin的参数,和移除已经部署的plugin,而这些内容都会保存在jwebap.xml里面。

保存的描述形式和plugin的描述形式基本一致,都是以Component标签描述Component定义,只不过jwebap.xml的配置优先于plugin的部署描述文件里面的参数配置。
83 楼 javatar 2008-03-13  
最好JDBC等配置能在Ext界面上输入
82 楼 leadyu 2008-03-12  
呵呵,我想有时间我还得多收集一下大家的使用情况,整理一下在各个架构下,的配置方式的差异。

就拿jdbc监控来说吧,虽然不依赖架构,应该在大部分架构下都可以工作,但是配置driver-class确有可能不同。这在使用上会有些不便,而需要使用者去了解内部实现机制,找出driver-class不是一件容易的事,所以,以后要是有人在自己架构下成功配置,请把配置方式发出来,大家共享一下,我会非常感谢。^_^
81 楼 heaven 2008-03-12  
可以了,呵呵,
在spring DaoSuport(jdbctemplate,hibernate,ibatis)+jndi环境下只要配置
org.springframework.jndi.JndiObjectFacoryBean
就好了,多谢楼主一直耐心解决,这个框架还是很不错的,
希望以后可以支持对lib/*.jar内的class进行监控,
80 楼 leadyu 2008-03-11  
jwebap更新,发布jwebap_0.5.8_all_7.zip,解决对于DataSource的代理问题。

第7修正版本,可以实现对于jdbc监控的driver-class进行注入,对该class返回的Connection或者DataSource进行代理。
79 楼 leadyu 2008-03-11  
我刚才翻了下ibatis2.3的代码,发现它是用com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory
这个类去获取远程数据源的,但是,很不幸,这个类只返回DataSource,不返回Connection,所以,以目前jwebap_0.5.8_all_6还不能对DataSource进行代理,
不过没关系,晚上我实现下,明天你下载jwebap_0.5.8_all_7,然后driver-class配置对应的Ibatis的DataSourceFactory就可以了。

很抱歉,让你折腾了这么久,毕竟,我也没有办法在所有可能出现的架构上进行测试。

78 楼 leadyu 2008-03-11  
<删掉了一段废话>


最好你可以把你spring中,和ibatis中关于数据源的配置贴出来

77 楼 heaven 2008-03-11  
leadyu 写道


你不能用tomcat的datasource实现类:首先,它根本和你的应用运行在不同的app下。另外,注入它肯定是duplicate class definition,因为tomcat肯定比你应用更先加载这个类。

所以,对于jndi数据源,你的办法就是找到你app里面用于获取连接的类,比如spring的连接工厂,或者hibernate的连接provider,或者你项目里面自己封装的获取连接的类。



spring的连接工厂  这个是什么?
引用
你的应用里面总有代码封装了,从jndi取datasource的代码,最终返回connection的类。

我觉得你的这个基础假设本身就有不成立的情况,我在spring jdbc/ibatis+jndi数据源的情况始终不能成功的监控jdbc
76 楼 heaven 2008-03-11  
重复提交,删掉了,
75 楼 leadyu 2008-03-10  
heaven 写道
今天把包更新成6版本,还是不行,后来发现tomcat 的实现类的包名并非原封不动的dbcp,而是org.apache.tomcat.dbcp.dbcp.BasicDataSource,改成这个就可以加载到了,但是错误变成duplicate class definition,往前看了一下贴子,说是可能是listener加载顺序的问题,但是我的listener已经在前面了,


你不能用tomcat的datasource实现类:首先,它根本和你的应用运行在不同的app下。另外,注入它肯定是duplicate class definition,因为tomcat肯定比你应用更先加载这个类。

所以,对于jndi数据源,你的办法就是找到你app里面用于获取连接的类,比如spring的连接工厂,或者hibernate的连接provider,或者你项目里面自己封装的获取连接的类。


74 楼 heaven 2008-03-10  
今天把包更新成6版本,还是不行,后来发现tomcat 的实现类的包名并非原封不动的dbcp,而是org.apache.tomcat.dbcp.dbcp.BasicDataSource,改成这个就可以加载到了,但是错误变成duplicate class definition,往前看了一下贴子,说是可能是listener加载顺序的问题,但是我的listener已经在前面了,
73 楼 leadyu 2008-03-06  
xlongbuilder 写道
数据库连接信息 最多能显示多少条 有限制吗
我这1300 条 就不再增加了



默认1300条,-1ms以上的连接轨迹记录下来。这两个参数你可以在jwebap.xml里面配置


相关推荐

    GPU-Z.0.5.8

    GPU-Z.0.5.8显卡详细显示工具自己试试

    soljson-v0.5.8 commit.23d335f2.js

    soljson-v0.5.8 commit.23d335f2.js soljson-v0.5.8 commit.23d335f2.js

    Blueprint css框架2013年最新可视化操作工具-boks-v0.5.8

    最新版div+css可视化开发工具,boks-v0.5.8,适用于blueprint css框架的开发,拖拉拽即可导出漂亮的网页架构。

    OpenCore-0.5.8

    OpenCore是类似于Clover的UEFI的引导器,OpenCore提供了详细的日志系统,帮助黑苹果排错;其次OpenCore以更先进的方法注入第三方Kext,不破坏系统的SIP;再次,OpenCore支持读取NVRAM等一系列特性,可以让黑苹果变得...

    docker-ghost:Docker 容器中的 Ghost

    版本幽灵: 0.5.8 NodeJS: 0.12.0 Ubuntu: 14.04.01用法克隆存储库 git clone git@github.com:zaiste/docker-ghost.git构建图像 cd docker-ghost sudo docker build -t &lt;your&gt;/ghost:0.5.8 .更新幽灵替换以下行中...

    Python库 | tushare-0.5.8.zip

    python库。 资源全名:tushare-0.5.8.zip

    Android代码-MaterialLoadingProgressBar

    compile('com.lsjwzh:materialloadingprogressbar:0.5.8-RELEASE') xml: options: java api: show arrow 'CircleProgressBar' will not show arrow by default. You can enable arrow drawing like this: ...

    Python库 | pycryptopp-0.5.8.zip

    资源分类:Python库 所属语言:Python 资源全名:pycryptopp-0.5.8.zip 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    GPU-Z.0.5.8 汉化版

    GPU-Z是提供给我们的一款GPU识别工具,绿色免安装,界面直观,运行后即可显示GPU核心,以及运行频率、带宽等,如同CPU-Z一样,这也是款必备工具

    Python库 | sovereign-0.5.8.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:sovereign-0.5.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    colonyNetwork:殖民地网络智能合约

    殖民地网络 定义的运行殖民地网络的合同 错误赏金计划 ... $ docker pull ethereum/solc:0.5.8 安装 在您选择的工作目录中,克隆最新版本的ColonyNetwork存储库: $ git clone https://github.com/JoinColo

    Python库 | tribology-0.5.8.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:tribology-0.5.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | reprobench-0.5.8.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:reprobench-0.5.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | pyunicore-0.5.8.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:pyunicore-0.5.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | OLCTools-0.5.8.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:OLCTools-0.5.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | dandan-0.5.8.tar.gz

    python库。资源全名:dandan-0.5.8.tar.gz

    Python库 | BentoML-0.5.8.tar.gz

    python库。资源全名:BentoML-0.5.8.tar.gz

    Python库 | JPSLUtils-0.5.8.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:JPSLUtils-0.5.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | braga-0.5.8.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:braga-0.5.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | anndata-0.5.8.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:anndata-0.5.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

Global site tag (gtag.js) - Google Analytics