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/alloy/docker-compose.yml b/alloy/docker-compose.yml index 48e7720..58ee940 100644 --- a/alloy/docker-compose.yml +++ b/alloy/docker-compose.yml @@ -7,7 +7,7 @@ services: - ../.env volumes: - ./config.alloy:/etc/alloy/config.alloy - - /app/logs:/var/log/app + - /app/log:/var/log/app command: - "run" - "--server.http.listen-addr=0.0.0.0:12345" 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(); + } + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 5f3472a..10f5165 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -35,12 +35,26 @@ spring: enable: true auth: true +server: + tomcat: + mbeanregistry: + enabled: true + management: endpoints: web: exposure: include: prometheus, health + metrics: + tags: + application: ${spring.application.name} + + prometheus: + metrics: + export: + enabled: true + tracing: sampling: probability: 1.0