Включить профильную аннотацию 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.reflect.JoinPointImpl.

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

ОБНОВИТЬ

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

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

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..*"/>,

Вы найдете больше информации в файле read-me моего проекта.

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

Другие вопросы по тегам