在工作流中进行状态检查

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

在工作流中进行状态检查 - 图1注意

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

状态检查类型

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

定义一个 HTTP 类型的 StatusCheck 节点

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

  1. - name: workflow-status-check
  2. templateType: StatusCheck
  3. deadline: 20s
  4. statusCheck:
  5. mode: Continuous
  6. type: HTTP
  7. intervalSeconds: 1
  8. timeoutSeconds: 1
  9. http:
  10. url: http://123.123.123.123
  11. method: GET
  12. criteria:
  13. 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(成功阈值) 两个字段:

  • 当出现连续的失败“执行结果”次数超过失败阈值时,则认为“状态检查结果”为失败。当“状态检查结果”为失败时,会直接结束当前 StatusCheck 节点的执行。
  • 当出现连续的成功“执行结果”次数超过成功阈值时,则认为“状态检查结果”为成功。
  1. - name: workflow-status-check
  2. templateType: StatusCheck
  3. deadline: 20s
  4. statusCheck:
  5. mode: Continuous
  6. type: HTTP
  7. successThreshold: 1
  8. failureThreshold: 3
  9. http:
  10. url: http://123.123.123.123
  11. method: GET
  12. criteria:
  13. statusCode: '200'

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

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

在工作流中进行状态检查 - 图2注意

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

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

在工作流中进行状态检查 - 图3注意

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

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

  1. - name: workflow-status-check
  2. templateType: StatusCheck
  3. deadline: 20s
  4. abortWithStatusCheck: true
  5. statusCheck:
  6. mode: Continuous
  7. type: HTTP
  8. http:
  9. url: http://123.123.123.123
  10. method: GET
  11. criteria:
  12. statusCode: '200'

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

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

执行模式

持续性的状态检查

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

  1. - name: workflow-status-check
  2. templateType: StatusCheck
  3. deadline: 20s
  4. statusCheck:
  5. mode: Continuous
  6. type: HTTP
  7. intervalSeconds: 1
  8. successThreshold: 1
  9. failureThreshold: 3
  10. http:
  11. url: http://123.123.123.123
  12. method: GET
  13. criteria:
  14. statusCode: '200'

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

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

一次性的状态检查

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

  1. - name: workflow-status-check
  2. templateType: StatusCheck
  3. deadline: 20s
  4. statusCheck:
  5. mode: Synchronous
  6. type: HTTP
  7. intervalSeconds: 1
  8. successThreshold: 1
  9. failureThreshold: 3
  10. http:
  11. url: http://123.123.123.123
  12. method: GET
  13. criteria:
  14. 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/ContinuousSynchronous
typestring状态检查的类型,可选值有:HTTPHTTPHTTP
durationstring当失败的执行次数小于 failureThreshold 时状态检查的持续时间。对于 SynchronousContinuous 模式的状态检查都适用。100s
timeoutSecondsint状态检查单次执行的超时秒数。11
intervalSecondsint状态检查的间隔时间(秒)。11
failureThresholdint决定状态检查失败的最小连续失败次数。33
successThresholdint决定状态检查成功的最小连续成功次数。11
recordsHistoryLimitint保存历史执行记录的条数。100100
httpHTTPStatusCheck配置执行 HTTP 请求的具体细节。

HTTPStatusCheck 字段说明

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

HTTPCriteria 字段说明

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