분산 로그 트레이싱하기

ssongkim·2023년 1월 22일
0

MSA와 DDD

목록 보기
7/9
post-thumbnail
post-custom-banner

Overview

SW마에스트로에서 프로젝트를 마이크로서비스는 9개로 이벤트 주도 아키텍처로 설계, 개발하였다.

여기서 문제가 발생하였는데 서비스가 분리되어있고 마이크로서비스 끼리 통신을 하다보니 하나의 사용자의 요청으로부터 시작되는 흐름을 점점 추적하기 어려웠다는 것이다.
모놀리식은 클라이언트의 요청을 받으면 하나의 스레드에서 모든 요청을 실행하므로 로그를 확인하기 쉽고 문제가 발생하면 그 지점을 바로 알 수 있다는 장점이 있다.

하지만 MSA의 경우 여러 마이크로서비스 사이에서 통신이 이루어지고 통신이 많아지면 많아질수록 장애가 발생한 지점이 어디인지, 어느 마이크로서비스에서 비즈니스 로직을 수행하는데 얼마나 걸렸는지 추적하기 점점 어려워진다.

이런 문제점에 대한 보완책으로 분산 시스템에 대해 로그를 트레이싱하는 오픈소스 프로젝트인 open tacing 프로젝트를 알게되었다.

1. open tracing 프로젝트

open tracing 프로젝트란 CNCF 산하의 프로젝트로 단어 그자체 처럼 하나의 흐름을 공개적으로 추적하기 위한 기능을 표준화하는 프로젝트이다.

참고로 현업에서 활발히 사용되는 pinpoint도 CNCF 프로젝트에 포함되어 있다고 한다.

open tracing 구현체

open tracing 프로젝트의 대표적인 구현체로는 jaegerzipkin이 있다.

우리는 본 프로젝트를 진행하며 스프링과 연동이 쉬운 zipkin을 도입하였다. 그래서 오늘은 zipkin에 대해서 알아보고자 한다.

2. Zipkin

Zipkin은 대표적인 opentracing 표준을 따르는 구현체라고 할 수 있다.

사용자의 요청에 대해 전체적인 흐름을 추적해 시각화하여 볼 수 있다. 사용자의 요청마다 trace-id, span-id가 발급되는데 이를 로그에서 따서 조회도 가능하다.

2-a. Zipkin 아키텍처


아키텍처는 간단하다.

  • Reporter는 Transport를 통해 트레이스 정보를 전달한다.
  • Collector는 이를 수집하여 스토리지에 저장한다.
  • Zipkin API를 활용하여 UI를 통해 시각화한다.

2-b. Zipkin 동작원리


분산 트레이싱 동작 원리이다 핵심은 trace-idspan-id이다.
사용자가 요청을 보내면 여러 마이크로서비스끼리 통신이 발생할 것이다.

클라이언트가 서버로 호출한 하나의 호출을 Trace라고 했을 때, 서비스 컴포넌트간의 호출을 Span이라고 한다.각 서비스 컴포넌트들은 하나의 클라이언트 호출을 추적하기 위해서 같은 Trace Id를 사용하고, 각 서비스간의 호출은 각각 다른 Span Id를 사용한다. 이렇게 함으로써 전체 트렌젝션 시간을 Trace로 추적이 가능하고, 각 서비스별 구간 시간은 Span으로 추적할 수 있다.

통신이 발생할 때마다 헤더에 trace-idspan-id를 넣어 건내주면 된다.

3. Spring Cloud Sleuth

Spring Boot 3.2 버전 이상부터 slueth는 사용하지 못하고 Micrometer를 사용해야합니다. (https://docs.spring.io/spring-cloud-sleuth/docs/current-SNAPSHOT/reference/html/) micrometer-tracing-bridge-brave + zipkin-reporter-brave 구성을 추천드립니다.

아니 마이크로서비스 마다 언제 일일이 Trace IdSpan Id를 헤더에 넣어 보내주지?? 귀찮다.
스프링 진영에서는 분산 트레이싱 추적을 자동화해주는 프로젝트로 Spring Cloud Sleth 존재한다.
단순히 의존성을 추가하고 Zipkin 경로를 지정해주는 것만으로 자동화를 수행한다.

3-a. Spring Cloud Sleuth 시작하기

Spring Cloud Sleuth는 사용하기 굉장히 쉽다! 너무나도 잘만들어놨다.
zipkin 경로만 잘 설정해두면 알아서 zipkin collector로 로그를 보낸다.

zipkin, sleuth 의존성 추가하기

implementation group: 'org.springframework.cloud', name: 'spring-cloud-sleuth-zipkin', version: '3.1.4'   // zipkin
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-sleuth', version: '3.1.4'   // sleuth

spring-cloud-starter-zipkin은 레거시이다. spring-cloud-starter-sleuth 사용할 것!

application 설정파일 수정

spring:
  application:
    name: auth-service # 보이고하자하는 이름
  sleuth:
    sampler:
      probability: 1.0 # Zipkin에 트랜젝션을 어느정도의 비율로 보낼지에 대한 값이다. 기본값은 10%(0.1)이며, 1.0이면 트랜젝션을 100% 보내게 된다.
  zipkin:
    base-url: http://zipkin.istio-system.svc.cluster.local:9411/ # zipkin 경로

연동 끝! 굉장히 쉽다......

참고자료

https://engineering.linecorp.com/ko/blog/line-ads-msa-opentracing-zipkin/

profile
鈍筆勝聰✍️
post-custom-banner

0개의 댓글