问题排查

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

排查部署错误

部署工作流后,工作流会检查源代码是否正确无误,并且与语言语法是否匹配。工作流会返回发现的错误。最常见的部署错误包括:

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

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

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

以下来源代码将用于以下 Cloud Console 和 Cloud SDK 示例。

控制台

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

部署错误

此错误消息会标记源代码中的问题,指定错误源自何处:

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 命令时,如果部署失败,则工作流会向命令行返回错误消息。此错误消息会标记源代码中的问题,指定错误源自何处:

ERROR: (gcloud.beta.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

修改此工作流的源代码以解决问题。在这种情况下,请更新对 varC 的引用,改为引用 varA

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

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

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

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

  3. 选择日志标签页。

  4. 如需按严重性过滤日志,请选择默认下拉列表,然后选择要显示的日志的错误类型。

访问工作流执行结果

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

控制台

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

  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 错误状态时会引发该错误。引发该异常时,响应将是包含以下元素的字典:
* 消息 - 人类可读的错误消息 * 代码 - HTTP 响应状态代码 * 标头 - 响应标头 * 正文 - 响应正文

您还可以使用 raise: 语法引发自定义异常。请注意,用户定义的异常可覆盖现有错误字典中的元素。

将日志发送到 Cloud Logging

工作流不会自动为 Cloud Logging 中的工作流执行生成日志。您可以改为控制在工作流执行期间将日志发送到 Logging 的时间。您选择发送到 Logging 的日志称为“自定义日志”

日志记录所需的权限

如需将自定义日志发送到 Logging,工作流必须与具有 roles/logging.logWriter 角色的服务帐号相关联。如果您需要更改服务帐号以更新您的工作流,请参阅更新工作流。如需详细了解如何创建服务帐号和分配角色,请参阅授予、更改和撤消对资源的访问权限

执行期间创建日志条目

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

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

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

  • TEXT:必填。要记录的文本。如果您需要记录字典的值,请使用 ${json.encode_to_string(myDictionary)}
  • SEVERITY:可选。日志条目的严重级别。例如 INFOWARNINGCRITICAL。如需查看严重级别的完整列表,请参阅 Logging 参考文档

查看自定义工作流日志

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

查看工作流中的日志

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

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

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

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

  4. 如需按严重性过滤日志,请点击默认下拉列表,然后选择您要查看的日志的严重性。默认情况下,系统会显示所有严重级别的日志。

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

  • 发送到 Logging 的自定义日志

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

查看 Logging 中的日志

如需查看 Logging 中的自定义日志,请执行以下操作:

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

  2. 查询构建器中,点击资源,输入“workflow”,然后从清单中选取工作流,最后点击添加

    工作流日志记录

  3. 点击运行查询

如需详细了解如何查看 Logging 中的日志,请参阅使用 Logs Explorer