[Spring Boot] Observability - 분산 추적과 성능 모니터링

이동엽·2024년 8월 4일
1

spring

목록 보기
21/21
post-thumbnail

1. 개요

1.1 Spring Observability 소개

  • Spring 프레임워크를 사용하는 애플리케이션에서 관찰성을 구현하는 데 필요한 도구와 기능을 제공하는 개념
  • 이를 통해 Spring 애플리케이션의 상태와 성능을 효과적으로 모니터링하고 관리할 수 있다.
  • 주로 모니터링은 애플리케이션의 성능과 상태에 대한 데이터 수집을 허용하는 반면, 관찰성은 문제가 발생할 때 이해하고 문제를 해결하는 데 도움이 된다.

1.2 주요 구성 요소

메트릭(Metrics)

  • 시스템의 성능이나 상태를 나타내는 숫자 데이터를 의미
    • CPU 사용량, 메모리 사용량, 요청 처리 시간, 에러 발생 횟수 등
  • Micrometer : Spring의 메트릭을 수집하고 다양한 모니터링 시스템에 전송하기 위해 사용되는 라이브러리

로그(Logs)

  • 시스템의 상태나 이벤트에 대한 기록
  • Logback, Log4j2 : Spring 애플리케이션에서 자주 사용되는 로깅 프레임워크

트레이스(Traces)

  • 트레이스는 시스템 내에서 요청의 흐름을 추적하는 데이터

    • 하나의 요청이 여러 서비스와 컴포넌트를 거쳐 처리되는 과정을 추적
    • → 이는 특히 분산 시스템에서 중요한 역할
  • Micrometer Tracing, Spring Cloud Sleuth : Spring에서 트레이싱을 구현하는 데 사용

    • Spring Boot 3.x 부터는 Sleuth를 사용할 수 없음, Micrometer Tracing으로 이전


1.3 Spring Observability 도구와 프레임워크

Spring Boot Actuator

  • Spring 애플리케이션의 상태와 성능을 모니터링하고 관리할 수 있는 다양한 엔드포인트를 제공
    • 제공하는 엔드포인트: 헬스 체크, 환경 정보, 메트릭, 로그 등.
    • example : /actuator/health 엔드포인트를 통해 애플리케이션의 상태를 확인

Micrometer

  • 다양한 모니터링 시스템과 통합하여 메트릭을 수집하고 전송
    • example : Prometheus와의 통합을 통해 실시간 메트릭 모니터링 및 알림 설정.

Micrometer Tracing, Spring Cloud Sleuth

  • 분산 추적을 구현하여, 마이크로서비스 환경에서 요청의 흐름을 추적하고 분석
    • example : 하나의 요청이 여러 서비스에서 처리될 때 각 서비스의 처리 시간을 추적하고 분석.

2. 애플리케이션 상태 및 성능 지표 모니터링

2.1 Spring에서의 성능 지표 추출 및 모니터링

  • Spring Actuator와 Micrometer는 Spring 애플리케이션의 상태와 성능 모니터링을 제공한다.

    • Actuator : 다양한 모니터링 엔드포인트를 제공

    • Micrometer : Prometheus와 같은 외부 모니터링 시스템과 통합하여 메트릭을 수집하고 분석

      • Spring Boot 2의 Actuator에 포함된 메트릭 수집 기능으로, 애플리케이션의 메트릭을 표준 방법으로 제공


의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

환경 설정 파일 작성

management:
  endpoint:
    # 각각의 endpoint 마다 자세한 값을 보여줄 지 지정할 수 있다.
    health:
      show-details: always # default : never
  endpoints:
    web:
      exposure:
        # 웹으로 노출하고 싶은 endpoint를 지정할 수 있음
        include: health, prometheus # default : health
        # 웹으로 노출하고 싶지 않은 endpoint도 지정할 수 있음
        exclude: info
      # 메트릭을 확인할 base-url을 지정할 수 있다.
      base-path: /actuator  # default : /actuator

메트릭 확인

GET {서버 주소 : 포트}/actuator/health 요청시


GET {서버 주소 : 포트}/actuator/prometheus 요청시


2.2 메트릭 활용 예시

위에서 추출한 메트릭을 모니터링 도구를 통해 시각화하여 확인하곤 한다.


대표적인 인기있는 모니터링 도구들

  • Prometheus : Sound Cloud에서 처음 구축된 오픈소스 시트메 모니터링 및 경고 툴킷
  • Grafana : Prometheus를 포함한 다양한 소스의 시각화 및 분석 데이터
  • Splunk : 로그, 이벤트 및 기타 유형의 데이터를 포함하여 기계에서 생성된 데이터를 실시간으로 검색, 모니터링 및 분석
  • Loki : 프로메테우스와 비슷하지만 로그만을 위한 툴
  • OpenTelemetry : 애플리케이션에서 관찰 데이터를 수집하고 이 데이터(메트릭, 추적, 로그)를 내보내는 표준 방식을 제공하는 관찰 프레임워크
  • Zipkin : 분산 추적 시스템으로, 서비스 아키텍처에서 지연 문제를 해결하는 데 필요한 타이밍 데이터를 수집

위 그림과 같이 추출한 메트릭을 프로메테우스에 저장하고, 그라파나로 시각화한 결과가 아래에 해당된다.


3. 분산 추적 및 로깅

3.1 분산 추적 개념

분산 추적은 마이크로서비스 아키텍처에서 요청의 흐름을 모니터링하고 추적하는 방법으로,

요청이 여러 마이크로 서비스를 통해 전파되는 전체 경로를 시각화하고 분석할 수 있는 방법을 제공한다.


3.2 분산 추적의 중요성

  • 병목현상 식별
    • 요청의 전체 수명 주기를 추적함으로써 시스템의 성능 병목현상과 지연 문제를 쉽게 식별할 수 있다.
  • 디버깅
    • 분산 추적은 실패나 오류가 발생한 정확한 서비스나 작업을 찾아내어 더 빠르고 정확한 디버깅을 제공
  • 성능 모니터링
    • 각 서비스의 성능에 대한 통찰을 제공하여 더 나은 자원 할당 및 최적화를 할 수 있다.

3.3 분산 추적 특징 정리

Micrometer Tracing 소개

  • Micrometer Tracing은 Spring 애플리케이션에서 분산 추적을 지원한다.
  • Zipkin 및 OpenTelemetry와 같은 인기 있는 추적 시스템과 원활하게 통합된다.

주요 개념 및 기능

  • Trace와 Span
    • 요청의 수명 주기를 나타내기 위해 trace와 span을 사용한다.
    • trace : 단일 요청에 대한 고유 식별자
    • span : 해당 trace 내에서 단일 작업 단위
  • 자동 계측
    • Spring Boot 애플리케이션을 자동으로 계측하여 로그에 trace 및 span ID를 추가한다.
  • 로깅 통합
    • Micrometer Tracing은 로깅 프레임워크와 통합되어 로그 항목에 추적 정보를 추가한다.

3.4 분산 추적 구현

의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!-- Micrometer Tracing으로 MSA 분산 추적 구현 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>

<!-- 분산 추적 내용을 zipkin으로 모니터링 -->
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter-brave</artifactId>
</dependency>

프로퍼티 설정

management:
  tracing:
    sampling:
      probability: 1.0   # 로그 샘플링 비율 - 1.0일 경우에는 100% 로그를 샘플링, default : 0.1
    propagation:         # 추적 정보 전파 방식 (wbc, b3, b3_multi)
      produce: b3_multi  # 추적 정보를 여러 개의 헤더로 나누어 전송
      consume: b3        # HTTP 헤더를 사용하여 추적 ID, 스팬 ID 등을 전달

  zipkin:
    tracing:
      endpoint: "<http://localhost:9411/api/v2/spans>" # zipkin 서버 주소 & 엔드포인트

분산 추적을 모니터링하기 위한 zipkin 실행

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

Spring Boot 서버에 요청시, 생기는 로그

66adf20e7b6e74e03eb80ff15be76d2b-3bf50d15d97d65 과 같이 {traceId}-{spanId}가 자동 추가됨

2024-08-03T18:02:06.527+09:00 DEBUG 12236 --- **[user-service] [o-auto-1-exec-1] [66adf20e7b6e74e03eb80ff15be76d2b-3bf50d15d9fd7d65]** i.d.u.controller.UserController          : health_check health_check

주의할 점

외부 API 서버 호출시 RestTemplate, RestClient, WebClient를 이용하는 경우에는 반드시 Builder를 이용해 객체를 생성하고, 빈으로 등록하여 사용해야만 요청 헤더에 TraceId가 전파된다.


요청 간의 TraceId가 제대로 전파될 경우, 아래와 같이 헤더에 traceId가 들어있어야 한다.


zipkin 으로 모니터링하기

  1. localhost:9411 접속

  1. Trace ID 검색

  1. Span Table 확인


4. 마무리

  • API 서버간 통신하는 기능에서 문제가 생길 경우, 각각의 서버에 접속해서 로그로 문제가 되는 곳을 파악하기에는 시간이 오래 걸린다.
  • 따라서 API 서버간 통신이 많아질 경우에는, 모니터링 도구를 통해 빠르게 문제점을 찾기 위해 도입해야 할 것 같다.

5. 참고자료

profile
백엔드 개발자로 등 따숩고 배 부르게 되는 그 날까지

0개의 댓글