ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ZIPKIN 시작하기
    인프라/모니터링 2021. 11. 25. 18:26

    Zipkin 설치방법 1(Jar 파일 실행)

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

    Zipkin Elasitc 저장소로 실행

    java -jar zipkin.jar --STORAGE_TYPE=elasticsearch --ES_HOSTS=http://127.0.0.1:9200

     

    Zipkin 설치방법 2(도커 이미지 실행)

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

    docker-compose.yml

    version: "3.3" # 파일 규격 버전
    services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
    
      zipkin:
        image: openzipkin/zipkin
        container_name: zipkin
        # environment:
        #   - STORAGE_TYPE=elasticsearch
        #   - ES_HOSTS=localhost:9200 ## 도커로 엘라스틱 저장소 연결하는거는 다음처럼 했을때 안됐음.
        ports:
          - "9411:9411"

    Zipkin 설치방법 3(zipkin-server 용 어플리케이션 생성)

    @EnableZipkinServer 추가

     

     

    위와 같은 준비가 끝났으면 spring 에서는 

    spring cloud slueth 연동

     

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>
    spring:
      application:
        name: zipkin-client
      sleuth:
        sampler:
          probability: 1.0
      zipkin:
        base-url: http://localhost:9411

     

     

    Zipkin 구조도

    Zipkin은 크게 Zipkin Client Library와 Zipkin Server로 구성되며, Zipkin Server는 Collector, Storage, API(Query Service), Web UI(Dashboard)로 구성된다.

     

    1. Zipkin Client Library : 서비스에서 트레이스 정보를 수집하여 Zipkin Server의 Collector 모듈로 전송하며, 지원하는 언어는 Java, Javascript, Go, C# 등이 있다. Collector로 전송할 때는 다양한 프로토콜을 사용할 수 있지만 일반적으로 HTTP를 사용하고, 시스템이 클 경우 Kafka 큐를 통해서도 전송을 한다.

    2. Collector : Zipkin Client Library로부터 전달된 트레이스 정보 유효성을 검증하고 검색 가능하게 저장 및 색인화 한다. 

    3. Storage : Zkipkin Collector로 보내진 트레이스 정보는 Storage에 저장된다. Zipkin은 초창기에는 Cassandra에 데이터를 저장하도록 만들어졌지만(Cassandra가 확장 가능하고 유연한 스키마를 가지고 있기 때문에 Twitter 내에서 많이 사용되었음), 그 뒤로 ElasticSearch나 MySQL도 지원 가능하게 구성되었다. 그 외에 In-Memory도 지원 가능하기 때문에 간단히 로컬에서 테스트할 때는 In-Memory, 소규모는 MySQL, 운영환경에 적용은 Cassandra나 ElasticSearch를 저장소로 사용하는 것이 좋다. 

    4. API(Zipkin Query Service) : 저장되고 색인화된 트레이스 정보를 검색하기 위한 JSON API이며, 주로 Web UI에서 호출된다.

    5. Web UI : 수집된 트레이스 정보를 확인할 수 있는 GUI로 만들어진 대쉬보드이며, 서비스 / 시간 / 어노테이션 기반으로 데이터 확인이 가능하다. Zipkin 서버의 대쉬보드를 사용할 수도 있고, ElasticSearch 백앤드를 이용한 경우는 Kibana 활용도 가능하다.

     

     

    Spring Cloud Sleuth란?

    MSA환경에서 클라이언트의 호출은 내부적으로 여러 마이크로서비스를 거쳐서 일어나기 때문에 추적이 어렵다. 때문에 이를 추적하기 위해서는 연관된 ID가 필요한데, 이런 ID를 자동으로 생성해주는 것이 Spring Cloud Sleuth이다.

    Spring Cloud Sleuth는 Spring에서 공식적으로 지원하는 Zipkin Client Library로 Spring과의 연동이 매우 쉬우며, 호출되는 서비스에 Trace(추적) ID와 Span(구간) ID를 부여한다. Trace ID는 클라이언트 호출의 시작부터 끝날때까지 동일한 ID로 처리되며, Span ID는 마이크로서비스당 1개의 ID가 부여된다. 이 두 ID를 활용하면 클라이언트 호출을 쉽게 추적할 수 있다.


    Zipkin 헤더

    Zipkin은 B3-Propagation을 통해서 OpenTracing을 구현하고 있습니다. B3 propagation은 간단히 말해 ‘X-B3-‘으로 시작하는 X-B3-TraceId와 X-B3-ParentSpanId, X-B3-SpanId, X-B3-Sampled, 이 4개 값을 전달하는 것을 통해서 트레이스 정보를 관리합니다. 서버에서는 이 값들을 TraceContext에서 관리하는데요. Spring 프레임워크와 SLF4J(Simple Logging Facade for Java)를 사용하고 있었기에 MDC(Mapped Diagnostic Context)에서 해당 값을 꺼내서 사용할 수 있었습니다. HTTP를 통해 다른 서버로 전달하는 경우에는 HTTP 헤더를 통해서 전달하고, Kafka 메시지를 통해 전달하는 경우에는 Kafka 헤더를 통해서 전달합니다.

     

    Spring cloud sleuth

    Zipkin의 Brave는 B3-propagation의 Java 구현체이고, Spring Cloud Sleuth는 BraveTracer를 Spring 프레임워크에서 쉽게 사용하기 위한 라이브러리입니다. TaskExecutor와 RestTemplate, KafkaTemplate, KafkaListener, RedisTemplate을 사용하는 것만으로 새로운 스팬(span)이 생성됩니다. 다만, BeanPostProcessor를 통해서 동작하기 때문에 아래와 같이 메서드 내부에서 생성된 오브젝트를 사용하는 경우에는 동작하지 않는다.

     

    TaskExecutor executor = new TaskExecutor();
    -> 
    @Bean

     

    public TaskExecutor taskExecutor() { return new TaskExecutor();}
    반응형

    '인프라 > 모니터링' 카테고리의 다른 글

    spring cloud resilience4j 모니터링  (0) 2022.11.03
    [ELK] logstash 설치 및 실행하기  (0) 2022.07.13
    telegraf 시작하기  (0) 2022.01.04
    Burrow 시작하기  (0) 2021.12.30
    프로메테우스 Prometheus 시작하기(docker)  (0) 2021.11.04

    댓글

Designed by Tistory.