메트릭 설정

메트릭 설정 (Metrics Configuration)

이 페이지는 Airflow가 StatsDOpenTelemetry로 메트릭을 보내도록 설정하는 방법을 안내해요. StatsD·OpenTelemetry 설정, 컴포넌트·인스턴스 식별, 히스토그램 메트릭과 백엔드 요구사항, 허용/차단 목록, 메트릭 이름 변경, 커스텀 메트릭은 물론 모든 내장 메트릭(Counters/Gauges/Timers)의 설명도 포함해요.

출처: 문서

본문

Airflow는 StatsDOpenTelemetry로 메트릭을 보내도록 설정할 수 있어요.

설정 - StatsD

StatsD를 사용하려면 먼저 필요한 패키지를 설치해야 해요:

pip install 'apache-airflow[statsd]'

그런 다음 airflow.cfg 같은 설정 파일에 다음 줄을 추가해요:

[metrics]
statsd_on = True
statsd_host = localhost
statsd_port = 8125
statsd_prefix = airflow

Airflow가 제공하는 기본 클라이언트 대신 커스텀 StatsD 클라이언트를 사용하려면, 커스텀 StatsD 클라이언트의 모듈 경로와 함께 설정 파일에 다음 키를 추가해야 해요. 이 모듈은 PYTHONPATH에서 사용할 수 있어야 해요.

[metrics]
statsd_custom_client_path = x.y.customclient

Python과 Airflow가 모듈을 어떻게 관리하는지에 대한 자세한 내용은 Modules Management를 참고해요.

Note

StatsD에는 자원(resource) 개념이 없으므로, 메트릭을 그것을 만든 프로세스에 귀속시킬 수 없어요. 고가용성의 scheduler처럼 여러 프로세스가 같은 컴포넌트를 실행하면, 각각이 같은 시리즈를 내보내고 서버가 마지막에 도착한 값을 유지해요. 그것들을 구별하려면 컴포넌트와 그 인스턴스 식별하기에 설명된 대로 OpenTelemetry를 사용해요.

설정 - OpenTelemetry

OpenTelemetry를 사용하려면 먼저 필요한 패키지를 설치해야 해요:

pip install 'apache-airflow[otel]'

메트릭 백엔드로의 연결을 위해서는 OpenTelemetry Collector(또는 호환 서비스)가 필요해요. airflow.cfg 같은 설정 파일에 Collector 세부 정보를 추가해요:

[metrics]
otel_on = True
otel_host = localhost
otel_port = 8889
otel_prefix = airflow
otel_interval_milliseconds = 30000  # The interval between exports, defaults to 60000
otel_service = Airflow
otel_ssl_active = False

Note

다음 설정 키는 deprecated되었으며 향후 제거될 예정이에요

[metrics]
otel_host = localhost
otel_port = 8889
otel_interval_milliseconds = 30000
otel_debugging_on = False
otel_service = Airflow
otel_ssl_active = False

OpenTelemetry SDK는 OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_PROTOCOL 같은 표준 OpenTelemetry 환경 변수를 사용해 구성해야 해요.

자세한 내용은 OpenTelemetry exporter 프로토콜 스펙SDK 환경 변수 문서를 참고해요.

컴포넌트와 그 인스턴스 식별하기

OpenTelemetry는 각 메트릭을 그것을 만든 리소스로 라벨링해요. 두 개의 리소스 속성이 배포의 얼마나 많은 부분을 구별할 수 있는지 결정해요:

service.name : 어느 컴포넌트가 메트릭을 보고했는지. 모든 Airflow 프로세스에 대해 airflow로 기본 설정되므로, scheduler, triggerer, worker가 하나의 이름으로 도착해요. 컴포넌트별로 설정해 메트릭을 그것을 만든 프로세스 종류에 귀속시켜요.

service.instance.id : 그 컴포넌트의 어느 프로세스가 메트릭을 보고했는지. 기본적으로 설정되지 않으므로, 같은 컴포넌트를 실행하는 프로세스(예: 2+ scheduler)는 구별할 수 없어요. 프로세스별로 설정해 메트릭을 그중 하나에 귀속시켜요.

Airflow는 OTEL_SERVICE_NAME에서 service.name을 읽고, 다른 모든 리소스 속성은 OTEL_RESOURCE_ATTRIBUTES에서 읽어요:

# on one of the schedulers
export OTEL_SERVICE_NAME="airflow-scheduler"
export OTEL_RESOURCE_ATTRIBUTES="service.instance.id=$(hostname)"

리소스를 공유하는 프로세스는 시리즈도 공유하며, 백엔드가 마지막에 도착한 export를 유지해요. 여러 프로세스가 같은 컴포넌트를 실행하면, 데이터는 집계 대신 손실돼요: 각 scheduler가 자신의 루프로 메타데이터 데이터베이스를 샘플링하므로, pool.open_slots 같은 게이지는 모든 값에서 파생된 값이 아니라 임의의 scheduler 샘플을 보고해요.

각 프로세스가 식별되면 그 샘플이 자신의 시리즈를 이루고 의도적으로 결합될 수 있어요 — 예를 들어 어떤 scheduler가 관찰한 열린 슬롯의 최소 수:

min by (pool_name) (airflow_pool_open_slots)

속성이 어떻게 표면화되는지는 백엔드에 따라 달라져요. OpenTelemetry Prometheus 호환성 스펙을 구현하는 백엔드는 그것을 jobinstance 라벨로 노출해요.

HTTPS 활성화

OpenTelemetry collector와 HTTPS 연결을 설정하려면 OpenTelemetry collector의 config.yml 파일 안에 SSL 인증서와 키를 구성해야 해요.

receivers:
  otlp:
    protocols:
      http:
        endpoint: 0.0.0.0:4318
        tls:
          cert_file: "/path/to/cert/cert.crt"
          key_file: "/path/to/key/key.pem"

히스토그램 메트릭과 백엔드 요구사항

Airflow의 타이밍 메트릭(timing() / timer())은 지수 버킷 히스토그램으로 집계된 OpenTelemetry 히스토그램으로 내보내져요. 그래서 버킷 경계가 관찰된 범위에 자동으로 적응하고, 밀리초부터 시간까지 아주 다른 스케일에 걸친 메트릭에 대해 명시적 버킷을 손으로 튜닝할 필요가 없어요.

이를 end-to-end로 올바르게 수집하려면, 연결하는 메트릭 백엔드가 OpenTelemetry 지수 히스토그램과 (Prometheus의 경우) 네이티브 히스토그램으로의 변환을 지원해야 해요:

  • OpenTelemetry Collectoropentelemetry-collector-contrib 버전 0.115.0 이상을 사용해요. 이전 버전은 OTLP 지수 히스토그램을 Prometheus 네이티브 히스토그램으로 변환하지 않아요.
  • Prometheus — 네이티브 히스토그램을 명시적으로 활성화해야 하며, 그 방법은 Prometheus 버전에 따라 달라요:
    • 2.40 ~ 3.8--enable-feature=native-histograms 플래그로 Prometheus를 시작해요.
    • 3.8 이상 — scrape 구성에 scrape_native_histograms: true를 설정해요 (이 옵션은 3.8에서 추가되었고, 3.9부터 기능 플래그가 no-op이므로 설정이 필요해요):
      global:
          scrape_native_histograms: true
      

백엔드가 네이티브 히스토그램을 지원하지 않으면 지수 히스토그램 데이터 포인트가 버려지거나 잘못 렌더링될 수 있어요. 로컬 개발용으로 연결된 참조 스택(Collector, Prometheus, Grafana)은 breeze start-airflow --integration otel로 사용할 수 있어요. 자세한 내용은 기여자 문서를 참고해요.

허용/차단 목록

사용 가능한 모든 메트릭을 보내는 것을 피하고 싶다면, 특정 메트릭만 보내거나 차단하도록 허용 목록(allow list)이나 차단 목록(block list)을 구성할 수 있어요. 각 목록은 쉼표로 구분된 정규식 집합이며 메트릭 이름의 아무 위치에서나 매칭돼요(접두사 매칭은 ^로 앵커). 두 목록이 모두 설정되면 차단 목록은 무시돼요:

[metrics]
metrics_allow_list = scheduler,executor,dagrun,pool,triggerer,celery
[metrics]
metrics_block_list = scheduler,executor,dagrun,pool,triggerer,celery

메트릭 이름 변경

메트릭을 다른 이름으로 전달하고 싶으면 [metrics] 섹션의 stat_name_handler 옵션을 구성할 수 있어요. 이는 stat 이름을 검증하고, 필요하면 stat 이름에 변경을 적용하고, 변환된 stat 이름을 반환하는 함수를 가리켜야 해요. 이 함수는 다음과 같을 수 있어요:

def my_custom_stat_name_handler(stat_name: str) -> str:
    return stat_name.lower()[:32]

커스텀 메트릭

Task, 플러그인, 커스텀 Operator 안에서 Airflow가 내부적으로 사용하는 것과 같은 stats 클라이언트로 나만의 메트릭을 내보낼 수 있어요. Airflow 3에서 권장 import 경로는 airflow.sdk.observability예요:

from airflow.sdk.observability import stats

stats.incr("my_service.processed")
stats.decr("my_service.in_flight")
stats.gauge("my_service.queue_depth", 42)
stats.timing("my_service.batch_ms", 1234)

with stats.timer("my_service.batch"):
    ...

버전 3.3.0에 추가됨: 모듈 레벨 stats 함수(stats.incr(), stats.gauge() 등).

이전 버전에서는 Stats 클래스를 대신 사용해요: from airflow.sdk.observability.stats import Stats, 그런 다음 Stats.incr(...).

incr, decr, gauge, timing, timer는 또한 지원하는 백엔드에서 차원 메트릭을 위한 선택적 tags 매핑을 받아요:

stats.incr("my_service.requests", tags={"endpoint": "checkout"})

incrdecr는 또한 countrate를 받고, gaugeratedelta를 받아요. StatsD 데이터 타입을 따릅니다.

Note

태그 지원은 백엔드에 따라 달라져요. 고전적인 StatsD 프로토콜에는 태그 개념이 없어요.

  • OpenTelemetry (otel_on)은 태그를 네이티브 속성으로 보내요.
  • StatsD (statsd_on)은 기본적으로 tags 매핑을 버려요. 태그를 라벨로 바꾸려면 태그 기반 와이어 형식을 활성화해요. statsd_influxdb_enabled = True(InfluxDB name,key=value) 또는 statsd_datadog_enabled = True(DogStatsD |#key:value). Prometheus statsd_exporter는 두 형식 중 하나에서 태그를 읽어 라벨로 바꿔요. 이 플래그들은 와이어에 태그가 쓰여지는 방식만 바꿔요. 값을 메트릭 이름에 내장하고 statsd_exporter 매핑 규칙으로 그 이름 세그먼트를 라벨에 다시 매핑할 수도 있어요.

Note

메트릭 이름은 250자 이하여야 하며 a-z, A-Z, 0-9, _, ., -, / 문자만 포함할 수 있어요. 유효하지 않은 이름은 로그에 기록되고 메트릭은 내보내지지 않아요.

Note

백엔드가 활성화되지 않으면(설정 - StatsD 또는 설정 - OpenTelemetry 참고) 이 메트릭들은 조용히 버려져요.

Note

커스텀 메트릭이 나타나지 않으면 [metrics] metrics_allow_list[metrics] metrics_block_list를 확인해요(허용/차단 목록 참고). metrics_allow_list가 설정되면 그것과 일치하는 메트릭만 내보내지므로, 목록에 없는 커스텀 메트릭은 조용히 버려져요.

기타 설정 옵션

Note

메트릭 관련 설정 옵션의 상세 목록은 설정 참조 문서 - [metrics]를 참고해요.

메트릭 설명

Counters

이름 레거시 이름 설명
{job_name}_start - 시작된 {job_name} job 수, 예: SchedulerJob, LocalTaskJob
{job_name}_end - 종료된 {job_name} job 수, 예: SchedulerJob, LocalTaskJob
{job_name}_heartbeat_failure - {job_name} job에 대한 실패한 Heartbeat 수, 예: SchedulerJob, LocalTaskJob
local_task_job.task_exit local_task_job.task_exit.{job_id}.{dag_id}.{task_id}.{return_code} Dag {dag_id}의 Task {task_id} 실행 중 {return_code}로 종료된 LocalTaskJob 수. job_id, dag_id, task_id, return_code 태깅 포함.
operator_failures operator_failures_{operator_name} Operator {operator_name} 실패 수.
operator_successes operator_successes_{operator_name} Operator {operator_name} 성공 수.
resumable_job.fresh_submit - ResumableJobMixin operator가 이전 run ID 저장 없이 새 fresh job을 제출한 횟수(첫 run). operator 태깅 포함.
resumable_job.already_succeeded - ResumableJobMixin operator가 저장된 run ID의 job이 이미 성공적으로 완료되어 재제출을 건너뛴 횟수. operator 태깅 포함.
resumable_job.terminal_resubmit - ResumableJobMixin operator가 저장된 run ID의 job이 종료(failed) 상태임을 발견하고 새 job을 제출한 횟수. operator 태깅 포함.
resumable_job.reconnect_attempt - ResumableJobMixin operator가 재시도 시 저장된 run ID를 발견하고 재연결을 시도한 횟수. operator 태깅 포함.
resumable_job.reconnect_success - ResumableJobMixin operator가 재시도 시 활성 job에 성공적으로 재연결한 횟수. operator 태깅 포함.
ti_failures - 전체 task instance 실패 수. dag_id, task_id 태깅 포함.
ti_successes - 전체 task instance 성공 수. dag_id, task_id 태깅 포함.
previously_succeeded - 이전에 성공한 task instance 수. dag_id, task_id 태깅 포함.
task_instances_without_heartbeats_killed - 하트비트 없이 종료된 task instance 수. dag_id, task_id 태깅 포함.
scheduler_heartbeat - Scheduler 하트비트
dag_processor_heartbeat - 독립형 Dag processor 하트비트
dag_processing.processes - 현재 실행 중인 Dag 파싱 프로세스의 상대적 수(마지막 메트릭 전송 이후 프로세스가 완료됐으면 델타가 음수). file_path, action 태깅 포함.
dag_processing.processor_timeouts - 너무 오래 걸려 종료된 file processor 수. file_path 태깅 포함.
dag_processing.other_callback_count - 수신된 비-SLA 콜백 수
dag_processing.callback_only_count - 전체 DAG 파싱 없이 콜백만 처리한 DAG 파일 처리 실행 수
dag_processing.file_path_queue_update_count - 파일시스템을 스캔하고 모든 기존 DAG를 대기열에 넣은 횟수
dag_file_processor_timeouts - (DEPRECATED) dag_processing.processor_timeouts와 동일한 동작
dag_processing.manager_stalls - 정체된(stalled) DagFileProcessorManager
dag_file_refresh_error - Dag 파일 로드 실패 수
scheduler.tasks.killed_externally - 외부에서 종료된 Task 수. dag_id, task_id 태깅 포함.
scheduler.orphaned_tasks.cleared - Scheduler가 정리한 고아(orphaned) Task 수
scheduler.orphaned_tasks.adopted - Scheduler가 채택한 고아 Task 수
scheduler.critical_section_busy - scheduler 프로세스가 임계 섹션(executor로 Task를 보내는 데 필요)에 잠금을 얻으려다 다른 프로세스가 잠근 것을 발견한 횟수.
ti.start ti.start.{dag_id}.{task_id} 주어진 Dag에서 시작된 Task 수. {job_name}_start와 비슷하지만 Task용. dag_id, task_id 태깅 포함.
ti.finish ti.finish.{dag_id}.{task_id}.{state} 주어진 Dag에서 완료된 Task 수. {job_name}_end와 비슷하지만 Task용. dag_id, task_id 태깅 포함.
dag.callback_exceptions - Dag 콜백에서 발생한 예외 수. 이것이 발생하면 Dag 콜백이 작동하지 않는다는 뜻. dag_id 태깅 포함.
celery.task_timeout_error - Task를 Celery Broker에 게시할 때 발생한 AirflowTaskTimeout 에러 수.
celery.execute_command.failure - Celery task의 0이 아닌 exit code 수.
task_removed_from_dag task_removed_from_dag.{dag_id} 주어진 Dag에서 제거된 Task 수(즉 Task가 더 이상 Dag에 없음). dag_id, run_type 태깅 포함.
task_restored_to_dag task_restored_to_dag.{dag_id} 주어진 Dag에 복원된 Task 수(즉 이전에 DB에서 REMOVED 상태였던 task instance가 Dag 파일에 추가됨). dag_id, run_type 태깅 포함.
task_instance_created task_instance_created_{task_type} 주어진 Operator에 대해 생성된 task instance 수. dag_id, run_type 태깅 포함.
triggerer_heartbeat - Triggerer 하트비트
triggers.blocked_main_thread - 메인 스레드를 막은 트리거 수(완전히 비동기가 아니어서일 가능성)
triggers.failed - 이벤트를 발생시키기 전에 에러가 난 트리거 수
triggers.succeeded - 하나 이상의 이벤트를 발생시킨 트리거 수
asset.updates - 업데이트된 asset 수
asset.triggered_dagruns - asset 업데이트에 의해 트리거된 Dag run 수
deadline_alerts.deadline_created - Dag run에 대해 생성된 deadline 알림 수
deadline_alerts.deadline_missed - Dag run이 deadline을 놓쳐 발생한 deadline 알림 수
deadline_alerts.deadline_not_missed - Dag run이 deadline 전에 끝나 삭제된 deadline 레코드 수
ol.emit.failed - 실패한 OpenLineage 이벤트 전송 시도 수
api_server.dag_bag.cache_hit - API 서버의 DBDagBag에서 SerializedDAG를 검색할 때 cache hit 수
api_server.dag_bag.cache_miss - API 서버의 DBDagBag에서 SerializedDAG를 검색할 때 cache miss 수
api_server.dag_bag.cache_clear - API 서버에서 DBDagBag 캐시가 정리된 횟수
scheduler.dag_bag.cache_hit - scheduler의 DBDagBag에서 SerializedDAG를 검색할 때 cache hit 수
scheduler.dag_bag.cache_miss - scheduler의 DBDagBag에서 SerializedDAG를 검색할 때 cache miss 수
scheduler.dag_bag.cache_clear - scheduler에서 DBDagBag 캐시가 정리된 횟수
connection_test.success - 성공적으로 완료된 worker 디스패치 연결 테스트 수
connection_test.failed - 실패로 완료된 worker 디스패치 연결 테스트 수
connection_test.reaped - scheduler reaper가 실패로 표시한 오래된(stale) 연결 테스트 수. prior_state 태깅 포함.
edge_worker.heartbeat_count edge_worker.heartbeat_count.{worker_name} edge worker의 하트비트 수
edge_worker.ti.start edge_worker.ti.start.{queue}.{dag_id}.{task_id} edge worker에서 시작된 task instance 수
edge_worker.ti.finish edge_worker.ti.finish.{queue}.{state}.{dag_id}.{task_id} edge worker에서 완료된 task instance 수
kubernetes_executor.pod_creation_status - Kubernetes Executor의 create_namespaced_pod 호출 수. HTTP 응답 상태로 태깅 (200 성공, 실패 시 ApiException 상태 코드, 비-API 예외는 error).
kubernetes_executor.pod_deletion_status - Kubernetes Executor의 delete_namespaced_pod 호출 수. HTTP 응답 상태로 태깅 (200 성공, 실패 시 ApiException 상태 코드).
kubernetes_executor.pod_patching_status - Kubernetes Executor의 patch_namespaced_pod 호출 수. HTTP 응답 상태로 태깅 (200 성공, 실패 시 ApiException 상태 코드).

Gauges

이름 레거시 이름 설명
asset.orphaned - 더 이상 Dag schedule 파라미터나 task outlet에서 참조되지 않아 orphan으로 표시된 asset 수
dagbag_size - scheduler가 설정에 기반해 스캔을 실행했을 때 발견한 DAG 수
api_server.dag_bag.cache_size - API 서버의 DBDagBag에 캐시된 SerializedDAG 객체 수
scheduler.dag_bag.cache_size - scheduler의 DBDagBag에 캐시된 SerializedDAG 객체 수
connection_test.active - 현재 실행 중인 연결 테스트 수(queued + running), scheduler가 매 틱마다 샘플링
connection_test.pending - pending 백로그(큐 깊이)에서 기다리는 연결 테스트 수, scheduler가 매 틱마다 샘플링
dag_processing.import_errors - Dag 파일 파싱 시도에서 발생한 에러 수
dag_processing.total_parse_time - dag_processing.file_path_queue_size Dag 파일을 스캔·import하는 데 걸린 초
dag_processing.file_path_queue_size - 다음 스캔에서 고려할 Dag 파일 수
dag_processing.last_run.seconds_ago dag_processing.last_run.seconds_ago.{file_name} DAG 파일이 마지막으로 처리된 후 지난 초. file_path, bundle_name, file_name 태깅 포함.
dag_processing.last_num_of_db_queries.{dag_file} - 파싱 중 {dag_file}당 Airflow 데이터베이스에 보낸 쿼리 수
scheduler.tasks.starving - pool에 열린 슬롯이 없어 스케줄링할 수 없는 Task 수
scheduler.tasks.executable - pool 제한, Dag 동시성, executor 상태, 우선순위와 관련해 실행 준비가 된(queued로 설정된) Task 수
scheduler.dagruns.running - 최신 DagRun이 현재 RUNNING 상태인 DAG 수
executor.open_slots executor.open_slots.{executor_class_name} executor의 열린 슬롯 수. 레거시 메트릭은 여러 executor가 구성된 경우에만 내보내짐.
executor.queued_tasks executor.queued_tasks.{executor_class_name} executor의 queued task 수. 레거시 메트릭은 여러 executor가 구성된 경우에만 내보내짐.
executor.running_tasks executor.running_tasks.{executor_class_name} executor의 running task 수. 레거시 메트릭은 여러 executor가 구성된 경우에만 내보내짐.
pool.open_slots pool.open_slots.{pool_name} pool의 열린 슬롯 수
pool.queued_slots pool.queued_slots.{pool_name} pool의 queued 슬롯 수
pool.running_slots pool.running_slots.{pool_name} pool의 running 슬롯 수
pool.deferred_slots pool.deferred_slots.{pool_name} pool의 deferred 슬롯 수
pool.scheduled_slots pool.scheduled_slots.{pool_name} pool의 scheduled 슬롯 수
pool.starving_tasks pool.starving_tasks.{pool_name} pool의 starving task 수
triggers.running triggers.running.{hostname} triggerer(hostname으로 설명)에서 현재 실행 중인 트리거 수
triggerer.capacity_left triggerer.capacity_left.{hostname} triggerer에서 트리거를 실행할 남은 용량(hostname으로 설명)
ti.scheduled ti.scheduled.{queue}.{dag_id}.{task_id} 주어진 Dag의 scheduled task 수
ti.queued ti.queued.{queue}.{dag_id}.{task_id} 주어진 Dag의 queued task 수
ti.running ti.running.{queue}.{dag_id}.{task_id} 주어진 Dag의 running task 수. ti.start와 ti.finish가 어긋날 수 있으므로 이 메트릭은 모든 running ti를 보여줘요.
ti.deferred ti.deferred.{queue}.{dag_id}.{task_id} 주어진 Dag의 deferred task 수
ol.event.size ol.event.size.{event_type}.{operator_name} 이벤트 유형과 operator별 OpenLineage 이벤트 크기(바이트)
edge_worker.status edge_worker.status.{worker_name} Edge worker 상태(Python logging level로 표현)
edge_worker.connected edge_worker.connected.{worker_name} connected 상태의 edge worker
edge_worker.maintenance edge_worker.maintenance.{worker_name} maintenance 상태의 edge worker
edge_worker.jobs_active edge_worker.jobs_active.{worker_name} edge worker의 활성 job 수
edge_worker.concurrency edge_worker.concurrency.{worker_name} edge worker의 동시성 용량
edge_worker.free_concurrency edge_worker.free_concurrency.{worker_name} edge worker의 사용 가능한 동시성
edge_worker.num_queues edge_worker.num_queues.{worker_name} edge worker의 큐 수

Timers

이름 레거시 이름 설명
dagrun.dependency-check dagrun.dependency-check.{dag_id} Dag 의존성 확인에 걸린 밀리초
task.duration dag.{dag_id}.{task_id}.duration Task 실행에 걸린 밀리초
task.scheduled_duration dag.{dag_id}.{task_id}.scheduled_duration Task가 Queued되기 전 Scheduled 상태에서 보낸 밀리초
task.queued_duration dag.{dag_id}.{task_id}.queued_duration Task가 Running되기 전 Queued 상태에서 보낸 밀리초
dag_processing.last_duration dag_processing.last_duration.{bundle_name}.{file_name} 주어진 Dag 파일을 로드하는 데 걸린 밀리초
dagrun.duration.success dagrun.duration.success.{dag_id} DagRun이 success 상태에 도달하는 데 걸린 밀리초
dagrun.duration.failed dagrun.duration.failed.{dag_id} DagRun이 failed 상태에 도달하는 데 걸린 밀리초
dagrun.schedule_delay dagrun.schedule_delay.{dag_id} 스케줄링된 DagRun 시작 날짜와 실제 DagRun 시작 날짜 사이의 지연 밀리초
scheduler.critical_section_duration - scheduler 루프의 임계 섹션에서 보낸 밀리초
scheduler.critical_section_query_duration - 임계 섹션 task instance 쿼리 실행에 걸린 밀리초
scheduler.scheduler_loop_duration - 한 번의 scheduler 루프 실행에 걸린 밀리초
scheduler.executor_heartbeat_duration - 각 scheduler 루프 반복에서 executor.heartbeat()에 걸린 밀리초. executor 클래스 이름으로 태깅되어 각 구성된 executor가 별도로 보고됨
dagrun.first_task_scheduling_delay dagrun.{dag_id}.first_task_scheduling_delay 첫 Task start_date와 dagrun 예상 시작 사이의 밀리초
dagrun.first_task_start_delay - dagrun queued_at과 첫 Task start_date 사이의 밀리초
collect_db_dags - DB에서 모든 Serialized Dags를 가져오는 데 걸린 밀리초
kubernetes_executor.adopt_task_instances.duration - Kubernetes Executor에서 task instance를 채택하는 데 걸린 밀리초
kubernetes_executor.pod_creation - Kubernetes Executor의 create_namespaced_pod 호출에 걸린 밀리초
kubernetes_executor.pod_deletion - Kubernetes Executor의 delete_namespaced_pod 호출에 걸린 밀리초
kubernetes_executor.pod_patching - Kubernetes Executor의 patch_namespaced_pod 호출에 걸린 밀리초
batch_executor.adopt_task_instances.duration - AWS Batch Executor에서 task instance를 채택하는 데 걸린 밀리초
ecs_executor.adopt_task_instances.duration - AWS ECS Executor에서 task instance를 채택하는 데 걸린 밀리초
lambda_executor.adopt_task_instances.duration - AWS Lambda Executor에서 task instance를 채택하는 데 걸린 밀리초
edge_executor.sync.duration - Edge Executor의 한 번의 동기화 하트비트에 걸린 밀리초
ol.emit.attempts ol.emit.attempts.{event_type}.{transport_type} OpenLineage 이벤트 전송 시도에 걸린 밀리초
ol.extract ol.extract.{event_type}.{operator_name} 이벤트 유형과 operator별 OpenLineage 이벤트 추출에 걸린 밀리초
airflow.io.load_filesystems - provider에서 filesystem 구현을 로드하는 데 걸린 밀리초
serde.load_serializers - 모든 직렬화기 모듈을 로드하는 데 걸린 밀리초
connection_test.dispatch_duration - scheduler가 한 틱에서 pending 연결 테스트를 executor로 디스패치하는 데 보내는 밀리초
connection_test.hook_duration - worker가 worker 디스패치 연결 테스트에 대해 훅의 test_connection을 실행하는 데 보내는 밀리초

더 알아보기 (Learn more)