Skip to content

Commit

Permalink
Merge branch 'develop' into feature/#613_deploy_v.1.3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Junyoung-WON committed Feb 6, 2025
2 parents 73ea40d + eea1669 commit defa59a
Show file tree
Hide file tree
Showing 12 changed files with 291 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.staccato.config.log;


import java.time.LocalDate;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.staccato.member.domain.Member;
import com.staccato.moment.service.MomentService;
import com.staccato.moment.service.dto.request.MomentRequest;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import lombok.RequiredArgsConstructor;

@Aspect
@Component
@RequiredArgsConstructor
public class CreateMomentMetricsAspect {

private final MeterRegistry meterRegistry;

@Pointcut("execution(public * com.staccato.moment.service.MomentService.createMoment(..)) && args(momentRequest, member)")
public void createMomentPointcut(MomentRequest momentRequest, Member member) {
}

@AfterReturning(pointcut = "createMomentPointcut(momentRequest, member)", returning = "result")
public void afterSuccessfulCreateMoment(MomentRequest momentRequest, Member member, Object result) {
LocalDate visitedAt = momentRequest.visitedAt().toLocalDate();
LocalDate now = LocalDate.now();
if (isPastDate(visitedAt, now)) {
recordCounter("past");
return;
}
if (isFutureDate(visitedAt, now)) {
recordCounter("future");
return;
}
recordCounter("now");
}

private boolean isPastDate(LocalDate visitedAt, LocalDate now) {
return visitedAt.isBefore(now);
}

private boolean isFutureDate(LocalDate visitedAt, LocalDate now) {
return visitedAt.isAfter(now);
}

private void recordCounter(String viewPoint) {
Counter.builder("staccato_record_viewpoint")
.tag("class", MomentService.class.getName())
.tag("method", "createMoment")
.tag("viewPoint", viewPoint)
.description("counts different view points for Staccato Record")
.register(meterRegistry).increment();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.staccato.config.log;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.staccato.member.domain.Member;
import com.staccato.memory.service.MemoryFilter;
import com.staccato.memory.service.MemoryService;
import com.staccato.memory.service.MemorySort;
import com.staccato.memory.service.dto.request.MemoryReadRequest;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import lombok.RequiredArgsConstructor;

@Aspect
@Component
@RequiredArgsConstructor
public class ReadAllCategoryMetricsAspect {

private final MeterRegistry meterRegistry;

@Pointcut("execution(public * com.staccato.memory.service.MemoryService.readAllMemories(..)) && args(member, memoryReadRequest)")
public void createMemoryPointcut(Member member, MemoryReadRequest memoryReadRequest) {
}

@AfterReturning(pointcut = "createMemoryPointcut(member, memoryReadRequest)", returning = "result", argNames = "member,memoryReadRequest,result")
public void afterSuccessfulReadMemory(Member member, MemoryReadRequest memoryReadRequest, Object result) {
for (MemoryFilter filter : memoryReadRequest.getFilters()) {
countFilter(filter);
}
countSort(memoryReadRequest.getSort());
}

private void countFilter(MemoryFilter filter) {
Counter.builder("category_filter_count")
.tag("class", MemoryService.class.getName())
.tag("method", "readAllMemories")
.tag("filter", filter.getName())
.description("counts for filter usage of categories")
.register(meterRegistry).increment();
}

private void countSort(MemorySort sort) {
Counter.builder("category_sort_count")
.tag("class", MemoryService.class.getName())
.tag("method", "readAllMemories")
.tag("sort", sort.getName())
.description("counts for sort usage of categories")
.register(meterRegistry).increment();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

import java.net.URI;
import java.time.LocalDate;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
Expand All @@ -18,15 +16,13 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.staccato.config.auth.LoginMember;
import com.staccato.config.log.annotation.Trace;
import com.staccato.member.domain.Member;
import com.staccato.memory.controller.docs.CategoryControllerDocs;
import com.staccato.memory.service.MemoryService;
import com.staccato.memory.service.dto.request.CategoryReadRequest;
import com.staccato.memory.service.dto.request.CategoryRequest;
import com.staccato.memory.service.dto.request.MemoryReadRequest;
import com.staccato.memory.service.dto.response.CategoryDetailResponse;
import com.staccato.memory.service.dto.response.CategoryIdResponse;
import com.staccato.memory.service.dto.response.CategoryNameResponses;
Expand All @@ -35,7 +31,6 @@
import com.staccato.memory.service.dto.response.MemoryIdResponse;
import com.staccato.memory.service.dto.response.MemoryNameResponses;
import com.staccato.memory.service.dto.response.MemoryResponses;

import lombok.RequiredArgsConstructor;

@Trace
Expand All @@ -52,7 +47,8 @@ public ResponseEntity<CategoryIdResponse> createCategory(
@LoginMember Member member
) {
MemoryIdResponse memoryIdResponse = memoryService.createMemory(CategoryDtoMapper.toMemoryRequest(categoryRequest), member);
return ResponseEntity.created(URI.create("/categories/" + memoryIdResponse.memoryId())).body(CategoryDtoMapper.toCategoryIdResponse(memoryIdResponse));
return ResponseEntity.created(URI.create("/categories/" + memoryIdResponse.memoryId()))
.body(CategoryDtoMapper.toCategoryIdResponse(memoryIdResponse));
}

@GetMapping
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.staccato.memory.domain.Memory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Getter
public enum MemoryFilter {
TERM("term", memoryList ->
memoryList.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import java.util.function.Function;
import java.util.stream.Stream;
import com.staccato.memory.domain.Memory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Getter
public enum MemorySort {
UPDATED("UPDATED", memoryList ->
memoryList.stream()
Expand Down
4 changes: 2 additions & 2 deletions backend/src/main/resources/error-appender.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<included>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/error/error-${BY_DATE}.log</file>
<file>./logs/error/error.log</file>

<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
Expand All @@ -13,7 +13,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>./logs/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>15</maxHistory>
<maxHistory>365</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
Expand Down
4 changes: 2 additions & 2 deletions backend/src/main/resources/info-appender.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<included>
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/info/info-${BY_DATE}.log</file>
<file>./logs/info/info.log</file>

<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
Expand All @@ -13,7 +13,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>./logs/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>15</maxHistory>
<maxHistory>365</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
Expand Down
1 change: 0 additions & 1 deletion backend/src/main/resources/logback-spring.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<timestamp key="BY_DATE" datePattern="yyyy-MM-dd"/>
<springProfile name="dev">
<include resource="console-appender.xml"/>
<root level="info">
Expand Down
4 changes: 2 additions & 2 deletions backend/src/main/resources/warn-appender.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<included>
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/warn/warn-${BY_DATE}.log</file>
<file>./logs/warn/warn.log</file>

<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
Expand All @@ -13,7 +13,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>./logs/warn/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>15</maxHistory>
<maxHistory>365</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package com.staccato.config.log;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Stream;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.staccato.ServiceSliceTest;
import com.staccato.fixture.Member.MemberFixture;
import com.staccato.fixture.memory.MemoryFixture;
import com.staccato.member.domain.Member;
import com.staccato.member.repository.MemberRepository;
import com.staccato.memory.domain.Memory;
import com.staccato.memory.repository.MemoryRepository;
import com.staccato.moment.service.MomentService;
import com.staccato.moment.service.dto.request.MomentRequest;
import io.micrometer.core.instrument.MeterRegistry;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;

class CreateMomentMetricsAspectTest extends ServiceSliceTest {

@Autowired
private MemoryRepository memoryRepository;
@Autowired
private MemberRepository memberRepository;
@Autowired
private MomentService momentService;
@Autowired
private MeterRegistry meterRegistry;

@DisplayName("기록되는 시점을 매트릭을 통해 표현 할 수 있습니다.")
@TestFactory
Stream<DynamicTest> createMomentMetricsAspect() {
Member member = saveMember();
Memory memory = saveMemory(member);
LocalDateTime now = LocalDateTime.now();

return Stream.of(
dynamicTest("과거, 미래 기록 매트릭을 등록합니다.", () -> {
// given
MomentRequest pastRequest = createRequest(memory.getId(), now.minusDays(1));
MomentRequest futureRequest = createRequest(memory.getId(), now.plusDays(1));

//when
momentService.createMoment(pastRequest, member);
momentService.createMoment(futureRequest, member);

//then
assertAll(
() -> assertThat(getPastCount()).isEqualTo(1.0),
() -> assertThat(getFutureCount()).isEqualTo(1.0)
);
}),
dynamicTest("과거 요청 → 누적: past:2, future:1", () -> {
// given
MomentRequest momentRequest = createRequest(memory.getId(), now.minusDays(1));

// when
momentService.createMoment(momentRequest, member);

// then
assertAll(
() -> assertThat(getPastCount()).isEqualTo(2.0),
() -> assertThat(getFutureCount()).isEqualTo(1.0)
);
})
);
}

private Member saveMember() {
return memberRepository.save(MemberFixture.create());
}

private Memory saveMemory(Member member) {
Memory memory = MemoryFixture.create();
memory.addMemoryMember(member);
return memoryRepository.save(memory);
}

private double getFutureCount() {
return meterRegistry.get("staccato_record_viewpoint")
.tag("viewPoint", "future")
.counter().count();
}

private double getPastCount() {
return meterRegistry.get("staccato_record_viewpoint")
.tag("viewPoint", "past")
.counter().count();
}

private MomentRequest createRequest(Long memoryId, LocalDateTime localDateTime) {
return new MomentRequest(
"staccatoTitle",
"placeName",
"address",
BigDecimal.ONE,
BigDecimal.ONE,
localDateTime,
memoryId,
List.of());
}
}
Loading

0 comments on commit defa59a

Please sign in to comment.