Skip to content

Commit 1558d0a

Browse files
committed
✨ 分布式链路追踪示例
1 parent 6798e96 commit 1558d0a

File tree

88 files changed

+6608
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+6608
-0
lines changed

codes/distributed/pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<groupId>io.github.dunwu.spring</groupId>
7+
<artifactId>spring-distributed</artifactId>
8+
<version>1.0.0</version>
9+
<packaging>pom</packaging>
10+
<name>Spring::分布式</name>
11+
12+
<modules>
13+
<module>trace</module>
14+
</modules>
15+
</project>
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<parent>
7+
<groupId>org.springframework.boot</groupId>
8+
<artifactId>spring-boot-starter-parent</artifactId>
9+
<version>2.7.7</version>
10+
<relativePath />
11+
</parent>
12+
13+
<groupId>io.github.dunwu.springcloud</groupId>
14+
<artifactId>spring-opentelemetry-async</artifactId>
15+
<version>1.0.0</version>
16+
<packaging>jar</packaging>
17+
<name>Spring::分布式::链路追踪::OpenTelemetry::异步</name>
18+
<description>Spring + OpenTelemetry 链路追踪异步手动埋点的示例</description>
19+
20+
<dependencies>
21+
<!-- Spring Web 的 Spring Boot 启动包,完成 Web 相关的自动化配置 -->
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-web</artifactId>
25+
</dependency>
26+
<!-- Spring Test 的 Spring Boot 启动包,提供了一些便利的测试工具集 -->
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-starter-test</artifactId>
30+
<scope>test</scope>
31+
</dependency>
32+
<!--OpenTelemetry SDK-->
33+
<dependency>
34+
<groupId>io.opentelemetry</groupId>
35+
<artifactId>opentelemetry-api</artifactId>
36+
</dependency>
37+
<dependency>
38+
<groupId>io.opentelemetry</groupId>
39+
<artifactId>opentelemetry-sdk</artifactId>
40+
</dependency>
41+
<dependency>
42+
<groupId>io.opentelemetry</groupId>
43+
<artifactId>opentelemetry-exporter-otlp</artifactId>
44+
</dependency>
45+
<dependency>
46+
<groupId>io.opentelemetry</groupId>
47+
<artifactId>opentelemetry-semconv</artifactId>
48+
<version>1.26.0-alpha</version>
49+
</dependency>
50+
</dependencies>
51+
52+
<dependencyManagement>
53+
<dependencies>
54+
<dependency>
55+
<groupId>io.opentelemetry</groupId>
56+
<artifactId>opentelemetry-bom</artifactId>
57+
<version>1.26.0</version>
58+
<type>pom</type>
59+
<scope>import</scope>
60+
</dependency>
61+
</dependencies>
62+
</dependencyManagement>
63+
</project>
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package example.spring.trace.opentelemetry;
2+
3+
import io.opentelemetry.api.GlobalOpenTelemetry;
4+
import io.opentelemetry.api.OpenTelemetry;
5+
import io.opentelemetry.api.trace.Span;
6+
import io.opentelemetry.api.trace.StatusCode;
7+
import io.opentelemetry.api.trace.Tracer;
8+
import io.opentelemetry.context.Context;
9+
import io.opentelemetry.context.Scope;
10+
import org.apache.commons.logging.Log;
11+
import org.apache.commons.logging.LogFactory;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent;
14+
import org.springframework.context.ApplicationListener;
15+
import org.springframework.web.bind.annotation.RequestMapping;
16+
import org.springframework.web.bind.annotation.RestController;
17+
18+
import java.util.concurrent.ExecutorService;
19+
import java.util.concurrent.Executors;
20+
21+
@RestController
22+
public class DemoController implements ApplicationListener<ServletWebServerInitializedEvent> {
23+
24+
private static final Log log = LogFactory.getLog(DemoController.class);
25+
26+
private int port;
27+
28+
@Autowired
29+
private DemoService userService;
30+
31+
private ExecutorService executorService = Executors.newFixedThreadPool(5);
32+
33+
private void biz() {
34+
35+
Tracer tracer = OpenTelemetrySupport.getTracer();
36+
Span span = tracer.spanBuilder("biz (manual)")
37+
// 可选,自动设置
38+
.setParent(Context.current().with(Span.current()))
39+
.startSpan();
40+
41+
try (Scope scope = span.makeCurrent()) {
42+
span.setAttribute("bizId", "111");
43+
44+
executorService.submit(() -> {
45+
Span asyncSpan = tracer.spanBuilder("async")
46+
.setParent(Context.current().with(span))
47+
.startSpan();
48+
try {
49+
// some async jobs
50+
Thread.sleep(1000L);
51+
} catch (Throwable e) {
52+
e.printStackTrace();
53+
} finally {
54+
asyncSpan.end();
55+
}
56+
});
57+
58+
// fake biz logic
59+
Thread.sleep(1000);
60+
System.out.println("biz done");
61+
OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
62+
openTelemetry.getPropagators();
63+
} catch (Throwable t) {
64+
span.setStatus(StatusCode.ERROR, "handle biz error");
65+
} finally {
66+
span.end();
67+
}
68+
}
69+
70+
private void child(String userType) {
71+
Span span = OpenTelemetrySupport.getTracer().spanBuilder("ChildSpan").startSpan();
72+
try (Scope scope = span.makeCurrent()) {
73+
span.setAttribute("user.type", userType);
74+
biz();
75+
} catch (Throwable t) {
76+
span.setStatus(StatusCode.ERROR, "handle child span error");
77+
} finally {
78+
span.end();
79+
}
80+
}
81+
82+
@RequestMapping("/async")
83+
public String async() {
84+
System.out.println("UserController.async -- " + Thread.currentThread().getId());
85+
86+
Span span = OpenTelemetrySupport.getTracer().spanBuilder("ParentSpan").startSpan();
87+
span.setAttribute("user.id", "123456");
88+
try (Scope scope = span.makeCurrent()) {
89+
userService.async();
90+
child("vip");
91+
} catch (Throwable t) {
92+
span.setStatus(StatusCode.ERROR, "handle parent span error");
93+
} finally {
94+
span.end();
95+
}
96+
return "async";
97+
}
98+
99+
@Override
100+
public void onApplicationEvent(ServletWebServerInitializedEvent event) {
101+
this.port = event.getSource().getPort();
102+
}
103+
104+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package example.spring.trace.opentelemetry;
2+
3+
import org.springframework.scheduling.annotation.Async;
4+
import org.springframework.stereotype.Service;
5+
6+
@Service
7+
public class DemoService {
8+
9+
@Async
10+
public void async() {
11+
System.out.println("DemoService.async begin. thread: " + Thread.currentThread().getId());
12+
System.out.println("DemoService.async end. ");
13+
}
14+
15+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package example.spring.trace.opentelemetry;
2+
3+
import io.opentelemetry.api.OpenTelemetry;
4+
import io.opentelemetry.api.common.Attributes;
5+
import io.opentelemetry.api.trace.Tracer;
6+
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
7+
import io.opentelemetry.context.propagation.ContextPropagators;
8+
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
9+
import io.opentelemetry.sdk.OpenTelemetrySdk;
10+
import io.opentelemetry.sdk.resources.Resource;
11+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
12+
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
13+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
14+
15+
/**
16+
* OpenTelemetry 支持类
17+
*
18+
* @author <a href="mailto:[email protected]">Zhang Peng</a>
19+
* @date 2023-05-24
20+
*/
21+
public class OpenTelemetrySupport {
22+
23+
private static final Tracer tracer;
24+
private static final OpenTelemetry openTelemetry;
25+
26+
public static final String SERVICE_NAME = "opentelemetry-test";
27+
28+
static {
29+
Resource resource = Resource.getDefault()
30+
.merge(Resource.create(Attributes.of(
31+
ResourceAttributes.SERVICE_NAME, SERVICE_NAME
32+
// ResourceAttributes.HOST_NAME, "<host-name>"
33+
)));
34+
35+
SdkTracerProvider sdkTracerProvider =
36+
SdkTracerProvider.builder()
37+
.addSpanProcessor(BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder().build()).build())
38+
.setResource(resource)
39+
.build();
40+
41+
openTelemetry = OpenTelemetrySdk.builder()
42+
.setTracerProvider(sdkTracerProvider)
43+
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
44+
.buildAndRegisterGlobal();
45+
46+
tracer = openTelemetry.getTracer("my-trace", "1.0.0");
47+
}
48+
49+
public static Tracer getTracer() {
50+
return tracer;
51+
}
52+
53+
public static OpenTelemetry getOpenTelemetry() {
54+
return openTelemetry;
55+
}
56+
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package example.spring.trace.opentelemetry;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.scheduling.annotation.EnableAsync;
6+
7+
@EnableAsync
8+
@SpringBootApplication
9+
public class OpenTelemetryWebApplication {
10+
11+
public static void main(String[] args) {
12+
SpringApplication.run(OpenTelemetryWebApplication.class, args);
13+
}
14+
15+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<parent>
7+
<groupId>org.springframework.boot</groupId>
8+
<artifactId>spring-boot-starter-parent</artifactId>
9+
<version>2.7.7</version>
10+
<relativePath />
11+
</parent>
12+
13+
<groupId>io.github.dunwu.springcloud</groupId>
14+
<artifactId>spring-opentelemetry-http-client</artifactId>
15+
<version>1.0.0</version>
16+
<packaging>jar</packaging>
17+
<name>Spring::分布式::链路追踪::OpenTelemetry::Http::Client</name>
18+
<description>OpenTelemetry Http 手动埋点、传播的客户端示例</description>
19+
20+
<dependencies>
21+
<!-- Spring Web 的 Spring Boot 启动包,完成 Web 相关的自动化配置 -->
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-web</artifactId>
25+
</dependency>
26+
<!-- Spring Test 的 Spring Boot 启动包,提供了一些便利的测试工具集 -->
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-starter-test</artifactId>
30+
<scope>test</scope>
31+
</dependency>
32+
<!--OpenTelemetry SDK-->
33+
<dependency>
34+
<groupId>io.opentelemetry</groupId>
35+
<artifactId>opentelemetry-api</artifactId>
36+
</dependency>
37+
<dependency>
38+
<groupId>io.opentelemetry</groupId>
39+
<artifactId>opentelemetry-sdk</artifactId>
40+
</dependency>
41+
<!--opentelemetry 可选包,引入后,提供 LoggingSpanExporter,支持配置将数据以日志形式打印-->
42+
<dependency>
43+
<groupId>io.opentelemetry</groupId>
44+
<artifactId>opentelemetry-exporter-logging</artifactId>
45+
</dependency>
46+
<dependency>
47+
<groupId>io.opentelemetry</groupId>
48+
<artifactId>opentelemetry-semconv</artifactId>
49+
<version>1.26.0-alpha</version>
50+
</dependency>
51+
<!--流行的工具包集-->
52+
<dependency>
53+
<groupId>cn.hutool</groupId>
54+
<artifactId>hutool-all</artifactId>
55+
<version>5.5.9</version>
56+
</dependency>
57+
</dependencies>
58+
59+
<dependencyManagement>
60+
<dependencies>
61+
<dependency>
62+
<groupId>io.opentelemetry</groupId>
63+
<artifactId>opentelemetry-bom</artifactId>
64+
<version>1.26.0</version>
65+
<type>pom</type>
66+
<scope>import</scope>
67+
</dependency>
68+
</dependencies>
69+
</dependencyManagement>
70+
</project>

0 commit comments

Comments
 (0)