Ops/Monitoring
Loki - Tempo 연동(w. opentelemetry)
크리두
2025. 5. 26. 13:44
반응형
🧭 사용법 요약 (공식 문서 기준)
✅ 기본 구성 요소
- Ingress NGINX – OpenTelemetry 모듈 활성화
- OpenTelemetry Collector – OTLP gRPC 포트 수신 (4317)
- Trace Backend (e.g., Tempo) – Collector에서 데이터 수신
🛠️ 1. NGINX 설정: Tracing 활성화
Helm 설치 시 tracing 활성화 옵션을 추가합니다:
helm upgrade --install ingress-nginx ingress-nginx \\
--repo <https://kubernetes.github.io/ingress-nginx> \\
--namespace ingress-nginx --create-namespace \\
--set controller.opentelemetry.enabled=true \\
--set controller.opentelemetry.endpoint="otel-collector:4317" \\
--set controller.opentelemetry.sampler="always_on" \\
--set controller.opentelemetry.serviceName="ingress-nginx"
🔹 otel-collector:4317 은 OTLP gRPC 포트를 사용하는 OpenTelemetry Collector 서비스 주소입니다.
⚙️ 2. OpenTelemetry Collector 구성 (필수)
Collector가 OTLP 데이터를 수신하고, Tempo로 전송합니다. 예시:
receivers:
otlp:
protocols:
grpc:
http:
exporters:
otlp/tempo:
endpoint: tempo.monitoring.svc.cluster.local:4317
tls:
insecure: true
logging:
loglevel: debug
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlp/tempo, logging]
Collector는 otel-collector 라는 이름으로 서비스되어야 위 Helm 설정과 연결됩니다.
🔗 3. 전체 데이터 흐름
[App / Ingress]
↓
[OpenTelemetry Collector]
↓
OTLP/gRPC Exporter
↓
[Tempo]
↓
[Grafana Tempo Plugin]
- Ingress NGINX가 traceparent 헤더로 요청마다 trace를 생성
- 이 trace는 OTLP gRPC로 Collector에 전송됨
- Collector는 이를 Tempo에 저장
- Grafana에서 Tempo를 데이터 소스로 추가하여 시각화 가능
📋 주요 Helm 옵션 정리
옵션 설명
controller.opentelemetry.enabled | OpenTelemetry tracing 활성화 |
controller.opentelemetry.endpoint | OTLP gRPC 수신 주소 (Collector) |
controller.opentelemetry.sampler | 샘플링 전략 (always_on, always_off, traceidratio) |
controller.opentelemetry.serviceName | trace에 표시될 서비스 이름 (예: ingress-nginx) |
🎯 로그에서 traceID 추적
Ingress NGINX는 자동으로 traceparent 헤더를 백엔드로 전달하므로, Flask 등 앱에서 이를 추출해 로그에 출력하면 Loki → Tempo 연동이 가능해집니다.
Loki - Tempo 연동
Grafana UI에서:
⚙️ Configuration → Data Sources → Loki → Trace → Derived fields
✅ 예시 설정
🔹 Name
- TraceID: 이 필드는 Grafana Explore 탭에서 표시될 이름입니다.
- 로그 라인에서 추출된 trace_id 옆에 TraceID로 보입니다.
🔹 Type
- Regex in log line: 로그 라인에서 정규표현식으로 값을 추출하겠다는 의미입니다.
🔹 Regex
- trace_id=(\\w+)
- 로그 메시지에서 trace_id=abc123... 와 같은 형태를 찾아 abc123만 추출합니다.
- \\w+는 알파벳+숫자+언더스코어 ([a-zA-Z0-9_]) 한 개 이상을 의미합니다.
예시 로그:
level=info msg="something" trace_id=abcd1234efgh5678
→ 위 로그에서 abcd1234efgh5678이 추출됩니다.
🔹 Query
- v1/traces/${__value.raw}
- 추출한 trace_id를 Tempo의 trace API 경로로 사용합니다.
- 이 URL은 내부적으로 Tempo datasource와 연결되어 사용됩니다.
- ${__value.raw}는 Regex에서 추출한 값입니다.
🔹 Internal link
- 활성화되어 있음 (tempo 선택됨):
- 이 옵션은 Grafana가 이 값을 Tempo datasource로 직접 연결해주는 것을 의미합니다.
- 클릭하면 Tempo에서 해당 trace를 바로 확인할 수 있는 UI로 이동합니다.
✅ 작동 방식 요약
- Loki 로그에서 trace_id=abc123... 형식을 찾음
- 정규식 trace_id=(\\w+)에 의해 abc123을 추출
- URL 템플릿 v1/traces/${__value.raw}로 변환 → v1/traces/abc123
- Grafana가 연결된 tempo 데이터소스를 사용해 Tempo UI에서 해당 trace 조회
✅ 잘 동작하는지 확인하려면?
- 로그에 trace_id=... 문자열이 포함되어 있어야 합니다.
- Explore → Loki에서 해당 로그를 조회해보세요.
- 로그 오른쪽에 🔗 TraceID 링크가 생성되어야 합니다.
- 클릭 시 Tempo trace 뷰로 이동해야 합니다.
✅ 참고 팁
- 로그가 JSON 형태일 경우:
- Regex를 "trace_id":"([^"]+)" 식으로 수정해야 할 수 있습니다.
반응형