1616
1717package com .palantir .tracing ;
1818
19- import static com .palantir .logsafe .Preconditions .checkArgument ;
2019import static com .palantir .logsafe .Preconditions .checkNotNull ;
21- import static com .palantir .logsafe .Preconditions .checkState ;
2220
23- import com .google .common .base .Strings ;
24- import com .google .errorprone .annotations .CheckReturnValue ;
2521import com .palantir .logsafe .SafeArg ;
2622import com .palantir .logsafe .exceptions .SafeIllegalStateException ;
2723import com .palantir .tracing .api .OpenSpan ;
@@ -51,49 +47,15 @@ private Trace(TraceState traceState) {
5147 this .traceState = traceState ;
5248 }
5349
54- /**
55- * Opens a new span for this thread's call trace, labeled with the provided operation and parent span. Only allowed
56- * when the current trace is empty. If the return value is not used, prefer {@link #fastStartSpan(String, String,
57- * SpanType)}}.
58- */
59- @ CheckReturnValue
60- final OpenSpan startSpan (String operation , String parentSpanId , SpanType type ) {
61- checkState (isEmpty (), "Cannot start a span with explicit parent if the current thread's trace is non-empty" );
62- checkArgument (!Strings .isNullOrEmpty (parentSpanId ), "parentSpanId must be non-empty" );
63-
64- return startSpan (operation , Optional .of (parentSpanId ), type );
65- }
66-
67- /**
68- * Opens a new span for this thread's call trace, labeled with the provided operation. If the return value is not
69- * used, prefer {@link #fastStartSpan(String, SpanType)}}.
70- */
71- @ CheckReturnValue
72- final OpenSpan startSpan (String operation , SpanType type ) {
73- OpenSpan span = top ();
50+ abstract void fastStartSpan (String operation , Optional <String > parentSpanId , SpanType type );
7451
75- return startSpan (operation , span != null ? Optional .of (span .getSpanId ()) : Optional .empty (), type );
76- }
77-
78- private OpenSpan startSpan (String operation , Optional <String > parentSpanId , SpanType type ) {
79- OpenSpan span = OpenSpan .of (operation , Tracers .randomId (), type , parentSpanId );
80- push (span );
81- return span ;
82- }
83-
84- /** Like {@link #startSpan(String, String, SpanType)}, but does not return an {@link OpenSpan}. */
85- abstract void fastStartSpan (String operation , String parentSpanId , SpanType type );
86-
87- /** Like {@link #startSpan(String, SpanType)}, but does not return an {@link OpenSpan}. */
88- abstract void fastStartSpan (String operation , SpanType type );
52+ @ Nullable
53+ abstract OpenSpan fastCompleteSpan ();
8954
9055 abstract void push (OpenSpan span );
9156
9257 @ Nullable
93- abstract OpenSpan top ();
94-
95- @ Nullable
96- abstract OpenSpan pop ();
58+ abstract OpenSpan current ();
9759
9860 abstract boolean isEmpty ();
9961
@@ -120,15 +82,15 @@ private Sampled(TraceState traceState) {
12082 }
12183
12284 @ Override
123- @ SuppressWarnings ( "ResultOfMethodCallIgnored" ) // Sampled traces cannot optimize this path
124- void fastStartSpan ( String operation , String parentSpanId , SpanType type ) {
125- startSpan ( operation , parentSpanId , type );
85+ void fastStartSpan ( String operation , Optional < String > parentSpanId , SpanType type ) {
86+ OpenSpan span = OpenSpan . of ( operation , Tracers . randomId (), type , parentSpanId );
87+ push ( span );
12688 }
12789
12890 @ Override
129- @ SuppressWarnings ( "ResultOfMethodCallIgnored" ) // Sampled traces cannot optimize this path
130- void fastStartSpan ( String operation , SpanType type ) {
131- startSpan ( operation , type );
91+ @ Nullable
92+ OpenSpan fastCompleteSpan ( ) {
93+ return stack . pollFirst ( );
13294 }
13395
13496 @ Override
@@ -138,16 +100,10 @@ protected void push(OpenSpan span) {
138100
139101 @ Override
140102 @ Nullable
141- OpenSpan top () {
103+ OpenSpan current () {
142104 return stack .peekFirst ();
143105 }
144106
145- @ Override
146- @ Nullable
147- OpenSpan pop () {
148- return stack .pollFirst ();
149- }
150-
151107 @ Override
152108 boolean isEmpty () {
153109 return stack .isEmpty ();
@@ -177,13 +133,18 @@ private Unsampled(TraceState traceState) {
177133 }
178134
179135 @ Override
180- void fastStartSpan (String _operation , String _parentSpanId , SpanType _type ) {
136+ void fastStartSpan (String _operation , Optional < String > _parentSpanId , SpanType _type ) {
181137 numberOfSpans ++;
182138 }
183139
184140 @ Override
185- void fastStartSpan (String _operation , SpanType _type ) {
186- numberOfSpans ++;
141+ @ Nullable
142+ OpenSpan fastCompleteSpan () {
143+ validateNumberOfSpans ();
144+ if (numberOfSpans > 0 ) {
145+ numberOfSpans --;
146+ }
147+ return null ;
187148 }
188149
189150 @ Override
@@ -193,17 +154,7 @@ protected void push(OpenSpan _span) {
193154
194155 @ Override
195156 @ Nullable
196- OpenSpan top () {
197- return null ;
198- }
199-
200- @ Override
201- @ Nullable
202- OpenSpan pop () {
203- validateNumberOfSpans ();
204- if (numberOfSpans > 0 ) {
205- numberOfSpans --;
206- }
157+ OpenSpan current () {
207158 return null ;
208159 }
209160
@@ -213,7 +164,7 @@ boolean isEmpty() {
213164 return numberOfSpans <= 0 ;
214165 }
215166
216- /** Internal validation, this should never fail because {@link #pop ()} only decrements positive values. */
167+ /** Internal validation, this should never fail because {@link #fastCompleteSpan ()} only decrements positive values. */
217168 private void validateNumberOfSpans () {
218169 if (numberOfSpans < 0 ) {
219170 throw new SafeIllegalStateException (
0 commit comments