我已将 sleuth 依赖项添加到我的 Spring boot 项目中。尽管存在依赖关系,但在日志中看不到任何跟踪信息。没有编译或运行时错误。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>TestProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>TestProject</name>
<description>Test Project.</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
</properties>
<repositories>
<repository>
<id>ccp-master</id>
<url>https://maven.teamccp.com/content/groups/master</url>
</repository>
<repository>
<id>spring-release</id>
<url>http://repo.spring.io/libs-release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestone</id>
<url>http://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshot</id>
<url>http://repo.spring.io/libs-snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency> …Run Code Online (Sandbox Code Playgroud) 我有一个 Spring Boot 应用程序,我要更新到 1.5.1。效果很好,直到我将 Sleuth 和 Zipkin 添加到类路径
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
当这些行出现时,我得到
2017-02-22 22:33:05.331 ERROR [chathub-api,,,] 7581 --- [ main] o.s.boot.SpringApplication : Application startup failed
java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/FilterRegistrationBean
Run Code Online (Sandbox Code Playgroud)
这是我的部门。管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)
我试着改成达尔斯顿
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/libs-snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)
但错误变得更加奇怪
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method …Run Code Online (Sandbox Code Playgroud) 我们正在尝试在我们的项目中使用Zipkin实现Spring cloud sleuth,并想知道Spring cloud sleuth是否将支持Spring数据JPA的数据库调用。
我想跟踪数据库调用所花费的时间,就像服务调用一样
当我使用RestTemplate进行服务呼叫时,该呼叫被发送到zipkin,并且能够在仪表板上看到它
但是DB与Spring数据jpa的交互未在Zipkin中显示
我正在尝试将 Sleuth 集成到我们的系统中。如果我使用带注释的接口@FeignClient,则一切正常。这些接口会自动检测,并且 Sleuth 标头会通过 REST 调用传播。
但是,我们有一些现有代码直接使用 Feign.Builder 和 Feign 注释接口(只是没有用 注释@FeignClient)。这段代码添加了一些自定义的请求拦截器、编码器、代理等。
例如:
// Feign REST interface
public interface MyService {
@RequestMapping(method = RequestMethod.GET, value = "/version")
String getVersion();
}
// Creating the builder
Feign.Builder builder = Feign.builder();
builder.requestInterceptor(new MyCustomInterceptor());
// + adding proxy, encoder, decoder, etc
// Using the builder
MyService myService = builder.target(MyService.class, "http://localhost:8080/myservice");
myService.getVersion();
Run Code Online (Sandbox Code Playgroud)
我希望这个旧代码传播 Sleuth 标头。有什么简单的方法来连接它吗?
(我想一种选择是重新设计我们的 Feign 接口以使用 @FeignClient 并重新设计所有自定义拦截器、编码器等的应用方式,但最终这可能需要大量工作并有很大风险。)
我是否需要做一个特殊的请求拦截器来手动注入这些(例如从自动装配的 Tracer)?有没有一种干净的方法(或现有的类)来做到这一点?
spring-boot spring-cloud feign spring-cloud-netflix spring-cloud-sleuth
我有一个 Spring Boot 2.0.0 REST 服务,我正在尝试启用 Sleuth 和 Zipkin 将跟踪发送到我的本地主机 Zipkin 服务器。
该应用程序运行良好spring-cloud-starter-sleuth,spring-cloud-sleuth-zipkin直到我将两个依赖项添加到我的 pom.xml 中。一旦我这样做了,我现在收到一个编译错误:
项目构建错误:不可解析的导入 POM:找不到工件 io.zipkin.brave:brave-bom:pom:4.16.3-SNAPSHOT
我通过删除我的 .m2 文件夹并更新(两次)来确保它不是损坏的 Maven 包问题。
为什么我会收到此错误,我该如何解决?
这是我的 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.urig</groupId>
<artifactId>inventory</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>inventory</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.M8</spring-cloud.version>
<sleuth.version>2.0.0.M8</sleuth.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId> …Run Code Online (Sandbox Code Playgroud) 我需要自定义 spring sleuth 生成跟踪 ID 值的方式:在我的情况下,客户端使用查询参数发送相关 ID,我想使用该值作为跟踪 ID。那可能吗?如何?
提前致谢。
我想知道 Spring Cloud Sleuth 如何在线程之间传播 MDC 上下文,从而使 MDC 参数可用。
我读过这篇文章https://simonbasle.github.io/2018/02/contextual-logging-with-reactor-context-and-mdc/建议使用订阅者上下文在线程之间传播 MDC 状态。
我需要对某些请求标头中的其他参数执行类似操作,因此我创建了将其放入当前线程的 MDC 并将其存储在订阅者上下文中的操作。但是,恢复执行的下一个线程不可用。不知何故,我应该使用上下文中的值在新线程中再次调用 MDC,但是如何调用?
@Slf4j
@RequiredArgsConstructor
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ReactiveRequestCorrelationFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
String principal = exchange.getRequest().getHeaders().getFirst("principal-header");
MDC.put("principal", principal);
return chain.filter(exchange)
.subscriberContext(Context.of("principal", principal))
.doOnTerminate(MDC::clear);
}
}
Run Code Online (Sandbox Code Playgroud)
看看这个控制器映射:
@GetMapping(value = "/v1/departments", produces = MediaType.APPLICATION_JSON_VALUE)
public Flux<Department> getDepartments() {
log.info("getDepartaments");
return webClient.get().uri("http://someService:8080/api/v1/departamentosFoo").retrieve().bodyToFlux(Departments.class)
.doOnNext(dep -> log.info("found department {}", dep));
}
Run Code Online (Sandbox Code Playgroud)
它生成此日志:
logging.pattern.console="%magenta([%thread]) [%X{traceId}] [%X{spanId}] [%X{principal}] - %m%n"
Run Code Online (Sandbox Code Playgroud)
[boundedElastic-2] [d0a916db8be0cbf7] [d0a916db8be0cbf7] [] …Run Code Online (Sandbox Code Playgroud) spring-boot project-reactor spring-cloud spring-cloud-sleuth spring-webflux
我从另一个微服务调用我的 Springboot 应用程序来获取跟踪和跨度 ID,但在启动应用程序时出现错误。我想要做的是在app1中创建Trace & Span,然后调用app2并在app2中获取从app1传递的Trace id。在 app1 中,我能够获取跟踪和跨度,但在 app2 中,我想获取该跟踪,但它失败了。我曾尝试参考这一点。
我得到的错误是:
描述:
com.test.demo1.filter.MyFilter 中构造函数的参数 0 需要一个类型为“brave.Tracer”的 bean,但无法找到。
行动:
考虑在您的配置中定义一个“brave.Tracer”类型的 bean。”我也尝试创建该 bean,但给出错误“构造函数 Tracer() 未定义”
下面是我的简单 RestController 和 pom.xml
package com.test.demo1.controller;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import brave.Tracer;
@RestController
@Component
public class Greeting {
private static final Logger logger = Logger.getLogger(Greeting.class.getName());
@Autowired
Tracer tracer;
@RequestMapping("/greeting")
public String greeting() {
logger.info("Hello info from from spring sleuth");
logger.info("tracer is -----> "+tracer.currentSpan().context().traceIdString());
System.out.println("tracer-id :"+ tracer.currentSpan().context().traceIdString());
return "Hello"; …Run Code Online (Sandbox Code Playgroud) 我正在使用 Feign Builder 发出顺序请求。请求标题中没有 x-b3-traceid,x-b3-spanid .. 。这就是为什么我的最后一个客户的日志出现在 zipkin 上。
我使用 spring boot 2.4.2 、 spring cloud 2020.0.0 、 feign-core 10.10.1 、 feign-okhttp 10.10.1 。我尝试过 spring-cloud-openfeign 并取得了想要的结果。但我不想使用这个库。这里有使用 Feign Builder 和 Rest Template 时的请求。我在 zipkin 上没有看到相同的日志。
我的 Client1 应用程序。我正在发送请求 http://localhost:8082/
import feign.Client;
import feign.Feign;
import feign.RequestInterceptor;
import feign.codec.Decoder;
import feign.codec.Encoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import sample.feign2.Client2Feign;
import javax.servlet.http.HttpServletRequest;
@RestController
public class SampleController {
private Logger logger …Run Code Online (Sandbox Code Playgroud) 是否可以向 Elastic APM 提供 Spring Cloud Sleuth(针对 Webflux 项目)的 Tracers 和 Spans?
我已经在 Spring Webflux 的上下文中看到了对该问题的讨论。这里是 Spring Cloud Sleuth 的背景。
spring elasticsearch project-reactor spring-cloud-sleuth elastic-apm
spring-boot ×7
spring-cloud ×5
spring ×4
zipkin ×3
java ×2
cloud ×1
elastic-apm ×1
feign ×1
maven ×1
openfeign ×1
trace ×1