Интеграция Opentememetry Zuul

Я безуспешно пытаюсь интегрировать Opentelemetry с Zuul с помощью Spring Boot. Я пытаюсь передать контекст Opentelemetry от Zuul другим микросервисам в цепочке, и когда ответ пришел в Zuul, закройте трассировку.

(Создать трассировку) Zuul --call -> (новый Span) Microservice --call -> (новый Span) Microservice B

(Закрыть трассировку) Zuul <- response - Microservice A <-response - Microservice B

Кто-нибудь делал что-то подобное?

1 ответ

Я решил так:

@Component
public class HeaderRequestFilter extends ZuulFilter {
    
    @Autowired
    private Tracer tracer;
    
    @Override
    public int filterOrder() {
        // run before PreDecoration
        return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
    }

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
                
        RequestContext ctx = RequestContext.getCurrentContext();

        Span span = tracer.spanBuilder(ctx.getRequest().getRequestURI()).startSpan();
        span.setAttribute("eurekaInstanceId", eurekaInstanceId);        
        tracer.withSpan(span);
        
        OpenTelemetry.getPropagators().getTextMapPropagator().inject(Context.current(), ctx, new Setter<RequestContext>() {
            @Override
            public void set(RequestContext carrier, String key, String value) {             
                carrier.addZuulRequestHeader(key, value);
            }
        });

        return null;
    }
}

и ответ, где пролёт закрыт

@Component
public class HeaderResponseFilter extends ZuulFilter {

    @Autowired
    private Tracer tracer;
    
    
    @Override
    public int filterOrder() {
        // Run before PreDecoration
        return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1; 
    }

    @Override
    public String filterType() {
        return FilterConstants.POST_TYPE;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        // Close span
        tracer.getCurrentSpan().end();
        
        return null;
    }
}
Другие вопросы по тегам