Dev./Prometheus & Grafana

Prometheus: Django 와 연결해보기

Ivan'show 2023. 10. 16.
728x90
반응형

Prometheus

<https://prometheus.io/>

도커로 열어보기

 

 

Django-prometheus

<https://github.com/korfuri/django-prometheus>

프로메테우스가 장고를 모니터링하게 만들기 위해서는 몇가지 설정을 변경해주어야 한다.

장고 프로메테우스 설치

pip install django-prometheus

파이썬 settings.py 에 설치내용과 미들웨어 추가

INSTALLED_APPS = [
   ...
   'django_prometheus',
   ...
]

MIDDLEWARE = [
    'django_prometheus.middleware.PrometheusBeforeMiddleware',
    # All your other middlewares go here, including the default
    # middlewares like SessionMiddleware, CommonMiddleware,
    # CsrfViewmiddleware, SecurityMiddleware, etc.
    'django_prometheus.middleware.PrometheusAfterMiddleware',
]

DATABASES = {
    'default': {
        'ENGINE': 'django_prometheus.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
}

프로메테우스의 미들웨어로 다른 미들웨어를 감싸야 한다. 데이터베이스는 장고엔진이 아닌 장고-프로메테우스 엔진으로 변경해서 db 정보도 모니터링 할 수 있게 한다. 데이터베이스는 적용되는 데이터베이스 종류가 있으니 확인하고 적용해야한다.

그리고 project/urls.py 에서 장고-프로메테우스 라이브러리에서 제공하는 urls 소스를 사용하게 끔 설정한다.

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

docker-compose 를 사용할 예정이니, requirements.txt 에 새로 설치한 내용을 넣어주고

django-prometheus==2.3.1

docker-compose.yml 파일에도 내용을 추가해 준다.

...
...
prome:
    container_name: lion-prome
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./monitoring:/etc/prometheus
      - prometheus-data:/prometheus

volumes:
  staticfiles:
  postgres_data:
  prometheus-data:

docker-compose 파일에 볼륨을 보면 알겠지만, prometheus.yml 파일을 매핑해주는데 이부분이 설정파일이다.

오픈 소스의 내용을 보면,

# examples/prometheus/prometheus.yml
global:
  scrape_interval: 10s
  evaluation_interval: 10s

  external_labels:
    monitor: django-monitor

rule_files:
- "django.rules"

scrape_configs:
- job_name: "django"
  static_configs:
  - targets: ["localhost:8000"]

rules_file 과 scrape_configs 에 설정값들이 있다. 이 내용들을 가져와서 내 모니터링 기능으로 적용시켜야 한다.

 

프로젝트 최상위 경로에 모니터링을 새롭게 구성했고, 그 안쪽에 example 에 명시되어 있는 파일들을 가져와 수정했다.

django.rules 는 그대로 두었고, prometheus.yml 에서 한가지를 변경했는데,

global:
  scrape_interval: 10s
  evaluation_interval: 10s

  external_labels:
    monitor: django-monitor

rule_files:
- "django.rules"

scrape_configs:
- job_name: "django"
  static_configs:
  - targets: ["lion-app:8000"]

docker-compose 파일에서는 서비스 이름으로 참조가 가능하기 때문에 이렇게 해서 내 앱을 모니터링 하게 끔 설정했다.

docker-compose up --build -d
#
⠿ Network dev_django_app_default           Created                                                                          0.0s
 ⠿ Volume "dev_django_app_prometheus-data"  Created                                                                          0.0s
 ⠿ Container lion-prome                     Started                                                                          0.7s
 ⠿ Container postgres-db                    Started                                                                          0.7s
 ⠿ Container lion-app-dc                    Started                                                                          1.0s
 ⠿ Container lion-nginx-dc                  Started                                                                          1.2s
(venv) kimminhyeok@Ivans-Mac dev_django_app %

prometheus 접속 후 잘 연결이 되었는지 확인

<http://localhost:9090/>
# status >> Configuration
global:
  scrape_interval: 10s
  scrape_timeout: 10s
  evaluation_interval: 10s
  external_labels:
    monitor: django-monitor
rule_files:
- /etc/prometheus/django.rules
scrape_configs:
- job_name: django
  honor_timestamps: true
  scrape_interval: 10s
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  follow_redirects: true
  enable_http2: true
  static_configs:
  - targets:
    - lion-app:8000
# status >> Rules

# status >> Targets

만약 타겟에서 계속 400 에러가 나고 있다면 allowed host 부분을 확인하고 와일드카드를 심어주자. 프로메테우스에서 로컬로 URL 이 설정되어 있는 것 처럼 보이나 이는 컨테이너에서 띄운 로컬 호스트이기 때문에 실제 장고 컨테이너에서는 호스트정보가 로컬 호스트는 아니기 때문이다.

728x90
반응형

댓글