앞서 모니터링 서버에 Grafana와 Prometheus를 설치하였으니, Airflow에서 해당 모니터링 서버로 데이터를 전송하도록 해야합니다!!
해당 목표를 위해 도전하였던 방법에 대해서 기술하도록 하겠습니다!
먼저 처음 알아보았던 방법은 Airflow 서버에서 Prometheus Exporter를 통해 Monitoring 서버로 Airflow의 다양한 메트릭 데이터를 보내는 방법이었습니다!
Prometheus Exporter를 통한 Metrics 데이터 전송
1) Airflow 서버에 Prometheus Exporter 설치
airflow-main, airflow-worker 서버에 Prometheus Exporter 설치
# 이미 설치되어 있는지 확인
pip list | grep prometheus-airflow-exporter
# 설치
pip install airflow-prometheus-exporter --break-system-packages
# airflow-prometheus-exporter 플러그인이 flask_admin 모듈을 필요로 함
pip install flask-admin --break-system-packages
# metric 활성화 안되서 업그레이드
pip install airflow-prometheus-exporter --upgrade --break-system-packages
- Airflow 서버(Web Server 및 Worker)에 Exporter를 설치
⇒ 이 플러그인을 설치해야 Airflow 웹 서버가 Prometheus가 이해할 수 있는 /metrics 엔드포인트를 생성
*Airflow는 /metrics를 기본적으로 생성하며, Prometheus는 이 경로를 통해 데이터를 수집
2) Airflow 웹 서버에서 Metrics 활성화
리버스 프록시 없이 Airflow를 직접 사용하고 있기 때문에 추가적인 Airflow 설정 파일 변경은 필요 없음
→ airflow-prometheus-exporter 플러그인 플러그인 설치 후 Airflow 웹 서버를 재시작만 하면 /metrics 엔드포인트가 활성화
# Airflow 웹 서버 재시작
airflow webserver -D
해당 방법을 통해 Airflow Main 서버에서 Metrics 엔드포인트에 접속을 확인하였으나, 404 에러가 발생하며 접속을 할 수 없었습니다!!
이슈 상세
airflow-prometheus-exporter 플러그인이 Airflow에 성공적으로 로드되어있지만, metrics 엔드포인트 접속 불가능
→ metric 활성화가 안된 상태
ubuntu@ip---:~$ curl <http://ip:port/metrics>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Airflow 404</title>
<link rel="icon" type="image/png" href="/static/pin_32.png">
</head>
<body>
<div style="font-family: verdana; text-align: center; margin-top: 200px;">
<img src="/static/pin_100.png" width="50px" alt="pin-logo" />
<h1>Airflow 404</h1>
<p>Page cannot be found.</p>
<a href="/">Return to the main page</a>
<p></p>
</div>
</body>
</html>
해당 오류 해결을 위해 Airflow의 기본 StatsD 지원 기능을 활용하기로 결정하고 적용하였습니다!
StatsD Exporter 사용
1. 문제 배경
- Airflow에서 Prometheus Exporter를 사용해 메트릭을 직접 Prometheus로 전송하려 했지만, 정상적으로 작동하지 않음.
- Airflow의 기본 StatsD 지원 기능을 활용하기로 결정.
2. 해결 방법 개요
- Airflow가 StatsD를 통해 메트릭을 전송하도록 설정.
- StatsD Exporter를 사용해 StatsD 메트릭을 Prometheus 형식으로 변환.
- Prometheus가 StatsD Exporter에서 변환된 메트릭을 스크래핑하도록 설정.
3. 구현 과정
1. StatsD Exporter 설치 및 설정
StatsD Exporter를 설치하고 실행:
wget https://github.com/prometheus/statsd_exporter/releases/download/v0.22.1/statsd_exporter-0.22.1.linux-amd64.tar.gz
tar -xvzf statsd_exporter-0.22.1.linux-amd64.tar.gz
cd statsd_exporter-0.22.1.linux-amd64
./statsd_exporter --statsd.listen-udp 0.0.0.0:8125 --web.listen-address 0.0.0.0:9102 --log.level debug
- 8125: StatsD 데이터를 수신하는 UDP 포트.
- 9102: Prometheus가 스크래핑할 HTTP 포트.
- 해당 두 포트에 대해서 각각 UDP, TCP 포트를 인바운드 규칙에 추가해야 합니다!!
2. Airflow 설정 변경
Airflow에서 StatsD를 통해 메트릭을 전송하도록 설정:
# airflow.cfg 파일 수정
statsd_on = True
statsd_host = # StatsD Exporter 서버 IP
statsd_port = 8125 # StatsD Exporter의 UDP 포트
statsd_prefix = airflow_scheduler_webserver # 메트릭 네임스페이스
statsd_disabled_tags = job_id,run_id # 불필요한 태그 필터링
statsd_datadog_metrics_tags = True # 태그 지원 활성화
설정 후 Airflow 서비스를 재시작:
sudo systemctl restart airflow-scheduler
sudo systemctl restart airflow-webserver
3. Prometheus 설정 변경
Prometheus에서 StatsD Exporter를 스크래핑하도록 설정:
# prometheus.yml 파일 수정
scrape_configs:
- job_name: "airflow-metrics" # 원하는 job name으로 설정
scrape_interval: 5s # 설정하지않으면 job이 down 상태!
static_configs:
- targets: ["13.209.214.205:9102"] # StatsD Exporter의 HTTP 엔드포인트
설정 후 Prometheus 서비스를 재시작:
sudo systemctl restart prometheus
기존 Prometheus Exporter를 사용하려는 방법보다, Statsd Exporter를 모니터 서버에 구축하여 설정을 변경해주는 것이 보다 편하고 간편하게 Metrics 데이터를 전송할 수 있었습니다!
Prometheus Exporter가 되지 않는 정확한 이유는 파악하지 못했지만, 예상으로는 2.x의 Airflow 중에도 구버전을 지원했던 기술이기에 현재 프로젝트에서 사용 중인 최신 Airflow 2.9x, 2.10x와 호환이 되지 않는 것 같다는 예상을 하고 있습니다!
'TroubleShooting' 카테고리의 다른 글
[TroubleShooting] Airflow EC2 Monitoring 서버 구축기 - 1 (0) | 2024.12.27 |
---|