一直沒怎么關注javaMelody這個東西。
自己寫東西的時候想弄點監控,於是把javaMelody裝進去了。
看了文檔幾乎全是法語,在此記錄一些常用的配置。
首先依賴添加如下:
<dependency> <groupId>net.bull.javamelody</groupId> <artifactId>javamelody-core</artifactId> <version>1.50.0</version> </dependency>
說說最基本的配置: net.bull.javamelody.MonitoringFilter
和net.bull.javamelody.SessionListener
這兩個個必須有, MonitoringFilter用於監控的Servlet Filter,需要聲明在webapp的web.xml中。
而SessionListener是用於監聽HTTP Session的,另外也監聽Servlet Context,需要聲明在webapp的web.xml中。
/**
* Filtre de servlet pour le monitoring.
* C'est la classe de ce filtre qui doit être déclarée dans le fichier web.xml de la webapp.
* @author Emeric Vernat
*/
public class MonitoringFilter implements Filter{
//...
}
web.xml中配置如下:
<filter>
<filter-name>monitoring</filter-name>
<filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>monitoring</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>net.bull.javamelody.SessionListener</listener-class>
</listener>
如果mvc框架使用的是struts,javaMelody提供了net.bull.javamelody.StrutsInterceptor
。
/**
* Interceptor Struts 2 pour avoir les temps moyens des actions Struts.
* {@link StrutsInterceptor "http://struts.apache.org/2.1.6/docs/interceptors.html"}
* @author Emeric Vernat
*/
public final class StrutsInterceptor extends AbstractInterceptor{
//..
}
集成了AbstractInterceptor,直接放到struts2的interceptor tag里面reg上就可以了:
<package name="default" extends="struts-default" >
<interceptors>
<interceptor name="monitoring" class="net.bull.javamelody.StrutsInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="monitoring"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
</package>
關於數據源的監控,雖然說作者提供了一個net.bull.javamelody.JdbcDriver
,但通常會使用dbcp,c3p0什么的,然后再把它注入到TransactionMananger什么的來做點事務管理。
那就用net.bull.javamelody.SpringDataSourceFactoryBean
,把數據源給監控代理做監控了。 比如這樣,只是把聲明好的數據源注入進去:
<bean id="mainDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
<property name="targetName" value="_mainDataSource" />
</bean>
這樣配置后我試着執行了一次SQL,它也的確監控到了。 但是我聲明的net.bull.javamelody.MonitoringSpringAdvisor
卻什么也沒記錄。
說的就是這個東東:
關於aop,可以使用net.bull.javamelody.MonitoringSpringAdvisor
。
官網給了三種配置方法,我在這里也舉個多pointcut栗子:
<bean id="facadeMonitoringAdvisor" class="net.bull.javamelody.MonitoringSpringAdvisor">
<property name="pointcut">
<bean class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="patterns">
<list>
<value>com.xyz.someapp.service.MonitoringPointcut0.*</value>
<value>com.xyz.someapp.service.MonitoringPointcut1.*</value>
<value>com.xyz.someapp.service.MonitoringPointcut2.*</value>
</list>
</property>
</bean>
</property>
</bean>
光配置這個是不會生效的。
之前配置數據源的時候官網給出的文檔中說道:如果數據源配置於spring context中,請務必將classpath:net/bull/javamelody/monitoring-spring.xml
加入contextConfigLocation
中。
但我並沒有加上,問題是確實監控到了SQL的執行於是沒太關心。
但這次沒監控到spring就要把這個加上了。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:net/bull/javamelody/monitoring-spring.xml
classpath*:/applicationContext*.xml
</param-value>
</context-param>
那這個monitoring-spring.xml是什么?
先來看看他的內容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="monitoringAdvisor" class="net.bull.javamelody.MonitoringSpringAdvisor">
<property name="pointcut">
<bean class="net.bull.javamelody.MonitoredWithAnnotationPointcut"/>
</property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<bean id="springDataSourceBeanPostProcessor" class="net.bull.javamelody.SpringDataSourceBeanPostProcessor">
<!--
<property name="excludedDatasources">
<set>
<value>excludedDataSourceName</value>
</set>
</property>
-->
</bean>
<!--
<bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
<property name="targetName" value="targetDataSource" />
</bean>
-->
</beans>
MonitoringSpringAdvisor繼承了默認的DefaultPointcutAdviso,並在自己的constructor中設置了一個Advice——MonitoringSpringInterceptor以簡化配置。
MonitoredWithAnnotationPointcut則是Pointcut的實現,它讓所有MonitoredWithSpring使用MonitoredWithSpring注解和所有類都通過。
另外定時任務框架我使用的是Quartz, 如果僅僅是Quartz而已,JavaMelody會自動監控,不需要任何配置。
但如果是使用spring scheduling的Quartz JavaMelody提供了...其實它也沒提供什么。
關鍵是org.springframework.scheduling.quartz.SchedulerFactoryBean中有個exposeSchedulerInRepository
,雖然注釋中提到不提倡使用,但是只要spring版本夠新就沒什么問題。
監控集成於spring的quartz只需要將該屬性設置為true(默認為false)。
然后進monitoring,顯示如下: