[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).