[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)·metrics prometheusremotewrite(prometheus:9090). batch·attributes 프로세서로 deployment.environment resource 보정. 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 잡에 env relabel 부여(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가 유효하다(⑦ 다중 인스턴스 확장성 검증).