취미겸생업

[Spring boot] Spring Cloud 분산 추적 (Micrometer, Zipkin) 본문

IT/Spring Boot

[Spring boot] Spring Cloud 분산 추적 (Micrometer, Zipkin)

nohumb 2026. 7. 3. 21:11
SMALL

Spring Cloud Micrometer 및 Zipkin

분산추적 개념

  • MSA와 같은 분산 시스템에서 서비스 간의 요청 흐름을 추적하고 모니터링

  • 각 서비스의 호출 관계와 성능을 시각화하여 각 서비스의 호출 흐름을 명확히 파악하고, 성능 병목이나 오류를 빠르게 진단

  • 주요 개념

    분산 추적 단위

    • 트레이스(Trace) : 하나의 요청이 시작부터 끝까지 각 서비스를 거치는 전체 흐름
      • 하나의 트레이스는 여러 개의 스팬으로 구성
      • 분산 시스템에서 클라이언트의 요청이 여러 서비스로 전달될 때, 각 서비스 호출이 트레이스의 일부로 기록
      • 트레이스 ID는 각 스팬에 공통으로 부여되며, 이를 통해 전체 요청 흐름을 추적 가능
    • 스팬(Span) : 가장 작은 단위로, 특정 서비스 내에서의 개별 작업 또는 요청
      • 시작 시간과 종료 시간을 기록하여 작업의 지속 시간을 나타냄
      • 고유한 스팬 ID를 가지며, 이는 트레이스 ID와 함께 특정 작업을 식별하는 데 사용
      • 부모-자식 관계를 가질 수 있으며, 이를 통해 호출 계층 구조를 표현
      • 메타데이터(태그, 로그, 이벤트 등)를 추가하여 상세한 정보를 기록
    • 컨텍스트(Context) : 요청이 서비스 간에 전달될 때 함께 전파되어, 각 서비스가 요청의 전체 흐름에 대한 정보를 가질 수 있게 함
      • 트레이스 ID, 스팬 ID, 부모 스팬 ID 등의 정보를 포함하여 각 서비스가 요청의 출처와 경로를 추적할 수 있도록 함
      • 서비스 호출 간에 컨텍스트를 유지함으로써, 분산 시스템 전체에서 일관된 추적이 가능
  • Spring 기반 애플리케이션에서 메트릭을 수집하고 모니터링하기 위한 라이브러리

  • 각 서비스의 성능 지표를 수집하고, Prometheus, Grafana 등과 연동하여 시각화

  • 분산 추적을 위한 기능을 제공하여 서비스 간의 호출 흐름을 추적

Zipkin이란

Zipkin GUI 예시

  • 트레이스 데이터를 수집하고 시각화하는 분산 추적 시스템
  • 각 서비스의 트레이스와 스팬 데이터를 저장하고, 이를 통해 호출 흐름을 시각화
  • 특정 트레이스나 스팬을 검색하고 필터링하여 문제를 진단 가능

Zipkin 서버 설정

  • Docker를 통해 실행

      docker run -d -p 9411:9411 openzipkin/zipkin
  • zipkin 대시보드 사용

Micrometer란

  • 기존 분산 추적에 사용되던 Sleuth를 대체하는 라이브러리 (Spring boot 3.x 이후)
  • Spring 기반 애플리케이션에서 메트릭을 수집하고 모니터링하기 위한 라이브러리
  • 각 서비스의 성능 지표를 수집하고, Prometheus, Grafana 등과 연동하여 시각화
  • 분산 추적을 위한 기능도 제공하여 서비스 간의 호출 흐름을 추적 가능

Micromter 클라이언트 설정

Micrometer를 통해 Zipkin에 트레이스 정보를 전달해 시각화 된 Metric을 확인할 수 있다

  • build.gradle

      dependencies {
          # 메트릭 및 트레이싱 수집을 위한 기초 인프라
          implementation 'org.springframework.boot:spring-boot-starter-actuator'
    
          # 핵심 엔진: 고유한 Trace ID / Span ID 발급 및 관리
          implementation 'io.micrometer:micrometer-tracing-bridge-brave'
    
          # 서비스 간 통신: OpenFeign 호출 시 HTTP 헤더에 Trace ID 자동 주입
          implementation 'io.github.openfeign:feign-micrometer'
    
          # 리포터: 수집 완료된 추적 데이터를 외부 Zipkin 서버로 전송
          implementation 'io.zipkin.reporter2:zipkin-reporter-brave'
      }
  • application.yml

      spring:
        application:
          name: product-service
      server:
        port: 19092
      eureka:
        client:
          service-url:
            defaultZone: http://localhost:19090/eureka/
    
      management:
        zipkin:
          tracing:
            endpoint: "http://localhost:9411/api/v2/spans" # Zipkin 서버 호스트 주소
        tracing:
          sampling:
            probability: 1.0 # 데이터 샘플링(추적) 비율, 기본 값은 0.1
LIST