问题排查

如果您在使用工作流时遇到问题,请了解一些可帮助进行问题排查的策略。

部署错误

部署工作流后,Workflows 会检查源代码是否正确无误,并符合语言语法。 如果发现错误,Workflows 会返回该错误。最常见的部署错误类型包括:

  • 引用未定义的变量、步骤或子工作流
  • 语法不正确
    • 缩进不正确
    • {}"-: 缺失或无关紧要

例如,以下源代码抛出部署错误,因为返回语句引用了未定义的变量 varC

- step1:
    assign:
    - varA: "Hello"
    - varB: "World"
- step2:
    return: ${varC + varB}

此错误源代码将用于以下 Google Cloud Console 和 Cloud SDK 示例。

控制台

发生部署错误时,Workflows 会在工作流的源代码上方以红色横幅显示错误消息:

部署错误

错误消息会标记源代码中的问题,尽可能指定错误来源:

Could not deploy workflow: failed to build: error in step step2: error
evaluating return value: symbol 'varC' is neither a variable nor a
sub-workflow name (Code: 3)

gcloud

运行 gcloud workflows deploy 命令时,如果部署失败,Workflows 会向命令行返回错误消息。错误消息会标记源代码中的问题,尽可能指定错误来源:

ERROR: (gcloud.workflows.deploy) [INVALID_ARGUMENT] failed to build:
error in step step2: error evaluating return value: symbol 'varC' is neither
a variable nor a sub-workflow name

如需解决此问题,请修改工作流的源代码。在这种情况下,请参阅 varA 而不是 varC

包含英文冒号的表达式

在 YAML 中,当英文冒号被解读为定义某个映射时,包含英文冒号的表达式可能会导致意外行为。虽然可以部署和执行工作流,但它不会按预期输出。

如果使用 Google Cloud Console 创建工作流,则无法在 Cloud Console 中直观呈现工作流,您可能会收到如下所示的警告:

工作流创建警告

要解决此问题,您可以使用英文单引号将 YAML 表达式括起来:

推荐: '${"a: " +string(a)}'

不推荐: ${"a: " +string(a)}

访问工作流部署和删除日志

您可以在 Cloud Console 中访问与工作流的部署和删除相关的错误日志。

  1. 转到 Cloud Console 中的 Workflows 页面:
    转到“Workflows”

  2. 点击工作流的名称以显示其工作流详情页面。

  3. 点击日志标签页。

  4. 要按严重性过滤日志,请在默认列表中选择要显示的日志类型。

访问工作流执行结果

您可以通过 Cloud Console 或使用 Cloud SDK 来访问工作流执行结果。

控制台

  1. 转到 Cloud Console 中的 Workflows 页面:
    转到“Workflows”

  2. 如需访问工作流的执行结果,请点击工作流的名称以转到其详情页面。

  3. 如需详细了解特定执行,请点击列表中的执行 ID。每个执行都包含以下信息:

    • 执行状态:指出工作流的结束状态。
    • 执行开始:执行开始时间。
    • 执行结束:执行结束时间。
    • 执行时长:经过的总时间。这可能表示网络错误或连接问题。
    • 输出:工作流的输出。如果执行失败,则包含导致执行失败的异常。如需了解详情,请参阅执行错误消息部分。
    • 输入:传递给工作流的运行时参数(如果有的话)。
  4. 如需查看工作流的所有执行日志,请点击日志以打开日志标签页。

  5. 如需过滤执行日志,请使用位于表格顶部的过滤条件字段。例如,如果只想显示失败的执行尝试,请在过滤条件的文本字段中输入 failed

    过滤执行日志

gcloud

  1. 如需查看工作流执行的完整列表,请输入以下命令:

    gcloud workflows executions list WORKFLOW-NAME
    

    WORKFLOW-NAME 替换为您的工作流的名称。 复制您感兴趣的执行的 ID。

  2. 如需查看工作流的执行日志,请输入以下命令:

    gcloud workflows executions describe \
    --workflow=WORKFLOW-NAME \
    EXECUTION-ID
    

    替换以下内容:

    • WORKFLOW-NAME:工作流的名称
    • EXECUTION-ID:执行的唯一 ID。

该命令会返回类似于以下内容的输出:

argument: '{"message":"I love it so much!"}'
endTime: '2020-07-21T17:48:16.438109757Z'
error: 'in step "sentimentCheck": {"message":"KeyError: key not found: messaage","tags":["KeyError","LookupError"]}'
name: projects/********/locations/us-central1/workflows/sentimentCheck/executions/e8103c53-72ba-4af7-8996-f5a8337c2a7
startTime: '2020-10-12T17:48:16.342177302Z'
state: FAILED
workflowRevisionId: '000009-e6d'

输出会包含以下信息:

  • argument:传递给工作流的运行时参数(如果有的话)。
  • endTime:执行结束时间。
  • error:在导致执行失败的异常中抛出的错误消息。
  • name:执行的完整名称,包括项目的名称、工作流的位置、工作流的名称以及执行 ID。
  • startTime:执行开始时间。
  • state:指出工作流的结束状态。
  • workflowRevisionID:执行时的当前修订版本。

执行错误消息

如果在执行期间工作流在try/except 块中抛出,但执行失败,则系统会返回描述该错误的映射。

在工作流执行期间抛出的错误包含标记,以帮助您确定错误的原因。下表介绍了不同错误标记的含义。

错误标记 说明
TypeError 在将操作或函数应用于不兼容类型的对象时引发。关联值是一个字符串,提供类型不匹配的详细信息。
ValueError 当操作或函数收到的参数具有正确的类型但值不正确,并且该情况没有一个更精确的异常(例如 IndexError)进行说明时,就会引发该错误。
IndexError 当序列子脚本超出范围整数时会引发该错误。
KeyError 在现有键集中找到字典键时会引发该错误。
RecursionError 解释器检测到超出递归深度上限时会引发该错误。
ZeroDivisionError 当除法或取模运算的第二个参数为零时会引发该错误。关联值是一个字符串,指出操作数和运算的类型。
SystemError 当解释器发现内部错误时会引发该错误。
TimeoutError 当系统函数在系统级别超时时会引发该错误。
ResourceLimitError 资源利用率达到上限时会引发该错误。在内部引发该错误时,无法捕获此类型的错误,从而导致立即执行失败。
HttpError HTTP 请求失败并显示 HTTP 错误状态时会引发该错误。引发此异常时,响应是包含以下元素的字典:
  • message - 人类可读的错误消息
  • codeHTTP 响应状态代码。
  • headers—响应标头
  • body—响应正文

您还可以使用 语法raise引发自定义异常。

检查长时间运行的执行操作的状态

您可以使用多个命令来帮助检查工作流执行的状态。

  • 如需检索工作流的执行尝试及其 ID 列表,请输入以下命令:

    gcloud workflows executions list WORKFLOW_NAME
    

    WORKFLOW_NAME 替换为工作流的名称。

  • 如需检查执行尝试的状态并等待尝试完成,请输入以下命令:

    gcloud workflows executions wait EXECUTION_ID
    

    EXECUTION_ID 替换为执行尝试的 ID。

    该命令会等到执行尝试完成后,再返回结果。

  • 如需检查最后一次执行尝试的状态,请输入以下命令:

    gcloud workflows executions wait-last
    

    如果您在同一个 gcloud 会话中进行了先前的执行尝试,该命令将等到前一个执行尝试完成后,再返回结果。如果前一个尝试不存在,gcloud 将返回以下错误:

    ERROR: (gcloud.workflows.executions.wait-last) [NOT FOUND] There are no cached executions available.
    
  • 如需获取最后一次完成的执行的状态,请输入以下命令:

    gcloud workflows executions describe-last
    

    如果您在同一个 gcloud 会话中进行了先前的执行尝试,该命令会返回最后一次完成的执行的结果。如果前一个尝试不存在,gcloud 将返回以下错误:

    ERROR: (gcloud.beta.workflows.executions.describe-last) [NOT FOUND] There are no cached executions available.
    

将日志发送到 Cloud Logging

Workflows 会自动为 Cloud Logging 中的工作流执行生成执行日志

您还可以启用调用日志记录。或者,您可以创建使用来源中的 sys.log 函数的自定义日志。使用调用日志记录和自定义日志,您可以控制在工作流执行期间日志发送到 Logging 的时间,并且在调试工作流时尤其有用。

如需了解详情(包括 engine_callexecutions_system 日志记录 proto 文件),请参阅此 GitHub 代码库

执行日志

每个工作流执行都至少会自动触发两个执行日志:一个在执行开始时,一个在执行结束时。

如需详细了解 Logging 中提供的 Workflows 平台日志,请参阅 Google Cloud Platform 日志

调用日志记录

您可以设置标志,以便记录工作流执行期间的每个调用步骤,以及返回步骤名称、函数名称、函数参数和调用响应。或者,您可以记录停止调用的任何异常。

系统只会记录明确的调用步骤;例如,对子工作流或库函数的调用。系统不会记录在表达式或标准库函数(例如,sys.log 中的 http.post)内以及连接器内的调用。

您可以使用 Google Cloud Console 或 gcloud 命令行工具来应用调用日志记录。

控制台

  1. 转到 Google Cloud Console 中的“工作流”页面:
    转到“Workflows”

  2. 在 Workflows 页面上,选择一个工作流以转到其详情页面。

  3. 工作流详细信息页面上,选择 执行

  4. (可选)在执行工作流页面上,您可以指定要在工作流执行期间应用的调用日志记录级别。

    记录调用下拉列表中,选择以下选项之一:

    • none:无调用日志记录。这是默认级别。
    • log-all-calls:记录对子工作流或库函数及其调用的所有调用。
    • log-errors-only:仅在调用因异常而停止时记录。
  5. 点击执行

gcloud

如需执行工作流并等待执行完成,请输入以下命令:

gcloud workflows run WORKFLOW_NAME \
    --call-log-level=CALL_LOGGING_LEVEL \
    --data=DATA

如需执行工作流而不等待执行尝试完成,请输入以下命令:

gcloud workflows execute WORKFLOW_NAME \
    --call-log-level=CALL_LOGGING_LEVEL \
    --data=DATA

替换以下内容:

  • WORKFLOW_NAME:工作流的名称。
  • CALL_LOGGING_LEVEL:可选。在执行期间应用的调用日志记录级别。可以是以下之一:
    • none:无调用日志记录。这是默认级别。
    • log-all-calls:记录对子工作流或库函数及其调用的所有调用。
    • log-errors-only:仅在调用因异常而停止时记录。
  • DATA:可选。您的工作流的运行时参数,其采用 JSON 格式。

自定义日志

如需在工作流执行期间在 Logging 中创建日志条目,请在工作流中定义调用 sys.log 函数的步骤:

YAML

  - step1:
      assign:
          - varA: "Hello"
          - varB: "World"
  - logStep:
      call: sys.log
      args:
          text: TEXT
          severity: SEVERITY 
  - step2:
      return: ${varA + " " + varB}
    

JSON

    [
      {
        "step1": {
          "assign": [
            {
              "varA": "Hello"
            },
            {
              "varB": "World"
            }
          ]
        }
      },
      {
        "logStep": {
          "call": "sys.log",
          "args": {
            "text": "TEXT",
            "severity": "SEVERITY"
          }
        }
      },
      {
        "step2": {
          "return": "${varA + " " + varB}"
        }
      }
    ]
      

创建日志条目时,请定义以下内容:

  • TEXT:必填。要记录的文本。如果需要记录映射的值,请使用 ${json.encode_to_string(myMap)}
  • SEVERITY:可选。日志条目的严重级别。例如 INFOWARNINGCRITICAL

如需了解详情,请参阅 sys.log 函数参考文档

所需权限

如需应用调用日志记录或将自定义日志发送到 Logging,工作流必须与具有 logging.logEntries.create 权限的服务帐号相关联(例如 roles/logging.logWriter 角色)。如果您需要更改与您的工作流一起更新的服务帐号,请参阅更新工作流。如需详细了解如何创建服务帐号并分配角色,请参阅管理对项目、文件夹和组织的访问权限

查看工作流日志

您可以在 Workflows 或 Logging 中查看日志。如需查看单个工作流的日志,请使用 Workflows 中的日志标签页。如需获取所有工作流的日志的汇总视图,请使用 Logging 中的日志浏览器页面。

在 Workflows 中查看日志

如需在 Workflows 中查看工作流的日志,请执行以下操作:

  1. 转到 Cloud Console 中的 Workflows 页面:
    转到“Workflows”

  2. 如需访问工作流的日志,请点击工作流的名称以转到其详情页面。

  3. 如需查看日志,请点击日志

  4. 要按严重性过滤日志,请在默认列表中选择要显示的日志类型。默认情况下,系统会显示所有严重程度的日志。

工作流详情页面上的日志标签页会显示以下类型的日志:

  • 发送到 Logging 的日志

  • 对工作流执行的任何操作(例如更新工作流定义)的审核日志

在 Logging 中查看日志

如需在 Logging 中查看日志,请执行以下操作:

  1. 转到 Cloud Console 中的日志浏览器页面:
    转到日志浏览器

  2. 查询构建器中,点击资源并输入 workflow。从列表中选择 Cloud 工作流,然后点击添加

    工作流日志记录

  3. 点击运行查询

如需详细了解如何在 Logging 查看日志,请参阅使用日志浏览器