Включить профилированную аннотацию perf4j в intellij

Я пытаюсь включить аннотации perf4j в intellij, но я изо всех сил пытаюсь правильно настроить AspectJ. В частности, файл журнала создается правильно, но в нем отсутствуют какие-либо данные из аннотированного метода.

Это соответствующие выдержки из конфигурации:

logback.xml

<configuration debug="true">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
        <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

<appender name="statistics" class="ch.qos.logback.core.FileAppender">
    <file>./target/statisticsLogback.log</file>
    <append>false</append>
    <layout>
        <pattern>%msg%n</pattern>
    </layout>
</appender>

<appender name="coalescingStatistics" class="org.perf4j.logback.AsyncCoalescingStatisticsAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <timeSlice>1000</timeSlice>
    <appender-ref ref="statistics"/>
</appender>

<appender name="listAppender" class="ch.qos.logback.core.read.ListAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <timeSlice>1000</timeSlice>
</appender>

<logger name="org.perf4j.TimingLogger" level="info">
    <appender-ref ref="coalescingStatistics" />
    <appender-ref ref="listAppender"/>
</logger>

<root level="debug">
    <appender-ref ref="STDOUT" />
</root>

aop.xml

<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
    <!--
     We only want to weave in the log4j TimingAspect into the @Profiled classes.
     Note that Perf4J provides TimingAspects for the most popular Java logging
     frameworks and facades: log4j, java.util.logging, Apache Commons Logging
     and SLF4J. The TimingAspect you specify here will depend on which logging
     framework you wish to use in your code.
    -->
    <aspects>
        <aspect name="org.perf4j.slf4j.aop.TimingAspect"/>
        <!-- if SLF4J/logback use org.perf4j.slf4j.aop.TimingAspect instead -->
    </aspects>
    <weaver options="-verbose -showWeaveInfo">
        <!--
         Here is where we specify the classes to be woven. You can specify package
         names like com.company.project.*
        -->
        <include within="com.mycode.myproject.mypackage.*"/>
        <include within="org.perf4j.slf4j.aop.*"/>
    </weaver>
</aspectj>

Наконец, связанный метод тестирования помечен аннотацией @Profiled, это часть пакета, определенного в aop.xml.

Эта конфигурация приводит к созданию файла журнала (что говорит о том, что файл logback.xml настроен правильно, однако он содержит только заголовки и не содержит статистики из помеченного метода.

Главный вопрос, который у меня есть, заключается в том, куда должна идти конфигурация AspectJ в Intellij. Я включил aop.xml в созданную вручную папку META-INF в папке src, но я не уверен, что AspectJ вообще обнаруживает это.

заранее спасибо

ОБНОВЛЕНИЕ

Я добился некоторого прогресса в этом со времени моего первоначального поста, в частности, внес два изменения: i) включил -javaagent:lib\aspectjweaver.jar ii) переместил aop.xml в папку META-INF. Конфигурация aop теперь подбирается, поскольку она регистрирует детали конфигурации, а также упоминает профилируемый метод. Теперь проблема заключается в том, что профилируемый поток дает сбой, он не регистрирует никаких исключений, но с помощью отладки проблема, похоже, связана с ClassNotFoundException в org.aspectj.runtime.reflect.Factory при попытке создать экземпляр org.aspectj.runtime. отражение.JoinPointImpl.

Чтобы изолировать проблему, я удалил весь импорт из maven из aspectJ и использовал файлы jar, предоставленные установочным пакетом, но проблема не устранена, а также тот факт, что приложение аварийно завершает работу без ведения журнала, что затрудняет отслеживание проблемы.

ОБНОВЛЕНИЕ

Чтобы уточнить:

  • Прочитав больше об этом, включая руководство по обратной ссылке (спасибо за это), я понял, что смешиваю подход времени загрузки/времени компиляции. С тех пор я попробовал оба метода, как описано в руководстве, но с теми же результатами, что и в моем предыдущем обновлении.
  • Как указано выше, я запускаю приложение с параметром Avenuej Weaver (-javaagent).
  • Сборка выполняется через IDE, как указано выше, на данный момент я удалил зависимости aspectj/perf4j от Maven и связал их с локальными jar-файлами.
  • Как уже упоминалось, aop.xml действительно загружается, как указано в обновлении, без ошибок или предупреждений, просто подтверждение тканого метода.

person Adunato    schedule 12.04.2017    source источник
comment
Спасибо за конфигурацию, но мне не хватает аннотированного кода приложения. Я хорошо знаю AspectJ, но не Perf4J. Из вашего aop.xml я делаю вывод, что вы хотите использовать плетение во время загрузки, а не во время компиляции, верно? Тогда правильно ли вы запускаете свою JVM с ткачом AspectJ в качестве агента Java в командной строке? И как вы создаете свое приложение? Надеюсь, с Мейвеном. Это было бы лучше, чем чистая сборка, зависящая от IDE. Пожалуйста, ответьте на все мои вопросы и отредактируйте свой собственный вопрос с образцом кода, тогда я смогу лучше вам помочь.   -  person kriegaex    schedule 13.04.2017
comment
Обновление: мне было любопытно, и я создал небольшой проект Perf4J Maven. Он использует переплетение во время компиляции через компилятор AspectJ вместо переплетения во время загрузки. Оба способа описаны в руководстве для разработчиков (доступно только через WayBack Machine, потому что Codehaus давно закрыли), но с ручной настройкой, а не с Maven. Я предпочитаю Maven, потому что он работает в любой среде IDE, такой как Eclipse, IDEA, возможно, также в Netbeans (никогда не пробовал). Он прекрасно работает, и я не вижу причин, по которым LTW также не работал бы.   -  person kriegaex    schedule 13.04.2017
comment
Другой вопрос, касающийся LTW: вы видите какие-либо выходные данные AspectJ weaver на консоли с <weaver options="-verbose -showWeaveInfo">? Есть ли признаки того, что файл вообще загружается?   -  person kriegaex    schedule 13.04.2017
comment
Спасибо за ваше время на это. Я обновил сообщение с дополнительной информацией и обновлением текущего статуса.   -  person Adunato    schedule 13.04.2017
comment
Пожалуйста, ответьте на мои вопросы. В вашем обновлении нет.   -  person kriegaex    schedule 13.04.2017
comment
Для информации я закончил тем, что обошёл систему аннотаций perf4j своей собственной, которая, в свою очередь, использовала функции секундомера и ведения журнала perf4j. Таким образом, все работает нормально, и я по-прежнему могу пользоваться функциями ведения журнала и агрегирования perf4j при использовании тегов на основе аннотаций. Спасибо за поддержку, она помогла мне решить несколько проблем на этом пути.   -  person Adunato    schedule 13.04.2017
comment
Вы слишком легко сдались - и я, кажется, потерял много времени, потому что к настоящему времени я подготовил полную сборку Maven с двумя профилями, один для CTW и один для LTW. Вы всегда программируете собственные обходные пути, если чего-то не понимаете? Я очень зол, что вы спросили, но не ответили на мои дополнительные вопросы, с помощью которых я мог бы помочь вам диагностировать и решить проблему. Поздравляем с отличным входом в StackOverflow. Если ты будешь продолжать в том же духе, ты найдешь здесь много друзей.   -  person kriegaex    schedule 13.04.2017
comment
Извините, если мой подход показался ленивым, на самом деле я не хотел тратить ваше время, поэтому и написал свой пост. Мне было бы интересно разобраться с проблемой использования аннотаций perf4j, но меня отталкивал тот факт, что для perf4j требуется закрытый набор старых jar-файлов аспектов, что усложняло устранение неполадок, и, честно говоря, я чувствовал, что натыкаюсь на стену. Кстати, я ответил на ваши вопросы, насколько я понял, во втором обновлении, но я прошу прощения, если это не показалось мне сотрудничеством с моей стороны.   -  person Adunato    schedule 13.04.2017


Ответы (1)


Хорошо, я добавил полный пример Maven в репозиторий GitHub, который вы можете просто клонировать и поиграть с ним. .

Некоторые основные вещи, которые следует учитывать:

  • Для плетения во время компиляции (CTW) вам нужно aspectjrt.jar в пути к классам при компиляции и запуске кода. Вам также необходимо использовать компилятор AspectJ для сборки проекта, обычного компилятора Java недостаточно.
  • Для плетения во время загрузки (LTW) вам нужно aspectjweaver.jar в качестве агента Java в командной строке при запуске кода: -javaagent:/path/to/aspectjweaver.jar. Вам также необходимо добавить его в качестве аргумента виртуальной машины в конфигурацию запуска LTW в IDEA.
  • Для LTW вам также понадобится META-INF/aop.xml в папке ресурсов. Также обратите внимание, что для охвата подпакетов вы должны использовать нотацию ..*, а не только .*, например. <include within="de.scrum_master..*"/>.

Дополнительную информацию вы найдете в файле readme моего проекта.

P.S.: Документация Perf4J устарела, и проект не поддерживается. Таким образом, он по-прежнему упоминает AspectJ 1.6.x как необходимые зависимости. Я построил и запустил все с последней версией AspectJ 1.8.10, и она отлично работает как в Maven, так и в IDEA.

person kriegaex    schedule 14.04.2017
comment
Спасибо за это, это далеко за пределами любой помощи, которую я надеялся найти здесь. Я клонировал ваш репозиторий, протестировал его, а затем адаптировал к своему проекту, который теперь работает с родной аннотацией perf4j :-) Также приятно видеть, что, несмотря на старую библиотеку, она по-прежнему работает с последней версией AspectJ. - person Adunato; 14.04.2017