云 运行: 500 服务器错误,没有日志输出
Cloud Run: 500 Server Error with no log output
我们正在调查部署的云 运行 服务上的一个问题,向该服务发出的请求偶尔会失败并显示 StatusCodeError: 500
,而上述请求的日志不会出现在云 运行.
服务的请求通常会产生两行日志,详细说明请求、路由和退出代码 (POST 200 on https://service-name.a.run.app/route/...
)
- 日志名称为
projects/XXX/logs/run.googleapis.com/stdout
的日志由我们的应用程序生成,用于记录每个请求的服务
- 云 运行 在每次请求时自动生成日志名称
projects/XXX/logs/run.googleapis.com/requests
的日志
当事件发生时,none 会被记录下来。客户端(运行ning 在同一个项目的 gke pod 中)只有失败请求的日志,包含以下消息:
StatusCodeError: 500 - "\n<html><head>\n<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<title>500 Server Error</title>\n</head>\n<body text=#000000 bgcolor=#ffffff>\n<h1>Error: Server Error</h1>\n<h2>The server encountered an error and could not complete your request.<p>Please try again in 30 seconds.</h2>\n<h2></h2>\n</body></html>\n"
上次事件的大致时间轴:
- 14:41 - 服务正在按预期处理请求,每次都生成两行日志
- 14:44 到 14:56 - 云 运行 日志为空,对服务 (~30) 发出的每个请求都会收到 500 错误消息
- 14:56 - 云 运行 终止了当前 运行ning 容器实例,(例如在一些不活动之后发生的情况),它被应用程序正确记录(
[INFO] Handling signal: term
)
- 14:58 - Cloud 运行 实例化一个新的容器实例并开始处理传入请求(正常记录)
由于事件期间没有日志,因此很难调查其原因,现阶段我们将不胜感激任何线索。
我们的服务还有另一个已知问题,可能相关也可能不相关。该服务旨在避免多个副本,因为单个副本应该能够处理负载并为并发请求提供服务(云 运行 concurency = 80),但冷启动时间相对较长(~30 秒)。当请求激增而没有副本可用时,这会导致 429 错误(因为云 运行 在冷启动期间将并发硬限制为 1)。通过允许一些复制(当前 maxScale = 3),这个问题在一定程度上得到了缓解,因为每个副本都可以在冷启动期间暂停请求,但需要在客户端进行一些工作才能正确处理(冷启动后的简单重试) .
我发现 PIT 描述了上述行为。这似乎是因为 Cloud 运行 的一部分认为已经配置了处理流量的实例,但实际上没有。此问题目前正在内部处理,但目前还没有修复的预计到达时间。
当前的解决方法是将最大实例数至少设置为 4。
我们正在调查部署的云 运行 服务上的一个问题,向该服务发出的请求偶尔会失败并显示 StatusCodeError: 500
,而上述请求的日志不会出现在云 运行.
服务的请求通常会产生两行日志,详细说明请求、路由和退出代码 (POST 200 on https://service-name.a.run.app/route/...
)
- 日志名称为
projects/XXX/logs/run.googleapis.com/stdout
的日志由我们的应用程序生成,用于记录每个请求的服务 - 云 运行 在每次请求时自动生成日志名称
projects/XXX/logs/run.googleapis.com/requests
的日志
当事件发生时,none 会被记录下来。客户端(运行ning 在同一个项目的 gke pod 中)只有失败请求的日志,包含以下消息:
StatusCodeError: 500 - "\n<html><head>\n<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<title>500 Server Error</title>\n</head>\n<body text=#000000 bgcolor=#ffffff>\n<h1>Error: Server Error</h1>\n<h2>The server encountered an error and could not complete your request.<p>Please try again in 30 seconds.</h2>\n<h2></h2>\n</body></html>\n"
上次事件的大致时间轴:
- 14:41 - 服务正在按预期处理请求,每次都生成两行日志
- 14:44 到 14:56 - 云 运行 日志为空,对服务 (~30) 发出的每个请求都会收到 500 错误消息
- 14:56 - 云 运行 终止了当前 运行ning 容器实例,(例如在一些不活动之后发生的情况),它被应用程序正确记录(
[INFO] Handling signal: term
) - 14:58 - Cloud 运行 实例化一个新的容器实例并开始处理传入请求(正常记录)
由于事件期间没有日志,因此很难调查其原因,现阶段我们将不胜感激任何线索。
我们的服务还有另一个已知问题,可能相关也可能不相关。该服务旨在避免多个副本,因为单个副本应该能够处理负载并为并发请求提供服务(云 运行 concurency = 80),但冷启动时间相对较长(~30 秒)。当请求激增而没有副本可用时,这会导致 429 错误(因为云 运行 在冷启动期间将并发硬限制为 1)。通过允许一些复制(当前 maxScale = 3),这个问题在一定程度上得到了缓解,因为每个副本都可以在冷启动期间暂停请求,但需要在客户端进行一些工作才能正确处理(冷启动后的简单重试) .
我发现 PIT 描述了上述行为。这似乎是因为 Cloud 运行 的一部分认为已经配置了处理流量的实例,但实际上没有。此问题目前正在内部处理,但目前还没有修复的预计到达时间。
当前的解决方法是将最大实例数至少设置为 4。