ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot3 + Jaeger] 스프링부트3에 예거 설정 추가 하는 방법
    Programming Language/Java 2024. 7. 31. 10:47
    반응형

    Jaeger 는 Uber Technologies 에서 개발한

    오픈소스 분산 트레이싱 시스템으로,

    마이크로서비스 아키텍처에서 서비스 간의 트랜잭션을

    추적하고 분석 할 수 있도록 해준다.

     

    최근 회사에서 프로젝트를 진행하면서

    여러 서비스 간의 API 흐름을 추적하고 모니터링하기 위해

    Jaeger 를 사용하기로 했다.

     

    내가 적용한 서비스는 Spring Boot 3.x 로 개발하고 있는데,

    Jaeger 를 적용하는 과정에서 Spring Boot 2.x 버전에서

    적용하는 방법과 차이가 있어서 정리를 하려고 한다.

     

    사용한 도구

    Gradle 8.5

    Java 21

    Spring Boot 3.x

    Jaeger (all-in-one) 1.59

     

    io.opentracing.contrib:opentracing-spring-jaeger-web-starter 실패

    opentracing 에서 개발한

    opentracing-spring-jaeger-web-starter 의 경우

    spring boot 2.x 버전에서는

    application.yml 에 추가로

    간단하게 동작이 가능하다고 하지만,,

     

    나의 경우 spring boot 3.x 를 사용해서

    Jaeger 에 정상 등록이 안됐다.

     

    opentracing github 을 확인해보니

    2021년 1월 3일 커밋을 마지막으로

    더이상 개발되지 않고 있고,

    Jaeger 문서 에서도 OpenTelemetry 를

    사용하는 것을 추천하고 있다.

    Jaeger 설치하기 (Docker)

    docker-hub 의 Jaeger All-in-One 이미지를 사용하고

    OTLP (OpenTelemetry Protocol) 을 사용하기 위해서

    COLLECTOR_OTLP_ENABLED=true 로 설정 하였다.

    docker run -d --rm --name jaeger \
      -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 -e COLLECTOR_OTLP_ENABLED=true \
      -p 6831:6831/udp \
      -p 6832:6832/udp \
      -p 5778:5778 \
      -p 16686:16686 \
      -p 4317:4317 \
      -p 4318:4318 \
      -p 14250:14250 \
      -p 14268:14268 \
      -p 14269:14269 \
      -p 9411:9411 \
      jaegertracing/all-in-one:1.59
    필요한 의존성

    우선 OpenTelemetry BOM 을 설정하여

    OpenTelemetry 의 모든 의존성을 정렬한다.

     

    gradle 의 경우 아래 2가지 방법이 있다.

    주의점은 두 방법을 혼합해서 사용하면 안된다는 것

    (다 적용했는데 동작을 안해서 한참 헤맸다...)

    // build.gradle.kts
    import org.springframework.boot.gradle.plugin.SpringBootPlugin
    
    plugins {
      id("java")
      id("org.springframework.boot") version "3.3.O"
    }
    
    dependencies {
      implementation(platform(SpringBootPlugin.BOM_COORDINATES))
      implementation(platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:2.6.0"))
    }
    // build.gradle.kts
    plugins {
      id("java")
      id("org.springframework.boot") version "3.3.O"
      id("io.spring.dependency-management") version "1.1.0"
    }
    
    dependencyManagement {
        imports {
            mavenBom("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:2.6.0")
        }
    }

     

    위와 같이 BOM 을 설정해 주고 아래의 의존성을 추가해주면

    Spring Boot 3 에서 OpenTelemetry 를 사용 할 수 있게 된다.

    dependencies {
    	implementation("io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter")
    }

     

    OpenTelemetry 의 Jaeger 설정을 사용하기 위해서

    아래 의존성을 추가해 준다.

    implementation("io.opentelemetry:opentelemetry-exporter-jaeger:1.34.1")

     

    예제 코드
    // ApiController.java
    
    @RestController
    @RequestMapping("/api")
    public class ApiController {
        @GetMapping("/status")
        public String status() {
            return "OK";
        }
    }
    // application.yml
    spring:
      application:
        name: SpringBoot3WithJaeger
    otel:
      exporter:
        otlp:
          protocol: grpc
          endpoint: http://localhost:4317
      traces:
        exporter: jaeger

     

    테스트 진행

    Spring Application 을 실행한 후,

    작성한 API (GET /api/status) 를 호출한다.

    Jaeger 화면

    참고 문서

     

    OpenTelemetry 의존성 추가 방법

    OpenTelemetry 설정값 문서
    Jaeger 배포 문서

     

     

     

    GitHub - fwani/SpringBoot3WithJaeger

    Contribute to fwani/SpringBoot3WithJaeger development by creating an account on GitHub.

    github.com

     

    반응형

    댓글

Designed by Tistory.