Проект:
Я использую Sflow + Ganglia для мониторинга показателей JVM сервера приложений Websphere (WAS). WAS оснащен аспектами AspectJ. Я добавил аспект для измерения времени выполнения всех методов приложения.
Я использую Hsflowd в качестве сборщика метрик JVM. Hsflowd внутренне использует JMX-SflowAgent javaagent для подключения к JVM. для сбора метрик с помощью MXBeans (RuntimeMXBean, GarbageCollectorMXBean, CompilationMXBean и ThreadMXBean).
Проблема:
Когда я запускаю WAS без хука аспекта jweaver, я могу постоянно видеть все показатели (ЦП, рабочий стол, память, процесс и т. д.) в сети Ganglia. Но когда аспект jweaver добавляется в аргументы JVM и после перезапуска сервера я вижу метрики в течение 10 минут, но после этого он не сообщает метрики JVM в сети Ganglia.
В журналах плетения Aspectj я вижу, что AspectJ плетет код JMXsflowAgent. Несмотря на то, что это исключено через !call(* com.sflow.JMX.SFlowAgent(..))
.
Аспект:
package com.foo.main;
import java.io.*;
import java.lang.reflect.Method;
import java.security.Signature;
import java.util.*;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.osgi.service.application.ApplicationAdminPermission;
@Aspect
public class ResponseTimeAspect {
@Pointcut(
"execution(* com.foo.*(..)) && " +
"!within(com.foo.main.ResponseTimeAspect) && " +
"!within(ThreadLocal+) && " +
"!within(&& !within(*..*Aspect)) && " +
"!within(com.foo.main.AppInformationReader) && " +
"!within(@org.aspectj.lang.annotation.Aspect *) && " +
"!within(com.sflow.jmx.SFlowAgent) && " +
"!(call( * com.sflow.jmx.SFlowAgent(..)))"
)
public void loggingResponseTime() {}
private static ThreadLocal<String> uuidContainer = new ThreadLocal<String>() {
@Override
protected String initialValue(){
return UUID.randomUUID().toString();
}
};
AppInformationReader logWriter = AppInformationReader.getInstance();
@Around("loggingResponseTime()")
public Object tracing(ProceedingJoinPoint thisJoinPoint) throws Throwable {
Long startTime= System.currentTimeMillis();
Long startTotalMemory = Runtime.getRuntime().totalMemory();
Long startFreeMemory = Runtime.getRuntime().freeMemory();
Object ret = thisJoinPoint.proceed();
Long elapsedTime=System.currentTimeMillis() - startTime;
Long endTotalMemory = Runtime.getRuntime().totalMemory();
Long endFreeMemory = Runtime.getRuntime().freeMemory();
String methodSignature=thisJoinPoint.getSignature().toString();
String classname=methodSignature.split("\\.")[thisJoinPoint.getSignature().toString().split("\\.").length-1];
String methodName =thisJoinPoint.getSignature().getDeclaringType().getCanonicalName();
logWriter.writeLog(uuidContainer.get().toString(), startTime, System.currentTimeMillis(), elapsedTime, classname, methodName);
return ret;
}
}
Пакеты JMX находятся под com.sflow.jmx.SFlowAgent
.