Airflow Task 실패 알림 메일 폭탄 피하기
Airflow에서 Task별 실패 메일을 1건으로 묶어 알림 노이즈를 줄였다.
G플레이스데이터개발팀은 여러 서비스의 데이터를 HDFS에 적재하고, 쿼리와 BI까지 연결하는 Data Lakehouse를 운영한다. 이 과정에서 Airflow는 ETL, 정합성 검증, 백업, Hive External table 관리, Github 연동 자동화, 샘플 데이터 생성에까지 폭넓게 쓰였다.
문제는 동일한 원인으로 여러 Task가 동시에 실패할 때였다. Airflow의 기본 알림은 Task 단위로 발송되기 때문에, 병렬로 생성된 Task들이 같은 장애에 연쇄적으로 실패하면 관리자에게 수십 통의 메일이 한꺼번에 도착했고, 이 때문에 진짜 중요한 알림을 놓치기 쉬웠다.
해결 방식은 단순했다. DAG 안의 모든 Task는 실패해도 메일을 보내지 않도록 바꾸고, 실패 알림 전용 Task 하나만 두어 그 시점에 실패한 Task들을 모아서 메일 1건으로 보내는 구조로 재구성했다.
구현의 핵심은 다음과 같다.
default_args의email_on_failure를 그대로 True로 두되, DAG 내부의 모든 Task에 대해 프로그래밍적으로email_on_failure=False를 설정한다.- 마지막에 실행될 Alert Task만
email_on_failure=True로 두고,trigger_rule='all_done'으로 설정해 앞선 Task 결과와 무관하게 반드시 실행되게 만든다. dag.leaves로 마지막 Task들을 찾아 Alert Task를 downstream에 연결하되, Alert Task 자신이dag.leaves에 포함되어 자기 자신을 참조하는 문제는 별도 리스트로 피한다.
Alert Task는 dag_run.get_task_instances()로 Task Instance들을 가져와 FAILED 상태만 추린다. 각 실패 Task에 대해 task_id와 log_url을 메일에 넣고, conf의 logging section에서 base_log_folder와 log_filename_template를 읽어 실제 log file 경로를 만든 뒤 로그 내용을 추가한다.
로그가 너무 길어지는 문제는 HTML의 details 태그로 해결했다. 메일 본문에서 실패한 Task의 로그를 접었다 펼칠 수 있게 만들어, 메일 1건 안에서도 원인 파악이 가능하도록 구성했다.
최종적으로 remove_duplicate_alert(dag)에 DAG만 넘기면, 기존처럼 수많은 실패 메일을 받지 않고 DAG run당 1회의 통합 알림을 받을 수 있다. 같은 장애로 반복 발송되던 노이즈를 줄이면서도, 실패한 Task의 위치와 로그를 바로 확인할 수 있게 만든 방식이다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.
