跳到主要内容
版本:Next

在工作流中进行状态检查

在工作流中,状态检查可对外部系统(比如业务应用系统、监控系统)执行指定的操作来获得系统的状态,并当检查到系统不健康时可以自动地终止工作流,其概念类似于 Kubernetes 中的 Container Probes。本文介绍如何通过 YAML 的方式在工作流中进行状态检查。

备注

当前 StatusCheck 节点还不支持在 Dashboard 上创建,只能通过 YAML 方式进行创建。

状态检查类型​

目前,只支持 HTTP 一种方法来进行状态检查。

定义一个 HTTP 类型的 StatusCheck 节点​

StatusCheck 节点支持对指定的 URL 执行 HTTP GET 或 POST 请求,可携带自定义的 HTTP headers 和 body,并通过 criteria 中的条件来判断请求是否成功。

- name: workflow-status-check
templateType: StatusCheck
deadline: 20s
statusCheck:
mode: Continuous
type: HTTP
intervalSeconds: 1
timeoutSeconds: 1
http:
url: http://123.123.123.123
method: GET
criteria:
statusCode: '200'

在这个配置文件中,可以看到定义了一个 HTTP 类型的 StatusCheck 节点。deadline 字段指定了该节点最多执行 20 秒。mode 字段指定了该 StatusCheck 节点会持续性的执行状态检查。intervalSeconds 字段指定了重复间隔为 1 秒。timeoutSeconds 字段指定了每次执行的超时时间。

当工作流运行到这个节点时,每隔 1 秒会执行一次指定的状态检查行为:使用 GET 方法向 http://123.123.123.123 这个 URL 进行 HTTP 请求,如果该请求在 1 秒内响应,且状态码为 200,则此次执行成功,反之失败。

检查结果​

每次执行状态检查都将获得一个“执行结果”,Success(成功)或 Failure(失败)。因为单次“执行结果”可能受某些条件波动的影响,并不能反映系统的真实情况,所以最终的“状态检查结果”并不由单次的“执行结果”来决定。

StatusCheck 节点中有 failureThreshold(失败阈值) 和 successThreshold(成功阈值) 两个字段:

  • 当出现连续的失败“执行结果”次数超过失败阈值时,则认为“状态检查结果”为失败。
  • 当出现连续的成功“执行结果”次数超过成功阈值时,则认为“状态检查结果”为成功。
- name: workflow-status-check
templateType: StatusCheck
deadline: 20s
statusCheck:
mode: Continuous
type: HTTP
successThreshold: 1
failureThreshold: 3
http:
url: http://123.123.123.123
method: GET
criteria:
statusCode: '200'

在这个配置文件中,StatusCheck 节点会持续性地执行状态检查:

  • 当出现连续 1 次及以上“执行结果”为“成功”时,认为“状态检查结果”为成功
  • 当出现连续 3 次及以上“执行结果”为“失败”时,认为“状态检查结果”为失败
备注

下文中,当提到“状态检查失败”时,都指的是“状态检查结果”为失败,而不是单次的“执行结果”为失败。

当状态检查不成功时,终止工作流​

备注

目前,StatusCheck 节点只支持当状态检查失败时,自动终止工作流。不支持暂停工作流和恢复工作流的功能。

当执行混沌实验时,应用系统可能会变得“不健康”,这时你可以通过快速结束混沌实验来恢复应用系统。在 StatusCheck 节点上将 abortWithStatusCheck 字段设置为 true,那么当状态检查失败时,就会自动的终止工作流。

- name: workflow-status-check
templateType: StatusCheck
deadline: 20s
abortWithStatusCheck: true
statusCheck:
mode: Continuous
type: HTTP
http:
url: http://123.123.123.123
method: GET
criteria:
statusCode: '200'

当符合以下任意条件时,就认为是状态检查不成功:

  • 状态检查失败
  • 当达到 StatusCheck节点超时时间时,状态检查结果不是“成功”。比如 successThreshold 为 1,failureThreshold 为 3,而当达到超时时间时,当前连续出现 2 次失败,0 次成功,虽然不符合状态检查失败的条件,但在这种情况下也被认为状态检查不成功。

执行模式​

持续性的状态检查​

当 mode 字段为 Continuous 时,代表这个 StatusCheck 节点会持续性地执行状态检查,直到节点超时退出或者状态检查失败。

- name: workflow-status-check
templateType: StatusCheck
deadline: 20s
statusCheck:
mode: Continuous
type: HTTP
intervalSeconds: 1
successThreshold: 1
failureThreshold: 3
http:
url: http://123.123.123.123
method: GET
criteria:
statusCode: '200'

在这个配置文件中,StatusCheck 节点每隔 1 秒会执行一次状态检查,当符合以下任意条件时退出:

  • 状态检查失败,即出现连续 3 次及以上失败的“执行结果”
  • 20 秒后触发节点超时

一次性的状态检查​

当 mode 字段为 Synchronous 时,代表这个 StatusCheck 节点会在明确状态检查结果时立即退出,或当节点超时时退出。

- name: workflow-status-check
templateType: StatusCheck
deadline: 20s
statusCheck:
mode: Synchronous
type: HTTP
intervalSeconds: 1
successThreshold: 1
failureThreshold: 3
http:
url: http://123.123.123.123
method: GET
criteria:
statusCode: '200'

在这个配置文件中,StatusCheck 节点每隔 1 秒会执行一次状态检查,当符合以下任意条件时退出:

  • 状态检查成功,即出现连续 1 次及以上成功的“执行结果”
  • 状态检查失败,即出现连续 3 次及以上失败的“执行结果”
  • 20 秒后触发节点超时

Status Check vs HTTP Request Task​

相同点:

  • StatusCheck 节点和 HTTP Request Task 节点(用来执行 HTTP 请求的 Task 节点)都属于工作流的一种节点类型
  • StatusCheck 节点和 HTTP Request Task 节点都可以通过 HTTP 请求来获得外部系统的信息

不同点:

  • HTTP Request Task 节点只能发送一次请求,而不能持续性的发送请求
  • HTTP Request Task 节点在请求失败时,无法对工作流的执行状态产生影响(比如终止工作流)

字段说明​

Workflow 和 Template 字段说明参考创建 Chaos Mesh 工作流。

StatusCheck 字段说明​

参数类型说明默认值是否必填示例
modestring状态检查的模式,可选值有:Synchronous/Continuous。无是Synchronous
typestring状态检查的类型,可选值有:HTTP。HTTP是HTTP
durationstring当失败的执行次数小于 failureThreshold 时状态检查的持续时间。对于 Synchronous 和 Continuous 模式的状态检查都适用。无否100s
timeoutSecondsint状态检查单次执行的超时秒数。1否1
intervalSecondsint状态检查的间隔时间(秒)。10否1
failureThresholdint决定状态检查失败的最小连续失败次数。3否3
successThresholdint决定状态检查成功的最小连续成功次数。1否1
recordsHistoryLimitint保存历史执行记录的条数。100否100
httpHTTPStatusCheck配置执行 HTTP 请求的具体细节。无否

HTTPStatusCheck 字段说明​

参数类型说明默认值是否必填示例
urlstringHTTP 请求的 URL。无是http://123.123.123.123
methodstringHTTP 请求的方法,可选值有:GET/POST。GET否GET
headersmap[string][]stringHTTP 请求的请求头。无否
bodystringHTTP 请求的请求体。无否{"a":"b"}
criteriaHTTPCriteria定义如何判断 HTTP StatusCheck 执行的结果。无是

HTTPCriteria 字段说明​

参数类型说明默认值是否必填示例
statusCodestringHTTP 请求预期的状态码。取值可以是单一的数字(比如 200),或者也可以是一个范围(比如 200-400,这里,200 和 400 都被包括在范围内)。无是200