Jaeger를 이용한 분산 추적 시스템 구축하기

HD.Y·2024년 2월 17일
0

한화시스템 BEYOND SW

목록 보기
54/58
post-thumbnail

Jaeger 란 ❓

  • "Jaeger"는 분산 시스템의 트래킹 및 분석을 위한 오픈 소스 분산 추적 시스템이다.
    분산 시스템에서 발생하는 트랜잭션의 흐름을 추적하고 이해하기 위한 도구로 사용된다.

    따라서 주로 MSA 에서 사용되며, 각 서비스 간의 통신 및 의존성을 추적하여 전체 시스템의 성능을 이해하고 최적화하는데 도움이 된다.

  • Jaeger를 사용하는 이유 ❓

    1) 분산 트랜잭션 모니터링
     ➡ 마이크로 서비스 간의 데이터 이동을 모니터링 하는 기능이 있어서, 개발자가
       사전에 문제를 감지하고 해결할 수 있다.

    2) 지연 시간 최적화
     ➡ 애플리케이션 속도를 저해하는 마이크로 서비스의 병목 지점을 찾을 수 있다.
       즉, 메서드가 실행될때 유독 시간이 오래 걸리는 메서드를 발견할 수 있고, 그러한
       문제를 발견하면 해결하기 위해 노력할 수 있다. 그렇게 되면 마이크로 서비스의
       속도를 높일 수 있다.

    3) 근본 원인 분석
     ➡ MSA에서는 하나의 문제가 다른 문제로 이어질 수 있는데, 이러한 문제들 속에서
       가장 첫 번째로 문제가 어디서 발생했는지 시작점을 찾을 수 있다.

    4) 서비스 종속성 분석
     ➡ 서비스 종속성이란 애플리케이션이 몇 가지 구성 요소의 실행에 의존한다는 것을
       의미하는데, 이러한 여러 마이크로 서비스 간의 복잡한 관계를 이해할 수 있다.


  • Jaeger의 기능 💻

    1) 분산 추적

    분산 추적은 마이크로서비스 간의 이벤트 시퀀스를 모니터링하는 소프트웨어 기술로, 모든 연결을 추적하고 애플리케이션의 요청 경로를 시각화하는 차트와 그래프를 제공한다.

    Jaeger는 각 요청마다 고유 식별자를 할당하고 특정 서비스가 요청을 처리할 때 정보를 수집하여 요청의 이동을 추적한다.


    2) OpenTracing

    OpenTracing은 다양한 현대적 소프트웨어 시스템에서 정확한 턴키 분산 추적을 실현할 수 있는 표준을 제공하는, 오픈 소스 또는 무료로 제공되는 프레임워크이다.

    Jaeger는 OpenTracing을 사용하여 마이크로서비스 데이터를 수집, 저장, 관리, 분석 및 시각화하는 완전한 솔루션을 제공한다.


    3) OpenTracing 데이터 모델

    OpenTracing 데이터 모델은 여러 구성 요소의 데이터를 연결하는 기본 정의를 제공하는데 Span과 Trace 가 있다.

    💡Span
    Span은 분산 추적 시스템에서 수행되는 작업의 단일 논리적 단위로, 각각의 Span에는
      아래와 같은 구성 요소가 있다.

    1. 작업 이름
    2. 시작 시간과 중지 시간
    3. 개발자가 Span을 분석하는 데 도움이 되는 태그 또는 값
    4. 마이크로서비스가 생성하는 메시지를 저장하는 로그
    5. Span Context 또는 Span에 대한 추가 설명


    💡Trace
    Trace는 동일한 프로세스에 속하는 하나 이상의 Span의 모음으로, 특정 시간 동안
      발생하는 이벤트를 나타낸다. 동일한 Trace에 속하는 Span은 동일한 Trace ID를
      공유한다.

    예를 들어 고객이 음식을 주문할 때 생성되는 트레이스에는 다음과 같은 스팬이
      포함된다.

    1. 고객이 주문 제출
    2. 결제가 처리됨
    3. 주문 목록이 식당에 제출됨
    4. 음식 수령
    5. 음식 제공


🐶 Jager 설치 및 실습하기 ( k8s 및 스프링 부트)

1. master 컴퓨터에서 아래와 같이 Jaeger를 설치한다.

docker run --rm --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.54

위 내용은 Jaeger에 접속할 수 있도록 포트포워딩 설정을 해서 설치하는 내용이다.

위의 포트 번호중 아무거나 나중에 스프링 부트 야멜 파일에서 설정해주면 되는데,
  나는 6831 번 포트를 사용할 예정이다.

정상적으로 설치가 되면, master 컴퓨터의 IP:16686 으로 접속하면, 아래처럼
  Jaeger 화면이 보인다.


  • Jaeger는 동작 상태로 두고, 이제는 스프링 부트에 Jaeger를 적용해보겠다.

2. pom.xml 에 라이브러리를 추가한다.

		<dependency>
            <groupId>io.opentracing.contrib</groupId>
            <artifactId>opentracing-spring-jaeger-web-starter</artifactId>
            <version>3.1.2</version>
        </dependency>

3. application.yml 파일에 설정을 추가한다.

spring:
 application:
   name: lonua-service 

opentracing:
 jaeger:
   service-name: lonua-svc  // Jaeger에 표시될 서비스의 이름 지정
   udp-sender:
     host: 192.168.0.211    // Jaeger가 동작중인 master 컴퓨터의 IP
     port: 6831             // Jaeger 설치 시 포트포워딩 해줬던 포트 중 1개

4. AOP 클래스 작성

@Aspect
@Component
public class JaegerAop {

   private final Tracer tracer;
   private Span spanPhase1;

   public JaegerAop(Tracer tracer) {
       this.tracer = tracer;
   }

   // 어느 경로의 패키지에 적용시킬 것인지 지정
   @Pointcut("execution(* com.example.lonua..*.*(..))")
   private void cut() {
       System.out.println("컷");
   }

   // 조인 포인트, 어느 시점 즉 메서드가 실행되기 전을 지정
   @Before("cut()")
   public void before(JoinPoint joinPoint) {
       Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
       System.out.println(method.getName() + " 메소드 실행 전");

       Span parentSpan = tracer.scopeManager().activeSpan();
       spanPhase1 = tracer.buildSpan("spanPhase_1").asChildOf(parentSpan).start();

   }

   // 조인 포인트, 어느 시점 즉 메서드가 실행된 후를 지정
   @AfterReturning(value = "cut()")
   public void afterReturning(JoinPoint joinPoint) {
       Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
       System.out.println(method.getName() + " 메소드 실행 후");

       try {
           spanPhase1.log("Test Micro Service Call.");
       } finally {
           spanPhase1.finish();
       }
   }
}

이렇게 작성하면, 모든 프로젝트 내의 모든 메서드가 실행되기 전에 추적을 시작하고
  메서드가 완전히 실행되면 추적을 끝낸다.


  • 이제, 프로젝트를 실행시키고, Jaeger 웹페이지에서 새로고침을 해보면 아래와 같이 야멜파일에서 설정한 서비스 이름으로 나타난다.

  • 이제, 아무 컨트롤러로 요청을 보내본다. ( 포스트맨 또는 웹브라우저 이용 )

  • 상품의 목록을 불러오는 요청을 아래처럼 보냈고,

  • Jaeger에서 서비스 선택 후 "Find Traces" 를 클릭해보면 아래처럼 메서드가 실행되는 동안의 추적한 결과가 나타난다.

profile
Backend Developer

0개의 댓글