如何使用CLIENT_DISCONNECT_BEFORE_ANY_RESPONSE调试失败的请求 [英] How to debug failed requests with client_disconnected_before_any_response
问题描述
我们有一个由Kubernetes入口创建的HTTP(s) Load Balancer,它指向由一组运行nginx和Ruby on rails的Pod组成的后端。
查看负载均衡日志,我们发现响应代码为0
和statusDetails
=client_disconnected_before_any_response
的请求数量不断增加。
我们正在试图理解为什么会发生这种情况,但我们还没有找到任何相关的东西。Nginx访问或错误日志中没有任何内容。
从GET到POST的多种请求都会发生这种情况。
我们还怀疑,有时尽管记录了带有该错误的请求,但请求实际上被传递到后端。例如,我们看到pg::UniqueViolation错误,这是由于标识注册请求被两次发送到注册终结点的后端。
任何形式的帮助都将不胜感激。谢谢!
更新1
根据请求,入口资源的here is the yaml文件:
更新2
我已经创建了一个基于日志的StackDrive指标,以统计呈现此行为的请求数量。图表如下:
大峰值与以下Kubernetes事件的时间戳大致匹配:
完全错误:Readiness probe failed: Get http://10.48.1.28:80/health_check: net/http: request canceled (Client.Timeout exceeded while awaiting headers)"
因此,对后端后面的Pod的就绪探测有时似乎会失败,但并不总是失败。
以下是ReadinessProbe的定义
readinessProbe:
failureThreshold: 3
httpGet:
httpHeaders:
- name: X-Forwarded-Proto
value: https
- name: Host
value: [redacted]
path: /health_check
port: 80
scheme: HTTP
initialDelaySeconds: 1
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
推荐答案
响应代码为0且状态Detail=CLIENT_DISCONNECTED_BEFORE_ANY_RESPONSE表示客户端在负载均衡能够按照GCP documentation提供响应之前关闭连接。
调查它没有及时响应的原因,其中一个原因可能是来自ngix的keepalive timeouts与gcp负载均衡的差异,即使这最像是提供了502 Bad Gateway race condition导致的backend_connection_closed_before_data_sent_to_client。
为了确保后端响应请求并查看是否需要多长时间,您可以重复此过程几次(因为您仍然会得到一些有效的响应):
卷曲响应时间
$curl-w"@curl.txt"-o/dev/null-s ip_here
curl.txt内容(先创建并保存此文件):
time_namelookup: %{time_namelookup}
time_connect: %{time_connect}
time_appconnect: %{time_appconnect}
time_pretransfer: %{time_pretransfer}
time_redirect: %{time_redirect}
time_starttransfer: %{time_starttransfer}
----------
time_total: %{time_total}
如果是这种情况,请查看任何类型的循环的注册终结点代码,如您提到的PG::UniqueViolation错误。
这篇关于如何使用CLIENT_DISCONNECT_BEFORE_ANY_RESPONSE调试失败的请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!