본문 바로가기

개발(합니다)/Java&Spring

[spring boot 설정하기-22] spring cloud sleuth와 zipkin 설정 및 테스트 소스

반응형

1. 개요

MSA는 잘게 쪼개어 개발되면서 서비스간에 연결이 많아지고 복잡해지게 됩니다.
분산 된 서비스의 상태를 한 곳에서 실시간으로 체크하는 이슈만큼이나
로그를 한 곳에서 실시간으로 체크하는 이슈도 중요합니다.

시스템 내에서 여러 서비스간에 많은 호출이 발생하면서
한번의 트래픽이 어디서부터 어디까지 가는지에 대한 트래킹이 필요합니다.

로그 중앙집중식 외부화가 필요한 이유는
디스크에 기록된 로그는 컨테이너가 재기동되면서 사라지므로
로그 파일을 로컬 장비 디스크에 기록하는 방식을 취해서는 안됩니다.

컴포넌트

  • 로그 스트림 : 로그 생산자가 만들어내는 로그 메시지의 스트림
  • 로그 적재기 : 서로 다른 로그 생산자나 종단점에서 나오는 로그 메시지 수집하여 DB, 대시보드, 스트림 처리기로 보내는 등 다른 종단점에 메시지 송신
  • 로그 스트림 처리기 : 실시간으로 데이터를 처리하거나 의사 결정에 필요한 이벤트 로그 분석
  • 로그 저장소 : 모든 로그를 저장하며 인덱싱되어 검색 가능하도록 저장
  • 로그 대시보드 : 로그 결과를 그래프 및 차트로 표시

Spring Cloud Sleuth와 Open Zipkin

Sleuth

  • trace(추적)
    • 추적 ID(trace ID)를 이용하여 처음부터 끝까지 서비스 고유 호출 추적 가능
    • 요청에 대한 전체 트랜잭션의 일부를 나타내는 고유 ID
    • 트리 구조
  • span(구간)
    • 하나의 작업 단위 및 기능
    • 전체 트랜잭선 서비스의 고유 숫자
    • 스팬 ID(span ID)로 서비스간 고유 호출 식별 가능
  • 상관관계 ID를 이용하여 HTTP 요청을 추적
  • 추적 데이터를 외부에 제공할 수 있는 Hook 제공

동작 순서

  1. 상관관계 ID를 생성하고 서비스 호출에 주입
  2. 서비스에서 전달하는 호출에 대한 상관관계 ID 전파 시 트랜잭션 상관관계 ID를 자동으로 추가
  3. 상관관계 정보를 Spring MCD로그에 추가하고 상관관계 ID를 자동으로 로깅
  4. 분산 추적 플랫폼으로 전송

로그 확인 방법

서비스명, TraceId, SpanId, exportable 순으로 출력되는 로그를 볼 수 있습니다.

첫 번째 값 : 서비스명
두 번째 값 : 추적 ID - 하나의 트랜잭션의 고유 식별자로 모든 서비스 호출에 전달
세 번째 값 : 스팬 ID - 하나의 트랜잭션의 일부를 나타내는 고유 식별자
네 번째 값 : 외부로 전송 여부

Open Zipkin

  • 그래프로 트랜잭션의 소요 시간 확인
  • 각 마이크로서비스별로 호출 된 소요된 시간 분석

저장 방식

  • 인메모리
  • Mysql
  • Cassandra
  • ElasticSearch

2. 설정 및 테스트 소스

이전에 작성한 Spring Cloud Gateway 프로젝트에 이어서 진행합니다.

2-1. Spring Cloud Sleuth

아래 내용은 gateway-server, gateway-user, gateway-cafe에 모두 공통적으로 추가합니다.

2-1-1. 의존성 추가

버전 호환에 따른 문제가 발생해서 최신 버전을 찾아서 주입했습니다.

    // https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-sleuth-zipkin
    implementation group: 'org.springframework.cloud', name: 'spring-cloud-sleuth-zipkin', version: '3.0.2'

    // https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-sleuth
    implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-sleuth', version: '3.0.2'

2-1-2. application.yml 설정

spring-cloud-config에 적용하지 않고 서비스 application.yml에 간단하게 적용합니다.

server:
  port: 9999

spring:
  sleuth:
    sampler:
      probability: 1.0 # 기본값 0.1  샘플링 정의 0~1(100%)
  zipkin:
    base-url: http://localhost:9411/ # zipkin 주소

2-2. Zipkin

2-2-1. 설치

아래 사이트에서 zipkin을 설치하며 글쓴이는 docker를 이용합니다.
https://zipkin.io/pages/quickstart.html

docker run -d -p 9411:9411 openzipkin/zipkin

2-2-3. 실행

아래 정보로 접속하면 접속 화면을 확인할 수 있습니다.
http://localhost:9411

3. 결과 확인

3-1. Sleuth

gateway-server는 application.name을 등록해서 첫번째 값이 보이고 gateway-user와 gateway-cafe는 설정하지 않아 보이지 않습니다.

gateway-server

gateway-user, gateway-cafe

3-2. Zipkin

http://localhost:9411/zipkin/ 접속 하고 메인 페이지에서 + 버튼을 누르면 확인하고자 하는 서비스가 나타납니다.

application.name을 설정하지 않으면 default로 표시가 됩니다.

설정을 하고 조회를 누르면 해당 서비스에서 발생한 트래픅을 확인할 수 있습니다.

가장 Duration이 높은 트래픽을 열어보면 Trace ID를 확인할 수 있습니다.

SHOW를 들어가면 트리별로 어떤 트랜잭션이 발생했는지를 알 수 있습니다.

반응형