使用AOP實現性能管理[譯]
From:http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=AOPforAPM
介紹:
應用開發人員使用一些傳統的技術去監控性能管理。使用像PotimizeIt,JProbe 等通用的調試工具。另一個傳統的方法是在代碼的特殊地方插入時間和有用的信息。商業的性能管理工具同樣使用不同的技術,例如 在類裝載時的字節碼探測,或者使用應用服務器的攔截器去修飾類。在此文中,我們介紹 一種 使用 Aspect Oriented Programming (AOP)的靈活多變的機制來處理應用程序性能管理。
注意:我們使用AspectJ[1] AOP庫去闡述這種方法,此技術可適用于任意的AOP程序。
方法:
在插圖1中,使用AOP技術“編織”的性能監視代碼自動插入到已存在的應用程序中。為了更容易些,我們把性能監控邏輯(例如:計時器,統計計算等)劃分成簡單的庫。傳統方法是手動編碼將程序庫放到應用程序中,這種方法單調乏味并且易錯。另一個好方法就是使用AOP特性,在應用程序中聲明性能監視庫需要創建的不同點,AOP工具 允許修改字節碼并自動插入到這些調用中。
Figure 1: High-level Architecture
實現:
我先從MonitoringFacade 類開始,它能計算一個API的執行時間。
public static long begin(Class clazz,
String method, String layer) { /* .. */ }
public static end(long startTime,
Class clazz, String method, String layer) { /* .. */ }
}
我們需要 在應用程序執行有意義地方的前或者后調用MonitoringFacade的一對begin/end方法。MonitoringFacade 類是一個普通的Java類,它來計算時間和使用統計,像min,max,average,first和last執行時間,這些是創建調用樹(call trees)所需要的,把這些測量數據與那些收集上來的系統中的其他部分聯系起來。我們寫一個 abstract aspect ,它來調用MonitoringFacade。
/**
* The condition based on which monitoring is performed.
*/
public abstract pointcut operationToBeMonitored();
/**
* Gets the layer (Web, Hibernate, JDBC etc.) of the operation
*/
public abstract String getLayerName();
/**
* Calls the agent fa?ade before and after the execution of the
* monitored operation
*/
Object around() : operationToBeMonitored () {
final Class clazz =
thisJoinPointStaticPart.getSignature().getDeclaringType();
final String method =
thisJoinPointStaticPart.getSignature().getName();
final String layer = getLayerName();
long startTime = MonitoringFacade.begin(clazz, method, layer);
try {
return proceed();
} finally {
MonitoringFacade.end(startTime, clazz, method, layer);
}
}
}
抽象aspect 的具體實現 為被監控的特殊操作提供了切入點,例如session bean調用,Struts 執行,entity bean調用,Hibernate 查詢等。他們同樣提供一個layer name(例如:“Struts”,“Hibernate”等等),它關系到被收集的統計數據。這讓我們提供感興趣的統計,例如某層執行花費的全部時間,這些有利于性能和伸縮性分析。
我們已經編寫一個具體的aspect,我們需要將它們“編織”到應用程序類中。“編織”是一個修改應用程序類字節碼并插入Facade調用的過程。AspectJ 提供工具去做此事。
下面是一個具體的HibernateAspect類,它在"Hibernate Query" 范圍內,定位和記錄所有Hibernate的查詢時間。
public pointcut hib3Query :
execution(public java.util.List org.hibernate.Query+.list());
public pointcut hib3Find :
execution(public * org.hibernate.Session+.find());
public pointcut operationToBeMonitored() : hib3Query || hib3Find;
/**
* Gets the layer name of the operation
*/
public String getLayerName() {
return "Hibernate Query";
}
}
同樣的,你能在普通的地方寫不同的appect去捕獲信息,例如:struts 執行時,JDBC 語句執行等等。如果需要的話,可以暴露pointcut定義,讓用戶很容易定制期望被監視的部分應用程序。
優點:
與其他方法相比,考慮更多高級的定制和更強的靈活性可以使用AOP工具的強大功能。下面列舉一些優點:
·選擇性的監控部分的應用程序而不是使用包名和API名去限制。pointcut定義語言有杠桿作用的功能,例如:監控APIs僅僅在當前執行上下文(使用AspectJ特性,像cflow),基于參數和它們的類型監視APIs,等等。
·在一個高層粒度去捕獲統計的功能。舉例:很容易收集在servlet層,Struts層,持久層,JDBC層等等的執行時間。AOP很容易通過聲明pointcut 定義語言來定義這些層。
·靈活捕獲更詳細的統計信息。用戶使用工具提供的特性,但使用這些工具不能完全展示AOP的功能。一些新功能的統計用它幾乎不可能做到。例如:常用API的頻率分布圖,第一次和最后一次的執行時間,平均時間需要除去第一次執行的平均時間(除去第一次非常有用,因為一些API在第一次執行時做很多事情,比如讀很多的數據并緩沖數據,如果包括了第一次執行時間,那么平均頻率就不能顯示增量請求所執行時間的真實數據)。InfraRED 提供了這些統計,但不是所有。即使這些特性在核心產品中不可用,AOP工具為用戶提供了強大的自定義功能。
·生成調用樹(call trees)的功能,調用樹鏈接著不同的執行API的功能,使用像cflow[5] 創建的AspectJ程序,在程序可以輕易的實現此功能。
總結:
在這里我們介紹了一個在應用程序中收集性能統計數據的靈活方法,略述了這種方法與傳統技術相比的幾個優點。這篇文章來自于我在InfraRED (http://infrared.sf.net/)中的工作經驗,一個基于AOP的開源的性能監控工具。
參考:
1.AspectJ homepage: http://www.eclipse.org/aspectj/
2.Introduction to AspectJ: http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html
3.AOP without the buzzwords: http://jroller.com/page/colyer?entry=the_ted_neward_challenge_aop
4.InfraRED homepage: http://infrared.sf.net/
5.On using AOP for Application Performance Management: http://aosd.net/2006/archive/AOSD06-IndustryTrackProceedings.pdf
作者:
Srinivas Narayanan 是Tavant Technologies 公司的總架構師,提供軟件企業解決方案。在Tavant,他監管一些大公司的J2EE項目,并創建一套基于java程序開發的可復用的平臺。他是InfraRED項目的創始人。在Tavant之前,他工作在IBM Almaden 研究中心,在關系對象數據庫系統領域。他在一些主要的研討會上演講了數篇關于企業級應用,SOA,系統集成和數據庫的論文。他在美國麥迪遜的威斯康星大學獲得了計算機科學碩士學位,在印度 Chennai IIT 獲得計算機科學學士。
Binil Thomas 在Tavant Technologies是副架構師。他也是InfraRED項目的參與者。他在印度喀拉拉大學獲得計算機科學學士。
感謝:Srinivas和Binil感謝他們的同事 Kamal Govindraj 提供的幫助。
聲明:以上翻譯是我在業余時間進行,因為英語水平有限,難免有些bug,多謝各位指教。
一個駐扎在天津的普通程序員,當個PM,TL,CODER 就是沒有當過CEO。
My idiom:Where there is a will,there is a way!
注:加班寫作,轉載請著名出處!!
posted on 2007-08-04 17:13 EugeneCao 閱讀(1347) 評論(1) 編輯 收藏 所屬分類: Development Article 、Java Development