Skip to content

Commit da3eae8

Browse files
committed
add source first
1 parent 76ad478 commit da3eae8

18 files changed

+821
-0
lines changed

Dockerfile

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM openjdk:8-jdk-alpine
2+
3+
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
4+
VOLUME /tmp
5+
6+
WORKDIR /data
7+
RUN mkdir logs
8+
ADD otel.jar otel.jar
9+
ADD opentelemetry-javaagent.jar opentelemetry-javaagent.jar
10+
ADD otel.jar
11+
# 修改时区
12+
ENV TZ=Asia/Shanghai
13+
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
14+
# 解决中文乱码
15+
ENV LANG en_US.UTF-8
16+
ENTRYPOINT ["java","-javaagent:opentelemetry-javaagent.jar","-Dspring.profiles.active=test","-Dotel.resource.attributes=service.name=trace-demo","-Dotel.traces.exporter=jaeger","-Djava.security.egd=file:/dev/./urandom","-jar","otel.jar"]

docker-compose.yml

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
version: '3.3'
2+
networks:
3+
jaeger:
4+
5+
services:
6+
7+
nginx:
8+
container_name: nginx
9+
image: nginx:1.16.1
10+
restart: always
11+
##ports:
12+
## - 80:80
13+
volumes:
14+
- ./nginx.conf:/etc/nginx/nginx.conf
15+
network_mode: host
16+
17+
app:
18+
build: ./
19+
container_name: observble-demo
20+
##ports:
21+
## - 8080:8080
22+
environment:
23+
# 外网ip,用于访问jaeger UI
24+
- EXTRA_HOST=localhost
25+
##- JAVA_OPTS=-javaagent:opentelemetry-javaagent.jar -Dotel.resource.attributes=service.name=trace-demo -Dotel.traces.exporter=jaeger -Dotel.metrics.exporter=none
26+
depends_on:
27+
- jaeger
28+
network_mode: host
29+
30+
jaeger:
31+
image: jaegertracing/all-in-one:1.29
32+
##ports:
33+
## - 5775:5775/udp
34+
## - 6831:6831/udp
35+
## - 6832:6832/udp
36+
## - 5778:5778
37+
## - 16686:16686
38+
## - 14250:14250
39+
## - 14268:14268
40+
## - 14269:14269
41+
## - 9411:9411
42+
##networks:
43+
## - jaeger
44+
network_mode: host

nginx.conf

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#这个文件给docker用的
2+
#user nobody;
3+
worker_processes 1;
4+
5+
#error_log logs/error.log;
6+
#error_log logs/error.log notice;
7+
#error_log logs/error.log info;
8+
9+
#pid logs/nginx.pid;
10+
11+
12+
events {
13+
worker_connections 1024;
14+
}
15+
16+
17+
http {
18+
include mime.types;
19+
default_type application/octet-stream;
20+
21+
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
22+
# '$status $body_bytes_sent "$http_referer" '
23+
# '"$http_user_agent" "$http_x_forwarded_for"';
24+
25+
#access_log logs/access.log main;
26+
27+
sendfile on;
28+
#tcp_nopush on;
29+
30+
#keepalive_timeout 0;
31+
keepalive_timeout 65;
32+
client_max_body_size 10m;
33+
gzip on;
34+
gzip_min_length 5k;
35+
gzip_buffers 4 16k;
36+
gzip_http_version 1.0;
37+
gzip_comp_level 4;
38+
gzip_types text/plain application/x-javascript application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
39+
gzip_vary on;
40+
41+
server {
42+
listen 80;
43+
server_name localhost;
44+
location / {
45+
proxy_pass http://127.0.0.1:8080/; #转向地址 访问80指向8080
46+
}
47+
}
48+
}

pom.xml

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.6.2</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<groupId>com.tim.observable</groupId>
12+
<artifactId>otel</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<name>otel</name>
15+
<description>Demo project for Spring Boot</description>
16+
<properties>
17+
<java.version>1.8</java.version>
18+
<opentelemetry.version>1.9.1</opentelemetry.version>
19+
<grpc.version>1.36.1</grpc.version>
20+
</properties>
21+
<dependencies>
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-web</artifactId>
25+
</dependency>
26+
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-starter-test</artifactId>
30+
<scope>test</scope>
31+
</dependency>
32+
<dependency>
33+
<groupId>io.opentelemetry</groupId>
34+
<artifactId>opentelemetry-api</artifactId>
35+
</dependency>
36+
<dependency>
37+
<groupId>io.opentelemetry</groupId>
38+
<artifactId>opentelemetry-sdk</artifactId>
39+
</dependency>
40+
<!-- <dependency>-->
41+
<!-- <groupId>io.opentelemetry</groupId>-->
42+
<!-- <artifactId>opentelemetry-exporter-otlp</artifactId>-->
43+
<!-- </dependency>-->
44+
<dependency>
45+
<groupId>io.opentelemetry</groupId>
46+
<artifactId>opentelemetry-extension-annotations</artifactId>
47+
</dependency>
48+
<dependency>
49+
<groupId>io.opentelemetry</groupId>
50+
<artifactId>opentelemetry-exporter-jaeger</artifactId>
51+
</dependency>
52+
<!-- Trace 的数据约定 -->
53+
<dependency>
54+
<groupId>io.opentelemetry</groupId>
55+
<artifactId>opentelemetry-semconv</artifactId>
56+
<version>1.9.0-alpha</version>
57+
</dependency>
58+
<dependency>
59+
<groupId>org.apache.commons</groupId>
60+
<artifactId>commons-lang3</artifactId>
61+
</dependency>
62+
</dependencies>
63+
<dependencyManagement>
64+
65+
<dependencies>
66+
<dependency>
67+
<groupId>io.opentelemetry</groupId>
68+
<artifactId>opentelemetry-bom</artifactId>
69+
<version>1.9.1</version>
70+
<type>pom</type>
71+
<scope>import</scope>
72+
</dependency>
73+
</dependencies>
74+
</dependencyManagement>
75+
<build>
76+
<finalName>${project.artifactId}</finalName>
77+
<plugins>
78+
<plugin>
79+
<groupId>org.springframework.boot</groupId>
80+
<artifactId>spring-boot-maven-plugin</artifactId>
81+
</plugin>
82+
</plugins>
83+
</build>
84+
85+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.observable.trace.otel;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.web.client.RestTemplate;
7+
8+
@SpringBootApplication
9+
public class Application {
10+
11+
public static void main(String[] args) {
12+
SpringApplication.run(Application.class, args);
13+
}
14+
15+
16+
17+
@Bean
18+
public RestTemplate httpTemplate(){
19+
return new RestTemplate();
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.observable.trace.otel.config;
2+
3+
import java.util.concurrent.TimeUnit;
4+
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
10+
import io.opentelemetry.api.OpenTelemetry;
11+
import io.opentelemetry.api.common.Attributes;
12+
import io.opentelemetry.api.trace.Tracer;
13+
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
14+
import io.opentelemetry.context.propagation.ContextPropagators;
15+
import io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporter;
16+
import io.opentelemetry.sdk.OpenTelemetrySdk;
17+
import io.opentelemetry.sdk.resources.Resource;
18+
import io.opentelemetry.sdk.trace.SdkTracerProvider;
19+
import io.opentelemetry.sdk.trace.SpanProcessor;
20+
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
21+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
22+
23+
/**
24+
*
25+
* @Title: TraceBean.java
26+
* @Description: TODO
27+
* @author tim.jiang
28+
* @date 2021年12月31日
29+
*/
30+
@Configuration
31+
public class TraceBean {
32+
@Autowired
33+
private TraceConfig config;
34+
35+
@Bean
36+
@ConditionalOnBean(TraceConfig.class)
37+
public OpenTelemetry openTelemetry() {
38+
SpanProcessor spanProcessor = getJaegerGrpcSpanProcessor();
39+
Resource serviceNameResource = Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "otelService"));
40+
41+
SdkTracerProvider tracerProvider =
42+
SdkTracerProvider.builder()
43+
.addSpanProcessor(spanProcessor)
44+
.setResource(Resource.getDefault().merge(serviceNameResource))
45+
.build();
46+
OpenTelemetrySdk openTelemetry =
47+
OpenTelemetrySdk.builder().setTracerProvider(tracerProvider)
48+
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
49+
.buildAndRegisterGlobal();
50+
51+
// add a shutdown hook to shut down the SDK
52+
Runtime.getRuntime().addShutdownHook(new Thread(tracerProvider::close));
53+
54+
// return the configured instance so it can be used for instrumentation.
55+
return openTelemetry;
56+
}
57+
58+
private SpanProcessor getJaegerGrpcSpanProcessor(){
59+
String httpUrl = String.format("http://%s:%s", config.getHost(), config.getPort());
60+
System.out.println(httpUrl);
61+
JaegerGrpcSpanExporter exporter =
62+
JaegerGrpcSpanExporter.builder()
63+
.setEndpoint(httpUrl)
64+
.build();
65+
return BatchSpanProcessor.builder(exporter)
66+
.setScheduleDelay(100, TimeUnit.MILLISECONDS)
67+
.build();
68+
}
69+
70+
@Bean
71+
public Tracer tracer(){
72+
return openTelemetry().getTracer("演示trace");
73+
}
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.observable.trace.otel.config;
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
import org.springframework.stereotype.Component;
5+
6+
/**
7+
* @author liurui
8+
* @date 2021/12/30
9+
*/
10+
@Component
11+
@ConfigurationProperties(prefix = "trace.exporter")
12+
public class TraceConfig {
13+
private String host;
14+
private String port;
15+
private String uiPort;
16+
17+
public String getHost() {
18+
return host;
19+
}
20+
21+
public void setHost(String host) {
22+
this.host = host;
23+
}
24+
25+
public String getPort() {
26+
return port;
27+
}
28+
29+
public void setPort(String port) {
30+
this.port = port;
31+
}
32+
33+
public String getUiPort() {
34+
return uiPort;
35+
}
36+
37+
public void setUiPort(String uiPort) {
38+
this.uiPort = uiPort;
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.observable.trace.otel.controller;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.beans.factory.annotation.Value;
9+
import org.springframework.web.client.RestTemplate;
10+
11+
import io.opentelemetry.api.OpenTelemetry;
12+
import io.opentelemetry.api.trace.Tracer;
13+
14+
/**
15+
*
16+
* @Title: BaseController.java
17+
* @Description: TODO
18+
* @author tim.jiang
19+
* @date 2021年12月31日
20+
*/
21+
public class BaseController {
22+
private static final Logger logger = LoggerFactory.getLogger(EventController.class);
23+
@Value("${api.url}")
24+
public String apiUrl;
25+
@Autowired
26+
public RestTemplate httpTemplate;
27+
@Autowired
28+
public Tracer tracer;
29+
30+
@Value("${trace.exporter.host}")
31+
public String exporterHost;
32+
@Value("${trace.exporter.uiPort}")
33+
public String exporterUiPort;
34+
@Value("${server.port}")
35+
public String serverPort;
36+
37+
@Autowired
38+
public OpenTelemetry openTelemetry;
39+
40+
public String buildTraceUrl(String traceId) {
41+
try {
42+
//睡一会吧,trace生成滞后,UI 同步成功一会再点
43+
Thread.sleep(2000);
44+
} catch (InterruptedException e) {
45+
// TODO Auto-generated catch block
46+
e.printStackTrace();
47+
}
48+
logger.info("enter buildTraceUrl");
49+
return "<HR style=\"FILTER:progid:DXImageTransform.Microsoft.Shadow(color:#987cb9,direction:145,strength:15)\" color=#987cb9 SIZE=3> <br/>"
50+
+ "trace生成成功!查看完整链路图,traceId: <a href='getTrace?traceId=" + traceId + "'>" + traceId + "</a>"
51+
+ "<HR style=\"FILTER:progid:DXImageTransform.Microsoft.Shadow(color:#987cb9,direction:145,strength:15)\" color=#987cb9 SIZE=3> <br/>";
52+
}
53+
}
54+
55+

0 commit comments

Comments
 (0)