diff --git a/server/src/main/java/ru/dragonestia/picker/LoadBalancerApplication.java b/server/src/main/java/ru/dragonestia/picker/LoadBalancerApplication.java index 05ee7ee..aa81bb9 100644 --- a/server/src/main/java/ru/dragonestia/picker/LoadBalancerApplication.java +++ b/server/src/main/java/ru/dragonestia/picker/LoadBalancerApplication.java @@ -7,6 +7,8 @@ import io.swagger.v3.oas.annotations.info.License; import io.swagger.v3.oas.annotations.servers.Server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.scheduling.annotation.EnableScheduling; @OpenAPIDefinition( info = @Info( @@ -24,6 +26,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; } ) @SpringBootApplication +@EnableAspectJAutoProxy +@EnableScheduling public class LoadBalancerApplication { public static void main(String[] args) { diff --git a/server/src/main/java/ru/dragonestia/picker/aspect/UserMetricsAspect.java b/server/src/main/java/ru/dragonestia/picker/aspect/UserMetricsAspect.java new file mode 100644 index 0000000..e825f9f --- /dev/null +++ b/server/src/main/java/ru/dragonestia/picker/aspect/UserMetricsAspect.java @@ -0,0 +1,45 @@ +package ru.dragonestia.picker.aspect; + +import io.micrometer.core.instrument.MeterRegistry; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import ru.dragonestia.picker.repository.UserRepository; + +import java.util.concurrent.atomic.AtomicInteger; + +@Component +@Aspect +@RequiredArgsConstructor +@Log4j2 +public class UserMetricsAspect { + + private final UserRepository userRepository; + private final MeterRegistry meterRegistry; + + private final AtomicInteger totalUsers = new AtomicInteger(0); + + @PostConstruct + void init() { + meterRegistry.gauge("roompicker_total_users", totalUsers); + } + + @After("execution(void ru.dragonestia.picker.repository.UserRepository.linkWithRoom(..))") + void onLinkUsers() { + totalUsers.set(userRepository.countAllUsers()); + } + + @After("execution(void ru.dragonestia.picker.repository.UserRepository.unlinkWithRoom(..))") + void onUnlinkUsers() { + totalUsers.set(userRepository.countAllUsers()); + } + + @Scheduled(fixedDelay = 3_000) + void updateUserMetrics() { + // TODO: metrics for userRepository.countUsersForNodes() + } +} diff --git a/server/src/main/java/ru/dragonestia/picker/repository/UserRepository.java b/server/src/main/java/ru/dragonestia/picker/repository/UserRepository.java index e295431..bb1c1d5 100644 --- a/server/src/main/java/ru/dragonestia/picker/repository/UserRepository.java +++ b/server/src/main/java/ru/dragonestia/picker/repository/UserRepository.java @@ -12,7 +12,7 @@ public interface UserRepository { Map linkWithRoom(Room room, Collection users, boolean force) throws RoomAreFullException; - int unlinkWithRoom(Room room, Collection users); + void unlinkWithRoom(Room room, Collection users); List findAllLinkedUserRooms(User user); diff --git a/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java b/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java index fb92909..6bdd5dc 100644 --- a/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java @@ -66,7 +66,7 @@ public class UserRepositoryImpl implements UserRepository { } @Override - public int unlinkWithRoom(Room room, Collection users) { + public void unlinkWithRoom(Room room, Collection users) { var counter = new AtomicInteger(); lock.writeLock().lock(); @@ -98,7 +98,7 @@ public class UserRepositoryImpl implements UserRepository { } finally { lock.writeLock().unlock(); } - return counter.get(); + counter.get(); } @Override