Istio环境下Spring集成Opentracing Jaeger header透传异常问题咨询
Istio Jaeger链路断裂场景下Sidecar请求头校验方案
校验Sidecar实际接收请求头的方法
方法1:临时开启Sidecar debug日志
- 给目标Pod添加注解开启debug级别日志,无需修改全局配置:
kubectl annotate pod <目标Pod名称> sidecar.istio.io/logLevel=debug - 执行以下命令查看istio-proxy容器日志,直接搜索对应请求的头信息:
日志中会完整打印Sidecar接收到的所有原始请求头,包括kubectl logs <目标Pod名称> -c istio-proxyX-B3-TraceId、X-B3-SpanId、traceparent等链路传播字段。
方法2:配置自定义访问日志格式
如果需要长期查看链路头,可修改Istio网格配置的访问日志格式,在meshConfig.accessLogFormat中添加需要打印的头字段:
meshConfig: accessLogFile: /dev/stdout accessLogFormat: | [%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% "b3_trace_id:%REQ(X-B3-TRACEID)%" "w3c_traceparent:%REQ(traceparent)%" "x_request_id:%REQ(X-REQUEST-ID)%"
配置生效后所有Sidecar的访问日志都会自带链路头字段,直接查看Pod的istio-proxy日志即可。
方法3:使用EnvoyFilter精准拦截打印
适合需要避免大量debug日志冗余的场景,编写EnvoyFilter在请求入口处打印指定头:
以下配置仅打印链路相关头,不会影响Sidecar正常性能
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: trace-header-log namespace: <你的服务命名空间> spec: workloadSelector: labels: app: <你的服务标签> configPatches: - applyTo: HTTP_FILTER match: context: SIDECAR_INBOUND listener: portNumber: <服务监听端口> filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" patch: operation: INSERT_BEFORE value: name: envoy.lua typed_config: "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua" inlineCode: | function envoy_on_request(request_handle) request_handle:logInfo("B3 TraceId: "..(request_handle:headers():get("x-b3-traceid") or "not found")) request_handle:logInfo("W3C Traceparent: "..(request_handle:headers():get("traceparent") or "not found")) end
配置应用后,在istio-proxy日志中搜索B3 TraceId即可拿到Sidecar实际接收的头值。
常见链路断裂排查补充
注意:不需要手动在Controller层透传请求头,先确认以下配置是否正确
- 你的RestTemplate/WebClient实例必须是Spring容器托管的:手动new出来的实例不会被opentracing-spring-jaeger-web-starter自动植入链路传播拦截器,RestTemplate要通过
@Bean注入后使用,WebClient要通过自动注入的WebClient.Builder构造。 - 检查Spring配置中是否同时开启了两种传播格式的透传:部分旧版本starter需要额外配置
opentracing.spring.web.client.enabled=true保证RestTemplate/WebClient的拦截器生效。
内容的提问来源于stack exchange,提问作者leoconco
相关产品推荐
相关产品推荐

