跳转至

运行、日志与恢复

运行页面(#/run/<run_id>)用于实时观察单次 DAG 运行的执行过程,并在出现问题时进行恢复——依赖图、各任务实例、流式日志,以及取消 / 重试 / 标记等运维操作,全部集中在 cronova 网页控制台的同一个页面上。

cronova 运行详情——依赖图、任务实例与实时日志

进入此页面的方式:在 DAG 的运行历史中点击任意运行行(参见使用 DAG),或直接打开 #/run/<run_id> URL——运行 URL 是稳定的深链接,可以直接粘贴到告警或聊天会话中。

运行头部

页面顶部汇总整个运行的状态,并在执行期间原地更新:

元素 显示内容
Run id 等宽字体 id——点击即可复制。
状态徽标 运行的当前状态(queuedrunningsuccessfailedcancelledtimed out),实时变色。
进度 done/total 计数器加进度条——已进入终态的任务实例数量,任务执行时还会显示 · N running
逻辑日期 本次运行代表的数据区间(点击可复制)——参见调度与 catchup
触发方式 运行的启动方式:scheduledmanualdependencyevent
时长 从开始到结束的墙钟时间;运行进行中会持续递增。
开始时间 第一个任务被派发的时刻。

如果运行是带参数触发的,头部下方会有一个药丸栏列出每一对 key=value(参见变量、连接与参数)。

头部右侧是运行级操作——运行进行中显示 Cancel run,运行结束后显示 Retry failedMark run。具体显示哪些按钮取决于运行状态和你的角色;详见下文恢复一次运行

依赖图

与 DAG 页面上相同的 DAG 图,但会按任务状态实时着色:每个节点的填充色跟随其任务实例变化,运行中的任务会有脉动效果。随着调度器逐步推进工作流,你可以直观地看到绿色浪潮在图上蔓延——而一个红色节点及其后方灰色的 upstream failed 节点会把你直接指向根因。图支持鼠标平移和缩放。

任务实例

图的下方有两个标签页,可在实例表格和时间线之间切换。

Task instances 标签页为运行中的每个任务列出一行:

含义
task 任务 id,即 DAG YAML 中定义的名称。
state 状态徽标:scheduledqueuedrunningretryingsuccessfailedupstream failedskippedcancelledtimed out
try n/m——当前尝试次数 / 最大次数(max_retries + 1)。自动重试会递增 n;参见重试、超时与资源池
pool 任务所在的并发资源池(在管理页面中管理)。
duration 任务最近一次尝试窗口的墙钟时间。
actions logs 打开日志面板。运行结束后, 可重试失败/已取消/超时的任务, 可标记任务状态(运维覆写)。

Timeline 标签页把同样的实例渲染成甘特图:每个任务一根条形,按真实的开始和结束时间定位与定长,按状态着色。悬停条形会显示任务、状态、时长以及开始 → 结束时间;任务名旁的 ×n 徽标标记出执行了不止一次尝试的任务。从未运行过的任务(如 skippedupstream failed)显示为灰色标签,而不是伪造一根条形。点击某一行即可打开该任务的日志。

日志面板

打开运行页面时,底部的日志面板会自动定位到最有用的任务:优先是当前正在运行的任务,否则是第一个尚未完成的任务,再否则是第一个任务。点击任意行(或时间线的行)上的 logs 即可切换任务。

面板提供:

  • 实时跟踪——任务运行期间,其 stdout/stderr 通过 SSE 流入面板,视图自动跟随最新一行。打开已有的大日志时只从最新 1 MiB 开始,而不会重放整个文件。脉动的 live 指示器表示流处于打开状态;任务结束后指示器消失。
  • 日志内查找——在过滤框中输入即可只显示匹配的行(不区分大小写),并实时统计匹配数量。
  • 下载完整日志——面板头部的链接可将完整捕获的日志文件下载为 <task>.log

Note

实时视图缓冲最近 5,000 行(被截断时会显示 showing last 5000 lines 提示)。下载完整日志会流式返回完整的已捕获文件。每次任务尝试的磁盘日志上限为 64 MiB,超出后会写入明确的截断标记并丢弃后续输出。每次重试都会写入新文件,因此面板显示当前尝试,而不是所有尝试的拼接。

恢复一次运行

cronova 的恢复操作就在运行页面上,且每一次操作都会记录到审计轨迹中。你能看到哪些操作取决于运行的状态——而 viewer(只读角色)完全看不到任何运维操作:

操作 位置 出现条件 作用
Cancel run 头部 运行处于 queuedrunning 确认后("Running tasks will be killed."),杀掉所有正在运行的任务进程,将未完成任务标记为 cancelled,并将运行终结为 cancelled
Retry failed 头部 运行已结束,且至少有一个 failedupstream failedcancelledtimed out 任务 将这些任务及其下游重置回 scheduled 并重新激活运行。已经成功的任务不会重跑。
↻ Retry(单任务) 实例行 运行已结束;任务可重试 确认后,重置该任务及其全部下游任务并重跑该子树。
⚑ Mark state(单任务) 实例行 任何时候(管理员)——对进行中的运行同样有效 选择 successskipfailed。仍在运行的任务会先被杀掉。标记为 success/skip 会释放因 upstream failed 而被阻塞的下游任务;已结束的运行会被重新激活,由调度器继续推进。
Mark run 头部 运行已结束 选择 successfailed。仅覆写运行的记录结果,不改动任务状态。标记为 success 会触发所有下游 DAG 的触发器,与自然成功完全一致——参见跨 DAG 触发

Tip

经验法则:想让工作重新执行时用 Retry;结果已经处理妥当(你手动修好了,或这次失败无关紧要)、只需要让调度器的账目——以及下游——继续往前走时用 Mark

Warning

单任务的 重试会重置该任务的整个下游子树,而不仅仅是这一个任务——确认对话框会明确说明这一点。如果下游任务有你不希望重复执行的副作用,请先检查依赖图。

这里的每个操作也都可以通过 REST API 和 CLI 完成(cronova cancelcronova retrycronova markcronova logs)——参见 CLI 参考

实时刷新与重试的呈现方式

运行进行期间,页面每 2 秒轮询一次并原地更新所有内容——状态徽标、进度条、图节点颜色、实例表格——不会中断已打开的日志流,也不会抢走键盘焦点。当运行进入终态后,轮询停止,并弹出 toast 报告结果。

重试会在三处可见:两次尝试之间状态徽标翻转为 retryingtry 列递增(2/33/3……),日志面板开始一份新的尝试日志。运维发起的重试会让计数器继续累加而不是清零,因此 try 计数始终如实记录任务实际执行了多少次。

常见问题

为什么我的失败运行上没有 Retry 按钮? Retry 只在已结束且仍有可重试任务的运行上出现。如果运行显示 runningqueued,请先取消。如果所有任务都已成功或被跳过,也就无可重试——需要覆写记录结果时请使用 Mark run

能只重试一个任务而不重跑整个 DAG 吗? 可以——点击任务行上的 。它会重跑该任务及其下游子树;已经成功的上游任务保持不变。

为什么不能标记一个仍在运行的运行? 进行中的运行状态由其任务状态推导而来,直接覆写会立刻被覆盖回去。请先取消运行,或改为标记单个任务——任务级标记对进行中的运行有效。

重试之后我的日志去哪了? 每次尝试都会开始一份新的日志文件。面板(以及下载链接)显示的是最新一次尝试。

谁能使用这些操作? 写操作仅限管理员。viewer 令牌和 viewer 会话只能看到只读的运行页面——没有取消、重试或标记按钮。参见 API 令牌与角色