1. 程式人生 > >Java專案效能監控和調優工具-Javamelody

Java專案效能監控和調優工具-Javamelody

JavaMelody能夠在執行環境監測JavaJava EE應用程式伺服器。並以圖表的形式顯示:Java記憶體和JavaCPU使用情況,使用者Session數量,JDBC連線數,和http請求、sql請求、jsp頁面與業務介面方法(EJB3、spring、Guice)的執行數量,平均執行時間,錯誤百分比等。圖表可以按天,周,月,年或自定義時間段檢視。 

監控效果圖見本文結尾部分.

3.在web.xml中配置filter:

  1. <filter>
  2.         <filter-name>monitoring</filter-name>
  3.         <
    filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
  4.         <init-param>
  5.             <param-name>log</param-name>
  6.             <param-value>true</param-value>
  7.         </init-param>
  8.     </filter>
  9.     <filter-mapping>
  10.         <filter-name>
    monitoring</filter-name>
  11.         <url-pattern>/*</url-pattern>
  12.     </filter-mapping>
  13.     <listener>
  14.         <listener-class>net.bull.javamelody.SessionListener</listener-class>
  15.     </listener>
4.重啟專案:開啟連結:http://<host>:<port>/projectname/monitoring
例如:http://127.0.0.1:8080/myproj/monitoring

至此,基本配置已完成,可以進行簡單的效能監控,下面配置是javamelody與struts2和spring3的整合配置:

5.javamelody和struts2整合時配置:
  1. <packagename="base"namespace="/"extends="struts-default">
  2.         <result-types>
  3.             <result-typename="json"class="org.apache.struts2.json.JSONResult"/>
  4.         </result-types>
  5.         <interceptors>
  6.             <!-- javamelody -->
  7.             <interceptorname="monitoring"class="net.bull.javamelody.StrutsInterceptor"/>
  8.             <interceptor-stackname="myStack">
  9.                 <interceptor-refname="monitoring"/>
  10.                 <!-- 
  11.                     struts預設的攔截器 
  12.                 -->
  13.                 <interceptor-refname="defaultStack"/>
  14.             </interceptor-stack>
  15.         </interceptors>
  16.         <default-interceptor-refname="myStack"/>
其他struts配置檔案繼承base,如下所示:
  1. <packagename="example"namespace="/"extends="base">
  2.         <actionname="student_*"class="studentAction"method="{1}">
  3.             <resultname="input">/pub_error.jsp</result>
  4.         </action>
  5.     </package>

6.javamelody與Spring整合:
spring的配置檔案中配置:

  1. <beanid"facadeMonitoringAdvisor"class="net.bull.javamelody.MonitoringSpringAdvisor">
  2.          <propertyname ="pointcut">
  3.                  <beanclass="org.springframework.aop.support.JdkRegexpMethodPointcut">
  4.                          <propertyname ="pattern"value="com.proj.*.service.*"/><!--正則表示式-->
  5.                  </bean>
  6.          </property>
  7. </bean>
然後配置:
方式一,web.xml中加入如下配置:
<context-param>
     <param-name> contextConfigLocation</param-name>
             <param-value>
                  classpath:applicationContext*.xml<!--Spring配置檔案-->
                  classpath:net/bull/javamelody/monitoring-spring.xml<!--和spring整合時新增-->
             </param-value>
</context-param>


方式二,在spring.xml中加入如下配置:
<import resource="classpath:net/bull/javamelody/monitoring-spring.xml" />


7.如果你的所有spring管理的bean都實現了介面,用步驟6中的配置一切OK,但如果有些bean沒有實現介面,使用步驟6中的配置將會出錯.
則將步驟6中的配置改為(這樣將使用cglib代理):
spring配置檔案中配置:
<bean id= "facadeMonitoringAdvisor" class="net.bull.javamelody.MonitoringSpringAdvisor" >
         <property name ="pointcut" >
                 <bean class="org.springframework.aop.support.JdkRegexpMethodPointcut" >
                         <property name ="pattern" value="com.proj.*.service.*" /><!--正則表示式-->
                 </bean>
         </property>
</bean>


方式一,web.xml中加入如下配置:
<context-param>
<param-name> contextConfigLocation</param-name>
             <param-value>
                  classpath:applicationContext*.xml<!--Spring配置檔案-->
                  classpath:net/bull/javamelody/monitoring-spring-aspectj.xml<!--和spring整合時新增-->
             </param-value>
</context-param>


方式二,在spring.xml中加入如下配置:
<import resource="classpath:net/bull/javamelody/monitoring-spring-aspectj.xml" />

8.在專案中經常這樣得到泛型類:

  1. private Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass()  
  2.             .getGenericSuperclass()).getActualTypeArguments()[0];  
使用步驟7配置的cglib代理後會以上程式碼會出錯,可以改為下面這種方式得到泛型類:
  1. private Class<T> entityClass = (Class<T>) getSuperClassGenricType(this
  2.             .getClass(), 0);  
  3. publicstatic Class<?> getSuperClassGenricType(Class<?> clazz, int index)  
  4.             throws IndexOutOfBoundsException {  
  5.         Type genType = clazz.getGenericSuperclass();  
  6.         if (!(genType instanceof ParameterizedType)) {  
  7.             return Object.class;  
  8.         }  
  9.         Type[] params = ((ParameterizedType) genType).getActualTypeArguments();  
  10.         if (index >= params.length || index < 0) {  
  11.             return Object.class;  
  12.         }  
  13.         if (!(params[index] instanceof Class<?>)) {  
  14.             return Object.class;  
  15.         }  
  16.         return (Class<?>) params[index];  
  17.     }  

9.javamelody快取檔案的清除:預設路徑一般在tomcat_home/temp/javamelody中.

10.如果需要將結果匯出為pdf,只要在專案中引用iText.jar即可自動加上匯出pdf的連結.

11.javamelody與Quartz整合需要配置:

  1. <beanid="quartzScheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  2.                 <propertyname="exposeSchedulerInRepository"value="true"/>
  3.                 ...  
  4.         </bean>
12.javamelody中配置可選引數:
web.xml中配置,以日誌記錄為例,如下配置將開啟info級別的日誌記錄:

  1. <filter>
  2.                 <filter-name>monitoring</filter-name>
  3.                 <filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
  4.                 <init-param>
  5.                         <param-name>log</param-name>
  6.                         <param-value>true</param-value>
  7.                 </init-param>
  8.         </filter>
其他可選引數:
system-actions-enabled:預設為true,控制啟動或停止system actions garbage collector, http sessions, heap dump, memory histogram, process list, jndi tree, opened jdbc connections, database.

url-exclude-pattern:可配置正則表示式,排除一些url不監控.

http-transform-pattern,sql-transform-pattern,ejb-transform-pattern, spring-transform-pattern, guice-transform-pattern, error-transform-pattern, log-transform-pattern, job-transform-pattern, jsf-transform-pattern, struts-transform-pattern and jsp-transform-pattern :可配置正則表示式,用於合併javamelody統計資料.

storage-directory: 預設為以javamelody,tomcat為例,預設儲存路徑為TOMCAT_HOME/temp/javamelody

monitoring-path:預設為:/monitoring,可以更改為其他地址,例如改為/mo,則監控地址改為:http://<host>:<port>/projectname/mo

no-database:預設false,配置為true將不監控和資料有關的行為.

disabled:預設false,配置為true將不再監控.


更多內容請參考:http://code.google.com/p/javamelody/wiki/UserGuide

擴充套件部分:增加訪問許可權校驗

public class MiaoshaMonitoringFilter extends MonitoringFilter {  
   
    protected boolean isRequestAllowed(HttpServletRequest httpRequest) {  
        HttpSession session = httpRequest.getSession();  
        if (session == null) {  
            return false;  
        }  
        User user = (User) session.getAttribute(UserConstants.SEESSION_USER);  
        if(user==null){  
            return false;  
        }  
        return user.isAdmin();  
    }  
} 

效果圖:


以上文章轉自:http://blog.csdn.net/lk_blog/article/details/13760999點選開啟連結