Skip to content

Commit 2ca1604

Browse files
committed
Add baggage span tags functionality and tests
1 parent 20885c9 commit 2ca1604

File tree

3 files changed

+47
-60
lines changed

3 files changed

+47
-60
lines changed

dd-java-agent/instrumentation/okhttp-3/src/test/groovy/OkHttp3Test.groovy

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -78,65 +78,6 @@ abstract class OkHttp3Test extends HttpClientTest {
7878
method = "GET"
7979
url = server.address.resolve(path)
8080
}
81-
82-
def "baggage span tags are properly added"() {
83-
setup:
84-
// W3C Baggage header format: key1=value1,key2=value2,key3=value3
85-
def baggageHeader = "user.id=bark,session.id=test-sess1,account.id=fetch,language=en"
86-
def sentHeaders = [:]
87-
88-
when:
89-
def status
90-
// Capture the headers that OkHttp3 sends
91-
def interceptor = new Interceptor() {
92-
@Override
93-
Response intercept(Chain chain) throws IOException {
94-
def request = chain.request()
95-
// Capture all headers sent
96-
request.headers().names().each { headerName ->
97-
sentHeaders[headerName] = request.header(headerName)
98-
}
99-
return chain.proceed(request)
100-
}
101-
}
102-
103-
def testClient = new OkHttpClient.Builder()
104-
.connectTimeout(CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS)
105-
.readTimeout(READ_TIMEOUT_MS, TimeUnit.MILLISECONDS)
106-
.writeTimeout(READ_TIMEOUT_MS, TimeUnit.MILLISECONDS)
107-
.addInterceptor(interceptor)
108-
.build()
109-
110-
def request = new Request.Builder()
111-
.url(server.address.resolve("/success").toURL())
112-
.header("baggage", baggageHeader) // Pass baggage directly in header
113-
.get()
114-
.build()
115-
def response = testClient.newCall(request).execute()
116-
status = response.code()
117-
118-
then:
119-
status == 200
120-
// Verify baggage header was sent
121-
sentHeaders["baggage"] == baggageHeader
122-
sentHeaders["baggage"].contains("user.id=bark")
123-
sentHeaders["baggage"].contains("session.id=test-sess1")
124-
sentHeaders["baggage"].contains("account.id=fetch")
125-
sentHeaders["baggage"].contains("language=en")
126-
127-
// Verify the resulting span has the correct baggage tags (only default configured keys)
128-
assertTraces(1) {
129-
trace(1) {
130-
clientSpan(it, null, "GET", false, false, server.address.resolve("/success"), 200, false, null, false, [
131-
// Should have baggage tags for keys in default configuration
132-
"baggage.user.id": "bark",
133-
"baggage.session.id": "test-sess1",
134-
"baggage.account.id": "fetch",
135-
// "baggage.language" should NOT be present since it's not in default config
136-
])
137-
}
138-
}
139-
}
14081
}
14182

14283
@Timeout(5)

dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,53 @@ abstract class HttpServerTest<SERVER> extends WithHttpServer<SERVER> {
785785
'GET' | null | 'x-datadog-test-request-header' | 'bar' | ['request_header_tag': 'bar']
786786
}
787787

788+
def "test baggage span tags are properly added"() {
789+
setup:
790+
// Use default configuration for TRACE_BAGGAGE_TAG_KEYS (user.id, session.id, account.id)
791+
def baggageHeader = "user.id=test-user,session.id=test-session,account.id=test-account,language=en"
792+
def request = request(SUCCESS, 'GET', null)
793+
.header("baggage", baggageHeader)
794+
.build()
795+
def response = client.newCall(request).execute()
796+
if (isDataStreamsEnabled()) {
797+
TEST_DATA_STREAMS_WRITER.waitForGroups(1)
798+
}
799+
800+
expect:
801+
response.code() == SUCCESS.status
802+
response.body().string() == SUCCESS.body
803+
804+
and:
805+
assertTraces(1) {
806+
trace(spanCount(SUCCESS)) {
807+
sortSpansByStart()
808+
// Verify baggage tags are added for default configured keys only
809+
serverSpan(it, null, null, 'GET', SUCCESS, [
810+
"baggage.user.id": "test-user",
811+
"baggage.session.id": "test-session",
812+
"baggage.account.id": "test-account"
813+
// "baggage.language" should NOT be present since it's not in default config
814+
])
815+
if (hasHandlerSpan()) {
816+
handlerSpan(it)
817+
}
818+
controllerSpan(it)
819+
if (hasResponseSpan(SUCCESS)) {
820+
responseSpan(it, SUCCESS)
821+
}
822+
}
823+
}
824+
825+
and:
826+
if (isDataStreamsEnabled()) {
827+
StatsGroup first = TEST_DATA_STREAMS_WRITER.groups.find { it.parentHash == 0 }
828+
verifyAll(first) {
829+
edgeTags.containsAll(DSM_EDGE_TAGS)
830+
edgeTags.size() == DSM_EDGE_TAGS.size()
831+
}
832+
}
833+
}
834+
788835
@Flaky(value = "https://github.com/DataDog/dd-trace-java/issues/4690", suites = ["MuleHttpServerForkedTest"])
789836
def "test QUERY_ENCODED_BOTH with response header x-ig-response-header tag mapping"() {
790837
setup:

dd-trace-core/src/test/groovy/datadog/trace/core/CoreSpanBuilderTest.groovy

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import datadog.trace.api.TagMap
1313
import datadog.trace.api.gateway.RequestContextSlot
1414
import datadog.trace.api.sampling.PrioritySampling
1515
import datadog.trace.api.naming.SpanNaming
16-
import datadog.trace.api.sampling.PrioritySampling
1716
import datadog.trace.bootstrap.instrumentation.api.AgentScope
1817
import datadog.trace.api.datastreams.NoopPathwayContext
1918
import datadog.trace.bootstrap.instrumentation.api.TagContext

0 commit comments

Comments
 (0)