Jaeger는 Uber가 개발하고 CNCF에 기부한 분산 추적(Distributed Tracing) 시스템이다. 마이크로서비스 아키텍처에서 요청의 흐름을 시각화하고 성능 병목을 찾는 데 사용된다.
분산 추적 핵심 개념
| 개념 | 설명 |
|---|
| Trace | 요청의 전체 실행 경로 (여러 스팬의 집합) |
| Span | 단일 작업 단위 (서비스 호출, DB 쿼리 등) |
| SpanContext | 트레이스 ID, 스팬 ID, 샘플링 플래그 |
| Baggage | 스팬 간 전파되는 키-값 데이터 |
Jaeger 아키텍처
클라이언트 라이브러리 → Jaeger Agent → Jaeger Collector → 스토리지 (Cassandra/ES)
↓
Jaeger Query → Jaeger UI
Docker Compose로 Jaeger 올-인-원 실행
yaml
services:
jaeger:
image: jaegertracing/all-in-one:latest
environment:
- COLLECTOR_OTLP_ENABLED=true
ports:
- "16686:16686" # UI
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
- "6831:6831/udp" # Thrift compact
Go SDK 예시
go
import (
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
)
func initTracer() func() {
exporter, _ := otlptracegrpc.New(ctx,
otlptracegrpc.WithEndpoint("jaeger:4317"),
otlptracegrpc.WithInsecure(),
)
tp := trace.NewTracerProvider(
trace.WithBatcher(exporter),
trace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName("my-service"),
)),
)
otel.SetTracerProvider(tp)
return func() { tp.Shutdown(ctx) }
}
샘플링 전략
| 전략 | 설명 | 적합한 상황 |
|---|
| Constant | 항상 샘플링 | 개발/테스트 |
| Probabilistic | 확률 기반 (예: 10%) | 일반 운영 |
| Rate Limiting | 초당 N개 제한 | 고트래픽 |
| Remote | Jaeger가 동적으로 결정 | 프로덕션 |
서비스 성능 메트릭 (SPM)
Jaeger UI에서 RED 메트릭(Rate, Errors, Duration)을 서비스별로 시각화한다. Prometheus 연동으로 자동 계산된다.