Spring Boot/MSA

분산 추적 도구 - zipkin

최-코드 2024. 9. 17. 22:18

분산 추적 동작 원리

  • 모든 관련된 마이크로서비스가 분산 추적 서버로 정보를 보낸다. 
  • 이 서버는 모든 정보를 데이터베이스에 저장한다. 보통 인메모리가 아닌 RDB 데이터베이스를 사용한다.
  • 이 서버는 여러 마이크로서비스에 걸친 요청을 추적할 수 있는 인터페이스를 제공한다.
  • 보통 분산 추적 서버의 포트는 9411이다.

zipkin

  • 서비스 간의 호출 정보를 수집하고 시각화하는 역할을 한다.
  • 내장 데이터베이스는 없으며, 외부 데이터베이스를 연결시켜줘야 한다. 만약 데이터베이스를 연결해주지 않으면 메모리에 추적 정보가 저장되게 된다.

사용 예시

의존성

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-tracing-bridge-otel'
implementation 'io.opentelemetry:opentelemetry-exporter-zipkin'
-----------------------------------------------------------------------
implementation 'io.github.openfeign:feign-micrometer'
  • actuator 의존성이 필요한 이유는 이 의존성 안에 micrometer 의존성이 내장되어 있다. 밑에 이유 때문에 micrometer 의존성을 추가해줘야 하므로 꼭 이 의존성을 주입해야 한다.
  • micrometer-tracing-bridge-otel은 micrometer가 내부적으로 opentelemetry를 사용하는 의존성이다.
    • 보통 micrometer를 통해 매트릭 데이터를 수집한다.
    • 따라서 기존에 micrometer를 사용할 때 이 의존성을 추가하는 것만으로 opentelemetry의 분산 추적 기능을 사용할 수 있게 된다.
    • 즉, 추가 설정을 할 필요가 없어진다.
  • 3번째 의존성은 opentelemetry가 수집한 트레이싱 데이터를 내보낼 백엔드 시스템을 명시해주는 의존성이다.
  • 마지막 의존성은 feignclient로 다른 마이크로서비스에 요청을 보낼 때 이 부분까지 기본적으로 추적을 하지 않으므로 이 의존성을 넣어 추적하도록 할 수 있다.

직접 RestTemplate를 생성하여 사용할 때도 추적이 제대로 안 될 때가 있다.

@Configuration(proxyBeanMethods = false)
class RestTemplateConfiguration {

    @Bean
    RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }
}

 따라서 위와 같이 빈을 생성한다음 주입하는 방식으로 사용하면 된다. new RestTemplate같이 메소드에서 직접 생성하는 경우 spring boot가 관리하는 빈이 아니게 되므로 micrometer(opentelemetry)와 자동으로 연동이 안되게 된다.

 

properties

management.tracing.sampling.probability=1.0
#endpoint의 기본값을 밑에 설정한 것과 같다. 따라서 이 부분을 빼줘도 된다.
#하지만 docker를 통해서 연결할 때는 변경할 필요가 있다.
#아래 api로 트레이싱 정보를 전송한다.
#management.zipkin.tracing.endpoint=localhost:9411/api/v2/spans
  • 이 설정을 통해 추적할 요청의 비율을 설정할 수 있다.
  • 1.0은 100%로 모든 요청을 추적한다는 의미이다.