排查失败金丝雀的问题
如果您的金丝雀失败,请检查以下内容以排查问题。
一般故障排除
-
使用金丝雀详细信息页面查找更多信息。在 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 页面
节点不可见或不是用于 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 查看金丝雀的日志
通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/
。 在左侧导航窗格中,选择 Log groups(日志组)。
在筛选器框中键入金丝雀名称来查找日志组。金丝雀的日志组名称为 /aws/lambda/cwsyn-
canaryName
-randomId。
尝试访问内部端点
如果希望您的金丝雀访问内部网络上的端点,我们建议您将 CloudWatch Synthetics 设置为使用 VPC。有关更多信息,请参阅在 VPC 上运行金丝雀。
跨域请求共享 (CORS) 问题
在 UI 金丝雀中,如果某些网络请求失败并显示 403
或 net::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 所用的启动参数。