Prometheus와 Grafana로 API 성능 지표 대시보드 만들기

실시간 API 모니터링을 위해 Prometheus로 메트릭을 수집하고 Grafana로 시각화하는 성능 대시보드 구축

모니터링 대시보드의 필요성

  • 장애 조기 감지: 에러율, 응답 시간 등 이상 징후를 빠르게 포착하여 심각한 장애로 번지기 전에 조치

  • 성능 병목 분석: 어떤 API가 느린지, DB 쿼리가 얼마나 실행되는지 등 데이터 기반 최적화 포인트 파악

  • 용량 계획: 트래픽 추이, CPU/메모리 사용량 분석으로 향후 필요한 인프라 자원 예측

Prometheus와 Grafana 개요

Prometheus

  • Pull 방식으로 /metrics 엔드포인트에서 데이터 수집

  • 시계열 데이터 저장에 특화

  • PromQL 쿼리 언어 제공

  • Alertmanager를 통한 알림 기능

Grafana

  • 다양한 데이터 소스 지원

  • 유연한 시각화 패널

  • 동적 대시보드 구성

  • 커뮤니티 템플릿 활용 가능

Django DRF에 django-prometheus 적용

1. 라이브러리 설치

pip install django-prometheus

2. settings.py 설정

INSTALLED_APPS = [
    'django_prometheus',
]

MIDDLEWARE = [
    'django_prometheus.middleware.PrometheusBeforeMiddleware',
    # ... other middlewares
    'django_prometheus.middleware.PrometheusAfterMiddleware',
]

3. urls.py 설정

urlpatterns = [
    path('', include('django_prometheus.urls')),
]

Prometheus 서버 설정

prometheus.yml 파일 작성

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'django-app'
    static_configs:
      - targets: ['host.docker.internal:8000']

Docker 실행

docker run -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

Grafana 대시보드 구성

Docker 실행

docker run -d -p 3000:3000 grafana/grafana

데이터 소스 연결

  • Prometheus를 데이터 소스로 추가

  • URL: http://host.docker.internal:9090

주요 PromQL 쿼리

  • API 요청률: sum(rate(django_http_requests_total_by_method_view_transport_status[5m])) by (view)

  • API 에러율: (sum(rate(django_http_requests_total_by_method_view_transport_status{status=~"5.."}[5m])) / sum(rate(django_http_requests_total_by_method_view_transport_status[5m]))) * 100

  • 응답 시간: histogram_quantile(0.95, sum(rate(django_http_requests_latency_seconds_bucket[5m])) by (le, view))

주의사항

  • 메트릭 카디널리티: 고유한 값을 갖는 label 남용으로 인한 Prometheus 서버 부하 방지

  • 보안: /metrics 엔드포인트는 특정 IP에서만 접근 가능하도록 제한

  • 알림 설정: 임계치 초과 시 자동 알림 체계 구축 필수

Last updated