前言
JavaMelody是一款可以監(jiān)控Java應(yīng)用(比如項目war,ear包)以及應(yīng)用服務(wù)器(比如Tomcat或Jboss weblogic等等)??梢酝ㄟ^圖表給出監(jiān)控數(shù)據(jù)。
源碼地址請戳這里
近期有web性能監(jiān)控方面的需求,特此整理一下使用說明以利于備忘
簡介
JavaMelody是一個監(jiān)控Java或者JavaEE應(yīng)用的工具。它并不會模擬用戶請求而是監(jiān)控用戶的請求并且形成圖表報告。
運行條件:
- java 1.6或者更高
- servlet 2.4或者更高
- 依賴 JRobin v1.5.9生成圖表
- 依賴iText v2.1.7生成PDF文件
- 支持多種語言,包括中文
起步
- 修改maven配置文件
<dependency>
<groupId>net.bull.javamelody</groupId>
<artifactId>javamelody-core</artifactId>
<version>1.56.0</version>
</dependency>
- 修改web.xml文件,增加如下的內(nèi)容
<!-- 進行運行情況監(jiān)控 使用/monitoring 進行查看-->
<filter>
<filter-name>javamelody</filter-name>
<filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>javamelody</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
<listener>
<listener-class>net.bull.javamelody.SessionListener</listener-class>
</listener>
- 啟動服務(wù),在通過web查看監(jiān)控結(jié)果
http://<host>/<context>/monitoring
輸出PDF報告
- 修改maven配置文件,增加iText依賴
<dependency>
<groupId>net.bull.javamelody</groupId>
<artifactId>javamelody-core</artifactId>
<version>1.56.0</version>
</dependency>
<!-- itext, option to add PDF export -->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
<exclusions>
<exclusion>
<artifactId>bcmail-jdk14</artifactId>
<groupId>bouncycastle</groupId>
</exclusion>
<exclusion>
<artifactId>bcprov-jdk14</artifactId>
<groupId>bouncycastle</groupId>
</exclusion>
<exclusion>
<artifactId>bctsp-jdk14</artifactId>
<groupId>bouncycastle</groupId>
</exclusion>
</exclusions>
</dependency>
- 修改web.xml文件
<!-- 進行運行情況監(jiān)控 使用/monitoring 進行查看-->
<filter>
<filter-name>javamelody</filter-name>
<filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>javamelody</filter-name>
<url-pattern>/servlet1/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>javamelody</filter-name>
<url-pattern>/servlet2/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>javamelody</filter-name>
<url-pattern>/monitoring</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
<listener>
<listener-class>net.bull.javamelody.SessionListener</listener-class>
</listener>
- 運行服務(wù)器,在報告頭部有PDF文檔的輸出鏈接,可以輸出PDF報告
spring mvc整合
我們配置spring mvc的時候,在web.xml中會配置一個監(jiān)聽,這個監(jiān)聽回使web應(yīng)用在讀取web.xml時,加載指定的spring文件。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
加載指定的javamelody配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
classpath:net/bull/javamelody/monitoring-spring-datasource.xml
</param-value>
</context-param>
注意: 如果發(fā)生AOP之類的有沖突,就換一個配置文件:monitoring-spring.xml
報告發(fā)郵件
可以定期:日,周,月給指定的郵箱發(fā)運行報告。我的環(huán)境是在Tomcat7下進行配置
- 必須的Jar:放置在%TOMCAT_HOME%\lib目錄下
activation-1.1.1.jar
javax.mail-1.5.2.jar
- 配置server.xml文件,在Host節(jié)點下進行如下配置
<Context docBase="appName" path="/appName" reloadable="true" source="org.eclipse.jst.jee.server:hcmserver">
<Resource auth="Container" type="javax.mail.Session" name="mail/MySession"
mail.smtp.host="SMTP服務(wù)器地址"
mail.smtp.user="發(fā)信用戶"
mail.from="發(fā)信用戶"
mail.smtp.auth="true"
mail.smtp.password="密碼"
/>
<Parameter name="javamelody.admin-emails" value="收信郵箱1,收信郵箱2,收信郵箱3" override="false" />
<Parameter name="javamelody.mail-session" value="mail/MySession" override="false" />
<Parameter name="javamelody.mail-periods" value="day,week,month" override="false" />
</Context>
- 測試
有一個測試命令可以使用,在瀏覽器訪問如下地址
/monitoring?action=mail_test
附加
在加載monitoring-spring配置文件的時候有可能發(fā)生AOP沖突的問題。這個問題主要是由于生產(chǎn)代理的方式?jīng)_突導(dǎo)致。
AOP的實現(xiàn)最簡單的將就是生成一個代理對象來處理請求,在代理對象中織入切面邏輯。
Spring提供了兩種方式來生成代理對象: JDKProxy和Cglib,在實際使用中具體使用那種方式?默認的策略是如果目標類是接口,則使用JDK動態(tài)代理技術(shù),否則使用Cglib來生成代理。
我們可以在Spring的配置文件中配置使用那種代理模式
<!-- 采用cglib來動態(tài)代理 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
<!-- 標準的JDK 基于接口的代理 -->
<aop:aspectj-autoproxy proxy-target-class="false" />
兩種代理的區(qū)別
- cglib:基于類的代理
- JDK標準:基于接口的代理