【发布时间】:2014-09-11 11:20:56
【问题描述】:
项目:
我使用 Sflow + Ganglia 来监控 Websphere Application Server (WAS) 的 JVM 指标。 WAS 使用 AspectJ 方面进行检测。我添加了一个方面来测量所有应用程序方法的运行时间。
我使用 Hsflowd 作为 JVM 指标收集器。 Hsflowd 在内部使用JMX-SflowAgent javaagent 挂钩到 JVM 以使用 MXBean(RuntimeMXBean、GarbageCollectorMXBean、CompilationMXBean 和 ThreadMXBean)收集指标。
问题:
当我在没有 aspectjweaver 挂钩的情况下运行 WAS 时,我可以连续查看 Ganglia Web 中的所有指标(CPU、桌面、内存、进程等)。但是当将 aspectjweaver 添加到 JVM args 并重新启动服务器后,我可以看到 10 分钟的指标,但之后它不会在 Ganglia web 中报告 JVM 指标。
在 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 下。
【问题讨论】:
-
对于我们看不到的 AspectJ 或 Java 代码以及我们也看不到的配置,很难说任何智能。也许您想考虑提供更多细节,因为这里没有人拥有魔法水晶球。
-
@Kriegaex- 不需要进一步配置.. 我认为 JMX 和 AspectJ 不会在我们的桌面上一起工作。
-
aspectj 正在编织 JMX 代码,尽管它不在执行中(* com.foo..*)切入点.. 我已经为 aspectj 编织启用了调试,并且看到 aspectj 正在编织 run() 方法也属于 JMX 代理。我不确定,但这可能是这里的问题。我的切入点是stackoverflow.com/questions/25663050/…
-
您是否阅读并理解了我在其他主题中的答案和cmets?!你的切入点拦截了一切,试着把它限制在你感兴趣的范围内。如果你不听答案,就不要问。如果你认为你知道答案,即使它显然是错误的,你为什么在这里?如果您对学习 AspectJ 基础知识不感兴趣,为什么还要冒险使用它?
-
我完全理解你的回答,甚至接受了你的回答。抱歉没有解释清楚。我已经编辑了我的问题以使其更清楚。
标签: hadoop aspectj jmx ganglia ibm-was