IT/Spring Cloud

Zipkin - 분산 추적

김 정 환 2022. 1. 30. 16:25
반응형

앞으로 구현할 Zipkin 개요입니다.

 

Zipkin은 마이크로서비스와 같은 분산 환경에서 데이터를 추적하기 위한 시스템 (오픈소스)입니다. 요청이 시작되면 Trace ID가 생성되고 이 ID로 분산 추적을 합니다.

 

Span

- 하나의 요청에 사용되는 작업의 단위

- 64 bits unique ID

 

Trace

- 트리 구조로 이루어진 Span set

- 하나의 요청에 대한 같은 Trace ID 발급

 

Spring Cloud Sleuth

- Spring Boot Application을 Zipkin과 연동

- 요청 값에 따른 Trace ID와 Span ID 부여

 

 

 

요약

Zipkin 설치
Zipkin과 Sleuth 설정
테스트

 

 

소스코드

설치

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

실행

java -jar zipkin.jar

 

실행되면, 127.0.0.1:9411에서 확인할 수 있습니다.

 

 

User ServiceOrder Service에 아래 내용을 추가합니다.

 

pom.xml에 Dependency를 추가합니다.

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

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

 

application.yml에 Zipkin과 Sleuth 설정을 합니다.

spring:
  application:
    name: user-service
  zipkin:
    base-url: http://127.0.0.1:9411
    enabled: true
  sleuth:
    sampler:
      probability: 1.0 # 로그를 몇 퍼센트 전달할 것인가

 

 

이제 서비스를 호출하는 곳에 로그를 남겨서 TID를 확인합니다.

User-service의 UserServiceImpl.java에 아래와 같이 로그를 추가합니다.

/* CircuitBreaker */
log.info("Before call orders microservice");
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
List<ResponseOrder> ordersList = circuitBreaker.run(() -> orderServiceClient.getOrders(userId),
        throwable -> new ArrayList<>()); // run(호출 메소드, 에러나면 대처)
log.info("After called orders microservice");

 

Order-service의 OrderController.java에 아래와 같이 로그를 추가합니다.

// 주문 내역 조회
@GetMapping("/{userId}/orders")
public ResponseEntity<List<ResponseOrder>> getOrder(@PathVariable("userId") String userId) throws Exception{
    log.info("Before retrieve orders data");
    Iterable<OrderEntity> orderList = orderService.getOrdersByUserId(userId);

    List<ResponseOrder> result = new ArrayList<>();

    orderList.forEach(v -> {
        result.add(new ModelMapper().map(v, ResponseOrder.class));
    });
    
    log.info("Add retrieved orders data");

    return ResponseEntity.status(HttpStatus.OK).body(result);
}

 

 

테스트

주문을 해보니 아래와 같이 로그가 보입니다. TID를 가져와서 Zipkin에서 조회하겠습니다.

 

조회하니 아래와 같이 뜹니다. 이렇게 TID를 통해서 데이터를 추적할 수 있습니다.

 

끝.

반응형

'IT > Spring Cloud' 카테고리의 다른 글

모니터링 - Prometheus, Grafana  (0) 2022.02.04
모니터링 - Micrometer  (0) 2022.02.04
CircuitBreaker  (0) 2022.01.30
Apache Kafka 활용 (1)  (0) 2022.01.23
데이터 동기화 - Kafka 설정  (0) 2022.01.08