본문 바로가기

MSA

분산 추적(Spring Cloud Sleuth) 및 로깅(Zipkin) 이론 및 실습

이론

분산 추적이란

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

Micrometer란

  • Micrometer는 Spring 기반 애플리케이션에서 메트릭을 수집하고 모니터링하기 위한 라이브러리입니다.
  • 각 서비스의 성능 지표를 수집하고, Prometheus, Grafana 등과 연동하여 시각화할 수 있습니다.
  • 분산 추적을 위한 기능도 제공하여 서비스 간의 호출 흐름을 추적할 수 있습니다.
  • 다양한 메트릭 수집: 애플리케이션의 다양한 성능 지표를 수집할 수 있습니다.
  • 유연한 연동: Prometheus, Grafana 등 다양한 모니터링 도구와 연동할 수 있습니다.
  • 추적 기능: 서비스 간의 호출 흐름을 추적하여 성능 병목을 진단할 수 있습니다.

Zipkin이란?

  • Zipkin은 트레이스 데이터를 수집하고 시각화하는 분산 추적 시스템입니다.
  • 각 서비스의 트레이스와 스팬 데이터를 저장하고, 이를 통해 호출 흐름을 시각화합니다.
  • 데이터 수집 및 저장: 각 서비스에서 전송된 트레이스 데이터를 수집하고 저장합니다.
  • 시각화: 트레이스 데이터를 시각화하여 서비스 간의 호출 관계를 명확히 파악할 수 있습니다.
  • 검색 및 필터링: 특정 트레이스나 스팬을 검색하고 필터링하여 문제를 진단할 수 있습니다.

 

실습

 

Zipkin 서버 실행

docker run -d -p 9411:9411 openzipkin/zipkin
  • URL: http://localhost:9411
  • Zipkin 대시보드에 접속하여 트레이스 데이터를 시각화합니다.

 

  • 의존성 설정
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-actuator'
	implementation 'io.micrometer:micrometer-tracing-bridge-brave'
	implementation 'io.github.openfeign:feign-micrometer'
	implementation 'io.zipkin.reporter2:zipkin-reporter-brave'
    
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-data-redis'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
	implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

	runtimeOnly 'com.mysql:mysql-connector-j'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
  • application.yml 설정
server:
  port: 19093

spring:
  application:
    name: product-service
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        show_sql: true
        format_sql: true
  data:
    redis:
      host: localhost
      port: 6379
      username: default
      password: systempass

eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka

product-service:
  ribbon:
    eureka:
      enabled: true

management:
  zipkin:
    tracing:
      endpoint: "http://localhost:9411/api/v2/spans"
  tracing:
    sampling:
      probability: 1.0