跳转至主要内容
自动化功能允许你配置操作,这些操作会根据触发器条件自动执行。 潜在的触发条件包括流运行状态变化引发的事件,或此类事件的缺失。你可以定义自己的自定义触发器,以基于 Python 代码中定义的自定义事件来触发。 通过 Prefect Cloud,你甚至可以创建 Webhook 来接收数据以供操作使用。 触发后你可以执行的操作包括:
  • 根据现有部署创建流运行
  • 暂停和恢复调度或工作池
  • 发送自定义通知

触发器

触发器指定了执行操作的条件。Prefect UI 包含许多常见条件的模板,例如:
  • 流运行状态更改(流运行标签仅在满足 `OR` 条件时计算)
  • 工作池状态
  • 工作队列状态
  • 部署状态
  • 指标阈值,例如平均持续时间、延迟或完成百分比
  • 自定义事件触发器
重要的是,你不仅可以配置响应事件的触发器,还可以预防性地配置触发器:针对预期事件的缺失。 在 Prefect Cloud 中配置自动化触发器。 例如,对于流运行状态更改触发器,你可能预期生产环境的流在 30 分钟内完成。但短暂的基础设施或网络问题可能导致流“卡”在运行状态。触发器可以在流处于运行状态超过 30 分钟时启动操作。 该操作可以直接作用于流本身,例如取消或重启。或者,该操作可以采取通知的形式,以便人工进行补救。你也可以设置在触发时同时执行这两个操作。

操作

操作指定了当满足触发条件时自动化应执行的任务。目前的操作类型包括:
操作类型
取消流运行cancel-flow-run
更改流运行的状态change-flow-run-state
挂起流运行suspend-flow-run
恢复流运行resume-flow-run
运行部署run-deployment
暂停部署调度pause-deployment
恢复部署调度resume-deployment
暂停工作池pause-work-pool
恢复工作池resume-work-pool
暂停工作队列pause-work-queue
恢复工作队列resume-work-queue
暂停自动化pause-automation
恢复自动化resume-automation
发送通知send-notification
调用 Webhookcall-webhook
Configuring an action for an automation in Prefect Cloud.

选定和推断的操作目标

有些操作要求你选择操作目标,或指定操作目标应由系统自动推断。选定目标简单且适用于你明确知道操作对象的情况。例如,针对某个清理流或特定的通知。 推断目标则是从触发器本身推导出来的。 例如,如果触发器基于卡在运行状态的流运行,且操作是取消一个推断的流运行,那么它取消的就是导致触发器激发的那个流运行。 同样,如果触发器基于工作队列事件,且对应的操作是暂停推断的工作队列,那么该推断的工作队列就是发出该事件的那个队列。 Prefect 会尽可能推断相关事件,但有时并不存在相关事件。 为自动化指定名称(可选描述)。

跟踪自动化操作

当自动化触发时,它会发出事件,你可以使用这些事件来跟踪发生了什么:
  • `prefect.automation.triggered` 或 `prefect.automation.resolved` - 当满足触发条件时发出
  • `prefect.automation.action.triggered` - 当操作开始时发出
  • `prefect.automation.action.executed` 或 `prefect.automation.action.failed` - 当操作完成时发出
操作事件包含关联资源,可链接回其源事件:
关联资源角色描述
triggering-event导致自动化触发的原始事件
automation-triggered-event导致执行操作的 `automation.triggered` 或 `automation.resolved` 事件
这些链接有助于你从操作失败回溯到引发它的特定触发器和原始事件。

使用自动化发送通知

自动化支持通过任何已配置且有能力发送消息的预定义 Block 发送通知,包括:
  • 发送 Slack 频道消息
  • 发送 Microsoft Teams 频道消息
  • 发送邮件到电子邮箱地址
在 Prefect Cloud 中配置自动化通知。 有关自定义通知有效载荷,请参阅自定义通知指南

使用 Jinja 进行模板化

你可以通过 Jinja 语法在自动化操作中使用模板变量。模板变量使你能够动态包含自动化触发器的详细信息,例如流名称或池名称。 Jinja 模板变量语法将变量名包裹在双大括号中,例如:`{{ variable }}`。 你可以访问底层流运行对象的属性,包括: 除了其原生属性外,每个对象还包含 `id` 以及 `created` 和 `updated` 时间戳。 `flow_run|ui_url` 令牌返回在 UI 中查看流运行的 URL。 以下是一个关于基于流运行状态通知的示例:
Flow run {{ flow_run.name }} entered state {{ flow_run.state.name }}.

    Timestamp: {{ flow_run.state.timestamp }}
    Flow ID: {{ flow_run.flow_id }}
    Flow Run ID: {{ flow_run.id }}
    State message: {{ flow_run.state.message }}
生成的 Slack Webhook 通知大致如下所示: 在 Prefect Cloud 中配置自动化通知。 你可以包含 `flow` 和 `deployment` 属性:
Flow run {{ flow_run.name }} for flow {{ flow.name }}
entered state {{ flow_run.state.name }}
with message {{ flow_run.state.message }}

Flow tags: {{ flow_run.tags }}
Deployment name: {{ deployment.name }}
Deployment version: {{ deployment.version }}
Deployment parameters: {{ deployment.parameters }}
报告工作池状态的自动化可以使用 `work_pool` 属性来包含通知。
Work pool status alert!

Name: {{ work_pool.name }}
Last polled: {{ work_pool.last_polled }}
除了流、部署和工作池的这些快捷方式外,你还可以访问自动化本身以及触发自动化的事件。有关更多详细信息,请参阅 Automations API
Automation: {{ automation.name }}
Description: {{ automation.description }}

Event: {{ event.id }}
Resource:
{% for label, value in event.resource %}
{{ label }}: {{ value }}
{% endfor %}
Related Resources:
{% for related in event.related %}
    Role: {{ related.role }}
    {% for label, value in related %}
    {{ label }}: {{ value }}
    {% endfor %}
{% endfor %}
请注意,此示例还展示了在模板化通知时使用 Jinja 功能(如迭代器和 for 循环控制结构)的能力。 关于将上游流运行的参数传递给由自动化调用的流运行这一常见用例,请参阅将参数传递给流运行指南。

扩展阅读

  • 要了解有关可能触发自动化的 Prefect 事件的更多信息,请参阅事件文档
  • 请参阅 Webhooks 指南,了解如何创建 Webhook 并接收外部事件。