@@ -58,35 +58,35 @@ final class SpanBuilderImpl extends SpanBuilder {
5858 @ Nullable private Kind kind ;
5959
6060 private Span startSpanInternal (
61- @ Nullable SpanContext parent ,
61+ @ Nullable SpanContext parentContext ,
6262 @ Nullable Boolean hasRemoteParent ,
6363 String name ,
6464 @ Nullable Sampler sampler ,
6565 List <Span > parentLinks ,
6666 @ Nullable Boolean recordEvents ,
6767 @ Nullable Kind kind ,
68- @ Nullable TimestampConverter timestampConverter ) {
68+ @ Nullable Span parentSpan ) {
6969 TraceParams activeTraceParams = options .traceConfig .getActiveTraceParams ();
7070 Random random = options .randomHandler .current ();
7171 TraceId traceId ;
7272 SpanId spanId = SpanId .generateRandomId (random );
7373 SpanId parentSpanId = null ;
7474 // TODO(bdrutu): Handle tracestate correctly not just propagate.
7575 Tracestate tracestate = TRACESTATE_DEFAULT ;
76- if (parent == null || !parent .isValid ()) {
76+ if (parentContext == null || !parentContext .isValid ()) {
7777 // New root span.
7878 traceId = TraceId .generateRandomId (random );
7979 // This is a root span so no remote or local parent.
8080 hasRemoteParent = null ;
8181 } else {
8282 // New child span.
83- traceId = parent .getTraceId ();
84- parentSpanId = parent .getSpanId ();
85- tracestate = parent .getTracestate ();
83+ traceId = parentContext .getTraceId ();
84+ parentSpanId = parentContext .getSpanId ();
85+ tracestate = parentContext .getTracestate ();
8686 }
8787 TraceOptions traceOptions =
8888 makeSamplingDecision (
89- parent ,
89+ parentContext ,
9090 hasRemoteParent ,
9191 name ,
9292 sampler ,
@@ -96,22 +96,33 @@ private Span startSpanInternal(
9696 activeTraceParams )
9797 ? SAMPLED_TRACE_OPTIONS
9898 : NOT_SAMPLED_TRACE_OPTIONS ;
99- Span span =
100- (traceOptions .isSampled () || Boolean .TRUE .equals (recordEvents ))
101- ? RecordEventsSpanImpl .startSpan (
102- SpanContext .create (traceId , spanId , traceOptions , tracestate ),
103- name ,
104- kind ,
105- parentSpanId ,
106- hasRemoteParent ,
107- activeTraceParams ,
108- options .startEndHandler ,
109- timestampConverter ,
110- options .clock )
111- : NoRecordEventsSpanImpl .create (
112- SpanContext .create (traceId , spanId , traceOptions , tracestate ));
113- linkSpans (span , parentLinks );
114- return span ;
99+
100+ if (traceOptions .isSampled () || Boolean .TRUE .equals (recordEvents )) {
101+ // Pass the timestamp converter from the parent to ensure that the recorded events are in
102+ // the right order. Implementation uses System.nanoTime() which is monotonically increasing.
103+ TimestampConverter timestampConverter = null ;
104+ if (parentSpan instanceof RecordEventsSpanImpl ) {
105+ RecordEventsSpanImpl parentRecordEventsSpan = (RecordEventsSpanImpl ) parentSpan ;
106+ timestampConverter = parentRecordEventsSpan .getTimestampConverter ();
107+ parentRecordEventsSpan .addChild ();
108+ }
109+ Span span =
110+ RecordEventsSpanImpl .startSpan (
111+ SpanContext .create (traceId , spanId , traceOptions , tracestate ),
112+ name ,
113+ kind ,
114+ parentSpanId ,
115+ hasRemoteParent ,
116+ activeTraceParams ,
117+ options .startEndHandler ,
118+ timestampConverter ,
119+ options .clock );
120+ linkSpans (span , parentLinks );
121+ return span ;
122+ } else {
123+ return NoRecordEventsSpanImpl .create (
124+ SpanContext .create (traceId , spanId , traceOptions , tracestate ));
125+ }
115126 }
116127
117128 private static boolean makeSamplingDecision (
@@ -179,34 +190,28 @@ private SpanBuilderImpl(
179190
180191 @ Override
181192 public Span startSpan () {
182- SpanContext parentContext = remoteParentSpanContext ;
183- Boolean hasRemoteParent = Boolean .TRUE ;
184- TimestampConverter timestampConverter = null ;
185- if (remoteParentSpanContext == null ) {
193+ if (remoteParentSpanContext != null ) {
194+ return startSpanInternal (
195+ remoteParentSpanContext ,
196+ Boolean .TRUE ,
197+ name ,
198+ sampler ,
199+ parentLinks ,
200+ recordEvents ,
201+ kind ,
202+ null );
203+ } else {
186204 // This is not a child of a remote Span. Get the parent SpanContext from the parent Span if
187205 // any.
188- Span parent = this . parent ;
189- hasRemoteParent = Boolean . FALSE ;
206+ SpanContext parentContext = null ;
207+ Boolean hasRemoteParent = null ;
190208 if (parent != null ) {
191209 parentContext = parent .getContext ();
192- // Pass the timestamp converter from the parent to ensure that the recorded events are in
193- // the right order. Implementation uses System.nanoTime() which is monotonically increasing.
194- if (parent instanceof RecordEventsSpanImpl ) {
195- timestampConverter = ((RecordEventsSpanImpl ) parent ).getTimestampConverter ();
196- }
197- } else {
198- hasRemoteParent = null ;
210+ hasRemoteParent = Boolean .FALSE ;
199211 }
212+ return startSpanInternal (
213+ parentContext , hasRemoteParent , name , sampler , parentLinks , recordEvents , kind , parent );
200214 }
201- return startSpanInternal (
202- parentContext ,
203- hasRemoteParent ,
204- name ,
205- sampler ,
206- parentLinks ,
207- recordEvents ,
208- kind ,
209- timestampConverter );
210215 }
211216
212217 static final class Options {
0 commit comments