排查失败 Canary 的问题 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

排查失败 Canary 的问题

如果您的 Canary 失败,请检查以下内容以排查问题。

一般 排查

  • 使用 Canary 详细信息页面查找更多信息。在 CloudWatch 控制台中,选择导航窗格中的 Canaries,然后选择 Canary 的名称以打开 Canary 详细信息页。在 Availability(可用性)选项卡上,选中 SuccessPercent 指标以查看问题是经常性问题还是间歇性问题。

    仍在 Availability(可用性)选项卡上时,选择失败的数据点以查看该失败运行的屏幕截图、日志和步骤报告(如可用)。

    如果步骤报告可用(因为步骤是脚本的一部分),请检查以查明失败的步骤,并查看相关屏幕截图以查看客户看到的问题。

    您还可以检查 HAR 文件以了解是否有一个或多个请求失败。您可以使用日志对失败的请求和错误进行深入分析。最后,您可以将这些构件与成功的 Canary 运行中的构件进行比较,以确定问题。

    预设情况下,CloudWatch Synthetics 会捕获 UI Canary 中每个步骤的屏幕截图。但您的脚本可能会配置为禁用屏幕截图。在调试期间,您可能希望再次启用屏幕截图。同样,对于 API Canary,您可能希望在调试过程中查看 HTTP 请求和响应标头和响应体。有关如何将此数据包括在报告中,请参阅 executeHttpStep(stepName, requestOptions, [callback], [stepConfig])

  • 如果您最近对应用程序做出了部署,请执行回滚操作,然后稍后进行调试。

  • 手动连接到端点,看看是否会重现相同问题。

Canary 运行时版本升级和降级问题

如果您最近将 Canary 的运行时版本从 syn-1.0 升级到更高版本,则可能是跨域请求共享 (CORS) 问题。有关更多信息,请参阅 跨域请求共享 (CORS) 问题

如果您最近将 Canary 运行时版本降级到较旧版本,请检查以确保您正在使用的 CloudWatch Synthetics 函数在您降级到的旧运行时版本中可用。例如,executeHttpStep 函数可用于 syn-nodejs-2.2 或更高版本的运行时。要检查函数的可用性,请参阅 编写 Canary 脚本

注意

当您计划升级或降级 Canary 的运行时版本时,我们建议您首先克隆 Canary 并更新克隆 Canary 中的运行时版本。在验证了使用新运行时版本的克隆 Canary 正常运行后,您可以更新原始 Canary 的运行时版本并删除克隆 Canary。

等待元素出现

分析日志和屏幕截图后,如果您发现脚本正在等待某个元素出现在屏幕上并超时,请检查相关的屏幕截图以查看该元素是否出现在页面上。验证 xpath 以确保该元素的准确性。

对于与 Puppeteer 相关的问题,请参阅 Puppeteer 的 GitHub 页面或 Internet 论坛。

节点不可见或不是用于 page.click() 的 HTMLElement

如果节点不可见或不是用于 page.click()HTMLElement,请首先验证您正在用于单击元素的 xpath。另外,如果您的元素位于屏幕底部,请调整视区。预设情况下,CloudWatch Synthetics 采用的视区为 1920 * 1080。您可以在启动浏览器时或使用 Puppeteer 函数 page.setViewport 另行设置视区。

无法将构件上载到 S3,“异常:无法获取 S3 存储桶位置:访问被拒绝”

如果您的 Canary 因 Amazon S3 错误而失败,CloudWatch Synthetics 无法上传屏幕截图、日志或因权限问题为 Canary 创建的报告。请检查以下事项:

  • 检查 Canary 的 IAM 角色是否具有 s3:ListAllMyBuckets 权限、对正确的 Amazon S3 存储桶的 s3:GetBucketLocation 权限,以及对 Canary 存储其构件的存储桶的 s3:PutObject 权限。如果 Canary 执行可视化监控,该角色还需要存储桶的 s3:GetObject 权限。

  • 如果 Canary 使用 Amazon KMS 客户托管式密钥而不是标准 Amazon 托管式密钥(默认)来加密,Canary 的 IAM 角色可能没有使用该密钥加密或解密的权限。有关更多信息,请参阅 加密 Canary 构件

  • 您的存储桶策略可能不允许 Canary 使用的加密机制。例如,如果您的存储桶策略要求使用特定的加密机制或 KMS 密钥,则必须为 Canary 选择相同的加密模式。

如果 Canary 执行可视化监控,请参阅 使用可视化监控时更新构件位置和加密 了解更多信息。

“错误:协议错误 (Runtime.callFunctionOn):目标已关闭。”

如果在页面或浏览器关闭后还有一些网络请求,则会出现此错误。您可能忘记了等待异步操作。执行脚本后,CloudWatch Synthetics 会关闭浏览器。关闭浏览器后执行任何异步操作可能会导致 target closed error 错误。

“Canary 失败。错误:无数据点 – Canary 显示超时”错误

此错误指 Canary 运行超过了超时时间。Canary 执行在 CloudWatch Synthetics 发布成功率 CloudWatch 指标或更新构件(如 HAR 文件、日志和屏幕截图)前已经停止。如果超时时间太低,您可以将其提高。

预设情况下,Canary 的超时值等于其频率。您可以手动将超时值调整为小于或等于 Canary 频率。如果 Canary 频率较低,则必须增加频率以提高超时时间。在使用 CloudWatch Synthetics 控制台创建或更新 canary 时,您可以在 Schedule(计划)下调整频率和超时值。

请确保 canary 超时值不要短于 15 秒钟,以预留 Lambda 冷启动以及启动 canary 工具的时间。

发生此错误时,无法在 CloudWatch Synthetics 控制台中查看 Canary 构件。您可以使用 CloudWatch Logs 查看 Canary 的日志。

使用 CloudWatch Logs 查看 Canary 的日志

  1. 访问 https://console.aws.amazon.com/cloudwatch/,打开 CloudWatch 控制台。

  2. 在左侧导航窗格中,选择 Log groups(日志组)

  3. 在筛选器框中键入 Canary 名称来查找日志组。Canary 的日志组名称为 /aws/lambda/cwsyn-canaryName-randomId

尝试访问内部端点

如果希望您的 Canary 访问内部网络上的端点,我们建议您将 CloudWatch Synthetics 设置为使用 VPC。有关更多信息,请参阅 在 VPC 上运行 Canary

跨域请求共享 (CORS) 问题

在 UI Canary 中,如果某些网络请求失败并显示 403net::ERR_FAILED 错误,请检查 Canary 是否启用了活动跟踪,并使用 Puppeteer 函数 page.setExtraHTTPHeaders 添加标头。若是如此,则网络请求失败可能是由跨域请求共享 (CORS) 限制所致。您可以通过禁用活动跟踪或删除额外的 HTTP 标头来确认是否属于这种情况。

为什么会发生这种情况?

在使用活动跟踪时,会向所有传出请求添加额外的标头以跟踪调用。通过使用 Puppeteer 的 page.setExtraHTTPHeaders 来添加跟踪标头或添加额外标头的方式来修改请求标头,会导致对 XMLHttpRequest (XHR) 请求进行 CORS 检查。

如果您不想禁用活动跟踪或删除额外标头,则可以更新 Web 应用程序以允许跨域访问,也可以在脚本中启动 Chrome 浏览器时使用 disable-web-security 标志来禁用 Web 安全。

您可以覆盖 CloudWatch Synthetics 所用的启动参数,并通过使用 CloudWatch Synthetics 启动函数传递其他 disable-web-security 标记参数。有关更多信息,请参阅 可用于 Node.js Canary 脚本的库函数

注意

如果您使用的是 syn-nodejs-2.1 或更高运行时版本,则可以覆盖 CloudWatch Synthetics 所用的启动参数。