Skip to content

Commit 64a7eb3

Browse files
authored
Only root span gets AppD attributes set (#2247)
* Only root span gets AppD attributes set * Fixed issue with null parent context. * Fixed issue with null parent context. * UT fix
1 parent 61d2d25 commit 64a7eb3

File tree

3 files changed

+60
-15
lines changed

3 files changed

+60
-15
lines changed

custom/src/main/java/com/splunk/opentelemetry/appd/AppdBonusSpanProcessor.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static io.opentelemetry.api.common.AttributeKey.stringKey;
2121

2222
import io.opentelemetry.api.common.AttributeKey;
23+
import io.opentelemetry.api.trace.SpanContext;
2324
import io.opentelemetry.context.Context;
2425
import io.opentelemetry.sdk.extension.incubator.trace.OnStartSpanProcessor;
2526
import io.opentelemetry.sdk.trace.ReadWriteSpan;
@@ -37,17 +38,21 @@ public void apply(Context context, ReadWriteSpan span) {
3738
if (ctx == null) {
3839
return;
3940
}
40-
if (ctx.getAccountId() != null) {
41-
span.setAttribute(APPD_ATTR_ACCT, ctx.getAccountId());
42-
}
43-
if (ctx.getAppId() != null) {
44-
span.setAttribute(APPD_ATTR_APP, ctx.getAppId());
45-
}
46-
if (ctx.getBusinessTransactionId() != null) {
47-
span.setAttribute(APPD_ATTR_BT, ctx.getBusinessTransactionId());
48-
}
49-
if (ctx.getTierId() != null) {
50-
span.setAttribute(APPD_ATTR_TIER, ctx.getTierId());
41+
// Set attributes only for the local root span
42+
SpanContext parentSpanContext = span.getParentSpanContext();
43+
if (!parentSpanContext.isValid() || parentSpanContext.isRemote()) {
44+
if (ctx.getAccountId() != null) {
45+
span.setAttribute(APPD_ATTR_ACCT, ctx.getAccountId());
46+
}
47+
if (ctx.getAppId() != null) {
48+
span.setAttribute(APPD_ATTR_APP, ctx.getAppId());
49+
}
50+
if (ctx.getBusinessTransactionId() != null) {
51+
span.setAttribute(APPD_ATTR_BT, ctx.getBusinessTransactionId());
52+
}
53+
if (ctx.getTierId() != null) {
54+
span.setAttribute(APPD_ATTR_TIER, ctx.getTierId());
55+
}
5156
}
5257
}
5358
}

custom/src/test/java/com/splunk/opentelemetry/appd/AppdBonusCustomizerTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import static org.mockito.Mockito.verify;
3232
import static org.mockito.Mockito.when;
3333

34+
import io.opentelemetry.api.trace.SpanContext;
3435
import io.opentelemetry.context.Context;
3536
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
3637
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
@@ -98,8 +99,14 @@ void customizeEnabled() {
9899
tpcCaptor.getValue().apply(builder, config);
99100
ArgumentCaptor<SpanProcessor> spCapture = ArgumentCaptor.forClass(SpanProcessor.class);
100101
verify(builder).addSpanProcessor(spCapture.capture());
102+
101103
ReadWriteSpan span = mock();
104+
SpanContext parentSpanContext = mock(SpanContext.class);
105+
when(parentSpanContext.isValid()).thenReturn(false);
106+
when(span.getParentSpanContext()).thenReturn(parentSpanContext);
107+
102108
spCapture.getValue().onStart(context, span);
109+
103110
verify(span).setAttribute(APPD_ATTR_APP, appdContext.getAppId());
104111
verify(span).setAttribute(APPD_ATTR_ACCT, appdContext.getAccountId());
105112
verify(span).setAttribute(APPD_ATTR_TIER, appdContext.getTierId());

custom/src/test/java/com/splunk/opentelemetry/appd/AppdBonusSpanProcessorTest.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,63 @@
2222
import static com.splunk.opentelemetry.appd.AppdBonusSpanProcessor.APPD_ATTR_BT;
2323
import static com.splunk.opentelemetry.appd.AppdBonusSpanProcessor.APPD_ATTR_TIER;
2424
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.never;
2526
import static org.mockito.Mockito.verify;
2627
import static org.mockito.Mockito.when;
2728

29+
import io.opentelemetry.api.trace.SpanContext;
2830
import io.opentelemetry.context.Context;
2931
import io.opentelemetry.sdk.trace.ReadWriteSpan;
3032
import org.junit.jupiter.api.Test;
3133

3234
class AppdBonusSpanProcessorTest {
3335

3436
@Test
35-
void onStart() {
37+
void shouldSetAppdAttributesOnRootSpan() {
38+
// Given
3639
Context context = mock();
37-
3840
AppdBonusContext appdContext = new AppdBonusContext("myacct", "myapp", "mybt", "mytier");
39-
ReadWriteSpan span = mock();
40-
4141
when(context.get(CONTEXT_KEY)).thenReturn(appdContext);
4242

43+
ReadWriteSpan span = mock();
44+
SpanContext parentSpanContext = mock(SpanContext.class);
45+
when(parentSpanContext.isValid()).thenReturn(false);
46+
when(span.getParentSpanContext()).thenReturn(parentSpanContext);
47+
4348
AppdBonusSpanProcessor testClass = new AppdBonusSpanProcessor();
49+
50+
// When
4451
testClass.apply(context, span);
4552

53+
// Then
4654
verify(span).setAttribute(APPD_ATTR_ACCT, "myacct");
4755
verify(span).setAttribute(APPD_ATTR_APP, "myapp");
4856
verify(span).setAttribute(APPD_ATTR_BT, "mybt");
4957
verify(span).setAttribute(APPD_ATTR_TIER, "mytier");
5058
}
59+
60+
@Test
61+
void shouldNotSetAppdAttributesOnNestedSpans() {
62+
// Given
63+
Context context = mock();
64+
AppdBonusContext appdContext = new AppdBonusContext("myacct", "myapp", "mybt", "mytier");
65+
when(context.get(CONTEXT_KEY)).thenReturn(appdContext);
66+
67+
ReadWriteSpan span = mock();
68+
SpanContext parentSpanContext = mock(SpanContext.class);
69+
when(parentSpanContext.isValid()).thenReturn(true);
70+
when(parentSpanContext.isRemote()).thenReturn(false);
71+
when(span.getParentSpanContext()).thenReturn(parentSpanContext);
72+
73+
AppdBonusSpanProcessor testClass = new AppdBonusSpanProcessor();
74+
75+
// When
76+
testClass.apply(context, span);
77+
78+
// Then
79+
verify(span, never()).setAttribute(APPD_ATTR_ACCT, "myacct");
80+
verify(span, never()).setAttribute(APPD_ATTR_APP, "myapp");
81+
verify(span, never()).setAttribute(APPD_ATTR_BT, "mybt");
82+
verify(span, never()).setAttribute(APPD_ATTR_TIER, "mytier");
83+
}
5184
}

0 commit comments

Comments
 (0)