Skip to content

Commit 9f76c3c

Browse files
committed
[Tracing] Implement trace header context propagation
Somewhere along the way of reviewing previous work this bit got lost; This implements context propagation by injecting the apropriate headers from service context into the headers when forming a `Prepared` http request.
1 parent 8430dd4 commit 9f76c3c

File tree

3 files changed

+32
-3
lines changed

3 files changed

+32
-3
lines changed

Sources/AsyncHTTPClient/AsyncAwait/HTTPClient+execute.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,12 @@ extension HTTPClient {
9292

9393
// this loop is there to follow potential redirects
9494
while true {
95-
let preparedRequest = try HTTPClientRequest.Prepared(currentRequest, dnsOverride: configuration.dnsOverride)
95+
let preparedRequest =
96+
try HTTPClientRequest.Prepared(
97+
currentRequest,
98+
tracing: self.configuration.tracing,
99+
dnsOverride: configuration.dnsOverride
100+
)
96101
let response = try await {
97102
var response = try await self.executeCancellable(preparedRequest, deadline: deadline, logger: logger)
98103

Sources/AsyncHTTPClient/AsyncAwait/HTTPClientRequest+Prepared.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15+
import Instrumentation
1516
import NIOCore
1617
import NIOHTTP1
1718
import NIOSSL
19+
import ServiceContextModule
1820

1921
import struct Foundation.URL
2022

@@ -45,7 +47,11 @@ extension HTTPClientRequest {
4547

4648
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
4749
extension HTTPClientRequest.Prepared {
48-
init(_ request: HTTPClientRequest, dnsOverride: [String: String] = [:]) throws {
50+
init(
51+
_ request: HTTPClientRequest,
52+
tracing: HTTPClient.TracingConfiguration? = nil,
53+
dnsOverride: [String: String] = [:]
54+
) throws {
4955
guard !request.url.isEmpty, let url = URL(string: request.url) else {
5056
throw HTTPClientError.invalidURL
5157
}
@@ -54,6 +60,12 @@ extension HTTPClientRequest.Prepared {
5460

5561
var headers = request.headers
5662
headers.addHostIfNeeded(for: deconstructedURL)
63+
if let tracer = tracing?.tracer,
64+
let context = ServiceContext.current
65+
{
66+
tracer.inject(context, into: &headers, using: HTTPHeadersInjector.shared)
67+
}
68+
5769
let metadata = try headers.validateAndSetTransportFraming(
5870
method: request.method,
5971
bodyLength: .init(request.body)

Tests/AsyncHTTPClientTests/HTTPClientTracingTests.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
@_spi(Tracing) import AsyncHTTPClient // NOT @testable - tests that need @testable go into HTTPClientInternalTests.swift
15+
@_spi(Tracing) @testable import AsyncHTTPClient
1616
import Atomics
1717
import InMemoryTracing
1818
import Logging
@@ -147,4 +147,16 @@ final class HTTPClientTracingTests: XCTestCaseHTTPClientTestsBaseClass {
147147
XCTAssertTrue(span.errors.isEmpty, "Should have recorded error")
148148
XCTAssertEqual(span.attributes.get(client.tracing.attributeKeys.responseStatusCode), 404)
149149
}
150+
151+
func testTrace_preparedHeaders_include_fromSpan() async throws {
152+
let url = self.defaultHTTPBinURLPrefix + "404-does-not-exist"
153+
let request = HTTPClientRequest(url: url)
154+
155+
try tracer.withSpan("operation") { span in
156+
let prepared = try HTTPClientRequest.Prepared(request, tracing: self.client.tracing)
157+
XCTAssertTrue(prepared.head.headers.count > 2)
158+
XCTAssertTrue(prepared.head.headers.contains(name: "in-memory-trace-id"))
159+
XCTAssertTrue(prepared.head.headers.contains(name: "in-memory-span-id"))
160+
}
161+
}
150162
}

0 commit comments

Comments
 (0)