云 运行: 500 服务器错误,没有日志输出

Cloud Run: 500 Server Error with no log output

我们正在调查部署的云 运行 服务上的一个问题,向该服务发出的请求偶尔会失败并显示 StatusCodeError: 500,而上述请求的日志不会出现在云 运行.

服务的请求通常会产生两行日志,详细说明请求、路由和退出代码 (POST 200 on https://service-name.a.run.app/route/...)

当事件发生时,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"

上次事件的大致时间轴:

由于事件期间没有日志,因此很难调查其原因,现阶段我们将不胜感激任何线索。


我们的服务还有另一个已知问题,可能相关也可能不相关。该服务旨在避免多个副本,因为单个副本应该能够处理负载并为并发请求提供服务(云 运行 concurency = 80),但冷启动时间相对较长(~30 秒)。当请求激增而没有副本可用时,这会导致 429 错误(因为云 运行 在冷启动期间将并发硬限制为 1)。通过允许一些复制(当前 maxScale = 3),这个问题在一定程度上得到了缓解,因为每个副本都可以在冷启动期间暂停请求,但需要在客户端进行一些工作才能正确处理(冷启动后的简单重试) .

我发现 PIT 描述了上述行为。这似乎是因为 Cloud 运行 的一部分认为已经配置了处理流量的实例,但实际上没有。此问题目前正在内部处理,但目前还没有修复的预计到达时间。

当前的解决方法是将最大实例数至少设置为 4。