如何解决Jaeger 不跨越 elasticsearch 请求
我有一个响应式 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 请求有任何想法吗?
解决方法
这是一个有效的解决方案。我们需要
-
重用已存在的 bean
Tracer
和spanDecorators
-
在 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)); } }; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。