Cloud

Sleuth & ZipKin

Jungsoomin :) 2020. 12. 14. 16:29

MSA 에서 분산 컴퓨팅 환경을 가짐으로서 클라이언트의 Request -> Response 까지 다양한 MS 를 거치게 된다.

 

이 과정을 하나의 트랜젝션으로 보았을 때에 , 작업 단위의 세부내용을 추적하는 것은 어려운 일이다.

 

이는 분산 추적 <- 이라는 개념으로 기술되며, Spring Cloud Netflix 에서는 이를 해결하기 위해 Sleuth 를 사용한다.

 

Sleuth 는 TraceID , SpanID 를 생성하여 로그에 아이디를 달아 넣어 추적한다.

 


Sleuth 가 제공하는 ID 의 체계

 

Span ID

  • 작업의 기본단위. 서비스 호출시 새로운 Span 이 만들어진다.
  • 값은 유일하며 64 bit ID 를 가진다.
  • Description, key-value annotation, process ID 등의 추가정보를 가진다.
  • Trace 에서 가장 먼저 만들어지는 Span 을 Root Span 이라고 한다.

Trace ID

  • 최초의 Request 시에 Service 에서 만들어 낸다.
  • 동일한 Trace ID 를 가지는 Span 을 묶어 Tree 로 구성한다.
  • 값은 유일하며 64bit ID 를 가진다.

전체 트랜잭션의 Flow 를 확인하며, 트랜잭션 => Trace Id / 구간별 => Span Id 의 로그를 추적한다.

 

트위터가 제공하는 Zipkin , 구글의 Dapper 등의 UI 툴을 이용해 분산 추적을 쉽게 할 수 있다.

 

 

  1. 서비스 Request 시 API GateWay < (Ex : Zuul) 에서 gTxId (Global Transaction ID) 를 만든다. 
  2. 각 서비스의 Logging 시에 gTxId 를 함께 Logging 한다. 다른 서비스로 넘어갈 때 HeadergTxId 를 포함한다.

기록되는 이벤트와 시간

  • cs (Client Sent) : Span 의 시작
  • sr (Server Received) : 서버가 Request 를 받아 Process 를 시작함.  /  즉 sr - cs = 네트워크 지연시간 이 된다.
  • ss (Server Sent) : Request 된 Process 의 완료 시점으로 Client 에 Response 를 전달한 시점.  /  ss - sr = 서버 요청 처리 시간
  • cr (Client Received) : Span 종료 시점.  /  cr - cs = 클라이언트가 응답받는데 걸린시간.

** Client 는 요청을 보낸 쪽을 의미하며 단순한 Web Browser 를 의미하지 않는다. MS 가 MS 로 Request 를 보내면 요청을보낸 MS 가 Client 가 된다.

 

**서버가 Client 에 응답을 받아 처리를하면 Server Sent 를 하게 되며, 다른 MS 가 이를 받아도 Client Received 다.

다른 서비스로 보내질때 마다 Span Id 는 변경되며 Client Sent -> Server Received 로 분기 된다.

 


Spring Cloud Sleuth 의 기능

  • Slf4J 의 MDC ( Mapped Diagnostic Context ) 를 통하여 Trace 와 Span Id 를 로그에 추가한다.
  • 적용구간 : Servlet Filter , Rest Template , Message , Channels , Zull Filters , Feign Client

2018-05-11 15:21:46.466 INFO [sleuth-example,8f8964f0eebf01a8,8f8964f0eebf01a8,false ] 2647 --- [nio-8080-exec-1] com.example.slueth.SleuthApplication : This is your home!

[appname ,traceId ,spanId ,exportable]


사용

  • 필요의존 : 'org.springframework.cloud:spring-cloud-starter-sleuth'

이후 Slf4J 로 로깅시 해당 [ AppId , Trace ID , Span ID , Exportable ] 규격으로 출력 됨

 

Zuul 에서 라우팅 시킬때의 AppId , Trace Id, Span Id, Exportable

다른 서비스에서 받은 AppId , Trace Id, Span Id, Exportable


ZipKin

Zipkin 은  UI 를 제공하여 Slueth 가 달아놓은 Trace Id 와 Span Id를 가지고 작업을 추적한다.

 

  • 필요의존 : org.springframework.cloud:spring-cloud-starter-zipkin
    implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
    implementation 'org.springframework.cloud:spring-cloud-starter-zipkin'

깃 배쉬 같은 cml 로 jar 파일을 받을 수 있게 해놓았으니, 받아준다.

$ curl -sSL https://zipkin.io/quickstart.sh | bash -s
$ java -jar zipkin.jar

 

Application.yml

  • spring.sleuth.sampler.probability : ZipKin 에 트랜잭션 값을 얼마나 보낼지의 여부 , default 0.1 ( 10%)
  • spring.zipkin.base-url : Zipkin 서버의 Url
  • Sleuth 에서 나오는 ExportableZikin 에 트랜잭션을 보냈는지에 대한 여부이다.
spring:
  application:
    name: zuul-service
  sleuth:
    sampler:
      probability: 1.0
  zipkin:
    base-url: http://localhost:9411/zipkin/

 

'Cloud' 카테고리의 다른 글

Spring Cloud Bus  (0) 2020.12.15
Config Server  (0) 2020.12.14
Hystrix  (0) 2020.12.08
Feign  (0) 2020.12.08
Ribbon  (0) 2020.12.08