환경별 모니터링 대시보드 분기처리
문제 상황#
Dev(kubeadm)와 Staging(EKS) 환경의 인프라 구성이 달라서 모니터링 대시보드가 작동하지 않는 문제 발생.
환경별 인프라 차이#
| 구성요소 | Dev (kubeadm) | Staging (EKS) |
|---|---|---|
| PostgreSQL | 로컬 Pod (postgres:16-alpine) | AWS RDS |
| Redis | 로컬 Pod (redis:7-alpine) | AWS ElastiCache |
| 메트릭 수집 | Prometheus exporter | CloudWatch |
| 데이터소스 | Prometheus | CloudWatch |
증상#
- Dev 환경에서 “RDS PostgreSQL 모니터링” 대시보드 → No data
- Dev 환경에서 “ElastiCache Redis 모니터링” 대시보드 → No data
- 원인: CloudWatch 데이터소스가 없음 (AWS 환경이 아님)
해결#
1. 환경별 대시보드 분리#
동일한 기능의 대시보드를 두 가지 버전으로 생성:
| 대시보드 | 데이터소스 | 환경 |
|---|---|---|
database-rds-postgresql.json | CloudWatch | Staging |
database-postgresql-local.json | Prometheus | Dev |
cache-elasticache-redis.json | CloudWatch | Staging |
cache-redis-local.json | Prometheus | Dev |
2. 환경별 exclude 설정#
Helm values에서 환경에 맞지 않는 대시보드를 제외:
Dev 환경 (dev/values/monitoring/values-prometheus-stack.yaml):
dashboards:
devTeam:
exclude:
# CloudWatch 기반 대시보드 제외 (Dev는 로컬 exporter 사용)
- "database-rds-postgresql.json"
- "cache-elasticache-redis.json"
Staging 환경 (staging/values/values-prometheus-stack.yaml):
dashboards:
devTeam:
exclude:
# 로컬 exporter 대시보드 제외 (EKS는 CloudWatch 사용)
- "database-postgresql-local.json"
- "cache-redis-local.json"
3. ConfigMap 템플릿 수정#
대시보드 ConfigMap 생성 시 exclude 목록을 체크하도록 수정:
{{- $dashboardFiles := .Files.Glob "files/grafana-dashboards/dev-team-observability/*.json" -}}
{{- $excludeList := .Values.dashboards.devTeam.exclude | default list -}}
{{- if gt (len $dashboardFiles) 0 }}
...
{{- range $path, $_ := $dashboardFiles }}
{{- $filename := base $path -}}
{{- if not (has $filename $excludeList) }}
{{ $filename }}: |-
{{ $.Files.Get $path | nindent 4 }}
{{- end }}
{{- end }}
{{- end }}
메트릭 비교#
PostgreSQL#
| 메트릭 | Dev (postgres_exporter) | Staging (CloudWatch) |
|---|---|---|
| CPU | process_cpu_seconds_total | CPUUtilization |
| 연결 수 | pg_stat_activity_count | DatabaseConnections |
| 캐시 히트 | pg_stat_database_blks_hit | N/A (RDS 자체 관리) |
| DB 크기 | pg_database_size_bytes | FreeStorageSpace (역산) |
Redis#
| 메트릭 | Dev (redis_exporter) | Staging (CloudWatch) |
|---|---|---|
| CPU | redis_cpu_sys_seconds_total | CPUUtilization, EngineCPUUtilization |
| 메모리 | redis_memory_used_bytes | BytesUsedForCache |
| 연결 수 | redis_connected_clients | CurrConnections |
| 캐시 히트 | redis_keyspace_hits_total | CacheHits |
파일 변경 내역#
추가된 파일#
common-charts/.../dev-team-observability/database-postgresql-local.jsoncommon-charts/.../dev-team-observability/cache-redis-local.json
수정된 파일#
common-charts/.../templates/grafana-dashboards-dev-team-observability-configmap.yaml- exclude 로직 추가
common-charts/.../values.yamldashboards.devTeam.exclude기본값 추가
dev/values/monitoring/values-prometheus-stack.yaml- CloudWatch 대시보드 exclude
staging/values/values-prometheus-stack.yaml- 로컬 exporter 대시보드 exclude
관련 이슈: Prometheus PodMonitor 라벨 문제#
증상#
Staging에서 istio_requests_total 메트릭이 Prometheus에 수집되지 않음.
원인#
Prometheus가 release: kube-prometheus-stack 라벨이 있는 PodMonitor/ServiceMonitor만 선택하도록 설정되어 있었으나, Istio PodMonitor는 release: prometheus로 설정됨.
해결#
모든 모니터의 라벨을 release: kube-prometheus-stack으로 통일:
# 수정 전
labels:
release: prometheus
# 수정 후
labels:
release: kube-prometheus-stack
수정된 파일:
common-charts/infra/istio/istiod/templates/podmonitor-envoy.yamlcommon-charts/infra/istio/istiod/templates/servicemonitor.yamlcommon-charts/infra/argocd/templates/servicemonitor.yaml
Dev vs Staging Prometheus 설정 차이#
| 설정 | Dev | Staging |
|---|---|---|
serviceMonitorSelectorNilUsesHelmValues | false (모든 모니터 수집) | 기본값 (라벨 필터링) |
podMonitorSelectorNilUsesHelmValues | false (모든 모니터 수집) | 기본값 (라벨 필터링) |
Dev는 모든 모니터를 수집하므로 라벨이 달라도 문제없음. Staging은 특정 라벨만 선택하므로 라벨 일치 필요.
검증 방법#
# 1. Prometheus targets 확인
kubectl exec -n monitoring sts/prometheus-prom -c prometheus -- \
wget -qO- 'http://localhost:9090/api/v1/targets' | grep envoy
# 2. Istio 메트릭 쿼리
kubectl exec -n monitoring sts/prometheus-prom -c prometheus -- \
wget -qO- 'http://localhost:9090/api/v1/query?query=istio_requests_total'
# 3. 대시보드 ConfigMap 확인
kubectl get configmap grafana-dashboards-dev-team-observability -n monitoring -o yaml | grep -E "^\s+\w+\.json"
참고#
- Prometheus postgres_exporter:
prometheuscommunity/postgres-exporter:v0.15.0 - Prometheus redis_exporter:
oliver006/redis_exporter:v1.66.0 - CloudWatch 메트릭 네임스페이스:
- RDS:
AWS/RDS - ElastiCache:
AWS/ElastiCache
- RDS: