2014-09-11 7 views
0

프로젝트 JVM 메트릭을 계측 수집 중지 : 내가 웹 스피어 애플리케이션 서버의 JVM 메트릭을 모니터링 sFlow를 + 신경절을 사용JMX-SflowAgent는 WebSphere Application Server에에게 AspectJ의에서

을 (WAS). WAS는 AspectJ 측면을 사용하여 구현된다. 모든 응용 프로그램 메서드 런타임을 측정하는 측면을 추가했습니다.

Hsflowd를 JVM 메트릭 수집기로 사용합니다. Hsflowd는 내부적으로 JMX-SflowAgent javaagent를 사용하여 JVM에 연결하여 MXBeans (RuntimeMXBean, GarbageCollectorMXBean, CompilationMXBean 및 ThreadMXBean)를 사용하여 메트릭을 수집합니다.

문제 : 내가 계속 신경절 웹에있는 모든 메트릭 (CPU, 책상, 메모리, 프로세스 등)을 볼 수 있습니다 aspectjweaver 후크없이 WAS 실행

. 하지만 aspectjweaver가 JVM 인수에 추가되고 서버를 다시 시작한 후 10 분 동안 메트릭을 볼 수는 있지만 이후 Ganglia 웹의 JVM 메트릭은보고하지 않습니다.

Aspectj weaving 로그에서 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 받고있다.

+0

우리가 볼 수없는 AspectJ 또는 Java 코드와 우리가 볼 수없는 구성에 대해 지적인 말을하기가 약간 어렵다. 어쩌면 여기에 아무도 마법의 크리스탈 지구본을 가지고 있지 않으므로 더 자세한 정보를 제공하는 것을 고려하고 싶을 것입니다. – kriegaex

+0

@ Kriegaex- 추가 구성이 필요하지 않습니다. JMX와 AspectJ가 우리 데스크탑에서 함께 작동하지 않을 것이라고 생각합니다. –

+0

왜 안되나요? – kriegaex

답변

0

면책 조항 : 답변이지만 아직 해결책은 아닙니다. 더 많은 의견을 쓰는 것은 이치에 맞지 않습니다. 그래서 나는 Vimlesh로부터 더 많은 정보를 수집 할 때 여기에서 제 대답을 수정하려고합니다.

좋아요, 문제가있는 동작을 표시하는 실제 SSCCE이 아닌 바로 그 모습으로 문제를 재현하는 것은 불가능합니다. 열려 많은 질문이 있습니다

응용 프로그램 서버에 얼마나 많은 스레드
  • 나는 측면이 적용되고 얼마나 많은 클래스 모른다,
  • 및 메모리 소비 무슨
  • JMX 결과가 나오기 10 분 전과 종료 후 시간이 더 이상 표시되지 않습니다.
  • SFlow 에이전트가 매 10 초가 아니라 한 번만 실행 중이라고하셨습니다. 어떻게 알았어? 앱 서버없이 일반 Java SE VM을 사용하여 발견 한 방법과 동작을 재현하는 방법을 설명하는 정보를 제공해 주실 수 있습니까?
  • 나는 왜 aspect가 free memory에 관한 정보를 수집하는지 궁금하다. 그것은 다른 Java 에이전트가 수행 할 것으로 기대되는 것이 아닙니까? 왜 두 번이나 해?
  • logWriter이라는 변수가 AppInformationReader의 인스턴스라는 것이 이상하다고 생각합니다. 그렇다면 독자, 작가는 무엇입니까? 수업은 무엇을합니까? 애스펙트가이를 사용하지만 표시되지 않습니다.
  • 왜이 세상에서 스레드 당 UUID을 만드나요? 용도는 무엇입니까? 그들은 이전에 게시 한 다른 질문에서 이미 말했듯이 아무 가치도없는 것처럼 보입니다. 당신은 질문에 대답하지 않았습니다, 지금 할 수 있습니까? 쓸모없는 오버 헤드처럼 보입니다.
  • 포인트 컷은 잔인합니다.예를 들어,
    • execution(* com.foo.*(..))은 패키지 com.foo 아래의 클래스에서 메소드 실행 만 캡처하지만 하위 패키지는 캡처하지 않습니다. 따라서 하위 패키지에서 클래스를 제외시키는 것은 쓸모가 없습니다. 아마도 당신이 원하는 것은 execution(* com.foo..*(..))입니다 - 서브 패키지를 나타내는 foo..*의 두 점에 주목하십시오.
    • 당신은 측면과 내부적으로 사용 익명 ThreadLocal 서브 클래스를 제외 할 내 솔루션 하나를 선택하지 않았기 때문에 다른 질문에 내 대답을 오해하지만, &&로의 모든를 연결된했다. 그렇다고해서 더 좋거나 더 읽기 어려운 것은 아닙니다.
    • call(* com.sflow.jmx.SFlowAgent(..))을 제외하려고 시도했지만 두 가지 이유로 필요하지 않습니다. 첫째, SFlowAgent은 대상 패키지 com.foo에 없습니다. 둘째, execution() joinpoint는 결코 call() joinpoint가 될 수 없으므로 교차 집합은 비어 있어야합니다. 실행에서 호출을 제외 할 필요가 없습니다.
    • 이 구문은 유효하지 않습니다. !within(&& !within(*..*Aspect)) - 중첩 된 within() 절에 대한 & 붙여 넣기 오류가있을 수 있습니다.

      execution(* com.foo..*(..)) && 
      !within(@org.aspectj.lang.annotation.Aspect *) && 
      !within(com.foo.main.AppInformationReader) 
      

      충분해야한다 :

, 당신은 아마이 포인트 컷을 원했다 가졌어요.

pointcut를 수정 한 후에는 aspect에서 정보를 수집하고 로깅하는 것을 중지하여 더 효율적으로 만들 수 있습니다. 다른 Java 에이전트의 경우 aspect weaving에서 제외 할 필요는 없지만 대상을 SFlowAgent으로 제외시키지 않아야합니다. 아마도 SFlow 에이전트에 의해 계측 된 aspect code에 문제가있을 수 있습니다. 그러나 이는 단지 추측 일뿐입니다. 어쩌면 당신의 구성이 틀렸을 수도 있습니다. 당신이 충분히 잘 익힌 적이없는 두 가지 무기 (도구)를 휘두르는 것처럼 보이는 것처럼 보입니다. SSCCE가 없으면 문제의 근본 원인을 진단하기가 정말 어렵습니다.

업데이트 : AspectJ 위버를 JVM 명령 줄의 첫 번째 Java 에이전트, 즉 SFlow 에이전트 앞에 나열 할 수도 있습니다. 차이가 있는지 테스트하십시오.

+0

내 pointcut에서 실수를 지적 해 주신 kriegaex에게 감사드립니다. 나는 그것을 반드시 배우고 바로 잡을 것입니다. 나는 작업 복사본을 변경했지만 코드가 크고 실수를 붙여 넣는 복사가 일어났습니다. 문제가 -loadersToSkip 옵션을 사용하여 해결되었으므로 Sflowagent 클래스를로드하는 로더를 위해 제직 작업을하지 않았습니다. 지금은 잘 작동합니다. 덕분에 많은 도움을. –

+0

내 대답에 무엇을 편집해야합니까? 너는 내 질문에 대답하지 않았거나 충고를 따랐다. 대신 당신은 해결 방법을 발견했다고 말하면 좋을 것입니다. 근본 원인은 여기에 보여준 포인트 컷이 다른 에이전트를 엮어서는 안되기 때문에 다른 무엇이어야합니다. 어쩌면 당신은 다른 것을 할 수도 있습니다. 나는 잘 모른다. 우리 모두가 원래의 문제를 재현하고 뭔가를 배울 수 있도록 SSCCE를 공유하십시오. 요즘 당신을 도우려는 데 많은 시간을 할애하지만, 힌트의 대부분을 무시하고 완전한 정보를 공유하지 않으며 문제를 재현 할 수 없게 만듭니다. – kriegaex

+0

질문에 답해 주도록하십시오. com.foo .. * 패키지 아래 모든 클래스가 만들어져 있어야합니다. 이 부분은 APM 도구 용이므로 코드에 대해 전혀 알지 못하므로 응용 프로그램 서버에 스레드가 없습니다. 목표는 com.foo .. * 패키지 아래에 모든 클래스를 짜 맞추고 하나의 호출 흐름에 대해 실행 된 모든 메소드의 응답 시간을 얻는 것입니다. 10 분 전과 JMX 결과가 더 이상 표시되지 않은 후 메모리 소비가 없습니다. 코드에 추가 된 디버그의 코드를 다운로드하고이 사용자 정의 된 코드로 실행했습니다. ru() 아래의 디버그가 한 번만 호출되었음을 알 수 있습니다. –