JustDoEat
prometheus, telegraf 설정 본문
프로메테우스와 telegraf로 메트릭을 수집하고 프로메테우스에 연동이 다 되었는지 확인을 해보려고 합니다.
primetheus란?
프로메테우스는 오픈 소스 시스템 모니터링 도구로, 서버, 애플리케이션, 시스템 등에서 성능과 상태에 관한 데이터를 수집하고 분석합니다. 이 데이터는 다차원 데이터 모델을 기반으로 하며, 강력한 쿼리 언어를 사용하여 정보를 추출할 수 있습니다. 프로메테우스는 주기적으로 타겟 시스템에서 지표를 수집하고, 필요에 따라 알림을 생성하여 문제를 신속하게 감지하고 대응할 수 있도록 도와줍니다
설정
docker-compose.yml
prometheus:
container_name: prometheus # Prometheus 컨테이너의 이름
image: prom/prometheus # 사용할 Prometheus 도커 이미지
restart: 'always' # 컨테이너가 종료되면 항상 재시작
volumes:
- ./prometheus:/etc/prometheus # 호스트의 ./prometheus 디렉토리를 컨테이너의 /etc/prometheus 디렉토리로 마운트
- ./prometheus/prometheus.yml:/prometheus/prometheus.yml:ro # 호스트의 Prometheus 설정 파일을 컨테이너 내의 해당 경로로 마운트 (읽기 전용)
ports:
- 9090:9090 # 호스트의 9090 포트를 컨테이너의 9090 포트로 포워딩
command:
- '--web.enable-lifecycle' # Prometheus 웹 인터페이스의 생애주기 지원 활성화
- '--config.file=/etc/prometheus/prometheus.yml' # Prometheus 설정 파일의 경로 지정
networks:
- haru # "haru"라는 이름의 도커 네트워크에 연결
config.settings.py
MIDDLEWARE = [
#기존 코드 생략
'django_prometheus.middleware.PrometheusBeforeMiddleware',
'django_prometheus.middleware.PrometheusAfterMiddleware',
]
'django_prometheus.middleware.PrometheusBeforeMiddleware'
이 미들웨어는 https요청이 오면 어떤 요청이 왔는지에 대한 정보를 메트릭으로 기록해주는 친구
'django_prometheus.middleware.PrometheusAfterMiddleware',
이 미들웨어는 https응답에 대한 메트릭을 수집하는 친구
미들웨어란?
쉽게 이야기 하면, 클라이언트가 api요청을 보내면 바로 api로 요청이 가는것이 아니라, middleware라는 곳을 들려 미들웨어의 코드를 "순차적"으로 실행을 한 후 통과가 되면 api로 요청이 전달이 된다.
config.urls.py
urlpatterns = [
#기존 경로
path('', include("django_prometheus.urls")),
]
promethus.yml
global:
scrape_interval: 15s # 모든 타겟을 15초 간격으로 스크래이핑합니다. 기본값은 1분입니다.
evaluation_interval: 15s # 전역 'evaluation_interval'에 따라 규칙을 15초마다 평가합니다. 기본값은 1분입니다.
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
# 규칙을 한 번 로드하고 전역 'evaluation_interval'에 따라 주기적으로 평가합니다.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
- job_name: "django"
metrics_path: /metrics
static_configs:
- targets:
- host.docker.internal:8000
# "django" job에 대한 설정입니다.
# /metrics 경로에서 메트릭을 수집하고, host.docker.internal:8000에서 데이터를 수집합니다.
# - job_name: "nginx-prometheus-exporter"
# metrics_path: /metrics
# static_configs:
# - targets: ['nginx-prometheus-exporter:9113']
# "nginx-prometheus-exporter" job에 대한 설정입니다. 주석 처리되어 있어 비활성화되어 있습니다.
- job_name: 'telegraf'
static_configs:
- targets: ['telegraf:9273']
# "telegraf" job에 대한 설정입니다.
# telegraf:9273에서 데이터를 수집합니다.
scrape_configs:
- job_name: "django"
metrics_path: /metrics
static_configs:
- targets:
- host.docker.internal:8000
쉽게 설명하자면.
host.docker.internal:8000 이라는 도커 내부에 컨테이너에 8000번 포트로 입장 후 /metric이라는 엔드 포인트에서 메트릭을 가지고 오라는 말.
scrape_config(스크레이프는 데이터를 추출하거나 수집하는 행위를 말함.)
static_config(static은 정적이라는 뜻처럼, 변하지않는 고정값을 설정한다는 의미)
메트릭이란?
소프트웨어의 상태나 지표를 나타내주는 지표
http_requests_total과 같이 HTTP 요청의 총 횟수를 나타내는 메트릭 그리고
http_requests_total{method="GET", status="200"}과 같이 특정 HTTP 메서드와 상태 코드에 대한 메트릭을 식별하는 레이블이 있다.
- job_name: 'telegraf'
static_configs:
- targets: ['telegraf:9273']
이 부분은 아래 telegraf를 설명하면서 추가로 이어가도록 하겠다.
telegraf란
경량 데이터 수집기로서, ELK에서 다룬 filebeat, logstash랑 비슷한 역할을 한다, 즉 데이터를 수집 후 elasticsearch, prometheus같은 DB에 출력값으로써 데이터를 넘겨준다. 나느 데이터를 prometheus로 넘겨줄것이다.
현제 telegraf를 사용하는 이유는
cpu사용량, 메모리사용량, 네트워크 트레픽, 시스템 부하를 확인하기 위해 사용했다.
설정
prometheus.yml
- job_name: 'telegraf'
static_configs:
- targets: ['telegraf:9273']
# "telegraf" job에 대한 설정입니다.
# telegraf:9273에서 데이터를 수집합니다.
사용하기 앞서 prometheus.yml 파일에 위 처럼 적어준다.
telegraf:9273 이라는 타겟으로 가서 메트릭을 수집하라는 뜻이다.
docker-compose.yml
#생략
telegraf:
image: telegraf:latest
container_name: telegraf
volumes:
- ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
networks:
- haru
depends_on:
- prometheus
restart: always
command: [ "telegraf", "--config", "/etc/telegraf/telegraf.conf" ]
#생략
프로메테우스에 연동이 되었는지 확인하기.
프로메테우스 컨테이너의 주소를 눌러주고 http://localhost:9090/ 로 접속
status -> target을 눌러주면 위와 같은 화면이 뜨는데, 지금까지 설정했던 target들이 잘 나오는걸 볼 수 있다.
state가 초록색으로 되어있으면 성공적으로 연동이 되어있다.
보통 여기서 grafana까지 실행을 시켜서 데쉬보드에 이쁘게 나오게 하는게 일반적인 방법이다.
다음글에 이어서 진행하도록 하겠다.