Apache Airflow 新增 Deadlines 页面:在 Browse 菜单下统一监控 DAG Run 截止时间

发布时间:2026/9/10 11:27:07
Apache Airflow 新增 Deadlines 页面:在 Browse 菜单下统一监控 DAG Run 截止时间 Apache Airflow 新增 Deadlines 页面在 Browse 菜单下统一监控 DAG Run 截止时间【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow导读本文围绕 Apache Airflow 新增的Deadlines截止时间页面展开它被放置在 Web UI 顶部的Browse 菜单中用于集中查看所有 DAG Run 的最晚完成时间deadline以及这些截止时间是否已被错过missed。读完本文你将掌握Deadlines 页面的访问方式与权限要求、页面提供的列/筛选/排序能力、其背后的 FastAPI 数据接口与 SQLAlchemy 模型以及 Scheduler 如何评估并触发超期回调的完整链路。功能概述Deadlines 页面是什么根据变更记录 airflow-core/newsfragments/67586.significant.rst本次改动在Browse 菜单下新增了一个 Deadlines 页面用于浏览系统中已创建的所有 Deadline 记录。Deadline 在 Airflow 中的定义是一个 need-by 日期如果该时间点已过则触发回调见 Deadline 模型注释。该页面与已有功能的关系如下它面向跨 DAG、跨 DAG Run 的全局视角与 DAG 详情页中针对单个 DAG 展示的截止时间不同Browse → Deadlines 汇总了所有 DAG 的截止时间方便运维统一排查哪些 Run 即将/已经超时它与Deadline Alert截止时间告警联动页面上会显示每个 Deadline 关联的告警名称Alert Name从而把谁定义的截止时间与具体哪次运行对应起来它由新的UI 路由/deadlines与新的FastAPI 接口GET /dags/{dag_id}/dagRuns/{dag_run_id}/deadlines共同支撑权限上仅要求对 DAG Runs 拥有can_read与menu_access。访问入口与权限要求导航入口Browse 菜单在 Web UI 顶部的Browse下拉菜单中新增了Deadlines菜单项。其导航定义位于 BrowseButton.tsxconst links [ { href: /events, key: auditLog, title: Audit Log }, { href: /deadlines, key: deadlines, title: Deadlines }, { href: /jobs, key: jobs, title: Jobs }, { href: /xcoms, key: xcoms, title: XComs }, { href: /required_actions, key: requiredActions, title: Required Actions }, ];其中Deadlines菜单项指向路由/deadlines。前端路由注册在 router.tsx页面组件为src/pages/Deadlines/index.tsx并由BaseLayout承载。权限模型变更记录明确指出该页面对任何已拥有can_read与menu_access针对DAG Runs的角色开放不需要额外的高权限角色。这与后端接口的权限声明保持一致。在 deadlines.py 路由文件 中接口通过requires_access_dag(methodGET, access_entityDagAccessEntity.RUN)校验对 DAG Run 的读取权限并通过ReadableDagRunsFilterDep自动把结果集收窄到当前用户可读的 DAG Runs 范围内deadlines_router.get( /dagRuns/{dag_run_id}/deadlines, dependencies[ Depends(requires_access_dag(methodGET, access_entityDagAccessEntity.RUN)), ], ) def get_deadlines(...): ...也就是说页面可见性由浏览菜单权限决定而具体能看到哪些 Deadline 行由DAG Run 可读范围决定两者在前后端均有对应实现。页面能力详解列、筛选、排序与分页页面主体是一个支持筛选、排序与分页的数据表格实现在 Deadlines 页面组件。表格列页面按如下列展示每条 DeadlinecreateColumns函数列含义说明Dag ID所属 DAG点击跳转到对应 DAG 详情页Team团队仅在开启多团队multi_team配置时显示Dag Run ID所属运行点击跳转到对应 DAG Run 详情页Deadline Time截止时间展示为本地化时间Status状态Missed红色徽标/Pending蓝色徽标Alert Name告警名称关联的 Deadline Alert 名称未关联则为空Created At创建时间Deadline 记录创建时间其中状态徽标的渲染逻辑为missed为真时显示红色Missed否则显示蓝色Pending对应国际化文案见 browse.json 的 deadlines 段落。筛选能力页面支持三种筛选维度deadlinesFilterKeys配合顶部 FilterBar 使用Dag ID按 DAG 过滤Deadline Time Range按截止时间区间过滤deadlineTimeGte/deadlineTimeLteMissed按状态过滤true/false/ 不限Teams仅在开启多团队时出现按团队过滤。这些筛选会原样映射为后端接口的查询参数dagId、deadlineTimeGte、deadlineTimeLte、missed、teams。排序与分页默认按deadline_time倒序排列最新截止时间在前const orderBy sort ? [...] : [-deadline_time]支持对deadline_time、created_at、missed等字段点击表头排序接口层可排序字段见后端SortParam定义分页通过limit/offset参数控制表格底部显示总条目数total_entries。自动刷新Deadlines 页面通过 useDeadlines.ts 查询数据并启用自动轮询当存在待处理pending的 Deadline 时按自动刷新周期拉取最新状态仅当结果集中所有 Deadline 都已 missed 时才停止轮询避免无意义的请求const allMissed data.total_entries 0 data.deadlines.every((deadline) deadline.missed); return allMissed ? false : refetchInterval;后端数据接口全局视角的查询设计Deadlines 页面调用的核心接口位于 deadlines.pyGET /dags/{dag_id}/dagRuns/{dag_run_id}/deadlines该接口的设计要点通配符~dag_id与dag_run_id均支持传入~表示所有 DAG / 所有 Run。页面请求时传dagId或~与dagRunId: ~从而获得跨 DAG 的全局列表参数约束当指定了dag_run_id而dag_id为~时返回400dag_id is required when dag_run_id is specified当指定了具体的dag_run_id但该 Run 不存在时返回404关联加载查询基于Deadline表joinDagRun并 outerjoinDeadlineAlert同时通过contains_eager预加载团队信息避免 N1 查询响应模型DeadlineResponse 聚合了id、deadline_time、missed、created_at、dag_id、dag_run_id、alert_id、alert_name、team_name等字段页面表格的每一列都能在响应中找到对应来源排序白名单SortParam只允许对id、deadline_time、created_at、last_updated_at、missed排序并支持将dag_id/dag_run_id/alert_name映射到底层表的真实列to_replace默认按deadline_time排序。此外同文件还提供了按 DAG 查询告警定义的接口GET /dags/{dag_id}/deadlineAlerts返回该 DAG 下定义的 Deadline Alert 列表用于在 DAG 详情侧展示告警配置。底层实现Deadline 模型与 Scheduler 的错过处理了解页面背后的数据才能更好地理解每个字段的含义。Deadline 的存储模型定义在 airflow-core/src/airflow/models/deadline.py表名为deadline核心字段包括字段含义deadline_time截止时间超过该时间即视为错过并触发回调missed是否已被 Scheduler 标记为错过dagrun_id关联的 DAG Run外键级联删除callback_id错过时要执行的回调外键级联删除deadline_alert_id生成该 Deadline 的 Deadline Alert可为空删除时置空表上还建立了(missed, deadline_time)与(callback_id)两个索引用于支撑按状态时间查询与回调检索。Scheduler 如何判定错过在 scheduler_job_runner.py 中Scheduler 周期性扫描deadline_time早于当前时间且尚未处理的 Deadline使用FOR UPDATE SKIP LOCKED避免多个 Scheduler 并发重复处理随后调用deadline.handle_miss(session)将回调入队并把missed置为True。handle_miss的实现要点deadline.py#L231-L292为回调注入简化上下文dag_run与deadline信息便于回调逻辑感知是哪次运行、哪个截止时间超期根据回调类型分发TriggererCallback直接入队ExecutorCallback置为PENDING后交由 Executor 执行完成后标记missed True并上报deadline_alerts.deadline_missed指标。Deadline 的创建与清理创建Deadline 由 DAG 中定义的 Deadline Alert 生成。参考类型DeadlineReference包括固定时间FixedDatetimeDeadline、DAG Run 逻辑日期DagRunLogicalDateDeadline、入队时间DagRunQueuedAtDeadline以及基于历史运行时长推算AverageRuntimeDeadline仅统计SUCCESS状态的 Run 以避免失败/挂起任务污染平均值相关序列化实现见 airflow-core/src/airflow/serialization/definitions/deadline.py清理Deadline.prune_deadlines会删除DAG Run 在截止时间之前已成功结束的 Deadlinedagrun.end_date deadline.deadline_time并上报deadline_alerts.deadline_not_missed指标已被标记为 missed 的 Deadline 不会被 prune 级联删除因为其回调由 Scheduler 负责处理见 prune_deadlines。因此Deadlines 页面上的记录大致分为两类仍在等待截止时间到达的Pending记录以及已超期并触发回调的Missed记录——状态徽标正是对这一业务语义的直接呈现。测试验证该功能的正确性由单元测试保障最直接的是路由级测试 airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_deadlines.py其 fixture 构造了多种场景的 Runrun_empty无任何 Deadlinerun_single1 条未错过的 Deadline且未关联告警run_missed1 条missedTrue的 Deadlinerun_alert1 条关联了 Deadline Alert 的 Deadlinerun_multi乱序插入的 3 条 Deadline用于验证排序run_other/run_dag2用于验证按 Run 隔离与跨 DAG 过滤。测试覆盖了分页、排序、按missed过滤、跨 DAG 查询~通配以及 400/404 错误分支可以作为阅读与二次开发该接口的参考入口。此外test_deadline.py 与 test_deadline_alert.py 覆盖了模型层的创建、handle_miss与prune_deadlines逻辑。小结入口Web UI 顶部 Browse 菜单 → Deadlines路由/deadlines前端实现在 pages/Deadlines/index.tsx权限只需对DAG Runs拥有can_read与menu_access的角色即可访问具体可见的数据范围由可读 DAG Runs 过滤后端权限校验见 deadlines.py能力表格展示 Dag ID、Dag Run ID、Deadline Time、StatusMissed/Pending、Alert Name、Created At支持按 DAG / 时间区间 / 状态 / 团队筛选默认按截止时间倒序并带自动刷新全部 Missed 后停止轮询数据链路UI →GET /dags/{dag_id}/dagRuns/{dag_run_id}/deadlines~通配全局查询→deadline表 → Scheduler 扫描超期记录并触发回调运维价值该页面把散落在各 DAG 中的截止时间统一成一张全局清单配合 Alert Name 与 Missed 状态可以快速定位哪些运行没有在承诺时间内完成是 Deadline Alert 特性的可视化落地。【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考