diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml index 3c4ae4f..30c2061 100644 --- a/.github/workflows/deploy-prod.yml +++ b/.github/workflows/deploy-prod.yml @@ -42,8 +42,11 @@ jobs: java-version: '21' distribution: 'corretto' + - name: Gradle Wrapper 실행 권한 부여 + run: chmod +x ./gradlew + - name: JAR 빌드 - run: ./gradlew bootJar --no-daemon + run: ./gradlew bootJar --no-daemon --stacktrace -Dspring.profiles.active=prod - name: Docker Hub 로그인 run: echo "${{ secrets.DOCKER_ACCESS_TOKEN }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin diff --git a/src/main/java/com/recyclestudy/common/log/ControllerLoggingAspect.java b/src/main/java/com/recyclestudy/common/log/ControllerLoggingAspect.java index 62d7e91..5a6f1ad 100644 --- a/src/main/java/com/recyclestudy/common/log/ControllerLoggingAspect.java +++ b/src/main/java/com/recyclestudy/common/log/ControllerLoggingAspect.java @@ -7,7 +7,6 @@ import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; @@ -20,11 +19,7 @@ public class ControllerLoggingAspect { private static final int MAX_LOG_LENGTH = 500; - @Pointcut("execution(* com.recyclestudy..controller..*(..))") - public void controllerMethods() { - } - - @Around("controllerMethods()") + @Around("LoggingPointcuts.controllerLayer()") public Object logController(final ProceedingJoinPoint joinPoint) throws Throwable { final MethodSignature signature = (MethodSignature) joinPoint.getSignature(); final String className = signature.getDeclaringType().getSimpleName(); diff --git a/src/main/java/com/recyclestudy/common/log/LoggingPointcuts.java b/src/main/java/com/recyclestudy/common/log/LoggingPointcuts.java new file mode 100644 index 0000000..39d2b97 --- /dev/null +++ b/src/main/java/com/recyclestudy/common/log/LoggingPointcuts.java @@ -0,0 +1,22 @@ +package com.recyclestudy.common.log; + +import org.aspectj.lang.annotation.Pointcut; + +public class LoggingPointcuts { + + @Pointcut("execution(* com.recyclestudy..controller..*(..))") + public void controllerLayer() { + } + + @Pointcut("execution(* com.recyclestudy..service..*(..))") + public void serviceLayer() { + } + + @Pointcut("execution(* com.recyclestudy..repository..*(..))") + public void repositoryLayer() { + } + + @Pointcut("controllerLayer() || serviceLayer() || repositoryLayer()") + public void applicationLayers() { + } +} diff --git a/src/main/java/com/recyclestudy/common/trace/TracingAspect.java b/src/main/java/com/recyclestudy/common/trace/TracingAspect.java new file mode 100644 index 0000000..dc2d266 --- /dev/null +++ b/src/main/java/com/recyclestudy/common/trace/TracingAspect.java @@ -0,0 +1,36 @@ +package com.recyclestudy.common.trace; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Scope; +import lombok.RequiredArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@RequiredArgsConstructor +@Order(Ordered.HIGHEST_PRECEDENCE) +public class TracingAspect { + + private final Tracer tracer; + + @Around("com.recyclestudy.common.log.LoggingPointcuts.applicationLayers()") + public Object trace(ProceedingJoinPoint joinPoint) throws Throwable { + String className = joinPoint.getSignature().getDeclaringType().getSimpleName(); + String methodName = joinPoint.getSignature().getName(); + + String spanName = className + "::" + methodName; + Span span = tracer.spanBuilder(spanName).startSpan(); + + try (Scope scope = span.makeCurrent()) { + return joinPoint.proceed(); + } finally { + span.end(); + } + } +}