Response flags¶
Why an exchange ended as it did: the Envoy response flag and the response code details the proxy
sets for each cause. Use this page to read access logs, metrics
(downstream_rq_response_flag.<flag>), traces and ctx.response_flags in scripts.
Response flags and details¶
FlowContext.failure(), responseFlags() and responseCodeDetails() tell why an exchange ended
as it did; trackers, filters, scripts (ctx.failure, ctx.response_flags,
ctx.response_code_details) and HttpLogger lines see them. The proxy sets these flags (the
ResponseFlag enum names Envoy's flags, and a filter can add one with ctx.addResponseFlag):
| cause | flag | details |
|---|---|---|
connection refused, unreachable or timed out (ConnectFailed) |
UF |
proxy_failure:connect_failed |
the server's name did not resolve (UnresolvedHost) |
DF |
proxy_failure:unresolved_host |
TLS with the server or a chained proxy failed (TlsFailed) |
UF, and %UPSTREAM_TRANSPORT_FAILURE_REASON% (TlsFailed.reason(): certificate_revoked: ...) |
proxy_failure:tls_failed |
the server did not answer in time (ServerTimeout) |
UT |
proxy_failure:server_timeout (upstream_response_timeout mid-response) |
a malformed response (BadServerResponse) |
UPE |
proxy_failure:bad_server_response |
| the server closed before its response head was complete | UC |
proxy_failure:bad_server_response |
| the server reset or closed mid-response | UR |
upstream_reset_after_response_started |
nowhere to send it (NoRoute) |
NR |
proxy_failure:no_route |
the shared pool was exhausted (NoConnectionAvailable) |
UO |
proxy_failure:no_connection_available |
a refused or malformed request (BadRequest), or one too large (RequestTooLarge) |
DPE |
proxy_failure:bad_request, proxy_failure:request_too_large, downstream_protocol_error |
| the client left before the response was complete | DC |
downstream_remote_disconnect |
| the client reset its HTTP/2 or HTTP/3 stream | DR |
downstream_remote_reset |
a ConcurrencyLimiter refused it |
RL |
concurrency_limited |
| every chained proxy (with backoff between them) failed | URX, with the last one's flag |
as the last failure |
| an exchange, tunnel or CONNECT-UDP flow sat idle for the idle timeout | SI |
stream_idle_timeout |
the proxy authenticator refused the client (407) |
UAEX |
auth_rejected |
a filter aborted the exchange (returned null) |
LR |
filter_aborted |
425 Too Early for a request in 0-RTT data |
none | too_early |
| served from the cache, or by a filter's short-circuit, or from a replay | none | cache, filter, replay |
| the server's response, relayed | none | via_upstream |
| a transparent QUIC flow | none (UAEX when the authenticator refused it) |
quic_relayed, quic_dropped, quic_streams |
The ConcurrencyLimiter answers 429 by default, as a rate limit does, so it sets RL rather
than UO (Envoy's circuit-breaker overflow, which this proxy keeps for its exhausted pool). A
425 Too Early has no flag: Envoy has none for it, and a custom one would be meaningless to its
tools; too_early in the details tells it apart. A response from the cache gets no RFCF either,
since the cache is no filter of Envoy's: cache in the details and %MP_RESPONSE_SOURCE% say it.