메트릭(Metrics)
Micrometer
: Spring의 메트릭을 수집하고 다양한 모니터링 시스템에 전송하기 위해 사용되는 라이브러리로그(Logs)
Logback
, Log4j2
: Spring 애플리케이션에서 자주 사용되는 로깅 프레임워크트레이스(Traces)
트레이스는 시스템 내에서 요청의 흐름을 추적하는 데이터
Micrometer Tracing
, Spring Cloud Sleuth
: Spring에서 트레이싱을 구현하는 데 사용
Spring Boot 3.x 부터는 Sleuth를 사용할 수 없음, Micrometer Tracing으로 이전
Spring Boot Actuator
/actuator/health
엔드포인트를 통해 애플리케이션의 상태를 확인Micrometer
Micrometer Tracing, Spring Cloud Sleuth
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
요청시
위에서 추출한 메트릭을 모니터링 도구를 통해 시각화하여 확인하곤 한다.
대표적인 인기있는 모니터링 도구들
위 그림과 같이 추출한 메트릭을 프로메테우스에 저장하고, 그라파나로 시각화한 결과가 아래에 해당된다.
분산 추적은 마이크로서비스 아키텍처에서 요청의 흐름을 모니터링하고 추적하는 방법으로,
요청이 여러 마이크로 서비스를 통해 전파되는 전체 경로를 시각화하고 분석할 수 있는 방법을 제공한다.
Micrometer Tracing 소개
주요 개념 및 기능
trace
: 단일 요청에 대한 고유 식별자span
: 해당 trace 내에서 단일 작업 단위의존성 추가
<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
으로 모니터링하기
localhost:9411
접속
Trace ID 검색
Span Table 확인