1
- from airflow import DAG
2
- from airflow .decorators import task
3
- from dotenv import load_dotenv
4
- import os
5
- from airflow .operators .bash import BashOperator
6
- from airflow .exceptions import AirflowSkipException
7
- from airflow .operators .python import get_current_context
8
- from datetime import datetime , timedelta
9
- import json , requests
10
-
11
-
12
- # 함수 정의: HTTP POST 요청
13
- def send_post_request ():
14
- load_dotenv ()
15
- url = os .getenv ("OASIS_SERVICE_URL" )
16
-
17
- response = requests .post (url )
18
-
19
- # 응답 코드와 내용을 로그로 남김
20
- if response .status_code == 200 :
21
- print (f"Success: { response .json ()} " )
22
- elif "500 Internal Server Error" in response .text :
23
- context = get_current_context ()
24
- print (
25
- f"Failed: { response .status_code } , NO PRODUCT EXISTS, detail shows below\n { response .text } "
26
- )
27
- raise AirflowSkipException (f"Skip task { context ['ti' ].task_id } " )
28
- else :
29
- print (f"Failed: { response .status_code } , { response .text } " )
30
- response .raise_for_status ()
31
-
1
+ from modules import collect_task_results , send_post_request
2
+ from packages import *
32
3
33
4
# DAG의 기본 설정
34
5
default_args = {
35
- "owner" : "khuda" , # DAG 소유자
36
- "depends_on_past" : False , # 이전 DAG 실패 여부에 의존하지 않음
37
- # 'email': ['[email protected] '], # 수신자 이메일
38
- # "email_on_success": True, # 성공 시 이메일 전송
39
- # 'email_on_failure': True, # 실패 시 이메일 전송
40
- # 'email_on_retry': True, # 재시도 시 이메일 전송
41
- "retries" : 1 , # 실패 시 재시도 횟수
42
- "retry_delay" : timedelta (minutes = 5 ), # 재시도 간격
6
+ "owner" : "khuda" ,
7
+ "depends_on_past" : False ,
8
+ "retries" : 1 ,
9
+ "retry_delay" : timedelta (minutes = 5 ),
43
10
}
44
11
45
12
# DAG 정의
@@ -64,8 +31,26 @@ def generate_queue_values():
64
31
# BashOperator에서 expand로 받은 값을 사용
65
32
run_consumer_task = BashOperator .partial (
66
33
task_id = "run-consumer-task" ,
67
- bash_command = "python3 /home/patturning1 /Oasis_consumer.py {{ params.consumer }}" , # 템플릿을 사용하여 매핑된 값 사용
34
+ bash_command = "python3 /home/patturning2 /Oasis_consumer.py {{ params.consumer }}" , # 템플릿을 사용하여 매핑된 값 사용
68
35
).expand (params = generate_queue_values ())
69
36
70
- send_post_request_OASIS_task ()
71
- run_consumer_task
37
+ # 모든 태스크가 완료된 후 상태를 수집
38
+ collect_task_results_task = PythonOperator (
39
+ task_id = "collect_task_results" ,
40
+ python_callable = collect_task_results ,
41
+ provide_context = True ,
42
+ trigger_rule = "all_done" ,
43
+ )
44
+
45
+ # 이메일 전송
46
+ send_summary_email = EmailOperator (
47
+ task_id = "send_summary_email" ,
48
+
49
+ subject = "{{ task_instance.xcom_pull(task_ids='collect_task_results', key='email_subject') }}" ,
50
+ html_content = "{{ task_instance.xcom_pull(task_ids='collect_task_results', key='email_body') }}" ,
51
+ trigger_rule = "all_done" ,
52
+ )
53
+ [
54
+ send_post_request_OASIS_task ()
55
+ run_consumer_task
56
+ ] >> collect_task_results_task >> send_summary_email
0 commit comments