코딩공작소

MSA(11) - 스프링 클라우드 슬루와 집킨을 이용한 분산 추적 본문

어플리케이션개발/MSA

MSA(11) - 스프링 클라우드 슬루와 집킨을 이용한 분산 추적

안잡아모찌 2024. 7. 28. 16:16
  • 스프링 클라우드 슬루스 : 필터를 추가하고 다른 스프링 컴포넌트와 상호 작용하여 생성된 상관관계 ID를 모든 시스템 호출에 전달
  • 집킨 : 서비스 간의 트랜잭션 흐름을 보여 주는 오픈 소스 데이터 시각화 도구

 

스프링 클라우드 슬루스와 상관 관계 ID

상관관계ID는 트랜잭션이 시작될 때 트랜잭션에 할당된다. 스프링 클라우드 슬루스는 모든 코드 인프라스트럭처와 복잡성을 관리해 준다.

  • 상관관계 ID가 존재하지 않는다면 상관관계 ID를 생성해서 서비스 호출에 삽입
  • 아웃바운드 서비스 호출에 대한 상관관계 ID 전파를 관리하여 트랜잭션에 대한 상관관계 ID가 자동으로 추가되도록 한다
  • 상관관계 정보를 스프링 MDC 로깅에 추가하면 생성된 상관관계 ID가 스프링 부트의 기본 SL4J와 로그백 구현체에 자동으로 로깅될 수 있다.
  • 서비스 호출의 추적 정보를 집킨 분산 추적 플랫폼에 발행

 

라이선싱 . 및조직 서비스에 스프링 클라우드 슬루스 추가

pom.xml 파일에 메이븐 의존성을 추가해야 한다.

<dependency>
	<groupId>org.springframework.cloud</>
    <artifactId>spring-cloud-starter-sleuth</>
</>
  • 유입되는 모든 서비스 호출을 검사해서 슬루스의 추적 정보가 호출에 포함되는지 확인. 있다면, 마이크로서비스로 전달된 추적 정보는 수집되고 로깅과 프로세싱을 위해 서비스에서 사용
  • 슬루스 추적 정보를 스프링 MDC에 추가하여 마이크로서비스에서 생성된 모든 로그 문이 로깅되도록 한다.
  • 스프링 클라우드의 추적 정보를 서비스가 생성한 모든 아웃바운드 HTTP 호출과 스프링 메시징 채널의 메시지에 삽입

 

스프링 클라우드 슬루스의 추적 분석

슬루스에는 각 로그 항목마다 4가지의 정보가 있다.

  1. 로그를 출력하는 서비스의 애플리케이션 이름
  2. 추적 ID는 상관관계 ID에 해당하는 용어로 한 트랜잭션 전체에서 고유한 번호
  3. 스팬 ID는 전체 트랜잭션의 일부를 나타내는 고유 ID. 트랜잭션에 속하나 . 각서비스에는 고유한 스팬 ID가 부여되며, 스팬 ID는 집킨과 통합할 때 트랜잭션을 시각화하는 데 관련이 많다.
  4. 내보내기, 집킨에 추적 데이터 전송 여부를 나타내는 지표

 

 

로그 수집과 스프링 클라우드 슬루스

모든 서비스 인스턴스의 모든 로그를 실시간으로 중앙 수집 지점으로 스트리밍해서 로그 데이터에 인덱스를 추가하고 검색하게 해야한다.

 

 

해당 포스팅에서는 ELK스택을 사용한다.

  1. 오픈 소스이다
  2. 설정이 간단하고 사용이 간편하며 사용자 친화적이다
  3. 다양한 서비스에서 생성된 실시간 로그를 검색, 분석, 시각화할수 있는 완전한 도구다
  4. 모든 로깅을 중앙 집중화하여 서버 및 애플리케이션 문제를 식별할 수 있다.

 

 

동작하는 스프링 클라우드 슬루스/ELK스택 구현

 

 

 

서비스에서 로그백 구성

  1. logstash-logback-encoder 의존성을 각 서비스의 pom.xml 파일에 추가
  2. 로그백 구성 파일에 로그스태시 TCP 어펜더를 생성

 

로그스태시 인코더 추가

<dependency>
	<groupId>net.logstash.logback</>
    <artifactId>logstash-logback-encoder</>
    <version>6.3</>
</>

 

로그스태시 TCP 어펜더 생성

JOSN형식의 애플리케이션 로그를 보내기 위해 사용

logback-spring.xml이라는 로그백 구성 파일을 생성해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
     <springProperty scope="context" name="application_name" source="spring.application.name"/>
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>logstash:5000</destination>
       <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
    <root level="INFO">
        <appender-ref ref="logstash"/>
        <appender-ref ref="CONSOLE"/>
    </root>
    <logger name="org.springframework" level="INFO"/>
    <logger name="com.optimagrowth" level="DEBUG"/>
</configuration>
cs

로그스태시와 통신하려고 TcpSocketAppender를 사용한다.
TCP 통신을 위한 로그스태시 호스트 이름과 포트 번호

 

 

도커에서 ELK 스택 애플리케이션 정의 . 및실행

로그스태시 구성파일 만들기, 도커 구성 안에 ELK 스택 어플리케이션 정의하는 2가지의 단계가 필요하다

 

docker-compose.yml 파일에 세 개의 ELK 도커 항목을 추가

 

키바나 구성

키바나는 일련의 인덱스 패턴을 사용하여 일레스틱 서치 엔진에서 데이터를 검색. 인덱스 패턴은 탐색하려는 일레스틱서치 인덱스를 비카나에 알려 주는 역할을 한다.

 

키바나에서 스프링 클라우드 슬루스 추적 ID 검색

스프링 클라우드 게이트웨이 필터를 작성하여 HTTP 응답에 추적 ID를 삽입하는 것
pom.xml 파일에 스프링 클라우드 슬루스 의존성을 추가해야 한다.

<dependency>
	<groupId>org.springframework.cloud</>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</>

ResponseFilter안에서 Tracer 클래스를 자동 연결하여 추적 정보에 접근할 수 있다.
진행 중인 트랜잭션에 대한 현재 추적 ID를 문자열로 검색한다. 게이트 웨이로 반환되는 HTTP 응답에 추적 ID를 추가하는 간단한 작업은 아래의 메서드를 호출한다.

exchange.getResponse().getHeaders().add(FilterUtils.CORRELATION_ID, traceId);

이 코드를 적용하고나면 HTTP 응답에는 슬루스의 추적 ID로 된 tmx-correlation-id 헤더가 있어야 한다.

 

 

집킨을 이용한 분산 추적

분산 추적은 다양한 마이크로서비스 사이에서 트랜잭션이 어떻게 흐르는지 알려 주는 시각적인 그림을 제공하는 것이 포함된다.
집킨은 여러 서비스 호출 사이의 트랜잭션을 추적할 수 있는 분산 추적 플랫폼이다.

  • 추적 데이터를 캡처하는 스프링 클라우드 슬루스와 집킨의 JAR 파일 추가
  • 추적 데이터를 수집할 집킨 서버에 접속하도록 각 서비스의 스프링 프로퍼티 구성
  • 데이터를 수집하는 집킨 서버 설치 및 구성
  • 각 클라이언트가 추적 정보를 전송하는 데 필요한 샘플링 전략 정의
<dependency>
	<groupId>org.springframework.cloud</>
    <artifactId>spring-cloud-sleuth-zipkin</>
</>

 

 

 

  • 스프링 클라우드 슬루스를 사용하면 마이크로서비스 호출에 대한 추적 정보를 손쉽게 추가할 수 있다
  • 상관관계 ID는 여러 서비스 간 로그를 연결하는 데 사용된다. 이것으로 한 트랜잭션과 연관된 모든 서비스에서 트랜잭션 동작을 관찰할 수 있다.
  • 상관관계 ID는 강력하지만, 다양한 출처에서 오는 로그를 수집하고 로그 내용을 검색하며 쿼리할 수 있는 로그 수집 플랫폼과 짝을 이루어야 한다.
  • 도커 컨테이너를 로그 수집 플랫폼과 통합하여 모든 애플리케이션 로깅 데이터를 캡처할 수 있다.
  • 도커 컨테이너를 ELK 스택과 통합한다. 이것으로 서비스에서 전송된 로깅 데이터를 변환, 저장, 시각화, 쿼리할 수 있다.
  • 통합 로깅 플랫폼은 필수이며, 마이크로서비스를 사용하여 트랜잭션을 시각적으로 추적할 수 있는 기능은 유용한 도구다.
  • 집킨을 사용하면 서비스와 트랜잭션 흐름 사이에 존재하는 의존 관계를 확인하고 사용자 트랜잭션과 관련된 각 마이크로서비스의 성능 특성을 이해할 수 있다.
  • 스프링 클라우드 슬루스는 집킨과 쉽게 통합된다. 집킨은 HTTP 호출에서 추적 데이터를 자동으로 캡처하며, 슬루가 활성화된 서비스 내부에서 사용되는 인바운드/아웃바운드 메시지 채널이 된다.
  • 스프링 클라우드 슬루스는 각 서비스 호출을 스팬 개념에 매핑한다. 그런 다음 집킨으로 스팬 성능을 확인할 수 있다.
  • 스프링 클라우드 슬루스와 집킨으로 사용자가 직접 스팬을 만들 수 있다. 이것으로 스프링이 아닌 자원 성능을 파악할 수 있다.