Skip to content

Commit 7062e83

Browse files
authored
Add Tracer.hasUnobservableTrace() API to simplify consumers (#624)
Add `Tracer.hasUnobservableTrace()` API to simplify tracing framework implementations.
1 parent a580d42 commit 7062e83

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
type: improvement
2+
improvement:
3+
description: Add `Tracer.hasUnobservableTrace()` API to simplify tracing framework
4+
implementations.
5+
links:
6+
- https://github.com/palantir/tracing-java/pull/624

tracing/src/main/java/com/palantir/tracing/Tracer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,16 @@ public static boolean isTraceObservable() {
627627
return trace != null && trace.isObservable();
628628
}
629629

630+
/**
631+
* Returns true if there is an active trace which is not observable. This is equivalent to the result of
632+
* {@code Tracer.hasTraceId() && !Tracer.isTraceObservable()}.
633+
* This check is used frequently in hot paths to avoid unnecessary overhead in unsampled traces.
634+
*/
635+
public static boolean hasUnobservableTrace() {
636+
Trace trace = currentTrace.get();
637+
return trace != null && !trace.isObservable();
638+
}
639+
630640
/** Returns an independent copy of this thread's {@link Trace}. */
631641
static Optional<Trace> copyTrace() {
632642
Trace trace = currentTrace.get();

tracing/src/test/java/com/palantir/tracing/TracerTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,13 @@ public void testCountsSpansWhenTraceIsNotObservable() throws Exception {
157157
String traceId = Tracers.randomId();
158158
assertThat(MDC.get(Tracers.TRACE_ID_KEY)).isNull();
159159
assertThat(Tracer.hasTraceId()).isFalse();
160+
assertThat(Tracer.hasUnobservableTrace()).isFalse();
160161
Tracer.setTrace(Trace.of(false, traceId, Optional.empty()));
161162
// Unsampled trace should still apply thread state
162163
assertThat(MDC.get(Tracers.TRACE_ID_KEY)).isEqualTo(traceId);
163164
assertThat(Tracer.hasTraceId()).isTrue();
164165
assertThat(Tracer.getTraceId()).isEqualTo(traceId);
166+
assertThat(Tracer.hasUnobservableTrace()).isTrue();
165167
Tracer.fastStartSpan("foo");
166168
Tracer.fastStartSpan("bar");
167169

@@ -175,6 +177,7 @@ public void testCountsSpansWhenTraceIsNotObservable() throws Exception {
175177
Tracer.fastCompleteSpan();
176178
assertThat(MDC.get(Tracers.TRACE_ID_KEY)).isNull();
177179
assertThat(Tracer.hasTraceId()).isFalse();
180+
assertThat(Tracer.hasUnobservableTrace()).isFalse();
178181
}
179182

180183
@Test
@@ -356,6 +359,36 @@ public void testHasTraceId() {
356359
assertThat(Tracer.hasTraceId()).isFalse();
357360
}
358361

362+
@Test
363+
public void testHasUnobservableTrace_observableTrace() {
364+
Tracer.setSampler(AlwaysSampler.INSTANCE);
365+
assertThat(Tracer.hasTraceId()).isFalse();
366+
assertThat(Tracer.hasUnobservableTrace()).isFalse();
367+
Tracer.fastStartSpan("test");
368+
try {
369+
assertThat(Tracer.hasTraceId()).isTrue();
370+
assertThat(Tracer.hasUnobservableTrace()).isFalse();
371+
} finally {
372+
Tracer.fastCompleteSpan();
373+
}
374+
assertThat(Tracer.hasUnobservableTrace()).isFalse();
375+
}
376+
377+
@Test
378+
public void testHasUnobservableTrace_unobservableTrace() {
379+
Tracer.setSampler(NeverSampler.INSTANCE);
380+
assertThat(Tracer.hasTraceId()).isFalse();
381+
assertThat(Tracer.hasUnobservableTrace()).isFalse();
382+
Tracer.fastStartSpan("test");
383+
try {
384+
assertThat(Tracer.hasTraceId()).isTrue();
385+
assertThat(Tracer.hasUnobservableTrace()).isTrue();
386+
} finally {
387+
Tracer.fastCompleteSpan();
388+
}
389+
assertThat(Tracer.hasUnobservableTrace()).isFalse();
390+
}
391+
359392
@Test
360393
public void testSimpleDetachedTrace() {
361394
assertThat(Tracer.hasTraceId()).isFalse();

0 commit comments

Comments
 (0)