JVM/SpringCloud

Zipkin

kyoulho 2024. 1. 3. 15:41

Zipkin


Zipkin은 분산 시스템에서의 추적 및 모니터링을 위한 오픈 소스 소프트웨어이다. 주로 마이크로서비스 아키텍처에서 사용되며 서비스 간 통신과 연관된 각 단계의 지연 시간 및 성능을 추적하여 문제를 식별하고 해결하는 데 도움이 된다.

Span

Span은 하나의 요청에 사용되는 작업의 단위이다. 예를 들어, 서비스 간의 요청 또는 로컬 작업과 같은 작업 단위를 나타낼 수 있다. Span은 시작 시간, 종료 시간, 태그 등의 정보를 포함하여 특정 작업에 대한 세부 정보를 기록한다.

Trace

Trace는 관련된 여러 Span들의 모음으로, 전체 작업의 흐름을 나타낸다. 서비스 간의 요청이 발생하면, 해당 요청에 대한 Span이 생성되고, 이러한 Span들이 모여 Trace를 형성한다. Trace는 전체 시스템의 흐름을 이해하고, 각 Span이 어떻게 연결되어 있는지를 시각적으로 보여준다.
 

docker-compose.yml

version: '3'
services:
  zipkin:
    image: openzipkin/zipkin
    ports:
      - "9411:9411"

http://localhost:9411로 Zipkin에 접속해 서버명을 검색하면, 요청에 대한 플로우를 확인할 수 있다.
 
 

라이브러리

implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("io.micrometer:micrometer-tracing-bridge-brave")
implementation("io.zipkin.reporter2:zipkin-reporter-brave")
implementation("io.micrometer:micrometer-registry-prometheus")
implementation("io.github.openfeign:feign-micrometer")

application.yml

# OpenFeign Micrometer 설정
spring:
  cloud:
    openfeign:
      micrometer:
        enabled: true  # OpenFeign에서 Micrometer를 활성화

# Tracing(분산 추적) 설정
  tracing:
    sampling:
      probability: 1.0  # 추적을 수행할 확률 (1.0은 100%의 확률)
    propagation:
      type: b3  # 추적 정보 전파 유형 (여기서는 B3 포맷)

# Zipkin Tracing 설정
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans  # Zipkin 서버의 추적 엔드포인트 URL

# Logging Pattern 설정
logging:
  pattern:
    level: "%5p [%X{traceId:-},%X{spanId:-}]"  # 로깅 패턴 설정 (로그 레벨과 함께 traceId와 spanId 출력)

Configuration

Micrometer를 사용하여 메트릭 데이터를 수집하는 설정을 정의한다

@Configuration
class MonitorConfig {
    @Bean
    fun capability(registry: MeterRegistry): Capability {
        return MicrometerCapability(registry)
    }
}

log

fun getUserByAll(): List<ResponseUser> {
    val findAllUsers = userRepository.findAll()

    val mappedUsers = findAllUsers.map {
        val responseUser = ResponseUser.from(it)
        log.info("before Call Orders Service")
        responseUser.orders = orderClient.getOrders(it.userId)
        log.info("after Call Orders Service")
        responseUser
    }

    return mappedUsers
}
INFO [659501279b13a1028d4e328f112f0d39,8d4e328f112f0d39] 4683 --- [user-service] [nio-8080-exec-1] [659501279b13a1028d4e328f112f0d39-8d4e328f112f0d39] c.e.userservice.service.UserService      : before Call Orders Service
INFO [659501279b13a1028d4e328f112f0d39,8d4e328f112f0d39] 4683 --- [user-service] [nio-8080-exec-1] [659501279b13a1028d4e328f112f0d39-8d4e328f112f0d39] c.e.userservice.service.UserService      : after Call Orders Service

이제 http://localhost:9411 로 Zipkin에 접속해 서버명을 검색하면, 요청에 대한 플로우를 확인할 수 있다.