diff --git a/README.md b/README.md
index 1fa07c41..203948c8 100644
--- a/README.md
+++ b/README.md
@@ -57,6 +57,7 @@ SOFATracer 的编译环境的要求为 JDK7 或者 JDK8,需要采用 [Apache M
* [SOFATracer 示例工程(基于 Spring MVC 示例落地日志)](./tracer-samples/tracer-sample-with-springmvc)
* [SOFATracer 示例工程(基于 Spring MVC 示例远程上报 Zipkin)](./tracer-samples/tracer-sample-with-zipkin)
+* [SOFATracer 示例工程(基于 SOFA RPC 示例落地日志)](./tracer-samples/tracer-sample-with-sofarpc)
* [SOFATracer 示例工程(基于日志编程接口 SLF4J 示例打印 traceId)](./tracer-samples/tracer-sample-with-slf4j)
## 六、文档
diff --git a/tracer-samples/tracer-sample-with-sofarpc/pom.xml b/tracer-samples/tracer-sample-with-sofarpc/pom.xml
index b56c4cd1..42f47256 100644
--- a/tracer-samples/tracer-sample-with-sofarpc/pom.xml
+++ b/tracer-samples/tracer-sample-with-sofarpc/pom.xml
@@ -5,7 +5,7 @@
com.alipay.sofa
sofa-tracer-samples
- 2.1.0
+ 2.2.0-SNAPSHOT
4.0.0
diff --git a/tracer-samples/tracer-sample-with-zipkin/README.md b/tracer-samples/tracer-sample-with-zipkin/README.md
index 676d4218..aa3e9fb1 100644
--- a/tracer-samples/tracer-sample-with-zipkin/README.md
+++ b/tracer-samples/tracer-sample-with-zipkin/README.md
@@ -59,15 +59,15 @@ logging.path=./logs
```xml
- io.zipkin.java
- zipkin
- 1.19.2
-
-
- io.zipkin.reporter
- zipkin-reporter
- 0.6.12
-
+ io.zipkin.zipkin2
+ zipkin
+ 2.11.1
+
+
+ io.zipkin.reporter2
+ zipkin-reporter
+ 2.7.7
+
```
## 启用 SOFATracer 汇报数据到 Zipkin
diff --git a/tracer-samples/tracer-sample-with-zipkin/pom.xml b/tracer-samples/tracer-sample-with-zipkin/pom.xml
index 1c2453d5..884b71c2 100644
--- a/tracer-samples/tracer-sample-with-zipkin/pom.xml
+++ b/tracer-samples/tracer-sample-with-zipkin/pom.xml
@@ -23,14 +23,14 @@
- io.zipkin.java
+ io.zipkin.zipkin2
zipkin
- 1.19.2
+ 2.11.1
- io.zipkin.reporter
+ io.zipkin.reporter2
zipkin-reporter
- 0.6.12
+ 2.7.7
org.springframework.boot
diff --git a/tracer-sofa-boot-starter/pom.xml b/tracer-sofa-boot-starter/pom.xml
index 2ae96fd6..06059c42 100644
--- a/tracer-sofa-boot-starter/pom.xml
+++ b/tracer-sofa-boot-starter/pom.xml
@@ -52,18 +52,31 @@
spring-boot-configuration-processor
true
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+ provided
+
+
+ org.apache.httpcomponents
+ httpasyncclient
+ 4.1.3
+ provided
+
- io.zipkin.java
+ io.zipkin.zipkin2
zipkin
- 1.19.2
+ 2.11.1
true
- io.zipkin.reporter
+ io.zipkin.reporter2
zipkin-reporter
- 0.6.12
+ 2.7.7
true
@@ -82,13 +95,5 @@
fastjson
test
-
-
- io.zipkin.java
- zipkin-junit
- 1.19.2
- test
-
-
diff --git a/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/ZipkinSofaTracerSpanRemoteReporter.java b/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/ZipkinSofaTracerSpanRemoteReporter.java
index d5092199..db8e2aa6 100644
--- a/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/ZipkinSofaTracerSpanRemoteReporter.java
+++ b/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/ZipkinSofaTracerSpanRemoteReporter.java
@@ -26,21 +26,16 @@
import com.alipay.sofa.tracer.boot.zipkin.sender.ZipkinRestTemplateSender;
import org.springframework.util.Assert;
import org.springframework.web.client.RestTemplate;
-import zipkin.Annotation;
-import zipkin.BinaryAnnotation;
-import zipkin.Endpoint;
-import zipkin.Span;
-import zipkin.reporter.AsyncReporter;
-
+import zipkin2.Endpoint;
+import zipkin2.Span;
+import zipkin2.reporter.AsyncReporter;
import java.io.Closeable;
import java.io.Flushable;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
import java.util.Map;
-import java.util.concurrent.TimeUnit;
/**
* ZipkinSofaTracerSpanRemoteReporter report {@link SofaTracerSpan} to Zipkin
@@ -50,8 +45,6 @@
*/
public class ZipkinSofaTracerSpanRemoteReporter implements SpanReportListener, Flushable, Closeable {
- private static final Charset UTF_8 = Charset.forName("UTF-8");
-
private static String processId = TracerUtils.getPID();
private final ZipkinRestTemplateSender sender;
@@ -63,11 +56,9 @@ public class ZipkinSofaTracerSpanRemoteReporter implements SpanReportListener, F
*/
private int ipAddressInt = -1;
- public ZipkinSofaTracerSpanRemoteReporter(RestTemplate restTemplate, String baseUrl,
- int flushInterval) {
+ public ZipkinSofaTracerSpanRemoteReporter(RestTemplate restTemplate, String baseUrl) {
this.sender = new ZipkinRestTemplateSender(restTemplate, baseUrl);
- this.delegate = AsyncReporter.builder(this.sender).queuedMaxSpans(1000)
- .messageTimeout(flushInterval, TimeUnit.SECONDS).build();
+ this.delegate = AsyncReporter.create(sender);
}
@Override
@@ -76,7 +67,7 @@ public void onSpanReport(SofaTracerSpan span) {
return;
}
//convert
- zipkin.Span zipkinSpan = convertToZipkinSpan(span);
+ Span zipkinSpan = convertToZipkinSpan(span);
this.delegate.report(zipkinSpan);
}
@@ -88,19 +79,22 @@ public void flush() throws IOException {
@Override
public void close() {
this.delegate.close();
- this.sender.close();
}
- private zipkin.Span convertToZipkinSpan(SofaTracerSpan sofaTracerSpan) {
- zipkin.Span.Builder zipkinSpanBuilder = Span.builder();
+ /**
+ * convent sofaTracerSpan model to zipKinSpan model
+ * @param sofaTracerSpan
+ * @return
+ */
+ private Span convertToZipkinSpan(SofaTracerSpan sofaTracerSpan) {
+ Span.Builder zipkinSpanBuilder = Span.newBuilder();
+ zipkinSpanBuilder.timestamp(sofaTracerSpan.getStartTime() * 1000);
+ //Annotations
Endpoint endpoint = getZipkinEndpoint(sofaTracerSpan.getOperationName());
this.addZipkinAnnotations(zipkinSpanBuilder, sofaTracerSpan, endpoint);
- this.addZipkinBinaryAnnotationsWithTags(zipkinSpanBuilder, sofaTracerSpan, endpoint);
- //baggage
+ this.addZipkinBinaryAnnotationsWithTags(zipkinSpanBuilder, sofaTracerSpan);
this.addZipkinBinaryAnnotationsWithBaggage(zipkinSpanBuilder, sofaTracerSpan);
- // Zipkin is in nanosecond :timestamp reference : zipkin.storage.QueryRequest.test()
- zipkinSpanBuilder.timestamp(sofaTracerSpan.getStartTime() * 1000);
- // Zipkin is in nanosecond
+ // Zipkin is in nanosecond cr-cs
zipkinSpanBuilder
.duration((sofaTracerSpan.getEndTime() - sofaTracerSpan.getStartTime()) * 1000);
//traceId
@@ -116,11 +110,10 @@ private zipkin.Span convertToZipkinSpan(SofaTracerSpan sofaTracerSpan) {
* off the pid in tail of the traceId, because it does not know the pid of the sender.
* resulting in over range when convert it to long type.
*/
- //zipkinSpanBuilder.traceId(traceIdToId(sofaTracerSpanContext.getTraceId()));
long[] traceIds = CommonUtils.hexToDualLong(sofaTracerSpanContext.getTraceId());
- zipkinSpanBuilder.traceIdHigh(traceIds[0]);
- zipkinSpanBuilder.traceId(traceIds[1]);
+ zipkinSpanBuilder.traceId(traceIds[0], traceIds[1]);
+ zipkinSpanBuilder.kind(Span.Kind.SERVER);
String parentSpanId = sofaTracerSpanContext.getParentId();
if (sofaTracerSpan.isServer() && parentSpanId != null
&& StringUtils.isNotBlank(parentSpanId)) {
@@ -159,8 +152,8 @@ private zipkin.Span convertToZipkinSpan(SofaTracerSpan sofaTracerSpan) {
}
private Endpoint getZipkinEndpoint(String operationName) {
+ InetAddress ipAddress = null;
if (this.ipAddressInt <= 0) {
- InetAddress ipAddress = null;
try {
ipAddress = InetAddress.getLocalHost();
this.ipAddressInt = ByteBuffer.wrap(ipAddress.getAddress()).getInt();
@@ -169,48 +162,39 @@ private Endpoint getZipkinEndpoint(String operationName) {
this.ipAddressInt = 256 * 256 * 256 * 127 + 1;
}
}
- return Endpoint.builder().serviceName(operationName).ipv4(this.ipAddressInt).build();
- }
-
- private void addZipkinBinaryAnnotation(String key, String value, Endpoint endpoint,
- zipkin.Span.Builder zipkinSpan) {
- BinaryAnnotation binaryAnn = BinaryAnnotation.builder().type(BinaryAnnotation.Type.STRING)
- .key(key).value(value.getBytes(UTF_8)).endpoint(endpoint).build();
- zipkinSpan.addBinaryAnnotation(binaryAnn);
+ return Endpoint.newBuilder().serviceName(operationName).ip(ipAddress).build();
}
/**
* Adds binary annotation from the Open Tracing Span
*/
- private void addZipkinBinaryAnnotationsWithTags(zipkin.Span.Builder zipkinSpan,
- SofaTracerSpan span, Endpoint endpoint) {
+ private void addZipkinBinaryAnnotationsWithTags(Span.Builder zipkinSpan, SofaTracerSpan span) {
for (Map.Entry e : span.getTagsWithStr().entrySet()) {
- addZipkinBinaryAnnotation(e.getKey(), e.getValue(), endpoint, zipkinSpan);
+ zipkinSpan.putTag(e.getKey(), e.getValue());
}
for (Map.Entry e : span.getTagsWithNumber().entrySet()) {
- addZipkinBinaryAnnotation(e.getKey(), e.getValue().toString(), endpoint, zipkinSpan);
+ zipkinSpan.putTag(e.getKey(), e.getValue().toString());
}
for (Map.Entry e : span.getTagsWithBool().entrySet()) {
- addZipkinBinaryAnnotation(e.getKey(), e.getValue().toString(), endpoint, zipkinSpan);
+ zipkinSpan.putTag(e.getKey(), e.getValue().toString());
}
}
- private void addZipkinBinaryAnnotationsWithBaggage(zipkin.Span.Builder zipkinSpan,
- SofaTracerSpan span) {
+ private void addZipkinBinaryAnnotationsWithBaggage(Span.Builder zipkinSpan, SofaTracerSpan span) {
SofaTracerSpanContext sofaTracerSpanContext = span.getSofaTracerSpanContext();
if (sofaTracerSpanContext != null) {
Map sysBaggage = sofaTracerSpanContext.getSysBaggage();
for (Map.Entry e : sysBaggage.entrySet()) {
- addZipkinBinaryAnnotation(e.getKey(), e.getValue(), null, zipkinSpan);
+ zipkinSpan.putTag(e.getKey(), e.getValue());
}
Map bizBaggage = sofaTracerSpanContext.getBizBaggage();
for (Map.Entry e : bizBaggage.entrySet()) {
- addZipkinBinaryAnnotation(e.getKey(), e.getValue(), null, zipkinSpan);
+ zipkinSpan.putTag(e.getKey(), e.getValue());
}
}
}
- private void addZipkinAnnotations(zipkin.Span.Builder zipkinSpan, SofaTracerSpan span,
+ private void addZipkinAnnotations(Span.Builder zipkinSpan, SofaTracerSpan span,
Endpoint endpoint) {
for (LogData logData : span.getLogs()) {
Map fields = logData.getFields();
@@ -218,12 +202,8 @@ private void addZipkinAnnotations(zipkin.Span.Builder zipkinSpan, SofaTracerSpan
continue;
}
for (Map.Entry entry : fields.entrySet()) {
- //ignore event key
- Annotation zipkinAnnotation = Annotation.builder()
- // Zipkin is in nanosecond
- .timestamp(logData.getTime() * 1000).value(entry.getValue().toString())
- .endpoint(endpoint).build();
- zipkinSpan.addAnnotation(zipkinAnnotation);
+ zipkinSpan.addAnnotation(logData.getTime() * 1000, entry.getValue().toString())
+ .localEndpoint(endpoint);
}
}
}
diff --git a/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/configuration/ZipkinSofaTracerAutoConfiguration.java b/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/configuration/ZipkinSofaTracerAutoConfiguration.java
index 12e80682..17566d58 100644
--- a/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/configuration/ZipkinSofaTracerAutoConfiguration.java
+++ b/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/configuration/ZipkinSofaTracerAutoConfiguration.java
@@ -37,7 +37,7 @@
@EnableConfigurationProperties({ ZipkinSofaTracerProperties.class,
ZipkinSofaTracerSamplerProperties.class })
@ConditionalOnProperty(value = "com.alipay.sofa.tracer.zipkin.enabled", matchIfMissing = true)
-@ConditionalOnClass({ zipkin.Span.class, zipkin.reporter.AsyncReporter.class })
+@ConditionalOnClass({ zipkin2.Span.class, zipkin2.reporter.AsyncReporter.class })
public class ZipkinSofaTracerAutoConfiguration {
@Bean
@@ -53,6 +53,6 @@ public ZipkinSofaTracerSpanRemoteReporter zpkinSofaTracerSpanReporter(ZipkinSofa
RestTemplate restTemplate = new RestTemplate();
zipkinSofaTracerRestTemplateCustomizer.customize(restTemplate);
return new ZipkinSofaTracerSpanRemoteReporter(restTemplate,
- zipkinSofaTracerProperties.getBaseUrl(), zipkinSofaTracerProperties.getFlushInterval());
+ zipkinSofaTracerProperties.getBaseUrl());
}
}
diff --git a/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/sender/ZipkinRestTemplateSender.java b/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/sender/ZipkinRestTemplateSender.java
index 2d55f697..4c3ed740 100644
--- a/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/sender/ZipkinRestTemplateSender.java
+++ b/tracer-sofa-boot-starter/src/main/java/com/alipay/sofa/tracer/boot/zipkin/sender/ZipkinRestTemplateSender.java
@@ -21,11 +21,10 @@
import org.springframework.http.MediaType;
import org.springframework.http.RequestEntity;
import org.springframework.web.client.RestTemplate;
-import zipkin.reporter.BytesMessageEncoder;
-import zipkin.reporter.Callback;
-import zipkin.reporter.Encoding;
-import zipkin.reporter.Sender;
-
+import zipkin2.Call;
+import zipkin2.codec.Encoding;
+import zipkin2.reporter.BytesMessageEncoder;
+import zipkin2.reporter.Sender;
import java.net.URI;
import java.util.List;
@@ -35,20 +34,15 @@
* @author yangguanchao
* @since 2018/05/01
*/
-public class ZipkinRestTemplateSender implements Sender {
-
- private RestTemplate restTemplate;
+public class ZipkinRestTemplateSender extends Sender {
- private String url;
+ private RestTemplate restTemplate;
- /**
- * close is typically called from a different thread
- */
- private transient boolean closeCalled;
+ private String url;
public ZipkinRestTemplateSender(RestTemplate restTemplate, String baseUrl) {
this.restTemplate = restTemplate;
- this.url = baseUrl + (baseUrl.endsWith("/") ? "" : "/") + "api/v1/spans";
+ this.url = baseUrl + (baseUrl.endsWith("/") ? "" : "/") + "api/v2/spans";
}
@Override
@@ -68,44 +62,22 @@ public int messageSizeInBytes(List spans) {
}
@Override
- public void sendSpans(List encodedSpans, Callback callback) {
- if (this.closeCalled) {
- throw new IllegalStateException("Zipkin has closed!");
- }
+ public Call sendSpans(List encodedSpans) {
try {
byte[] message = BytesMessageEncoder.JSON.encode(encodedSpans);
post(message);
- callback.onComplete();
} catch (Throwable e) {
- callback.onError(e);
if (e instanceof Error) {
throw (Error) e;
}
}
- }
-
- /**
- * Sends an empty json message to the configured endpoint.
- */
- @Override
- public CheckResult check() {
- try {
- post(new byte[] { '[', ']' });
- return CheckResult.OK;
- } catch (Exception e) {
- return CheckResult.failed(e);
- }
- }
-
- @Override
- public void close() {
- this.closeCalled = true;
+ return null;
}
private void post(byte[] json) {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
- RequestEntity requestEntity = new RequestEntity(json, httpHeaders,
+ RequestEntity requestEntity = new RequestEntity<>(json, httpHeaders,
HttpMethod.POST, URI.create(this.url));
this.restTemplate.exchange(requestEntity, String.class);
}
diff --git a/tracer-sofa-boot-starter/src/test/java/com/alipay/sofa/tracer/boot/zipkin/ZipkinSofaTracerSpanRemoteReporterTest.java b/tracer-sofa-boot-starter/src/test/java/com/alipay/sofa/tracer/boot/zipkin/ZipkinSofaTracerSpanRemoteReporterTest.java
index 4303efff..278456fb 100644
--- a/tracer-sofa-boot-starter/src/test/java/com/alipay/sofa/tracer/boot/zipkin/ZipkinSofaTracerSpanRemoteReporterTest.java
+++ b/tracer-sofa-boot-starter/src/test/java/com/alipay/sofa/tracer/boot/zipkin/ZipkinSofaTracerSpanRemoteReporterTest.java
@@ -59,9 +59,8 @@ public void before() throws Exception {
restTemplateCustomizer.customize(restTemplate);
//host http://zipkin-cloud-3.inc.host.net:9411
String baseUrl = "http://zipkin-cloud-3.inc.host.net:9411";
- int flushInterval = 1;
SpanReportListener spanReportListener = new ZipkinSofaTracerSpanRemoteReporter(
- restTemplate, baseUrl, flushInterval);
+ restTemplate, baseUrl);
SpanReportListenerHolder.addSpanReportListener(spanReportListener);
}