TIL : 분산 추적 (Spring Cloud Sleuth) 및 로깅 (Zipkin)

Skadi·2024년 8월 13일
0

9.1 분산 추적


9.1.1 분산 추적이란?

  • 분산 추적은 분산 시스템에서 서비스 간의 요청 흐름을 추적하고 모니터링하는 방법입니다.
  • 이 방법을 통해 여러 서비스의 호출 관계와 성능을 시각화하여 문제를 진단하고 해결할 수 있습니다.
  • 주요 개념:
    • 트레이스(Trace): 하나의 요청이 시작부터 끝까지 각 서비스를 거치는 전체 흐름을 나타냅니다. 트레이스는 여러 개의 스팬(Span)으로 구성되며, 트레이스 ID를 통해 요청의 전체 흐름을 추적할 수 있습니다.
    • 스팬(Span): 분산 추적의 가장 작은 단위로, 특정 서비스 내에서의 개별 작업 또는 요청을 나타냅니다. 각 스팬은 고유한 스팬 ID를 가지며, 시작 시간과 종료 시간을 기록하여 작업의 지속 시간을 나타냅니다.
    • 컨텍스트(Context): 요청이 서비스 간에 전달될 때 함께 전파되어, 각 서비스가 요청의 전체 흐름에 대한 정보를 가질 수 있게 합니다. 컨텍스트는 트레이스 ID, 스팬 ID, 부모 스팬 ID 등의 정보를 포함하여 서비스 호출 간의 추적을 가능하게 합니다.

9.1.2 분산 추적의 필요성

  • 마이크로서비스 아키텍처에서는 여러 서비스가 협력하여 하나의 요청을 처리합니다.
  • 서비스 간의 복잡한 호출 관계로 인해 문제 발생 시 원인을 파악하기 어려울 수 있습니다.
  • 분산 추적을 통해 각 서비스의 호출 흐름을 명확히 파악하고, 성능 병목이나 오류를 빠르게 진단할 수 있습니다.

9.2 Micrometer


9.2.1 Micrometer란?

  • Micrometer는 Spring 기반 애플리케이션에서 메트릭을 수집하고 모니터링하기 위한 라이브러리입니다.
  • 각 서비스의 성능 지표를 수집하고, Prometheus, Grafana 등과 연동하여 시각화할 수 있습니다.
  • 또한, 분산 추적을 위한 기능을 제공하여 서비스 간의 호출 흐름을 추적할 수 있습니다.

9.2.2 주요 특징

  • 다양한 메트릭 수집: 애플리케이션의 다양한 성능 지표를 수집할 수 있습니다.
  • 유연한 연동: Prometheus, Grafana 등 다양한 모니터링 도구와 연동할 수 있습니다.
  • 추적 기능: 서비스 간의 호출 흐름을 추적하여 성능 병목을 진단할 수 있습니다.

9.3 Zipkin


9.3.1 Zipkin이란?

  • Zipkin은 트레이스 데이터를 수집하고 시각화하는 분산 추적 시스템입니다.
  • 각 서비스의 트레이스와 스팬 데이터를 저장하고, 이를 통해 호출 흐름을 시각화합니다.

9.3.2 주요 특징

  • 데이터 수집 및 저장: 각 서비스에서 전송된 트레이스 데이터를 수집하고 저장합니다.
  • 시각화: 트레이스 데이터를 시각화하여 서비스 간의 호출 관계를 명확히 파악할 수 있습니다.
  • 검색 및 필터링: 특정 트레이스나 스팬을 검색하고 필터링하여 문제를 진단할 수 있습니다.

9.4 Zipkin 서버 설정


9.4.1 Zipkin 서버 실행

  • Zipkin 서버를 Docker를 사용하여 실행할 수 있습니다:
    docker run -d -p 9411:9411 openzipkin/zipkin

9.4.2 Zipkin 대시보드 사용

  • Zipkin 대시보드에 접속하여 트레이스 데이터를 시각화합니다:
    • URL: http://localhost:9411
    • 트레이스 검색 및 분석

9.5 분산 추적 예제


9.5.1 서비스 호출 흐름 추적

  • 예제 서비스 간의 호출 흐름을 추적하고, Zipkin 대시보드에서 시각화합니다.
  • 각 서비스 호출 시 트레이스와 스팬이 생성되고, Zipkin 서버로 전송됩니다.

9.5.2 성능 병목 진단

  • Zipkin 대시보드를 통해 성능 병목이 발생하는 부분을 식별합니다.
  • 각 스팬의 소요 시간과 호출 관계를 분석하여 성능 문제를 진단하고 해결합니다.

9.6 실습


9.6.1 Product-service

  • build.gradle 파일의 디펜던시를 아래와 같이 수정합니다:

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-actuator'
        implementation 'io.micrometer:micrometer-tracing-bridge-brave'
        implementation 'io.github.openfeign:feign-micrometer'
        implementation 'io.zipkin.reporter2:zipkin-reporter-brave'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
        implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
        providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    }
  • application.yml 파일:

    spring:
      application:
        name: product-service
    server:
      port: 19092
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:19090/eureka/
    
    management:
      zipkin:
        tracing:
          endpoint: "http://localhost:9411/api/v2/spans"
      tracing:
        sampling:
          probability: 1.0

9.6.2 Order-service

  • build.gradle 파일의 디펜던시를 아래와 같이 수정합니다:

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-actuator'
        implementation 'io.micrometer:micrometer-tracing-bridge-brave'
        implementation 'io.github.openfeign:feign-micrometer'
        implementation 'io.zipkin.reporter2:zipkin-reporter-brave'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
        implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
        providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    }
  • application.yml 파일:

    spring:
      application:
        name: order-service
    server:
      port: 19091
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:19090/eureka/
    
    management:
      zipkin:
        tracing:
          endpoint: "http://localhost:9411/api/v2/spans"
      tracing:
        sampling:
          probability: 1.0

9.6.3 Zipkin 실행

  • Zipkin 도커 컨테이너 실행 코드를 커맨드라인에 입력합니다:
    docker run -d -p 9411:9411 openzipkin/zipkin

9.6.4 서비스 실행 및 확인

  • Eureka Server > Order > Product 순으로 서비스를 실행합니다.
  • 브라우저에서 http://localhost:19091/order/1에 접속하여 이전과 동일한 응답 결과를 확인합니다.
  • http://localhost:9411/zipkin/로 접속 후, RUN QUERY를 클릭하여 생성된 트레이스를 확인하고, 서비스 간 호출 흐름을 추적합니다.

추가 내용


  • 필요 시, 서비스별로 로그를 분석하여 더욱 상세한 정보와 에러를 추적할 수 있습니다.
  • MicrometerZipkin을 연동하여 실시간 모니터링을 강화하고, 성능 최적화를 위해 메트릭을 분석하는 작업을 추가할 수 있습니다.

0개의 댓글