Skip to content

mshamanov/spring_aop_tracktime

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

50 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Система учета времени выполнения методов

Описание:

Необходимо разработать систему учета времени выполнения методов в приложении с использованием Spring AOP. Система должна быть способна асинхронно логировать и анализировать данные о времени выполнения методов.

Требования:

Создать аннотации @TrackTime и @TrackAsyncTime, которые можно применять к методам для отслеживания времени их выполнения. Реализовать аспекты, используя Spring AOP, для асинхронного и синхронного отслеживания времени выполнения методов, помеченных соответствующими аннотациями. Создать сервис, который будет асинхронно сохранять данные о времени выполнения методов в базе данных. Реализовать REST API для получения статистики по времени выполнения методов (например, среднее время выполнения, общее время выполнения) для различных методов и их групп. Настроить приложение с помощью конфигурации Spring для включения использования AOP и асинхронной обработки данных.

Технологии/зависимости

В рамках проекта используется:
Java21 Spring Boot v3 PostgreSQL Hibernate Maven

JDK

Проект написан с использованием 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-UI
  • rest/controller/TrackTimeRestController.java - класс REST-контроллера
  • rest/converter/* - классы-конвертеры из данных JSON в экземпляры Java
  • rest/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-сервису.

Взаимодействие с REST-сервисом

Для того, чтобы получить выборку сформированных данных, Вы можете воспользоваться таким инструментом как Postman или запустить во время работы приложения в браузере пользовательскую среду Swagger-UI для взаимодействия с REST-сервисом:

http://localhost:8080/swagger-ui.html

Там же Вы найдёте информацию о доступных запросах и ответах от сервера. Другим способом получить такую информацию является файл спецификации OpenAPI, который находится в src/main/resources/static/open-api.yaml, в этом документе есть вся необходимая информация.

Лицензия

License: MIT

About

T1 - Spring AOP - Task 1 Solution

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages