我想跨越多个线程传递跨度并希望获得跟踪。我有不同的工作线程。
在跑步的同时我得到了You may have forgotten to close or detach null
pom.hml
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.19.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sleuth.thread.example</groupId>
<artifactId>demo-zipking</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-zipking</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
workers盘1.Java
@Slf4j
@RequiredArgsConstructor
public class WorkerSpan1 implements Runnable {
private final CountDownLatch latch;
private final Span span;
private final Tracer tracer;
@Override
public void run() {
latch.countDown();
log.info("I am Worker 1 working");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tracer.close(span);
}
}
workers盘2.Java
@Slf4j
@RequiredArgsConstructor
public class WorkerSpan2 implements Runnable {
private final CountDownLatch latch;
private final Span span;
private final Tracer tracer;
@Override
public void run() {
latch.countDown();
log.info("I am Worker 2 working");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tracer.close(span);
}
}
这里我传递span因为tracer.getCurrentSpan()返回null。
和我的控制器
test controller.Java
@RestController
@Slf4j
@RequiredArgsConstructor
public class TestController {
private final Tracer tracer;
@GetMapping("/")
public String getDifferentThread2() throws InterruptedException {
CountDownLatch latch = new CountDownLatch(2);
Span span1 = next("WorkerSpan1");
WorkerSpan1 worker1 = new WorkerSpan1(latch, span1, tracer);
Span span2 = next("WorkerSpan2");
WorkerSpan2 worker2 = new WorkerSpan2(latch, span2, tracer);
Thread thread1 = new Thread(worker1);
Thread thread2 = new Thread(worker2);
thread1.start();
thread2.start();
latch.await();
log.info("returning result");
return "done";
}
}
在运行时我没有得到zipkin的跟踪并得到警告:
2019-03-10 23:50:49.830 INFO [multithread-logging,5c855581aea992ade8c629db8eca728f,63e3c0f93a7c6044,false] 18108 --- [nio-8081-exec-6] c.s.t.e.d.MultiThreadController : returning result
2019-03-10 23:50:49.830 INFO [multithread-logging,,,] 18108 --- [ Thread-14] c.s.t.e.demosleuththread.WorkerSpan2 : I am Worker 2 working
2019-03-10 23:50:49.830 INFO [multithread-logging,,,] 18108 --- [ Thread-13] c.s.t.e.demosleuththread.WorkerSpan1 : I am Worker 1 working
2019-03-10 23:50:49.834 WARN [multithread-logging,5c855581aea992ade8c629db8eca728f,63e3c0f93a7c6044,false] 18108 --- [nio-8081-exec-6] o.s.cloud.sleuth.util.ExceptionUtils : Tried to close span but it is not the current span: [Trace: 5c855581aea992ade8c629db8eca728f, Span: e8c629db8eca728f, Parent: null, exportable:false]. You may have forgotten to close or detach [Trace: 5c855581aea992ade8c629db8eca728f, Span: 63e3c0f93a7c6044, Parent: 9a3c20df7f81aa72, exportable:false]
2019-03-10 23:50:52.841 WARN [multithread-logging,,,] 18108 --- [ Thread-14] o.s.cloud.sleuth.util.ExceptionUtils : Tried to close span but it is not the current span: [Trace: 5c855581aea992ade8c629db8eca728f, Span: 63e3c0f93a7c6044, Parent: 9a3c20df7f81aa72, exportable:false]. You may have forgotten to close or detach null
2019-03-10 23:50:52.841 WARN [multithread-logging,,,] 18108 --- [ Thread-13] o.s.cloud.sleuth.util.ExceptionUtils : Tried to close span but it is not the current span: [Trace: 5c855581aea992ade8c629db8eca728f, Span: 9a3c20df7f81aa72, Parent: e8c629db8eca728f, exportable:false]. You may have forgotten to close or detach null
我还想知道如何跨不同的线程传递跟踪信息。
不幸的是,这个问题的最佳答案是升级到最新版本的Sleuth,我们已将其作为内部跟踪器迁移到Brave并解决了很多问题。