Необходимо разработать систему учета времени выполнения методов в приложении с использованием Spring AOP. Система должна быть способна асинхронно логировать и анализировать данные о времени выполнения методов.
Создать аннотации @TrackTime и @TrackAsyncTime, которые можно применять к методам для отслеживания времени их выполнения. Реализовать аспекты, используя Spring AOP, для асинхронного и синхронного отслеживания времени выполнения методов, помеченных соответствующими аннотациями. Создать сервис, который будет асинхронно сохранять данные о времени выполнения методов в базе данных. Реализовать REST API для получения статистики по времени выполнения методов (например, среднее время выполнения, общее время выполнения) для различных методов и их групп. Настроить приложение с помощью конфигурации Spring для включения использования AOP и асинхронной обработки данных.
В рамках проекта используется:
Проект написан с использованием JDK (Java) версии 21, который можно скачать, например, по этой ссылке: https://adoptium.net/download
Можно использовать JetBrains IntelliJ IDEA или VS Code, либо любую другую совместимую с вышеуказанными технологиями среду разработки.
В качестве БД в проекте используется PostgreSQL.
Скачать БД PostgreSQL можно с официального сайта
или
воспользоваться Docker для развёртывания.
AopTrackTimeApplication- точка входа в приложение, запуск приложения осуществляется с помощью метода main,aspect/*- классы и интерфейсы, связанные с AOP,aspect/annotation/*- аннотации AOP,aspect/impl/*- имплементация логики работы AOP,entity/*- классы-сущности для работы с репозиториями,generator/*- классы-генераторы сущностей,repository/*- интерфейсы и классы-репозитория для непосредственной манипуляции с хранилищами данных,rest/*- классы для работы REST-сервиса,rest/advice/*- классы для обработки ошибок при работе с REST-сервисомrest/config/OpenApiConfig.java- класс-конфигурации для настройки Swagger-UIrest/controller/TrackTimeRestController.java- класс REST-контроллераrest/converter/*- классы-конвертеры из данных JSON в экземпляры Javarest/mapper/*- классы для трансформации данных из одного вида в другойrest/model/*- классы, представляющие собой DTO для передачи данныхservice/*- классы-сервисы для работы с репозиториями,utils/ThreadUtils.java- вспомогательный класс для работы с потоками
Для запуска приложения, необходимо сначала скачать его:
git clone https://github.com/mshamanov/spring_aop_tracktime.git
Затем необходимо настроить БД под своё окружение.
Для этого нужно внести изменения в файл: src/main/resources/application.yaml.
Укажите URL адрес БД, а также имя и пароль пользователя:
datasource:
url: jdbc:postgresql://localhost:5432/postgres
username: {ПОЛЬЗОВАТЕЛЬ}
password: {ПАРОЛЬ}
Название таблицы по умолчанию: tracktimestats.
create table tracktimestats
(
id bigserial primary key,
class_name varchar(255) not null,
created_at timestamp(6) not null,
execution_time bigint not null,
group_name varchar(255) not null,
method_name varchar(255) not null,
package_name varchar(255) not null,
parameters varchar(255) not null,
return_type varchar(255) not null,
method_status varchar(255) not null
);
Создавать структуру, как правило, нет необходимости, т.к. при первом запуске приложения структура будет создана благодаря работе Hibernate.
В том случае, если запуск осуществляется непосредственно из среды
разработки, то Вы можете просто запустить метод main
из com.mash.aoptracktime.AopTrackTimeApplication.
Другим способом будет установка через Maven:
Если Maven уже установлен на Вашем компьютере, то Вы можете просто запустить:
mvn spring-boot:run
Если Maven не установлен на Вашем компьютере, то Вы можете запустить следующую команду:
./mvnw spring-boot:run
При успешном запуске приложения будет запущен класс генерирующий произвольные
данные о сотрудниках, сохраняя эти данные в БД [100 записей].
Методы, генерирующие данные о сотрудниках, а также методы сохранения данных в
БД, обозначены аннотациями @TrackTime и @TrackAsyncTime в зависимости от
того является ли вызов метода синхронным или асинхронным. При этом методы
сохранения в БД данных о сотрудниках имитируют небольшую задержку в пределах
300мс для того, чтобы создать разное время выполнения одних и тех же методов.
Некоторые методы могут получить статус EXCEPTION, это не означает неправильную
работу приложения, это сделано для разнообразия примеров. Вся метрика вызовов
методов сохраняется в БД, в таблицу tracktimestats.
Таким образом, используя аннотации @TrackTime и @TrackAsyncTime мы можем
оценивать время работы тех или иных методов в рамках приложения Spring Boot,
используя возможности AOP. Для дальнейшей оценки и изучения этих данных мы можем
сделать выборку необходимых данных по различным критериям поиска с помощью
обращения к запущенному REST-сервису.
Для того, чтобы получить выборку сформированных данных, Вы можете воспользоваться таким инструментом как Postman или запустить во время работы приложения в браузере пользовательскую среду Swagger-UI для взаимодействия с REST-сервисом:
http://localhost:8080/swagger-ui.html
Там же Вы найдёте информацию о доступных запросах и ответах от сервера.
Другим способом получить такую информацию является файл спецификации OpenAPI,
который находится в src/main/resources/static/open-api.yaml,
в этом документе есть вся необходимая информация.