JMX-SflowAgent прекращает сбор метрик JVM с WebSphere Application Server, оснащенного аспектами.

Проект:

Я использую 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.


person Vimlesh Yadav    schedule 11.09.2014    source источник
comment
Немного сложно сказать что-то разумное о коде AspectJ или Java, который мы не видим, и о конфигурациях, которые мы тоже не видим. Может быть, вы хотите рассмотреть возможность предоставления более подробной информации, поскольку ни у кого здесь нет волшебного хрустального глобуса.   -  person kriegaex    schedule 13.09.2014
comment
@Kriegaex- дальнейшая настройка не требуется .. я думаю, что JMX и AspectJ не будут работать вместе на наших рабочих столах.   -  person Vimlesh Yadav    schedule 16.09.2014
comment
аспект j сплетает код JMX, даже если он не находится в исполнении ( * com.foo.. *) pointcut.. я включил отладки для сплетения аспекта и увидел, что аспект сплетает метод run () также агента JMX. Я не уверен, но здесь может быть проблема. Мой pointcut stackoverflow.com/questions/25663050/   -  person Vimlesh Yadav    schedule 16.09.2014
comment
Вы когда-нибудь читали и понимали мой ответ и комментарии в другой теме?! Ваш pointcut перехватывает ВСЕ, постарайтесь ограничиться тем, что вам интересно. Если вы не слушаете ответы, не спрашивайте. Если вы думаете, что знаете ответ, даже если он явно неверен, почему вы здесь? И если вы не заинтересованы в изучении основ AspectJ, почему вы рискуете его использовать?   -  person kriegaex    schedule 16.09.2014
comment
Я полностью понял ваш ответ и даже принял ваш ответ. Извиняюсь, что не объяснил понятно. я отредактировал свой вопрос, чтобы сделать его более понятным.   -  person Vimlesh Yadav    schedule 17.09.2014
comment
Проблема здесь в том, как взаимосвязаны агенты Aspectj и JMXSflow. Как LTW JMXSflowAgent повреждает/останавливает SflowAgent для предоставления метрик. SFLowAgent имеет 1 поток демона, который собирает метрики каждые 20 секунд.   -  person Vimlesh Yadav    schedule 17.09.2014
comment
Почему вы даже аспектируете другого агента? Нельзя ли просто исключить его из плетения, определив правильный разрез? Я предполагаю, что вы хотите перехватить свой собственный код, а не сторонние библиотеки, верно? Редактировать: Ах, хорошо, я только что видел ваш фрагмент кода. Я проглядел его, потому что он не был отформатирован как код. Пожалуйста, опубликуйте полный pointcut, может быть, даже полный аспект. Кажется, я знаю, что происходит не так, но я хочу перепроверить. То, что вы разместили, не является SSCCE, поэтому трудно сказать.   -  person kriegaex    schedule 17.09.2014
comment
kriegaex.. я разместил полный код аспекта. на самом деле поток JMX-Agent запускается только один раз с аспектом J, но без аспекта он запускается каждые 10 секунд. и я больше информации с аспектом, он печатает системные журналы в native_stdout, а не в SystemOut, но без аспекта, он печатает отладки в SystemOut.log веб-сферы   -  person Vimlesh Yadav    schedule 17.09.2014
comment
Я переформатировал и перефразировал ваш вопрос, чтобы сделать его более понятным для человека. Может быть, я смогу посмотреть на проблему после обеда, хотя это может занять некоторое время. Что я уже могу сказать, так это то, что ваш pointcut слишком сложен и содержит вещи, которые противоречат друг другу, а также реальную синтаксическую ошибку. Он даже не должен работать так, как сейчас.   -  person kriegaex    schedule 17.09.2014


Ответы (1)


Отказ от ответственности: это ответ, но еще не решение. Нет смысла писать еще больше комментариев, поэтому я скорее уточню свой ответ здесь, когда соберу больше информации от Вимлеша.

Хорошо, невозможно воспроизвести вашу проблему только с аспектом, а не с реальным SSCCE, отображающим проблемное поведение. Есть много открытых вопросов:

  • Я не знаю, к скольким классам применяется аспект,
  • сколько потоков на сервере приложений и
  • что происходит с потреблением памяти за 10 минут до и время после того, как результаты JMX больше не отображаются.
  • Вы сказали, что агент SFlow запускался только один раз, а не каждые 10 секунд. Откуда вы знаете? Не могли бы вы предоставить информацию, объясняющую, как вы узнали и как воспроизвести поведение, оптимально без сервера приложений, но с простой виртуальной машиной Java SE?
  • Мне также интересно, почему аспект собирает информацию о свободной памяти. Разве это не то, что должен делать другой агент Java? Зачем делать это дважды?
  • Мне кажется странным, что переменная с именем logWriter является экземпляром AppInformationReader. Так кто же он, читатель или писатель? А что делает класс? Аспект использует его, но не показывает.
  • С какой стати вы создаете UUIDs на поток в аспекте и для чего они используются? Кажется, они не имеют никакой ценности, как я уже сказал в другом вопросе, который вы разместили ранее. Вы тогда не ответили на вопрос, можете ли вы сделать это сейчас? Это похоже на бесполезные накладные расходы.
  • The pointcut is overkill. For example
    • execution(* com.foo.*(..)) only captures method executions in classes directly under package com.foo, but not in any sub-packages. So it is useless to exclude classes from sub-packages. Probably what you really want is execution(* com.foo..*(..)) - note the two dots in foo..* signifying subpackages.
    • Вы неправильно поняли мой ответ на другой вопрос, потому что вы не выбрали одно из моих решений, чтобы исключить аспект и его внутренне используемый анонимный ThreadLocal подкласс, а объединили всех с помощью &&. Это не делает его лучше и читабельнее.
    • Вы пытаетесь исключить call( * com.sflow.jmx.SFlowAgent(..)), но в этом нет необходимости по двум причинам: во-первых, SFlowAgent не находится в целевом пакете com.foo. Во-вторых, точка соединения execution() никогда не может одновременно быть точкой соединения call(), поэтому набор пересечений должен быть пустым — нет необходимости исключать вызовы из выполнения.
    • Этот синтаксис недействителен: !within(&& !within(*..*Aspect)) - возможно, ошибка копирования и вставки в отношении вложенных предложений within().

Сказав это, вы, вероятно, захотите этот pointcut:

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

Этого должно быть достаточно.

После исправления вашего pointcut вы можете попытаться прекратить сбор и регистрацию информации в аспекте, чтобы сделать его более эффективным. Что касается другого агента Java, нет необходимости исключать его из объединения аспектов, но, возможно, вам нужно исключить аспект из списка целей SFlowAgent. Возможно, есть проблема в аспектном коде, который обрабатывается агентом SFlow, но это всего лишь предположение. Возможно у вас неправильная конфигурация, может еще что-то. Мне кажется, что вы пытаетесь владеть двумя видами оружия (инструментами), которыми вы так и не научились пользоваться достаточно хорошо. Без SSCCE действительно сложно диагностировать основную причину проблемы.

Обновление: вы также можете попробовать указать AspectJ weaver в качестве первого агента Java в командной строке JVM, то есть перед агентом SFlow. Проверьте, если это имеет какое-либо значение.

person kriegaex    schedule 17.09.2014
comment
Большое спасибо kriegaex за указание на ошибки в моем pointcut. обязательно выучу и исправлю. я внес изменения в свою рабочую копию, но так как код был большим, и при копировании произошли некоторые ошибки. Проблема была решена с помощью опции -loadersToSkip, я избегал переплетения для загрузчика, который загружал класс Sflowagent. теперь он работает нормально. Большое спасибо за помощь. пожалуйста, обновите ответ - person Vimlesh Yadav; 18.09.2014
comment
Что я должен отредактировать в своем ответе? Вы не ответили ни на один из моих вопросов и не последовали моему совету. Вместо этого вы говорите мне, что нашли обходной путь, и это приятно. Но первопричина должна быть чем-то другим, потому что показанный вами здесь pointcut не должен переплетать другого агента. Может быть, у вас есть еще один, я понятия не имею. Пожалуйста, поделитесь SSCCE, чтобы мы все могли воспроизвести исходную проблему и чему-то научиться. В последнее время я потратил довольно много времени на то, чтобы помочь вам, но вы, кажется, игнорируете большинство моих подсказок, никогда не делитесь полной информацией и не помогаете воспроизвести проблему. - person kriegaex; 18.09.2014
comment
позвольте мне попытаться ответить на ваши вопросы - он должен сплести все классы в пакетах com.foo..*. Поскольку этот аспект предназначен для инструмента APM, и у нас нет никакого представления о коде, на сервере приложений нет ни одного потока. Цель состоит в том, чтобы сплести все классы в пакете com.foo..* и получить время отклика всех методов, выполняемых для 1 потока вызовов. нет потребления памяти за 10 минут до и время после того, как результаты JMX больше не отображаются. я загрузил код из добавленных отладок в коде и выполнил его с этим настроенным кодом. я вижу, что отладки под ru() вызывались только один раз. - person Vimlesh Yadav; 18.09.2014
comment
Как воспроизвести - запустить Aspectjweaver и sflowagent.jar вместе с любым сервером приложений. AppInformationReader изначально предназначался только для чтения некоторых пользовательских данных, а позже я использовал тот же класс для дампа данных (UUID, responseTime, methodName и className) для файлов журнала. Как только я смогу исправить проблему с функциональностью, я исправлю ее в соответствии с принципом единой ответственности. UUID используются для уникальной идентификации распределенных транзакций. у нас есть распределенные транзакции, и поэтому мне нужно собрать данные для всех прыжков для одной распределенной транзакции. - person Vimlesh Yadav; 18.09.2014
comment
sflowagent jmx-sflow-agent.googlecode .com/svn/trunk/src/com/sflow/jmx/ содержит некоторые MXBEANS, которые были повреждены после плетения. Поврежденный код: /* OperatingSystemMXBean osMX = ManagementFactory.getOperatingSystemMXBean(); Строка className = osMX.getClass().getName(); if(com.sun.management.OperatingSystem.equals(className) || com.sun.management.UnixOperatingSystem.equals(className)) { */. Я до сих пор не знаю, что пошло не так в этом коде. - person Vimlesh Yadav; 18.09.2014
comment
Kriegaexk - Еще 1 вопрос - Как мы можем сделать распределенную трассировку транзакций. например, отправка одного и того же UUId всем JVM на пути транзакции. Как мы можем реализовать эту функциональность, если переходы взаимодействуют с использованием веб-служб (SOAP + Rest). - person Vimlesh Yadav; 18.09.2014
comment
Я был занят и находился в дороге почти две недели. Теперь я повторяю: предоставьте нам SSCCE (пожалуйста, нажмите на ссылку и прочитайте), попробуйте с любым сервером приложений, который не достаточно информации ИМО. Попробовать что? Пожалуйста, создайте небольшой образец проекта Maven на GitHub и скажите мне, какую цель вызывать, это было бы чрезвычайно полезно. Вы так много написали здесь, так что это, кажется, важно для вас. Тогда пройдите последнюю милю и подготовьте SSCCE, иначе я больше ничего не буду здесь писать. Сделайте его воспроизводимым! - person kriegaex; 24.09.2014