-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'develop' into feature/#613_deploy_v.1.3.0
- Loading branch information
Showing
12 changed files
with
291 additions
and
13 deletions.
There are no files selected for viewing
58 changes: 58 additions & 0 deletions
58
backend/src/main/java/com/staccato/config/log/CreateMomentMetricsAspect.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} |
52 changes: 52 additions & 0 deletions
52
backend/src/main/java/com/staccato/config/log/ReadAllCategoryMetricsAspect.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
109 changes: 109 additions & 0 deletions
109
backend/src/test/java/com/staccato/config/log/CreateMomentMetricsAspectTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | ||
} | ||
} |
Oops, something went wrong.