You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@skywalking.apache.org by wu...@apache.org on 2018/06/07 07:54:55 UTC
[incubator-skywalking] branch zipkin/receiver-v1 updated: Finish
ref transfer codes.
This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch zipkin/receiver-v1
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git
The following commit(s) were added to refs/heads/zipkin/receiver-v1 by this push:
new e954fee Finish ref transfer codes.
e954fee is described below
commit e954fee214ed5c011f16a90abed7faaa3228f6df
Author: wusheng <wu...@foxmail.com>
AuthorDate: Thu Jun 7 15:54:43 2018 +0800
Finish ref transfer codes.
---
.../zipkin/provider/transform/SegmentBuilder.java | 134 ++++++++++++++++++++-
1 file changed, 129 insertions(+), 5 deletions(-)
diff --git a/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/transform/SegmentBuilder.java b/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/transform/SegmentBuilder.java
index abaa642..2dbc5cf 100644
--- a/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/transform/SegmentBuilder.java
+++ b/apm-collector/apm-collector-thirdparty-receiver/receiver-zipkin/receiver-zipkin-provider/src/main/java/org/apache/skywalking/apm/collector/receiver/zipkin/provider/transform/SegmentBuilder.java
@@ -28,11 +28,14 @@ import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.skywalking.apm.collector.core.util.StringUtils;
import org.apache.skywalking.apm.collector.receiver.zipkin.provider.RegisterServices;
+import org.apache.skywalking.apm.network.proto.RefType;
import org.apache.skywalking.apm.network.proto.SpanObject;
import org.apache.skywalking.apm.network.proto.SpanType;
import org.apache.skywalking.apm.network.proto.TraceSegmentObject;
+import org.apache.skywalking.apm.network.proto.TraceSegmentReference;
import org.apache.skywalking.apm.network.proto.UniqueId;
import org.eclipse.jetty.util.StringUtil;
+import zipkin2.Endpoint;
import zipkin2.Span;
/**
@@ -81,10 +84,10 @@ public class SegmentBuilder {
if (StringUtils.isNotEmpty(applicationCode)) {
try {
builder.context.addApp(applicationCode, registerServices);
- SpanObject.Builder rootSpanBuilder = builder.initSpan(null, rootSpan, true);
+ SpanObject.Builder rootSpanBuilder = builder.initSpan(null, null, rootSpan, true);
builder.scanSpansFromRoot(rootSpanBuilder, rootSpan, parentId2SpanListMap, registerServices);
- builder.context.currentSegment().builder().addSpans(rootSpanBuilder);
+ builder.context.currentSegment().addSpan(rootSpanBuilder);
} finally {
builder.context.removeApp();
}
@@ -112,11 +115,11 @@ public class SegmentBuilder {
if (isNewApp) {
context.addApp(localServiceName, registerServices);
}
- SpanObject.Builder childSpanBuilder = initSpan(parentSegmentSpan, childSpan, isNewApp);
+ SpanObject.Builder childSpanBuilder = initSpan(parentSegmentSpan, parent, childSpan, isNewApp);
scanSpansFromRoot(childSpanBuilder, childSpan, parentId2SpanListMap, registerServices);
- context.currentSegment().builder().addSpans(childSpanBuilder);
+ context.currentSegment().addSpan(childSpanBuilder);
} finally {
if (isNewApp) {
context.removeApp();
@@ -125,7 +128,8 @@ public class SegmentBuilder {
}
}
- private SpanObject.Builder initSpan(SpanObject.Builder parentSegmentSpan, Span span, boolean isSegmentRoot) {
+ private SpanObject.Builder initSpan(SpanObject.Builder parentSegmentSpan, Span parentSpan, Span span,
+ boolean isSegmentRoot) {
SpanObject.Builder spanBuilder = SpanObject.newBuilder();
spanBuilder.setSpanId(context.currentIDs().nextSpanId());
if (!isSegmentRoot && parentSegmentSpan != null) {
@@ -139,9 +143,11 @@ public class SegmentBuilder {
break;
case SERVER:
spanBuilder.setSpanType(SpanType.Entry);
+ this.buildRef(spanBuilder, span, parentSegmentSpan, parentSpan);
break;
case CONSUMER:
spanBuilder.setSpanType(SpanType.Entry);
+ this.buildRef(spanBuilder, span, parentSegmentSpan, parentSpan);
break;
case PRODUCER:
spanBuilder.setSpanType(SpanType.Exit);
@@ -158,6 +164,71 @@ public class SegmentBuilder {
return spanBuilder;
}
+ private void buildRef(SpanObject.Builder spanBuilder, Span span, SpanObject.Builder parentSegmentSpan,
+ Span parentSpan) {
+ Segment parentSegment = context.parentSegment();
+ if (parentSegment == null) {
+ return;
+ }
+ Segment rootSegment = context.rootSegment();
+ if (rootSegment == null) {
+ return;
+ }
+
+ String ip = null;
+ int port = 0;
+ Endpoint serverEndpoint = span.localEndpoint();
+ Endpoint clientEndpoint = parentSpan.remoteEndpoint();
+ if (serverEndpoint != null) {
+ if (StringUtils.isNotEmpty(serverEndpoint.ipv4())) {
+ ip = serverEndpoint.ipv4();
+ } else if (StringUtils.isNotEmpty(serverEndpoint.ipv6())) {
+ ip = serverEndpoint.ipv6();
+ }
+ }
+
+ if (clientEndpoint != null) {
+ if (StringUtil.isBlank(ip)) {
+ if (StringUtils.isNotEmpty(clientEndpoint.ipv4())) {
+ ip = clientEndpoint.ipv4();
+ } else if (StringUtils.isNotEmpty(clientEndpoint.ipv6())) {
+ ip = clientEndpoint.ipv6();
+ }
+ port = clientEndpoint.port();
+ }
+ }
+ if (StringUtil.isBlank(ip)) {
+ //The IP is the most important for building the ref at both sides.
+ return;
+ }
+
+ TraceSegmentReference.Builder refBuilder = TraceSegmentReference.newBuilder();
+ refBuilder.setEntryApplicationInstanceId(rootSegment.builder().getApplicationInstanceId());
+ int serviceId = rootSegment.getEntryServiceId();
+ if (serviceId == 0) {
+ refBuilder.setEntryServiceName(rootSegment.getEntryServiceName());
+ } else {
+ refBuilder.setEntryServiceId(serviceId);
+ }
+ refBuilder.setEntryApplicationInstanceId(rootSegment.builder().getApplicationInstanceId());
+
+ // parent ref info
+ refBuilder.setNetworkAddress(port == 0 ? ip : ip + ":" + port);
+ parentSegmentSpan.setPeer(refBuilder.getNetworkAddress());
+ refBuilder.setParentApplicationInstanceId(parentSegment.builder().getApplicationInstanceId());
+ refBuilder.setParentSpanId(parentSegmentSpan.getSpanId());
+ refBuilder.setParentTraceSegmentId(parentSegment.builder().getTraceSegmentId());
+ int parentServiceId = parentSegment.getEntryServiceId();
+ if (parentServiceId == 0) {
+ refBuilder.setParentServiceId(parentServiceId);
+ } else {
+ refBuilder.setParentServiceName(parentSegment.getEntryServiceName());
+ }
+ refBuilder.setRefType(RefType.CrossProcess);
+
+ spanBuilder.addRefs(refBuilder);
+ }
+
/**
* Context holds the values in build process.
*/
@@ -193,6 +264,23 @@ public class SegmentBuilder {
return segmentsStack.getLast();
}
+ private Segment parentSegment() {
+ if (segmentsStack.size() < 2) {
+ return null;
+ } else {
+ return segmentsStack.get(segmentsStack.size() - 2);
+ }
+
+ }
+
+ private Segment rootSegment() {
+ if (segmentsStack.size() < 2) {
+ return null;
+ } else {
+ return segmentsStack.getFirst();
+ }
+ }
+
private Segment removeApp() {
return segmentsStack.removeLast();
}
@@ -213,9 +301,13 @@ public class SegmentBuilder {
private class Segment {
private TraceSegmentObject.Builder segmentBuilder;
private IDCollection ids;
+ private int entryServiceId = 0;
+ private String entryServiceName = null;
+ private List<SpanObject.Builder> spans;
private Segment(String applicationCode, int applicationId, int appInstanceId) {
ids = new IDCollection(applicationCode, applicationId, appInstanceId);
+ spans = new LinkedList<>();
segmentBuilder = TraceSegmentObject.newBuilder();
segmentBuilder.setApplicationId(applicationId);
segmentBuilder.setApplicationInstanceId(appInstanceId);
@@ -226,9 +318,41 @@ public class SegmentBuilder {
return segmentBuilder;
}
+ private void addSpan(SpanObject.Builder spanBuilder) {
+ if (entryServiceId == 0 && StringUtils.isEmpty(entryServiceName)) {
+ if (SpanType.Entry == spanBuilder.getSpanType()) {
+ entryServiceId = spanBuilder.getOperationNameId();
+ entryServiceName = spanBuilder.getOperationName();
+ }
+ }
+
+ // init by root span
+ if (spanBuilder.getSpanId() == 1 && entryServiceId == 0 && StringUtils.isEmpty(entryServiceName)) {
+ entryServiceId = spanBuilder.getOperationNameId();
+ entryServiceName = spanBuilder.getOperationName();
+ }
+
+ spans.add(spanBuilder);
+ }
+
+ public int getEntryServiceId() {
+ return entryServiceId;
+ }
+
+ public String getEntryServiceName() {
+ return entryServiceName;
+ }
+
private IDCollection ids() {
return ids;
}
+
+ public TraceSegmentObject.Builder freeze() {
+ for (SpanObject.Builder span : spans) {
+ segmentBuilder.addSpans(span);
+ }
+ return segmentBuilder;
+ }
}
private class IDCollection {
--
To stop receiving notification emails like this one, please contact
wusheng@apache.org.