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 TracerspanDecorators

  • 将 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));
        }
      };
    }
    }