第一部分建立了基於 AspectJ + JMX 的 `Glassbox Inspector` 核心:監控 Servlet 請求、JDBC 連線/Statement、巢狀統計、JMX 公開。第二部分將其擴展為**企業級監控基礎設施**:支援 Struts/Spring MVC 控制器、Web Service (Axis)、多應用程式隔離、錯誤追蹤、執行時動態開關、錯誤隔離層、Load-Time Weaving (LTW) 部署、效能與記憶體基準測試。
`AbstractOperationMonitor` 延伸 `AbstractRequestMonitor`,核心改進:
核心模板切點 (在 `AbstractOperationMonitor`):
public aspect StrutsMonitor extends AbstractOperationMonitor {
public interface NotMonitoredAction {} // 標記介面排除特定 Action
public pointcut actionMethodExec() :
execution(public ActionForward Action+.*(ActionMapping, ActionForm, ServletRequest+, ServletResponse+))
&& !within(NotMonitoredAction);
public pointcut rootActionExec() :
actionMethodExec() && (execution(* Action.execute(..)) || execution(* Action.perform(..)));
protected pointcut classControllerExec(Object controller) : rootActionExec() && this(controller);
protected pointcut dispatchActionMethodExec() : actionMethodExec() && execution(* DispatchAction+.*(..));
protected pointcut methodSignatureControllerExec(Object controller) : dispatchActionMethodExec() && this(controller);
}
public aspect SpringMvcMonitor extends AbstractOperationMonitor {
public interface NotMonitoredController {}
public pointcut springControllerExec() :
execution(public ModelAndView Controller+.*(HttpServletRequest, HttpServletResponse))
&& !within(NotMonitoredController+);
protected pointcut classControllerExec(Object controller) :
springControllerExec() && execution(* handleRequest(..)) && this(controller);
protected pointcut methodSignatureControllerExec(Object controller) :
springControllerExec() && execution(* MultiActionController+.*(..)) && this(controller);
}
統計物件命名格式:
application=Spring Petclinic,operation=org.springframework.samples.petclinic.web.ClinicController,database=jdbc:hsqldb:hsql://localhost:9001,statement=SELECT id,name from types ORDER BY name

圖 1:JConsole 顯示多應用、巢狀操作、資料庫、Web Service 統計樹
`RemoteCallMonitor` 延伸 `AbstractResourceMonitor`:
public pointcut remoteProxyCall(Object recipient) :
call(public * Remote+.*(..) throws RemoteException) && target(recipient) && !within(glassbox.inspector..*);
Object around(final Object recipient) : remoteProxyCall(recipient) { ... }
`ErrorHandling` 切面攔截監控代碼內所有 `Throwable`:

圖 2:JConsole 執行時啟用/停用 JDBC Statement 監控
編譯期織入需處理第三方 JAR 依賴複雜。**LTW 僅需:獨立編譯監控切面 → 打包 `glassboxInspector.jar` → `META-INF/aop.xml` 定義織入規則 → 啟動參數 `-javaagent:aspectjweaver.jar`。**
<aspectj>
<weaver>
<exclude within="org.springframework.jmx..*"/> <!-- 排除 Spring JMX 內部,加速啟動 -->
<exclude within="glassbox.inspector..*"/> <!-- 避免自我織入 -->
</weaver>
<aspects>
<aspect name="glassbox.inspector.monitor.operation.StrutsMonitor"/>
<aspect name="glassbox.inspector.monitor.operation.SpringMvcMonitor"/>
<aspect name="glassbox.inspector.monitor.resource.JdbcStatementMonitor"/>
<concrete-aspect name="glassbox.inspector.monitor.operation.CustomMvcMonitor"
extends="glassbox.inspector.monitor.operation.TemplOperationMonitor">
<pointcut name="classControllerExecTarget"
expression="execution(* com.ibatis.struts.BaseBean..*(..)) && cflow(execution(* com.ibatis.struts.BeanAction.execute(..)))"/>
</concrete-aspect>
</aspects>
</aspectj>
# Windows setclasspath.bat
set JAVA_OPTS=-javaagent:%CATALINA_HOME%\common\lib\aspectjweaver.jar -Xmx256m
# Linux setclasspath.sh 同理
| 狀態 | 平均端到端回應時間 (ms) | 伺服器啟動時間 (s) | 啟動進程記憶體 (MB) |
|---|---|---|---|
| 監控啟用 + LTW | 20 (+10ms) | 15 | 135 (+100%) |
| 監控部署但執行時停用 | 10 | 15 (含織入) | 130 |
| 未部署監控 | 10 | 5 | 65 |
完整源碼下載:developerWorks。歡迎加入 Glassbox Inspector 開源社群,貢獻代碼、回報問題、拓展新方向。