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

时间:2020-11-06 11:40:53

标签: google-cloud-run

我们正在调查有关已部署的云运行服务的问题,该服务向服务发出的请求有时会失败,并显示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的日志

事件发生时,没有被记录。客户端(在同一项目的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-云运行终止了当前正在运行的容器实例(例如在某些不活动之后发生的情况),该实例已由应用程序([INFO] Handling signal: term正确记录了
  • 14:58-云运行实例化了一个新的容器实例,并开始处理传入的请求(已正常记录)

事件期间没有日志,这使得调查其原因变得困难,在这个阶段,我们将不胜感激任何铅。


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

1 个答案:

答案 0 :(得分:1)

我发现这个PIT描述了上述行为。之所以发生这种情况,是因为Cloud Run的一部分认为已经配置了实例来处理流量,但没有。该问题目前正在内部解决,但目前尚无可解决的ETA。

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