Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop JMX SflowAgent停止从aspectj检测的WebSphere Application Server收集JVM度量_Hadoop_Aspectj_Jmx_Ganglia_Ibm Was - Fatal编程技术网

Hadoop JMX SflowAgent停止从aspectj检测的WebSphere Application Server收集JVM度量

Hadoop JMX SflowAgent停止从aspectj检测的WebSphere Application Server收集JVM度量,hadoop,aspectj,jmx,ganglia,ibm-was,Hadoop,Aspectj,Jmx,Ganglia,Ibm Was,项目: 我使用Sflow+Ganglia来监视websphereapplicationserver的JVM度量。WAS使用AspectJ方面进行检测。我添加了一个方面来度量所有应用程序方法运行时 我使用Hsflowd作为JVM度量收集器。Hsflowd在内部使用javaagent钩住JVM,使用mxbean RuntimeMXBean、GarbageCollectorMXBean、compilementmxbean和ThreadMXBean收集度量 问题: 当我在没有aspectjweaver钩

项目:

我使用Sflow+Ganglia来监视websphereapplicationserver的JVM度量。WAS使用AspectJ方面进行检测。我添加了一个方面来度量所有应用程序方法运行时

我使用Hsflowd作为JVM度量收集器。Hsflowd在内部使用javaagent钩住JVM,使用mxbean RuntimeMXBean、GarbageCollectorMXBean、compilementmxbean和ThreadMXBean收集度量

问题:

当我在没有aspectjweaver钩子的情况下运行WAS时,我可以连续看到Ganglia web中的所有指标CPU、桌面、内存、进程等。但是当aspectjweaver被添加到JVM参数中并且在重新启动服务器后,我可以看到10分钟的指标,但是在这之后,它不会在Ganglia web中报告JVM指标

在Aspectj编织日志中,我可以看到Aspectj正在编织JMXsflowAgent代码。即使它是独家通过!调用*com.sflow.JMX.SFlowAgent

方面:

包com.foo.main; 导入java.io.*; 导入java.lang.reflect.Method; 导入java.security.Signature; 导入java.util.*; 导入org.aspectj.lang.ProceedingJoinPoint; 导入org.aspectj.lang.annotation.*; 导入org.osgi.service.application.ApplicationAdminPermission; @面貌 公共类响应方面{ @切入点 执行*com.foo.*+ !withincom.foo.main.ResponseTimeAspect&&+ !withinThreadLocal+&&+ !在&&!在*.Aspect&&+ !withincom.foo.main.AppInformationReader&&+ !within@org.aspectj.lang.annotation.Aspect * && + !withincom.sflow.jmx.SFlowAgent&&+ !调用*com.sflow.jmx.SFlowAgent。。 公共无效日志响应时间{} 私有静态ThreadLocal uuidContainer=新ThreadLocal{ @凌驾 受保护字符串初始值{ 返回UUID.randomuid.toString; } }; AppInformationReader logWriter=AppInformationReader.getInstance; @大约记录响应时间 公共对象跟踪进程连接点此连接点抛出可丢弃{ 长启动时间=System.currentTimeMillis; Long startTotalMemory=Runtime.getRuntime.totalMemory; Long startFreeMemory=Runtime.getRuntime.freemory; Object ret=thisJoinPoint.continue; 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.writeLoguidContainer.get.toString、startTime、System.currentTimeMillis、elapsedTime、classname、methodName; 返回ret; } } JMX包位于com.sflow.JMX.SFlowAgent下。

免责声明:这是一个答案,但还不是一个解决方案。写更多的评论是没有意义的,所以当我从Vimlesh收集更多的信息时,我宁愿在这里完善我的答案

好吧,你不可能仅仅用外表而不是真实的行为来重现你的问题。有很多悬而未决的问题:

我不知道该特性应用于多少类, 应用程序服务器和服务器中有多少线程 JMX结果不再显示前10分钟和后10分钟的内存消耗情况。 您说过SFlow代理只运行一次,而不是每10秒运行一次。你怎么知道的?您能否提供信息,解释您是如何发现的,以及如何在没有应用程序服务器但使用普通JavaSE虚拟机的情况下以最佳方式重现这种行为? 我还想知道为什么aspect会收集有关空闲内存的信息。这不是另一个Java代理应该做的吗?为什么要做两次? 让我感到奇怪的是,名为logWriter的变量是AppInformationReader的实例。那么它是什么,读者还是作家?这个班做什么?方面使用它,但未显示。 究竟为什么要在方面中为每个线程创建UUID,它们的用途是什么?它们似乎没有增加任何价值,正如我在你早些时候发布的另一个问题中所说的那样。你当时没有回答这个问题,你现在能回答吗?它看起来像是无用的开销。 切入点太过分了。例如 执行*com.foo.*。。仅捕获包com.foo下的类中的方法执行,而不捕获任何子包中的方法执行。因此,从子包中排除类是无用的。也许你真正想要的是执行*com.foo..*.-注意foo..*中的两个点表示子包。 您误解了我在另一个问题中的回答,因为您没有选择我的解决方案之一来排除方面及其内部使用的匿名ThreadLocal子类,而是concatena 用&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&。这并不能使它更好或更具可读性。 您试图排除call*com.sflow.jmx.SFlowAgent..,但出于两个原因,这是不必要的:首先,SFlowAgent不在目标包com.foo中。其次,执行连接点不能同时是调用连接点,因此交集必须为空-无需从执行中排除调用。 此语法无效:!在&&!在*.Aspect内-可能是与嵌套的INTERNATE子句有关的复制粘贴错误。 话虽如此,您可能需要以下切入点:

执行*com.foo..*&& !within@org.aspectj.lang.annotation.Aspect * && !withincom.foo.main.AppInformationReader 这应该足够了

在修复切入点之后,您可以尝试停止收集和记录方面的信息,以提高效率。至于另一个Java代理,不需要将其排除在方面编织之外,但是可能需要将方面排除在SFlowAgent的目标之外。可能SFlow代理检测方面代码时存在问题,但这只是猜测。可能您的配置错误,可能是其他原因。在我看来,你似乎在尝试使用两种武器工具,而你从来没有学过如何使用它们。没有SSCCE,很难诊断问题的根本原因


更新:您还可以尝试将AspectJ weaver列为JVM命令行上的第一个Java代理,即在SFlow代理之前。测试它是否有任何不同。

对于我们看不到的AspectJ或Java代码以及我们也看不到的配置,很难说出任何有智慧的东西。也许你想考虑提供更多的细节,因为这里没有一个神奇的水晶球。我认为JMX和AspectJ不会在我们的桌面上一起工作。AspectJ正在编织JMX代码,即使它不在执行中*com.foo..*pointcut。。我已经为aspectj编织启用了调试,并且看到aspectj正在编织JMX代理的run方法。我不确定,但这可能是这里的问题。。我的切入点是,你有没有阅读并理解过我在另一个话题中的回答和评论?!你的切入点会截取一切,试着把它限制在你感兴趣的范围内。如果你不听回答,不要问。如果你认为你知道答案,即使它显然是错误的,你为什么在这里?如果你对学习AspectJ基础不感兴趣,为什么要冒险使用它呢?我完全理解你的答案,甚至接受了你的答案。抱歉没有解释清楚。我编辑了我的问题,让它更清楚。非常感谢kriegaex指出我切入点中的错误。我一定会学习并改正它。我对我的工作副本进行了更改,但由于代码太大,在粘贴副本时发生了一些错误。使用-loaderToSkip选项解决了这个问题,我避免了为加载Sflowagent类的加载程序编织。现在它可以正常工作了。非常感谢你的帮助。请更新答案我应该在答案中编辑什么?你没有回答我的任何问题,也没有听从我的建议。相反,你告诉我你找到了一个解决办法,这很好。但是根本原因一定是不同的,因为你在这里展示的切入点不应该编织其他代理。也许你有另一个这样做,我不知道。请分享一个SSCCE,这样我们都可以重现原始问题并学习一些东西。最近我花了很多时间试图帮助你,但你似乎忽视了我的大部分提示,从不分享完整信息,也无助于使问题可复制。让我试着回答你的问题-它应该将所有类编入com.foo..*包中。因为这方面是针对APM工具的,我们对代码没有任何概念,所以应用服务器中没有线程。目标是在com.foo..*包下编织所有类,并获取为1个调用流执行的所有方法的响应时间。JMX结果不再显示之前和之后的10分钟内没有内存消耗。我已经从代码中添加的调试中下载了代码,并使用此自定义代码执行。我可以看到ru下的调试只调用了一次。如何复制-与任何应用服务器一起运行Aspectjweaver和sflowagent.jar。AppInformationReader最初只是用于读取一些用户定义的数据,后来我使用同一个类转储dataUUID、responseTime、methodName和className来记录文件。一旦我能够解决我的功能问题,我将按照单一责任原则进行纠正。UUID用于分布式事务的唯一标识。我们有分布式事务,因此我需要为单个分布式事务收集所有跃点的数据。sflowagent有一些MXBean,它们在编织后被损坏。正在损坏的代码是/*OperatingSystemMXBean osMX=ManagementFactory.getOperatingSystemMXBean;圣 ring className=osMX.getClass.getName;ifcom.sun.management.OperatingSystem.EqualClassName | | | com.sun.management.UnixOperatingSystem.EqualClassName{*/。我仍然不知道这段代码出了什么问题。