Envoy访问日志%DURATION%与上游服务时长数值一致及微秒输出咨询
Envoy访问日志时长字段异常问题解答
两个时长字段取值相同的原因及遗漏配置
- 字段基础定义
%DURATION%:Envoy侧统计的请求全链路时长,计时起点为Envoy接收到客户端请求第一个字节,终点为Envoy向客户端发送完响应最后一个字节,默认单位为毫秒。%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%:读取响应头中X-Envoy-Upstream-Service-Time字段的取值,该字段默认需要上游服务或者上游侧Envoy主动注入,默认单位为毫秒。
- 取值相同的常见原因
- 未配置Envoy主动注入
X-Envoy-Upstream-Service-Time响应头:如果上游服务本身没有返回该头,同时当前Envoy未配置主动注入规则,该字段会默认填充和%DURATION%一致的取值。 - 精度限制:默认毫秒级精度下,Envoy自身的请求转发、处理耗时通常在1毫秒以内,四舍五入后两个字段的取值就会完全一致,无法体现差异。
- 未配置Envoy主动注入
- 遗漏配置补充
需要在对应路由规则中添加响应头注入配置,示例如下:
route: cluster: your_upstream_cluster response_headers_to_add: - append: false header: key: "X-Envoy-Upstream-Service-Time" value: "%UPSTREAM_SERVICE_TIME%"
如果是多Envoy部署架构,需要确保上游侧的Envoy也开启了该头的注入配置。
微秒级时长输出配置
Envoy 1.18及以上版本原生支持微秒级时长输出,修改访问日志配置即可:
- 全链路总耗时改用
%DURATION_USEC%字段,可直接输出微秒级的总时长数值。 - 上游处理时长需要先在HttpConnectionManager配置中添加
upstream_service_time_format: MICROSECONDS配置项,将X-Envoy-Upstream-Service-Time的单位改为微秒,再通过%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%读取即可。
调整后两个字段的精度都达到微秒级,即可清晰观测到Envoy自身处理耗时带来的数值差异。
内容的提问来源于stack exchange,提问作者JME
相关产品推荐
相关产品推荐

