[INFRA-03] 파이프라인 config — Collector·Prometheus·Loki·Tempo
작업 내용 (설계 의도)
근거 TDD: ../TDD.md “인터페이스·엔드포인트 계약”, ADR-002·003·005. FR-3·FR-4·FR-8.
변경 사항
관측 파이프라인 config 파일 4종을 생성한다. 컨테이너 정의(INFRA-02)와 파일이 분리돼 있어 병렬 authoring이 가능하다(TDD 계약이 호스트명·포트를 고정).
observability/otel-collector-config.yaml: OTLP receiver(4317/4318) → traces exporter(tempo:4317)·logs exporter(loki:3100)·metricsprometheusremotewrite(prometheus:9090). batch·attributes 프로세서로deployment.environmentresource 보정.service.name(BE=sports-application, web=sports-web)을 resource로 보존해 Tempo/Loki에서 두 서비스가 라벨로 구분되게 한다(senior-pm #5). service.name 미주입 trace는 drop하지 않고unknown_service로 통과(관측 유실 방지)observability/prometheus/prometheus.yml: scrape 잡 6종 —app(backend:8080/actuator/prometheus— ⑧이 backend를 컨테이너로 실행하므로 컨테이너명 사용, 비컨테이너 로컬은host.docker.internal:8080주석 대안)·mysqld-exporter:9104·redis-exporter:9121·kafka-exporter:9308·otel-collector:8888·self. exporter 잡에envrelabel 부여(ADR-005). remote_write 수신 활성(Collector remote_write·web FE 메트릭 대비). app 잡은 다중 타깃 확장 가능한 구조(⑦ 대비)observability/loki/loki-config.yaml: 단일 바이너리 로컬 구성observability/tempo/tempo-config.yaml: OTLP 수신 + 로컬 스토리지
파일 소유는 observability/ 하위 config 파일들 — compose(INFRA-02)·grafana(INFRA-04)와 교집합 0.
롤백: config 파일 revert 후 컨테이너 재시작.
의존
- 없음 (wave 1 — 계약 기반 병렬 authoring, 검증은 INFRA-02 컨테이너와 통합 시)
다이어그램
처리 흐름
sequenceDiagram participant A as App participant C as Collector (config) participant P as Prometheus (config) participant T as Tempo participant L as Loki A->>C: OTLP trace/log C->>T: traces exporter C->>L: logs exporter P->>A: scrape /actuator/prometheus P->>P: exporter 잡 scrape (env relabel)
클래스 의존
flowchart LR COLCFG["otel-collector-config.yaml"] --> TEMPO["tempo:4317"] COLCFG --> LOKI["loki:3100"] PROMCFG["prometheus.yml"] --> APP["app scrape"] PROMCFG --> EXP["exporter 잡 (env relabel)"]
테스트 케이스
promtool check config prometheus.yml이 통과한다.otelcol validate --config otel-collector-config.yaml이 통과한다(또는 컨테이너 부팅 무오류).- Prometheus가
app잡에서/actuator/prometheus를 scrape해up{job="app"}==1이 된다. - exporter 메트릭에
env라벨이 relabel로 부여된다. - Collector가 OTLP trace를 수신해 Tempo로 전달하고, Tempo에서 trace 조회가 가능하다.
service.name=sports-application(BE)과service.name=sports-web(web) trace가 Tempo에서 각각의 라벨로 구분 조회된다(senior-pm #5).- app 잡 타깃을 2개로 늘려도 config가 유효하다(⑦ 다중 인스턴스 확장성 검증).