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

排查失败金丝雀的问题

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

一般故障排除

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

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

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

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

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

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

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

金丝雀运行时版本升级和降级问题

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

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

注意

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

等待元素出现

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使用 CloudWatch Logs 查看金丝雀的日志
  1. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

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

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

尝试访问内部端点

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

跨域请求共享 (CORS) 问题

在 UI 金丝雀中,如果某些网络请求失败并显示 403net::ERR_FAILED 错误,请检查金丝雀是否启用了活动跟踪,并使用 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 金丝雀脚本的库函数

注意

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