我们正在使用微服务架构方法重新构建我们的软件平台。
其中大部分使用Spring Boot
库,对于我们的入口点,我们使用Spring Cloud Gateway,它可以轻松地与Jaeger
集成,以便在平台中进行跟踪。
我们使用以下 Maven 依赖项来执行此操作:
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>2.0.3</version>
</dependency>
而且它运行良好,我们可以在Jaeger UI
Web 控制台上看到跟踪。
现在的问题是如何将跟踪信息发送到平台中的下一个内部服务,以使每个服务都相关联。
有什么想法吗?
我们尝试使用GlobalFilter
将跟踪信息注入为 HTML 标头,但它使用的是传入请求,我们需要将它们放在下游请求中......有关如何覆盖的任何线索HTTPClient
下面使用。
@Bean
@Order(-1)
public GlobalFilter tracingFilter() {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
Tracer tracer = TracerResolver.resolveTracer();
Span span = tracer.buildSpan(request.getMethod().toString())
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
.start();
Tags.HTTP_URL.set(span, request.getURI().toString());
Tags.HTTP_METHOD.set(span, request.getMethod().toString());
if (request.getURI().getPort() != -1) {
Tags.PEER_PORT.set(span, request.getURI().getPort());
}
ServerHttpRequest.Builder requestBuilder = request.mutate();
tracer.inject(span.context(), Format.Builtin.HTTP_HEADERS, new RequestBuilderCarrier(requestBuilder));
...
}));
};
}
我们的解决方案:
Upstream filter 实现 org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter
exchange.getAttributes().put('your_key_here', value);
下游过滤器实现org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter
Object storedValue = exchange.getAttribute('your_key_here'); // NOTE can be null
并通过Spring Java配置(@Bean(注册它们