[INFRA-04] Grafana 데이터소스 + 대시보드 4종 프로비저닝

작업 내용 (설계 의도)

근거 TDD: ../TDD.md “Observability”, ADR-005. FR-7·FR-8.

변경 사항

Grafana를 코드로 프로비저닝한다(수동 클릭 배제 → 재현성).

  • observability/grafana/provisioning/datasources/datasources.yml: Prometheus(http://prometheus:9090, exemplar → Tempo 연결)·Tempo(http://tempo:3200)·Loki(http://loki:3100). trace↔log 상호 연결(FR-11)
  • observability/grafana/provisioning/dashboards/provider.yml: 대시보드 자동 로드
  • 대시보드 JSON 4종(모두 env 템플릿 변수 — ADR-005):
    • mysql.json: CPU·Memory·Slow Query·Connection (mysqld_exporter 메트릭)
    • redis.json: CPU·Memory (redis_exporter)
    • kafka.json: CPU·Memory·Consumer Lag·Partition (kafka_exporter)
    • spring.json: CPU·Memory·GC·Heap·Tomcat threads·Async(mcp-audit) threads (Micrometer). service 템플릿 변수로 BE(sports-application)/web(sports-web)를 구분(senior-pm #5) — 기본 sports-application, Tempo 패널(trace)은 두 서비스 모두 조회 가능

파일 소유는 observability/grafana/ 하위 — compose(INFRA-02)·pipeline config(INFRA-03)와 교집합 0. 대시보드 쿼리는 Micrometer/exporter 표준 메트릭명(TDD 계약)을 사용해 앱·exporter 실기동 전 authoring 가능.

롤백: provisioning 디렉토리 revert.

의존

  • 없음 (wave 1 — 표준 메트릭명 계약 기반, 검증은 통합 시)

다이어그램

처리 흐름

sequenceDiagram
    participant G as Grafana
    participant P as Prometheus
    participant T as Tempo
    G->>G: datasource·dashboard 프로비저닝 로드
    G->>P: PromQL (env 변수 필터)
    G->>T: exemplar trace_id 점프
    G-->>G: 4종 패널 렌더

클래스 의존

flowchart LR
    PROV["grafana/provisioning"] --> DS["datasources.yml"]
    PROV --> MYSQL["mysql.json"]
    PROV --> REDIS["redis.json"]
    PROV --> KAFKA["kafka.json"]
    PROV --> SPRING["spring.json"]

테스트 케이스

  • Grafana 기동 시 Prometheus·Tempo·Loki 데이터소스가 자동 등록된다.
  • 대시보드 4종(MySQL/Redis/Kafka/Spring)이 자동 로드돼 목록에 나타난다.
  • Spring 대시보드가 jvm_memory_used_bytes·tomcat_threads_busy·executor_active_threads 패널을 렌더한다.
  • Kafka 대시보드가 consumer lag 패널을 렌더한다.
  • env 템플릿 변수로 local/dev/prod 필터가 동작한다(값이 있을 때).
  • service 템플릿 변수로 sports-application(BE)/sports-web(web) trace가 구분 조회된다(senior-pm #5).
  • 데이터소스 JSON에 exemplar → Tempo 링크가 설정돼 있다(FR-11).