Jaeger 不跨越 elasticsearch 请求
Jaeger does not span elasticsearch requests
我有一个 Reactive SpringBoot Web 应用程序。此应用程序使用 Spring-Data-Elasticsearch 从 Elasticsearch 请求数据。该应用程序配置为使用 Jaeger 跟踪器进行 API-请求监控。
Jaeger 工作正常,除了 Elasticsearch 请求 - 它们不会出现在跟踪的嵌套范围内。存在任何其他 Web 请求。
我有以下 gradle.build
配置:
gradle.build:
springBootVersion = '2.4.2'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-reactor-netty'
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
implementation 'io.opentracing.contrib:opentracing-spring-jaeger-web-starter:2.0.3'
implementation 'io.opentracing.contrib:opentracing-elasticsearch7-client:0.1.2'
application.yml
spring:
data:
elasticsearch:
client:
reactive:
endpoints:
- localhost:9200
一个 jaeger 运行 命令:
docker run -d --name jaeger -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:latest
有人对为什么 Jaeger 不跨越 elasticsearch 请求有任何想法吗?
这是一个有效的解决方案。我们需要
重用现有 bean Tracer
和 spanDecorators
将 Trace 过滤器添加到 ES Web 客户端配置中:
@Configuration
@RequiredArgsConstructor
public class ElasticSearchClientConfiguration implements ErrorLogging {
private final ReactiveElasticsearchRestClientProperties properties;
private final Tracer tracer;
private final List<WebClientSpanDecorator> spanDecorators;
@Bean
public ClientConfiguration clientConfiguration() {
ClientConfiguration.MaybeSecureClientConfigurationBuilder builder =
ClientConfiguration.builder().connectedTo(properties.getEndpoints().toArray(new String[0]));
configureWebClient(builder);
return builder.build();
}
private void configureWebClient(ClientConfiguration.TerminalClientConfigurationBuilder builder) {
builder.withWebClientConfigurer(
webClient ->
webClient
.mutate()
.filters(addTraceExchangeFilterFunctionIfNotPresent())
.build());
}
private Consumer<List<ExchangeFilterFunction>> addTraceExchangeFilterFunctionIfNotPresent() {
return functions -> {
if (functions.stream()
.noneMatch(function -> function instanceof TracingExchangeFilterFunction)) {
functions.add(new TracingExchangeFilterFunction(tracer, spanDecorators));
}
};
}
}
我有一个 Reactive SpringBoot Web 应用程序。此应用程序使用 Spring-Data-Elasticsearch 从 Elasticsearch 请求数据。该应用程序配置为使用 Jaeger 跟踪器进行 API-请求监控。
Jaeger 工作正常,除了 Elasticsearch 请求 - 它们不会出现在跟踪的嵌套范围内。存在任何其他 Web 请求。
我有以下 gradle.build
配置:
gradle.build:
springBootVersion = '2.4.2'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-reactor-netty'
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
implementation 'io.opentracing.contrib:opentracing-spring-jaeger-web-starter:2.0.3'
implementation 'io.opentracing.contrib:opentracing-elasticsearch7-client:0.1.2'
application.yml
spring:
data:
elasticsearch:
client:
reactive:
endpoints:
- localhost:9200
一个 jaeger 运行 命令:
docker run -d --name jaeger -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:latest
有人对为什么 Jaeger 不跨越 elasticsearch 请求有任何想法吗?
这是一个有效的解决方案。我们需要
重用现有 bean
Tracer
和spanDecorators
将 Trace 过滤器添加到 ES Web 客户端配置中:
@Configuration @RequiredArgsConstructor public class ElasticSearchClientConfiguration implements ErrorLogging { private final ReactiveElasticsearchRestClientProperties properties; private final Tracer tracer; private final List<WebClientSpanDecorator> spanDecorators; @Bean public ClientConfiguration clientConfiguration() { ClientConfiguration.MaybeSecureClientConfigurationBuilder builder = ClientConfiguration.builder().connectedTo(properties.getEndpoints().toArray(new String[0])); configureWebClient(builder); return builder.build(); } private void configureWebClient(ClientConfiguration.TerminalClientConfigurationBuilder builder) { builder.withWebClientConfigurer( webClient -> webClient .mutate() .filters(addTraceExchangeFilterFunctionIfNotPresent()) .build()); } private Consumer<List<ExchangeFilterFunction>> addTraceExchangeFilterFunctionIfNotPresent() { return functions -> { if (functions.stream() .noneMatch(function -> function instanceof TracingExchangeFilterFunction)) { functions.add(new TracingExchangeFilterFunction(tracer, spanDecorators)); } }; } }