[INFRA-01] docker-compose.observability-agents.yml — exporter 3종 + Kafka UI

작업 내용 (설계 의도)

근거 TDD: ../TDD.md “시스템 역할 경계”·“Possible Solutions C3”, ADR-004(개정). FR-4·FR-6.

senior-pm #4 반영: 데이터스토어(MySQL/MongoDB/Redis/Kafka)는 ⑧ base compose가 단독 소유한다. 이 티켓은 데이터스토어를 정의하지 않고, ⑧이 띄운 서비스에 붙는 관측 에이전트(exporter + Kafka UI)만 소유한다. (구 docker-compose.infra.yml 데이터스토어 정의 폐기 — mongo 컨테이너 이중화·서비스명 불일치 방지.)

변경 사항

관측 에이전트를 담는 신규 docker-compose.observability-agents.yml을 루트에 생성한다.

  • mysqld-exporter(9104) → ⑧ mysql 접속
  • redis-exporter(9121) → ⑧ redis 접속
  • kafka-exporter(9308) → ⑧ kafka 접속
  • kafka-ui(8089) → ⑧ kafka 브로커·컨슈머그룹 sports-app 조회 (FR-6)
  • 공유 네트워크로 ⑧ 데이터스토어에 접속 (external network 또는 병합 시 동일 네트워크)
  • MongoDB exporter는 제외(PRD Non-Goals — MongoDB 메트릭 범위 외)

계약 준수: TDD “인터페이스·엔드포인트 계약”의 서비스명(mysqld-exporter/redis-exporter/kafka-exporter/kafka-ui)·포트·대상 데이터스토어명(⑧ mysql/redis/kafka)을 그대로 사용. prometheus(INFRA-03)가 이 exporter 호스트명을 scrape한다. 파일 소유는 docker-compose.observability-agents.yml 단독 — INFRA-02(관측 백엔드)와 disjoint.

런타임 선행: ⑧ base compose(데이터스토어) 기동이 선행 조건. ⑧ 미완 시 로컬은 기존 localhost 데이터스토어를 대상으로 지정 가능(오버라이드).

롤백: docker compose -f docker-compose.observability-agents.yml down — 데이터스토어·앱 무영향(scrape 대상만 사라짐).

의존

  • 없음 (wave 1, 독립 파일) — 런타임상 ⑧ base compose 필요(문서 명시)

다이어그램

처리 흐름

sequenceDiagram
    participant P as Prometheus
    participant E as exporter 3종
    participant DS as ⑧ 데이터스토어
    E->>DS: 상태 조회 (mysql/redis/kafka)
    P->>E: /metrics scrape
    E-->>P: 인프라 메트릭

클래스 의존

flowchart LR
    AGENTS["observability-agents.yml"] --> MYE["mysqld-exporter:9104"]
    AGENTS --> RE["redis-exporter:9121"]
    AGENTS --> KE["kafka-exporter:9308"]
    AGENTS --> UI["kafka-ui:8089"]
    MYE --> DS8["⑧ mysql/redis/kafka"]

테스트 케이스

  • docker compose -f docker-compose.observability-agents.yml config가 유효하게 파싱된다.
  • ⑧ 데이터스토어 기동 상태에서 exporter 3종이 각 /metrics(9104/9121/9308)에서 200을 반환한다.
  • Kafka UI(:8089)가 ⑧ kafka 브로커·컨슈머그룹 sports-app을 조회한다.
  • 데이터스토어 서비스명이 mongodb(⑧ 규약)로 참조되고, 이 파일에 데이터스토어 정의가 존재하지 않는다(중복 정의 0 검증).
  • MongoDB exporter가 정의되지 않는다(Non-Goals 준수 검증).