当前位置: 首页 > 知识库问答 >
问题:

JMX SflowAgent停止从插入aspectj的WebSphere Application Server收集JVM指标

班景龙
2023-03-14

项目:

我使用斯流甘利亚来监控 Websphere 应用程序服务器 (WAS) 的 JVM 指标。WAS 是使用方面J 方面进行检测的。我添加了一个方面来测量所有应用程序方法运行时。

我使用Hsflow d作为JVM指标收集器。Hsflow d在内部使用JMX-Sflow Agent javaagent挂钩到JVM以使用MXBean(RuntimeMXBean、GarbageCollectorMXBean、CompilationMXBean和ThreadMXBean)收集指标。

问题:

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

在“方面j编织日志”中,我可以看到“方面J”正在编织JMX流代理代码。即使它是通过!call(*)排除的。

方面:

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软件包位于< code > com . SF low . JMX . sflowagent 下。

共有1个答案

岳华灿
2023-03-14

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

好吧,仅仅用这个方面而不是一个真实的SSCCE显示有问题的行为来重现你的问题是不可能的。有很多悬而未决的问题:

  • 我不知道该方面应用于多少个类,
  • 应用服务器和
  • 中有多少线程
  • 不再显示JMX结果之前和之后10分钟内的内存消耗情况
  • 你说SFlow代理只运行一次,而不是每10秒运行一次。你怎么知道的?请您提供信息,解释您是如何发现的,以及如何重现这种行为的,最好不用应用服务器,而使用普通的Java SE VM
  • 我还想知道为什么这个方面会收集有关空闲内存的信息。这难道不是另一个Java代理应该做的吗?为什么要做两次
  • 我感到奇怪的是,名为logWriter的变量是AppInformationReader的实例。那么它是什么,读者还是作家?这门课做什么?方面使用它,但未显示
  • 你为什么在方面中为每个线程创建UUID?它们用于什么?它们似乎没有增加任何价值,正如我在你早些时候发布的另一个问题中所说的那样。你当时没有回答这个问题,你现在能回答吗?开销看起来没用
  • 切入点过多。例如
    • execution(*com.foo.*(..))仅捕获packagecom下类中的方法执行。foo,但不在任何子包中。因此,从子包中排除类是无用的。也许您真正想要的是执行(*com.foo..*(..))-注意foo..*中的两个点表示子包
    • 您误解了我在另一个问题中的回答,因为您没有选择我的一个解决方案来排除方面及其内部使用的匿名ThreadLocal子类,而是将它们与连接起来

    话虽如此,您可能想要这个切入点:

    java prettyprint-override">execution(* com.foo..*(..)) &&
    !within(@org.aspectj.lang.annotation.Aspect *) &&
    !within(com.foo.main.AppInformationReader)
    

    这应该足够了。

    修复切入点后,您可以尝试停止收集和记录该方面的信息,以使其更有效率。至于其他 Java 代理程序,没有必要将其从方面编织中排除,但也许您需要将该方面排除在 SFlowAgent 的目标之外。也许 SFlow 代理检测的方面代码存在问题,但这只是一个猜测。也许你的配置是错误的,也许是别的什么。在我看来,你好像在试图挥舞两种你从未学会使用得足够好的武器(工具)。如果没有 SSCCE,就很难诊断问题的根本原因。

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

 类似资料:
  • 如果程序员返回的是Arraylist而不是List,我会尝试生成一个警告。我使用Spring Boot,Spring Data JPA。 Pojo示例 我的存储库:

  • 即便用追踪式收集辅助引用计数,在很多时候停顿时间依然不可接受,原因有几点: 虽然引用计数可以保证不产生循环的对象能实时回收,但存在很多这类对象是挂在循环引用数据结构上的,比如两个对象互相引用,而他们各自又挂了很多int和string数据,即是一个例子。由于这些对象的回收也是在停顿期,实时性不是那么好 循环引用本身并不罕见,双链表、树等数据结构都存在这种情况,实际工作中很多复杂的业务也存在这种情况,

  • 问题内容: 对于一个类项目,我想实现一个Java应用程序,该应用程序连接到本地JVM并收集统计信息,例如堆使用情况,线程数,已加载的类等。我已经在网上搜索API,内置第三方,这将允许我执行此操作,但到目前为止我一直没有成功。 有谁知道一个API,它将允许我连接到正在运行的JVM并收集统计信息? 问题答案: 下列类演示如何连接到正在运行的JVM并建立JMX连接,并在必要时加载JMX代理。它将使用Me

  • 我希望Tweepy Streaming API在我将x#条推文存储在MongoDB中后停止推文。 我尝试了类内的IF和WHILE语句,用计数器定义,但不能让它停止在一定的X量。这对我来说是一个真正的爆头。我在这里找到了这个链接:https://groups.google.com/forum/#!Tweepy/5IGlu2qiug4但是我复制这个的努力失败了。它总是告诉我init需要一个额外的参数。

  • 我试图更深入地理解Java的垃圾收集。 在HotSpot JVM世代集合中,堆中有三个区域(年轻世代、老世代和永久世代)。还有两种算法:

  • 每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1