분산 추적
1단계: 실행 Jaeger Locally
섹션 제목: “1단계: 실행 Jaeger Locally”docker run -d --name jaeger \ -e COLLECTOR_OTLP_ENABLED=true \ -p 16686:16686 \ -p 4317:4317 \ -p 4318:4318 \ jaegertracing/all-in-one:latestJaeger UI at http://localhost:16686.
2단계: 설정 Your Service
섹션 제목: “2단계: 설정 Your Service”Name: order-apiHost: 0.0.0.0Port: 8888
Telemetry: Name: order-api # Jaeger 예시입니다 Endpoint: localhost:4317 # OTLP gRPC Sampler: 1.0 # 1.0 = 100% sampling; 0.1 = 10% Batcher: otlpgrpc3단계: 확인
섹션 제목: “3단계: 확인”# 시작합니다go run order.go -f etc/order-api.yaml
# Make 예시입니다curl http://localhost:8888/order/1
# Open, Jaeger, UI 예시입니다You will see 추적 사용하여:
- root
HTTP GET /order/1span - Child spans 위한 any downstream RPC calls
- Child spans 위한 SQL queries (경우 사용하여
sqlx) - Child spans 위한 Redis calls
4단계: 추적 전반에 서비스
섹션 제목: “4단계: 추적 전반에 서비스”Name: user.rpcListenOn: 0.0.0.0:8081
Telemetry: Name: user.rpc Endpoint: localhost:4317 Sampler: 1.0 Batcher: otlpgrpccross-service 추적 looks like:
order-api [200ms] ───────────────────────────────────────────────────────── HTTP GET /order/1 [200ms] user.rpc/GetUser [15ms] sqlx.FindOne [8ms] order.rpc/GetOrder [40ms] redis.Get [2ms] sqlx.FindOne [12ms]5단계: 추가 사용자 정의 span
섹션 제목: “5단계: 추가 사용자 정의 span”위한 additional detail inside your 비즈니스 로직:
import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute")
func (l *GetOrderLogic) GetOrder(req *types.GetOrderReq) (*types.GetOrderResp, error) { tracer := otel.Tracer("order-logic") ctx, span := tracer.Start(l.ctx, "validate-inventory") defer span.End()
// Annotate 예시입니다 span.SetAttributes( attribute.Int64("order.id", req.Id), attribute.String("order.region", req.Region), )
if err := l.checkInventory(ctx, req.Id); err != nil { span.RecordError(err) return nil, err }
return &types.GetOrderResp{ /* ... */ }, nil}사용하여 Grafana Tempo (OTLP)
섹션 제목: “사용하여 Grafana Tempo (OTLP)”Telemetry: Name: order-api Endpoint: http://tempo:4318 # OTLP HTTP Sampler: 1.0 Batcher: otlphttp또는 gRPC:
Telemetry: Name: order-api Endpoint: tempo:4317 # OTLP gRPC (no http:// prefix) Sampler: 1.0 Batcher: otlpgrpc사용하여 OpenTelemetry Collector
섹션 제목: “사용하여 OpenTelemetry Collector”receivers: otlp: protocols: http: endpoint: 0.0.0.0:4318 grpc: endpoint: 0.0.0.0:4317
exporters: jaeger: endpoint: jaeger:14250 tls: insecure: true prometheusremotewrite: endpoint: http://prometheus:9090/api/v1/write
service: pipelines: traces: receivers: [otlp] exporters: [jaeger]Point your 서비스 로 Collector:
Telemetry: Endpoint: http://otel-collector:4318 Batcher: otlphttp로그 Correlation
섹션 제목: “로그 Correlation”{ "level": "info", "ts": "2026-02-22T10:01:05Z", "caller": "logic/getorderlogic.go:42", "msg": "order fetched", "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736", "span_id": "00f067aa0ba902b7"}