Spring Boot 3에서 Zipkin 사용하기

이 글은 “Zipkin으로 Armeria와 Spring 함께 추적하기“에서 Spring Boot 3의 Zipkin 설정 부분을 발췌한 글입니다.

Spring에서 Zipkin을 사용하기 위해 구글링하면 Spring Cloud Sleuth를 이용한 설정이 가장 많이 언급되는데요. 애석하게도 Sleuth 공식 문서를 보면 Spring Boot 3 버전부터 사용할 수 없다는 공지가 있습니다. 기존 프로젝트는 Micrometer Tracing으로 이전한다고 하네요.

다행히 Spring Boot 공식 문서 13.8. Tracing에 다양한 분산 추적 라이브러리와 연동하는 방법이 설명되어있습니다. 다양한 구현체를 선택할 수 있지만 가장 대표적인 Brave + Zipkin 구성을 설명하겠습니다. 아래와 같이 의존성을 추가합니다. 이 때 actuator가 반드시 필요하므로 빠뜨리면 안됩니다. (구현체별 필요한 의존성은 13.8.3. Tracer Implementations 에서 확인하실 수 있습니다.)

다음으로 프로퍼티 설정이 필요합니다. application.yml(또는 application.properties) 파일을 다음과 같이 설정합니다.

먼저 Zipkin에서 서비스를 구분할 이름인 spring.application.name을 설정해줍니다. 그 다음 management.tracing.sampling.probability 값으로 샘플링할 비율을 설정할 수 있는데 모든 로그를 전부 샘플링하고 싶다면 1.0으로 설정합니다. (기본값은 0.1 입니다. probability sampling 참고)

빠뜨리면 안되는 설정인 management.propagationconsume, produce 확인합니다. MSA 환경에서 추적 문맥(Trace context)을 다른 서비스로 전파할 때 HTTP 헤더에 정보를 넣어서 전송합니다. 이 때 HTTP 헤더에서 어떤 이름을 사용할지 여러 선택지가 있습니다. 여기서는 3가지 중 하나를 선택할 수 있습니다.

  1. W3C propagation (기본값)
  2. B3 single header
  3. B3 multiple headers

현재 서비스에서 외부 서비스로 요청할 때 추적 문맥 전파 방식은 produce, 외부 서비스에서 현재 서비스로 보내는 요청의 추적 문맥을 해석하는 방식은 consume으로 따로 설정할 수 있습니다.

로그를 전송할 zipkin.tracing.endpoint를 설정합니다. 해당 URL은 Zipkin 공식 v2 API 명세에서 확인할 수 있습니다. 미리 띄워놓은 Zipkin 서버의 URL을 설정하면 되겠습니다.

마지막으로 로컬 머신의 로그에서 traceId, spanId를 확인하기 위해 loggin.pattern.level을 변경합니다. logback.xml 또는 logback-spring.xml을 사용하셔도 좋습니다. 위 예제 코드에서는 traceId, spanId를 함께 사용했는데 이외에도 parentId, sampled를 확인할 수 있습니다.

최근에 릴리즈한 Spring Boot 3버전에서 Zipkin과 연동하는 방법에 대해 정리된 글이 없는 것 같아 짧게 정리했습니다. 잘못된 부분이나 덧붙일 의견을 댓글로 주시면 정말 감사드리겠습니다. 🤗

comments powered by Disqus

Related