Spring 추적 라이브러리
Spring 추적 라이브러리는, 기존에는 개발자가 직접 만들어 사용하거나, Spring Cloud Sleuth를 사용하여 추적 로그를 수집하고, 분석하였다. 하지만, 2022년 11월 Spring Cloud 에서 해당 프로젝트를 분리하여, Micrometer Tracing 프로젝트를 만들었다. 이는 Spring Cloud Sleuth의 독립적인 복사본이며, Spring Cloud의 라이브러리 종속성을 제거하여, 완전히 분리되어 사용될 수 있는 구조를 가진 추적 라이브러리로 만들어 졌다.
설치
다음 Gradle 문장을 통해 Micrometer-Tracing를 사용하도록 설정할 수 있다.
implementation platform(‘io.micrometer:micrometer-tracing-bom:latest.release’)
implementation ‘io.micrometer:micrometer-tracing’
(tracing 부분은, 아래 Tracer를 추가하게 되면 전이적으로 추가됨)
이후, 필요한 추적 브리지에 따라 다음과 같이 추가로 설정을 진행한다.
Micrometer-Tracing에서는 유연성과 확장성, 호환성 등의 이유로 아래와 같은 두가지의 Tracer를 제공하며, 목적과 필요에 따라 선택적으로 사용하면 된다.
Tracer
Tracer는 추적 로그를 수집하는데, 다음과 같은 기능을 제공한다.
-
스팬 생성
- 스팬(Span): Tracer는 특정 작업이나 요청을 나타내는 스팬을 생성한다. 각 스팬은 시작 시간, 종료 시간, 이름, 메타데이터(태그 등)를 포함하여 요청의 처리 과정을 추적한다.
-
스팬 관리
- 시작 및 종료: Tracer는 스팬을 시작하고 종료하는 메서드를 제공하여, 특정 작업의 결과 시간을 기록
- 중첩 관계 관리: 여러 스팬을 중첩하여 계증 구조를 만들 수 있고, 이를 통해, 복잡한 호출 체인을 시각화 하고 분석할 수 있음
-
컨텍스트 전파
- Request Context: Tracer는 요청 간의 컨텍스트를 전파할 수 있는 기능을 제공, 이를 통해 분산 시스템에서 여러 서비스 간의 호출을 연결할 수 있음
- Http 헤더 전파: Tracer는 HTTP 요청 및 응답에서 스팬 ID와 같은 정보를 포함하여 컨텍스트를 전파할 수 있음
-
메타데이터 추가
- 태그와 애노테이션: Tracer는 스팬에 추가 정보를 포함할 수 있도록 태그나 애노테이션을 추가할 수 있는 기능을 제공 (에러메시지, 응답 코드 등을 기록할 수 있음)
-
데이터 내보내기
- 외부 백엔드 Jaeger, Zipkin등으로 내보내는 기능을 제공하여 실시간 모니터링 및 분석을 가능하게 함
Brave Tracer
- 간단하고 가벼운 라이브러리: Brave는 Zipkin에 기반한 경량화된 트레이싱 라이브러리로, 간단한 사용 사례에 적합
- Zipkin과의 통합: Zipkin과의 연동이 용이하며, 간단한 설정으로 빠르게 사용할 수 있음
- 전통적인 사용 사례: 기존의 Zipkin 사용자가 많은 경우, 쉽게 통합할 수 있음
implementation ‘io.micrometer:micrometer-tracing-bridge-brave’
Open-Telemetry Tracer
- 표준화된 프레임워크 : OpenTelemetry는 분산 트레이싱, 메트릭, 로그를 위한 표준화된 프레임워크로, 다양한 언어와 플랫폼에서 사용할 수 있는 통합 솔루션임
- 확장성 : 여러 백엔드와 쉽게 연동할 수 있으며, 사용자가 원하는 방식으로 데이터 수집 및 전송을 커스터마이즈 할 수 있음
- 정밀한 매트릭과 트레이싱: OpenTelemetry는 보다 정교한 트레이싱과 메트릭 수집 기능을 제공하므로, 복잡한 요구 사항이 있는 경우 성능 모니터링이 더 효과적일 수 있음
- 활발한 커뮤니티: 오픈 소스 프로젝트로, 큰 커뮤니티와 활발한 개발이 이루어 지고 있음
implementation ‘io.micrometer:micrometer-tracing-bridge-otel’
Reporter
Micrometer는 Wavefront나 Zipkin 등의 외부 시각화 도구를 지원하며, 이런 도구들에 리포팅을 위한 도구를 제공한다.
Wavefront Reporter
implementation ‘io.micrometer:micrometer-tracing-reporter-wavefront’
Brave Zipkin Reporter
implementation ‘io.zipkin.reporter2:zipkin-reporter-brave’
Open Telemetry Zipkin Reporter
implementation ‘io.opentelemetry:opentelemetry-exporter-zipkin’
Zipkin을 통해 span을 전송하기 위한 OpenZipkin URL 발신자 종속성
implementation ‘io.zipkin.reporter2:zipkin-sender-urlconnection’
Spring boot 설정
설정된 Report URL은 다음과 같은 형태로 application.yml(properties)에 추가하여 설정한다.
management.zipkin.tracing.endpoint: [URL]/api/v2/spans
시각화를 위한 설정 – Zipkin
사용 라이브러리 및 도구
Zipkin을 사용하여, 추적성 데이터를 시각화 할 수 있으며, 대상 모듈에서는 zipkin 라이브러리 의존성 추가와 zipkin서버 정보를 입력하여 데이터를 수집할 수 있다.
Zipkin 서버 설치
docker를 이용한 설치
docker run -d -p 9411:9411 openzipkin/zipkin
설정 파일을 위한 설정
Zipkin은 추적 정보를 DB로 관리한다. 따라서, 다음과 같은 설정을 추가하여 외부 DB를 사용하도록 설정하여 관리 데이터를 분리할 수 있다.
environment:
– STORAGE_TYPE=mysql
– MYSQL_DB=zipkin
– MYSQL_USER=zipkin
– MYSQL_PASS=zipkin
– MYSQL_HOST=zipkin-mysql
– MYSQL_TCP_PORT=3306
서버 확인
네트워크를 통한 호출 설정
Micrometer는 네트워크를 통한 타 서버 호출 시, 자동으로 TraceId와 SpanId를 입력하여, 추적할 수 있는 정보를 전달한다.
다만, 지원되는 함수는, RestTemplateBuilder, RestClient.Builder, WebClient.Builder를 지원하기 때문에, 해당 Builder를 주입 받아, Client를 생성하는 형태로 구현을 해야만, 정확한 추적 정보를 대상 서버에 전달할 수 있다.
RestClient.Builder
Trace정보를 입력하기 위하여 자동으로 설정된 코드는, Builder를 통해 넘어오기 때문에, 필히 Builder를 주입받아, Client를 생성하도록 구현한다.
public class Test {
private final RestClient client;
public Test(RestClient.Builder builder) {
client = builder.baseUrl(…).build();
}
}