Red Hat Service Mesh: custom header transformed into x-b3-traceId is lost

Viewed 162

I am trying to integrate a legacy system with microservice hosted on Red Hat OpenShift platform. The service is a java app behind ingress gateway. The legacy app passes unique operation identifier as a custom header uniqueId. The microservice leverages openshift service mesh support for Jaeger so I can pass tracing headers such as x-b3-traceid and see the request trace in Jaeger UI. Unfortunately, the legacy app cannot be modified and won't send jaeger headers but uniqueId conforms jaeger rules and seems ok to be used for tracing.

I am trying to transform uniqueId into x-b3-traceid on an envoy filter. The problem is that I can copy it to any other header, but cannot modify x-b3-* headers. Istio keeps generating new set of x-b3-* headers no matter what I do in envoy filter. See filter code below.

I tried different filter positions (on ingress gateway, on pod sidecar, before envoy.router, etc). Seems nothing works. Can anyone recommend how can I pass custom header as a traceId for service mesh's jaeger? I can create a custom proxy service transforming one header with another but it looks redundant. Is it possible to achieve that with service mesh only?

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: call-id-filter
  namespace: mynamespace
spec:
  filters:
    - filterConfig:
        inlineCode: |
          function envoy_on_request(request_handle)
            headers = request_handle:headers()
            uniqueId=headers:get("uniqueId")
            if (uniqueId ~= nil) then
              request_handle:headers():add("x-b3-traceid", uniqueId) -- istio overwrites these values
              request_handle:headers():add("x-b3-spanid", "myspan")
              request_handle:headers():add("x-b3-sampled", "1")

              request_handle:headers():add("my-custom-unique-id", uniqueId) -- works fine
              
              request_handle:logCritical("envoy filter setting x-b3-traceid with"..uniqueId)
            end
          end
      filterName: envoy.lua
      filterType: HTTP
      insertPosition:
        index: FIRST
      listenerMatch:
        listenerType: GATEWAY
        portNumber: 9011
  workloadLabels:
    app: istio-ingressgateway
    
0 Answers
Related