Skip to content

Commit ff57bcc

Browse files
authored
Add support to inject baggage propagator headers to the instrumented request (#443)
1 parent a109095 commit ff57bcc

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

Sources/Instrumentation/URLSession/URLSessionLogger.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,16 @@ class URLSessionLogger {
148148
instrumentation.configuration.injectCustomHeaders?(&request, span)
149149
var instrumentedRequest = request
150150
objc_setAssociatedObject(instrumentedRequest, &URLSessionInstrumentation.instrumentedKey, true, .OBJC_ASSOCIATION_COPY_NONATOMIC)
151-
var traceHeaders = tracePropagationHTTPHeaders(span: span, textMapPropagator: OpenTelemetry.instance.propagators.textMapPropagator)
151+
let propagators = OpenTelemetry.instance.propagators
152+
var traceHeaders = tracePropagationHTTPHeaders(span: span, textMapPropagator: propagators.textMapPropagator, textMapBaggagePropagator: propagators.textMapBaggagePropagator)
152153
if let originalHeaders = request.allHTTPHeaderFields {
153154
traceHeaders.merge(originalHeaders) { _, new in new }
154155
}
155156
instrumentedRequest.allHTTPHeaderFields = traceHeaders
156157
return instrumentedRequest
157158
}
158159

159-
private static func tracePropagationHTTPHeaders(span: Span?, textMapPropagator: TextMapPropagator) -> [String: String] {
160+
private static func tracePropagationHTTPHeaders(span: Span?, textMapPropagator: TextMapPropagator, textMapBaggagePropagator: TextMapBaggagePropagator) -> [String: String] {
160161
var headers = [String: String]()
161162

162163
struct HeaderSetter: Setter {
@@ -169,6 +170,10 @@ class URLSessionLogger {
169170
return headers
170171
}
171172
textMapPropagator.inject(spanContext: currentSpan.context, carrier: &headers, setter: HeaderSetter())
173+
174+
if let baggage = OpenTelemetry.instance.contextProvider.activeBaggage {
175+
textMapBaggagePropagator.inject(baggage: baggage, carrier: &headers, setter: HeaderSetter())
176+
}
172177
return headers
173178
}
174179
}

Tests/InstrumentationTests/URLSessionTests/URLSessionInstrumentationTests.swift

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,20 @@ class URLSessionInstrumentationTests: XCTestCase {
8282
static var semaphore: DispatchSemaphore!
8383
var sessionDelegate: SessionDelegate!
8484
static var instrumentation: URLSessionInstrumentation!
85+
static var baggage: Baggage!
8586

8687
static let server = HttpTestServer(url: URL(string: "http://localhost:33333"), config: nil)
8788

8889
override class func setUp() {
90+
OpenTelemetry.registerPropagators(textPropagators: [W3CTraceContextPropagator()], baggagePropagator: W3CBaggagePropagator())
8991
OpenTelemetry.registerTracerProvider(tracerProvider: TracerProviderSdk())
92+
93+
baggage = DefaultBaggageManager.instance.baggageBuilder()
94+
.put(key: EntryKey(name: "foo")!, value: EntryValue(string: "bar")!, metadata: nil)
95+
.build()
96+
97+
OpenTelemetry.instance.contextProvider.setActiveBaggage(baggage)
98+
9099
let sem = DispatchSemaphore(value: 0)
91100
DispatchQueue.global(qos: .default).async {
92101
do {
@@ -102,6 +111,7 @@ class URLSessionInstrumentationTests: XCTestCase {
102111

103112
override class func tearDown() {
104113
server.stop()
114+
OpenTelemetry.instance.contextProvider.removeContextForBaggage(baggage)
105115
}
106116

107117
override func setUp() {
@@ -240,20 +250,30 @@ class URLSessionInstrumentationTests: XCTestCase {
240250
XCTAssertTrue(URLSessionInstrumentationTests.checker.receivedErrorCalled)
241251
}
242252

243-
public func testShouldInstrumentRequest() {
253+
public func testShouldInstrumentRequest() throws {
244254
let request1 = URLRequest(url: URL(string: "http://defaultName.com")!)
245255
let request2 = URLRequest(url: URL(string: "http://dontinstrument.com")!)
246256

247-
URLSessionLogger.processAndLogRequest(request1, sessionTaskId: "111", instrumentation: URLSessionInstrumentationTests.instrumentation, shouldInjectHeaders: true)
248-
URLSessionLogger.processAndLogRequest(request2, sessionTaskId: "222", instrumentation: URLSessionInstrumentationTests.instrumentation, shouldInjectHeaders: true)
257+
let processedRequest1 = try XCTUnwrap(URLSessionLogger.processAndLogRequest(request1, sessionTaskId: "111", instrumentation: URLSessionInstrumentationTests.instrumentation, shouldInjectHeaders: true))
258+
let processedRequest2 = URLSessionLogger.processAndLogRequest(request2, sessionTaskId: "222", instrumentation: URLSessionInstrumentationTests.instrumentation, shouldInjectHeaders: true)
259+
260+
// `processedRequest2` is expected to be nil, because its URL was marked as not to be instrumented.
261+
XCTAssertNil(processedRequest2)
249262

250263
XCTAssertTrue(URLSessionInstrumentationTests.checker.shouldInstrumentCalled)
251264

265+
let processedHeaders1 = try XCTUnwrap(processedRequest1.allHTTPHeaderFields)
266+
267+
// headers injected from `TextMapPropagator` implementation
268+
XCTAssertTrue(processedHeaders1.contains(where: { $0.key == W3CTraceContextPropagator.traceparent }))
269+
270+
// headers injected from `TextMapBaggagePropagator` implementation
271+
XCTAssertTrue(processedHeaders1.contains(where: { $0.key == W3CBaggagePropagator.headerBaggage && $0.value == "foo=bar" }))
272+
252273
XCTAssertEqual(1, URLSessionLogger.runningSpans.count)
253-
XCTAssertNotNil(URLSessionLogger.runningSpans["111"])
254-
if let span = URLSessionLogger.runningSpans["111"] {
255-
XCTAssertEqual("HTTP GET", span.name)
256-
}
274+
275+
let span = try XCTUnwrap(URLSessionLogger.runningSpans["111"])
276+
XCTAssertEqual("HTTP GET", span.name)
257277
}
258278

259279
public func testDataTaskWithRequestBlock() {
@@ -388,8 +408,6 @@ class URLSessionInstrumentationTests: XCTestCase {
388408
XCTAssertTrue(URLSessionInstrumentationTests.checker.createdRequestCalled)
389409
XCTAssertNotNil(URLSessionInstrumentationTests.requestCopy?.allHTTPHeaderFields?[W3CTraceContextPropagator.traceparent])
390410
}
391-
392-
393411

394412
#if swift(>=5.5.2)
395413
@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)

0 commit comments

Comments
 (0)