Skip to content

Commit 47af075

Browse files
Merge pull request apache#631 from OpenSkywalking/feature/new-network-protocol
Change network protocol and refactor agent core.
2 parents e6bb08e + 5501387 commit 47af075

File tree

7 files changed

+65
-33
lines changed

7 files changed

+65
-33
lines changed

apm-network/src/main/proto/TraceSegmentService.proto

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,10 @@ message UniqueId {
2222

2323
message TraceSegmentObject {
2424
UniqueId traceSegmentId = 1;
25-
repeated TraceSegmentReference refs = 2;
26-
repeated SpanObject spans = 3;
27-
int32 applicationId = 4;
28-
int32 applicationInstanceId = 5;
29-
bool isSizeLimited = 6;
25+
repeated SpanObject spans = 2;
26+
int32 applicationId = 3;
27+
int32 applicationInstanceId = 4;
28+
bool isSizeLimited = 5;
3029
}
3130

3231
message TraceSegmentReference {
@@ -48,17 +47,18 @@ message SpanObject {
4847
int32 parentSpanId = 2;
4948
int64 startTime = 3;
5049
int64 endTime = 4;
51-
int32 operationNameId = 5;
52-
string operationName = 6;
53-
int32 peerId = 7;
54-
string peer = 8;
55-
SpanType spanType = 9;
56-
SpanLayer spanLayer = 10;
57-
int32 componentId = 11;
58-
string component = 12;
59-
bool isError = 13;
60-
repeated KeyWithStringValue tags = 14;
61-
repeated LogMessage logs = 15;
50+
repeated TraceSegmentReference refs = 5;
51+
int32 operationNameId = 6;
52+
string operationName = 7;
53+
int32 peerId = 8;
54+
string peer = 9;
55+
SpanType spanType = 10;
56+
SpanLayer spanLayer = 11;
57+
int32 componentId = 12;
58+
string component = 13;
59+
bool isError = 14;
60+
repeated KeyWithStringValue tags = 15;
61+
repeated LogMessage logs = 16;
6262
}
6363

6464
enum RefType {

apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/ContextManager.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,15 @@
2525
import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
2626
import org.skywalking.apm.agent.core.context.trace.TraceSegment;
2727
import org.skywalking.apm.agent.core.dictionary.DictionaryUtil;
28-
import org.skywalking.apm.agent.core.sampling.SamplingService;
2928
import org.skywalking.apm.agent.core.logging.api.ILog;
3029
import org.skywalking.apm.agent.core.logging.api.LogManager;
30+
import org.skywalking.apm.agent.core.sampling.SamplingService;
3131
import org.skywalking.apm.util.StringUtil;
3232

3333
/**
3434
* {@link ContextManager} controls the whole context of {@link TraceSegment}. Any {@link TraceSegment} relates to
3535
* single-thread, so this context use {@link ThreadLocal} to maintain the context, and make sure, since a {@link
36-
* TraceSegment} starts, all ChildOf spans are in the same context.
37-
* <p>
38-
* What is 'ChildOf'? {@see
36+
* TraceSegment} starts, all ChildOf spans are in the same context. <p> What is 'ChildOf'? {@see
3937
* https://github.com/opentracing/specification/blob/master/specification.md#references-between-spans}
4038
*
4139
* <p> Also, {@link ContextManager} delegates to all {@link AbstractTracerContext}'s major methods.
@@ -100,15 +98,18 @@ public static String getGlobalTraceId() {
10098

10199
public static AbstractSpan createEntrySpan(String operationName, ContextCarrier carrier) {
102100
SamplingService samplingService = ServiceManager.INSTANCE.findService(SamplingService.class);
101+
AbstractSpan span;
103102
AbstractTracerContext context;
104103
if (carrier != null && carrier.isValid()) {
105104
samplingService.forceSampled();
106105
context = getOrCreate(operationName, true);
106+
span = context.createEntrySpan(operationName);
107107
context.extract(carrier);
108108
} else {
109109
context = getOrCreate(operationName, false);
110+
span = context.createEntrySpan(operationName);
110111
}
111-
return context.createEntrySpan(operationName);
112+
return span;
112113
}
113114

114115
public static AbstractSpan createLocalSpan(String operationName) {

apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,13 @@ public void inject(ContextCarrier carrier) {
153153
*/
154154
@Override
155155
public void extract(ContextCarrier carrier) {
156-
this.segment.ref(new TraceSegmentRef(carrier));
156+
TraceSegmentRef ref = new TraceSegmentRef(carrier);
157+
this.segment.ref(ref);
157158
this.segment.relatedGlobalTraces(carrier.getDistributedTraceId());
159+
AbstractSpan span = this.activeSpan();
160+
if (span instanceof EntrySpan) {
161+
((EntrySpan)span).ref(ref);
162+
}
158163
}
159164

160165
/**

apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/EntrySpan.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818

1919
package org.skywalking.apm.agent.core.context.trace;
2020

21+
import java.util.LinkedList;
22+
import java.util.List;
2123
import org.skywalking.apm.agent.core.dictionary.DictionaryUtil;
24+
import org.skywalking.apm.network.proto.SpanObject;
2225
import org.skywalking.apm.network.trace.component.Component;
2326

2427
/**
@@ -29,12 +32,18 @@
2932
*
3033
* But with the last <code>EntrySpan</code>'s tags and logs, which have more details about a service provider.
3134
*
32-
* Such as: Tomcat Embed -> Dubbox
33-
* The <code>EntrySpan</code> represents the Dubbox span.
35+
* Such as: Tomcat Embed -> Dubbox The <code>EntrySpan</code> represents the Dubbox span.
3436
*
3537
* @author wusheng
3638
*/
3739
public class EntrySpan extends StackBasedTracingSpan {
40+
/**
41+
* The refs of parent trace segments, except the primary one. For most RPC call, {@link #refs} contains only one
42+
* element, but if this segment is a start span of batch process, the segment faces multi parents, at this moment,
43+
* we use this {@link #refs} to link them.
44+
*/
45+
private List<TraceSegmentRef> refs;
46+
3847
private int currentMaxDepth;
3948

4049
public EntrySpan(int spanId, int parentSpanId, String operationName) {
@@ -126,6 +135,25 @@ public EntrySpan log(Throwable t) {
126135
return false;
127136
}
128137

138+
@Override public SpanObject.Builder transform() {
139+
SpanObject.Builder builder = super.transform();
140+
if (refs != null) {
141+
for (TraceSegmentRef ref : refs) {
142+
builder.addRefs(ref.transform());
143+
}
144+
}
145+
return builder;
146+
}
147+
148+
public void ref(TraceSegmentRef ref) {
149+
if (refs == null) {
150+
refs = new LinkedList<TraceSegmentRef>();
151+
}
152+
if (!refs.contains(ref)) {
153+
refs.add(ref);
154+
}
155+
}
156+
129157
private void clearWhenRestart() {
130158
this.componentId = DictionaryUtil.nullValue();
131159
this.componentName = null;

apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/TraceSegment.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public class TraceSegment {
4646
* The refs of parent trace segments, except the primary one. For most RPC call, {@link #refs} contains only one
4747
* element, but if this segment is a start span of batch process, the segment faces multi parents, at this moment,
4848
* we use this {@link #refs} to link them.
49+
*
50+
* This field will not be serialized. Keeping this field is only for quick accessing.
4951
*/
5052
private List<TraceSegmentRef> refs;
5153

@@ -165,12 +167,8 @@ public UpstreamSegment transform() {
165167
* Trace Segment
166168
*/
167169
traceSegmentBuilder.setTraceSegmentId(this.traceSegmentId.transform());
168-
// TraceSegmentReference
169-
if (this.refs != null) {
170-
for (TraceSegmentRef ref : this.refs) {
171-
traceSegmentBuilder.addRefs(ref.transform());
172-
}
173-
}
170+
// Don't serialize TraceSegmentReference
171+
174172
// SpanObject
175173
for (AbstractTracingSpan span : this.spans) {
176174
traceSegmentBuilder.addSpans(span.transform());

apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/context/ContextManagerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,14 +255,14 @@ public void testTransform() throws InvalidProtocolBufferException {
255255
UpstreamSegment upstreamSegment = actualSegment.transform();
256256
assertThat(upstreamSegment.getGlobalTraceIdsCount(), is(1));
257257
TraceSegmentObject traceSegmentObject = TraceSegmentObject.parseFrom(upstreamSegment.getSegment());
258-
TraceSegmentReference reference = traceSegmentObject.getRefs(0);
258+
TraceSegmentReference reference = traceSegmentObject.getSpans(1).getRefs(0);
259259

260260
assertThat(reference.getEntryServiceName(), is("/portal/"));
261261
assertThat(reference.getNetworkAddress(), is("127.0.0.1:8080"));
262262
assertThat(reference.getParentSpanId(), is(3));
263263

264264
assertThat(traceSegmentObject.getApplicationId(), is(1));
265-
assertThat(traceSegmentObject.getRefsCount(), is(1));
265+
assertThat(traceSegmentObject.getSpans(1).getRefsCount(), is(1));
266266

267267
assertThat(traceSegmentObject.getSpansCount(), is(2));
268268

apm-sniffer/apm-agent-core/src/test/java/org/skywalking/apm/agent/core/remote/TraceSegmentServiceClientTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public void testSendTraceSegmentWithoutException() throws InvalidProtocolBufferE
127127
UpstreamSegment upstreamSegment = upstreamSegments.get(0);
128128
assertThat(upstreamSegment.getGlobalTraceIdsCount(), is(1));
129129
TraceSegmentObject traceSegmentObject = TraceSegmentObject.parseFrom(upstreamSegment.getSegment());
130-
assertThat(traceSegmentObject.getRefsCount(), is(0));
130+
assertThat(traceSegmentObject.getSpans(0).getRefsCount(), is(0));
131131
assertThat(traceSegmentObject.getSpansCount(), is(1));
132132

133133
SpanObject spanObject = traceSegmentObject.getSpans(0);

0 commit comments

Comments
 (0)