Интеграция 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;
}
}