【问题标题】:Jaeger does not span elasticsearch requestsJaeger 不跨越弹性搜索请求
【发布时间】:2021-05-27 12:19:43
【问题描述】:

我有一个响应式 SpringBoot Web 应用程序。此应用程序使用 Spring-Data-Elasticsearch 从 Elasticsearch 请求数据。该应用程序配置为使用 Jaeger 跟踪器进行 API 请求监控。

Jaeger 工作正常,除了 Elasticsearch 请求 - 它们不会出现在跟踪的嵌套跨度中。存在任何其他网络请求。

我有以下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 请求有任何想法吗?

【问题讨论】:

  • 您找到解决方案了吗?
  • 我没有找到任何开箱即用的解决方案。我也尝试了 sleuth/zipkin,但也没有用。因此,我通过.filter(ExchangeFilterFunction.ofRequestProcessor(...).filter(ExchangeFilterFunction.ofResponseProcessor(...) 在WebClient 中手动添加了跨度,但这会产生两个单独的跨度。在我的情况下,我使用响应式 Web 客户端,我无法合并这两个跨度来计算请求的持续时间。

标签: java spring-boot elasticsearch spring-data-elasticsearch jaeger


【解决方案1】:

这是一个有效的解决方案。我们需要

  • 重用现有的 bean TracerspanDecorators

  • 在 ES Web 客户端配置中添加 Trace 过滤器:

    @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));
        }
      };
    }
    }
    

【讨论】:

    猜你喜欢
    • 2020-11-20
    • 2018-12-19
    • 2012-11-29
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多