Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion Sources/AsyncHTTPClient/AsyncAwait/HTTPClient+execute.swift
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,12 @@ extension HTTPClient {

// this loop is there to follow potential redirects
while true {
let preparedRequest = try HTTPClientRequest.Prepared(currentRequest, dnsOverride: configuration.dnsOverride)
let preparedRequest =
try HTTPClientRequest.Prepared(
currentRequest,
tracing: self.configuration.tracing,
dnsOverride: configuration.dnsOverride
)
let response = try await {
var response = try await self.executeCancellable(preparedRequest, deadline: deadline, logger: logger)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
//
//===----------------------------------------------------------------------===//

import Instrumentation
import NIOCore
import NIOHTTP1
import NIOSSL
import ServiceContextModule

import struct Foundation.URL

Expand Down Expand Up @@ -45,7 +47,11 @@ extension HTTPClientRequest {

@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
extension HTTPClientRequest.Prepared {
init(_ request: HTTPClientRequest, dnsOverride: [String: String] = [:]) throws {
init(
_ request: HTTPClientRequest,
tracing: HTTPClient.TracingConfiguration? = nil,
dnsOverride: [String: String] = [:]
) throws {
guard !request.url.isEmpty, let url = URL(string: request.url) else {
throw HTTPClientError.invalidURL
}
Expand All @@ -54,6 +60,12 @@ extension HTTPClientRequest.Prepared {

var headers = request.headers
headers.addHostIfNeeded(for: deconstructedURL)
if let tracer = tracing?.tracer,
let context = ServiceContext.current
{
tracer.inject(context, into: &headers, using: HTTPHeadersInjector.shared)
}

let metadata = try headers.validateAndSetTransportFraming(
method: request.method,
bodyLength: .init(request.body)
Expand Down
14 changes: 13 additions & 1 deletion Tests/AsyncHTTPClientTests/HTTPClientTracingTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
//
//===----------------------------------------------------------------------===//

@_spi(Tracing) import AsyncHTTPClient // NOT @testable - tests that need @testable go into HTTPClientInternalTests.swift
@_spi(Tracing) @testable import AsyncHTTPClient
import Atomics
import InMemoryTracing
import Logging
Expand Down Expand Up @@ -147,4 +147,16 @@ final class HTTPClientTracingTests: XCTestCaseHTTPClientTestsBaseClass {
XCTAssertTrue(span.errors.isEmpty, "Should have recorded error")
XCTAssertEqual(span.attributes.get(client.tracing.attributeKeys.responseStatusCode), 404)
}

func testTrace_preparedHeaders_include_fromSpan() async throws {
let url = self.defaultHTTPBinURLPrefix + "404-does-not-exist"
let request = HTTPClientRequest(url: url)

try tracer.withSpan("operation") { span in
let prepared = try HTTPClientRequest.Prepared(request, tracing: self.client.tracing)
XCTAssertTrue(prepared.head.headers.count > 2)
XCTAssertTrue(prepared.head.headers.contains(name: "in-memory-trace-id"))
XCTAssertTrue(prepared.head.headers.contains(name: "in-memory-span-id"))
}
}
}
Loading