diff --git a/Package.swift b/Package.swift index 285915c..5cd1b0f 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.6 +// swift-tools-version:5.7 import PackageDescription let package = Package( diff --git a/Sources/Instrumentation/Instrument.swift b/Sources/Instrumentation/Instrument.swift index 976b0ba..9747b6f 100644 --- a/Sources/Instrumentation/Instrument.swift +++ b/Sources/Instrumentation/Instrument.swift @@ -15,11 +15,7 @@ import ServiceContextModule /// Typealias used to simplify Support of old Swift versions which do not have `Sendable` defined. -#if swift(>=5.6.0) @preconcurrency public protocol _SwiftInstrumentationSendable: Sendable {} -#else -public protocol _SwiftInstrumentationSendable {} -#endif /// Conforming types are used to extract values from a specific `Carrier`. public protocol Extractor: _SwiftInstrumentationSendable { diff --git a/Sources/Tracing/Docs.docc/Guides/ImplementATracer.md b/Sources/Tracing/Docs.docc/Guides/ImplementATracer.md index b4933b1..e2bb59b 100644 --- a/Sources/Tracing/Docs.docc/Guides/ImplementATracer.md +++ b/Sources/Tracing/Docs.docc/Guides/ImplementATracer.md @@ -125,7 +125,6 @@ The primary goal and user-facing API of a ``Tracer`` is to create spans. While you will need to implement all methods of the tracer protocol, the most important one is `startSpan`: ```swift -#if swift(>=5.7.0) extension MyTracer: Tracer { func startSpan( _ operationName: String, @@ -147,7 +146,6 @@ extension MyTracer: Tracer { return span } } -#endif ``` If you can require Swift 5.7 prefer doing so, and return the concrete ``Span`` type from the `startSpan` method. @@ -170,4 +168,4 @@ public struct MySpan: Tracing.Span { It is possible to implement a span as a struct or a class, but a ``Span`` **must exhibit reference type behavior**. In other words, adding an attribute to one reference of a span must be visible in other references to it. -The ability to implement a span using a struct comes in handy when implementing a "Noop" (do nothing) span and avoids heap allocations. Normal spans though generally will be backed by `class` based storage and should flush themselfes to the owning tracer once the span has been ended \ No newline at end of file +The ability to implement a span using a struct comes in handy when implementing a "Noop" (do nothing) span and avoids heap allocations. Normal spans though generally will be backed by `class` based storage and should flush themselves to the owning tracer once the span has been ended diff --git a/Sources/Tracing/Docs.docc/Guides/InstrumentYourLibrary.md b/Sources/Tracing/Docs.docc/Guides/InstrumentYourLibrary.md index 81b3098..c7fc830 100644 --- a/Sources/Tracing/Docs.docc/Guides/InstrumentYourLibrary.md +++ b/Sources/Tracing/Docs.docc/Guides/InstrumentYourLibrary.md @@ -211,7 +211,7 @@ While this code is very simple for illustration purposes, and it may seem surpri The above steps are enough if you wanted to provide context propagation. It already enables techniques such as **correlation ids** which can be set once, in one system, and then carried through to any downstream services the code makes calls from while the context is set. -Many libraries also have the opportunity to start trace spans themselfes, on behalf of users, in pieces of the library that can provide useful insight in the behavior or the library in production. For example, the `HTTPServer` can start spans as soon as it begins handling HTTP requests, and this way provide a parent span to any spans the user-code would be creating itself. +Many libraries also have the opportunity to start trace spans themselves, on behalf of users, in pieces of the library that can provide useful insight in the behavior or the library in production. For example, the `HTTPServer` can start spans as soon as it begins handling HTTP requests, and this way provide a parent span to any spans the user-code would be creating itself. Let us revisit the previous sample `HTTPServer` which restored context around invoking the user-code, and further extend it to start a span including basic information about the `HTTPRequest` being handled: diff --git a/Sources/Tracing/InstrumentationSystem+Tracing.swift b/Sources/Tracing/InstrumentationSystem+Tracing.swift index 669db59..ad25c62 100644 --- a/Sources/Tracing/InstrumentationSystem+Tracing.swift +++ b/Sources/Tracing/InstrumentationSystem+Tracing.swift @@ -16,7 +16,6 @@ @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) extension InstrumentationSystem { - #if swift(>=5.7.0) /// Returns the ``Tracer`` bootstrapped as part of the `InstrumentationSystem`. /// /// If the system was bootstrapped with a `MultiplexInstrument` this function attempts to locate the _first_ @@ -28,7 +27,6 @@ extension InstrumentationSystem { (self._findInstrument(where: { $0 is (any Tracer) }) as? (any Tracer)) return found ?? NoOpTracer() } - #endif /// Returns the ``Tracer`` bootstrapped as part of the `InstrumentationSystem`. /// @@ -36,6 +34,7 @@ extension InstrumentationSystem { /// tracing instrument as passed to the multiplex instrument. If none is found, a ``NoOpTracer`` is returned. /// /// - Returns: A ``Tracer`` if the system was bootstrapped with one, and ``NoOpTracer`` otherwise. + @available(*, deprecated, message: "prefer tracer") public static var legacyTracer: any LegacyTracer { let found: (any LegacyTracer)? = (self._findInstrument(where: { $0 is (any LegacyTracer) }) as? (any LegacyTracer)) diff --git a/Sources/Tracing/NoOpTracer.swift b/Sources/Tracing/NoOpTracer.swift index 8f1fc9d..5e4a598 100644 --- a/Sources/Tracing/NoOpTracer.swift +++ b/Sources/Tracing/NoOpTracer.swift @@ -91,7 +91,6 @@ public struct NoOpTracer: LegacyTracer { } } -#if swift(>=5.7.0) @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) extension NoOpTracer: Tracer { public func startSpan( @@ -106,4 +105,3 @@ extension NoOpTracer: Tracer { NoOpSpan(context: context()) } } -#endif diff --git a/Sources/Tracing/SpanProtocol.swift b/Sources/Tracing/SpanProtocol.swift index c5ae484..5fc6085 100644 --- a/Sources/Tracing/SpanProtocol.swift +++ b/Sources/Tracing/SpanProtocol.swift @@ -629,7 +629,6 @@ extension SpanAttributes { } } -#if swift(>=5.2) extension SpanAttributes { /// Enables for type-safe fluent accessors for attributes. public subscript(dynamicMember dynamicMember: KeyPath>) -> SpanAttribute? { @@ -650,7 +649,6 @@ extension SpanAttributes { SpanAttribute._namespace[keyPath: dynamicMember] } } -#endif extension SpanAttributes: ExpressibleByDictionaryLiteral { public init(dictionaryLiteral elements: (String, SpanAttribute)...) { diff --git a/Sources/Tracing/Tracer.swift b/Sources/Tracing/Tracer.swift index 5d944f6..726aa88 100644 --- a/Sources/Tracing/Tracer.swift +++ b/Sources/Tracing/Tracer.swift @@ -108,7 +108,6 @@ public func startSpan( ) } -#if swift(>=5.7.0) /// Start a new ``Span`` using the global bootstrapped tracer reimplementation. /// /// The current task-local `ServiceContext` is picked up and provided to the underlying tracer. @@ -155,7 +154,6 @@ public func startSpan( line: line ) } -#endif // ==== withSpan + sync --------------------------------------------------- @@ -251,8 +249,6 @@ public func withSpan( } } -#if swift(>=5.7.0) - /// Start a new ``Span`` and automatically end when the `operation` completes, /// including recording the `error` in case the operation throws. /// @@ -299,7 +295,6 @@ public func withSpan( try operation(anySpan) } } -#endif // ==== withSpan + async -------------------------------------------------- @@ -395,7 +390,6 @@ public func withSpan( } } -#if swift(>=5.7.0) /// Start a new ``Span`` and automatically end when the `operation` completes, /// including recording the `error` in case the operation throws. /// @@ -442,4 +436,3 @@ public func withSpan( try await operation(anySpan) } } -#endif diff --git a/Sources/Tracing/TracerProtocol+Legacy.swift b/Sources/Tracing/TracerProtocol+Legacy.swift index b7dab16..3426cc9 100644 --- a/Sources/Tracing/TracerProtocol+Legacy.swift +++ b/Sources/Tracing/TracerProtocol+Legacy.swift @@ -25,6 +25,7 @@ import Dispatch /// rather than these `startAnySpan` APIs which unconditionally always return existential Spans even when not necessary /// (under Swift 5.7+ type-system enhancement wrt. protocols with associated types).. @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) // for TaskLocal ServiceContext +@available(*, deprecated, renamed: "Tracer") public protocol LegacyTracer: Instrument { /// Start a new span returning an existential ``Span`` reference. /// @@ -54,6 +55,8 @@ public protocol LegacyTracer: Instrument { /// - function: The function name in which the span was started /// - fileID: The `fileID` where the span was started. /// - line: The file line where the span was started. + + @available(*, deprecated, message: "prefer withSpan") func startAnySpan( _ operationName: String, context: @autoclosure () -> ServiceContext, @@ -70,6 +73,7 @@ public protocol LegacyTracer: Instrument { /// such as when using some FaaS providers that may suspend the process after an invocation, but before the backend exports the completed spans. /// /// This function should not block indefinitely, implementations should offer a configurable timeout for flush operations. + @available(*, deprecated) func forceFlush() } @@ -108,6 +112,7 @@ extension LegacyTracer { /// - function: The function name in which the span was started /// - fileID: The `fileID` where the span was started. /// - line: The file line where the span was started. + @available(*, deprecated, message: "prefer withSpan") public func startAnySpan( _ operationName: String, at instant: @autoclosure () -> Instant, diff --git a/Sources/Tracing/TracerProtocol.swift b/Sources/Tracing/TracerProtocol.swift index a00336a..0a0a13d 100644 --- a/Sources/Tracing/TracerProtocol.swift +++ b/Sources/Tracing/TracerProtocol.swift @@ -18,8 +18,6 @@ // ==== ----------------------------------------------------------------------- // MARK: Tracer protocol -#if swift(>=5.7.0) - /// A tracer capable of creating new trace spans. /// /// A tracer is a special kind of instrument with the added ability to start a ``Span``. @@ -325,5 +323,3 @@ extension Tracer { } } } - -#endif // Swift 5.7 diff --git a/Tests/TracingTests/DynamicTracepointTracerTests.swift b/Tests/TracingTests/DynamicTracepointTracerTests.swift index 53e20de..82d5ec9 100644 --- a/Tests/TracingTests/DynamicTracepointTracerTests.swift +++ b/Tests/TracingTests/DynamicTracepointTracerTests.swift @@ -48,7 +48,6 @@ final class DynamicTracepointTracerTests: XCTestCase { // since the parent of this span was captured, this shall be captured as well } } - #if swift(>=5.7.0) tracer.withSpan("dont") { _ in // don't capture this span... } @@ -58,13 +57,8 @@ final class DynamicTracepointTracerTests: XCTestCase { // since the parent of this span was captured, this shall be captured as well } } - #endif - #if swift(>=5.7.0) XCTAssertEqual(tracer.spans.count, 4) - #else - XCTAssertEqual(tracer.spans.count, 2) - #endif for span in tracer.spans { XCTAssertEqual(span.context.traceID, "trace-id-fake-\(fileID)-\(fakeLine)") @@ -99,31 +93,17 @@ final class DynamicTracepointTracerTests: XCTestCase { } func logic(fakeLine: UInt) { - #if swift(>=5.7) InstrumentationSystem.tracer.withSpan("\(#function)-dont", line: fakeLine) { _ in // inside } - #else - InstrumentationSystem.legacyTracer.withAnySpan("\(#function)-dont", line: fakeLine) { _ in - // inside - } - #endif } func traceMeLogic(fakeLine: UInt) { - #if swift(>=5.7) InstrumentationSystem.tracer.withSpan("\(#function)-yes", line: fakeLine) { _ in InstrumentationSystem.tracer.withSpan("\(#function)-yes-inside", line: fakeLine + 11) { _ in // inside } } - #else - InstrumentationSystem.legacyTracer.withAnySpan("\(#function)-yes", line: fakeLine) { _ in - InstrumentationSystem.legacyTracer.withAnySpan("\(#function)-yes-inside", line: fakeLine + 11) { _ in - // inside - } - } - #endif } } @@ -193,7 +173,7 @@ final class DynamicTracepointTestTracer: LegacyTracer { } private func shouldRecord(tracepoint: TracepointID) -> Bool { - #if swift(>=5.5) && canImport(_Concurrency) + #if canImport(_Concurrency) if self.isActive(tracepoint: tracepoint) { // this tracepoint was specifically activated! return true diff --git a/Tests/TracingTests/TestTracer.swift b/Tests/TracingTests/TestTracer.swift index ba2bfce..7bb85fe 100644 --- a/Tests/TracingTests/TestTracer.swift +++ b/Tests/TracingTests/TestTracer.swift @@ -64,7 +64,6 @@ final class TestTracer: LegacyTracer { } } -#if swift(>=5.7.0) extension TestTracer: Tracer { func startSpan( _ operationName: String, @@ -86,7 +85,6 @@ extension TestTracer: Tracer { return span } } -#endif extension TestTracer { enum TraceIDKey: ServiceContextKey { diff --git a/Tests/TracingTests/TracedLockTests.swift b/Tests/TracingTests/TracedLockTests.swift index f5831cb..439200b 100644 --- a/Tests/TracingTests/TracedLockTests.swift +++ b/Tests/TracingTests/TracedLockTests.swift @@ -161,7 +161,6 @@ private final class TracedLockPrintlnTracer: LegacyTracer { } } -#if swift(>=5.7.0) extension TracedLockPrintlnTracer: Tracer { func startSpan( _ operationName: String, @@ -180,7 +179,6 @@ extension TracedLockPrintlnTracer: Tracer { ) } } -#endif #if compiler(>=5.6.0) extension TracedLockPrintlnTracer: Sendable {} diff --git a/Tests/TracingTests/TracerTests+swift57.swift b/Tests/TracingTests/TracerTests+swift57.swift index 17af99c..55bd474 100644 --- a/Tests/TracingTests/TracerTests+swift57.swift +++ b/Tests/TracingTests/TracerTests+swift57.swift @@ -17,7 +17,6 @@ import ServiceContextModule import Tracing import XCTest -#if swift(>=5.7.0) // Specifically make sure we don't have to implement startAnySpan final class SampleSwift57Tracer: Tracer { @@ -130,5 +129,3 @@ final class SampleSwift57Span: Span { extension SampleSwift57Tracer: @unchecked Sendable {} // only intended for single threaded SampleSwift57ing extension SampleSwift57Span: @unchecked Sendable {} // only intended for single threaded SampleSwift57ing - -#endif diff --git a/Tests/TracingTests/TracerTests.swift b/Tests/TracingTests/TracerTests.swift index 17a2aab..5939baa 100644 --- a/Tests/TracingTests/TracerTests.swift +++ b/Tests/TracingTests/TracerTests.swift @@ -75,15 +75,9 @@ final class TracerTests: XCTestCase { spanEnded = true } - #if swift(>=5.7.0) let value = tracer.withSpan("hello", context: .topLevel) { _ in "yes" } - #else - let value = tracer.withAnySpan("hello", context: .topLevel) { _ in - "yes" - } - #endif XCTAssertEqual(value, "yes") XCTAssertTrue(spanEnded) @@ -112,7 +106,7 @@ final class TracerTests: XCTestCase { } func testWithSpan_automaticBaggagePropagation_sync() throws { - #if swift(>=5.5) && canImport(_Concurrency) + #if canImport(_Concurrency) guard #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) else { throw XCTSkip("Task locals are not supported on this platform.") } @@ -141,7 +135,7 @@ final class TracerTests: XCTestCase { } func testWithSpan_automaticBaggagePropagation_sync_throws() throws { - #if swift(>=5.5) && canImport(_Concurrency) + #if canImport(_Concurrency) guard #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) else { throw XCTSkip("Task locals are not supported on this platform.") } @@ -171,7 +165,7 @@ final class TracerTests: XCTestCase { } func testWithSpan_automaticBaggagePropagation_async() throws { - #if swift(>=5.5) && canImport(_Concurrency) + #if canImport(_Concurrency) guard #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) else { throw XCTSkip("Task locals are not supported on this platform.") } @@ -324,7 +318,7 @@ final class TracerTests: XCTestCase { } func testWithSpan_recordErrorWithAttributes() throws { - #if swift(>=5.5) && canImport(_Concurrency) + #if canImport(_Concurrency) guard #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) else { throw XCTSkip("Task locals are not supported on this platform.") } @@ -358,11 +352,9 @@ final class TracerTests: XCTestCase { let tracer = TestTracer() let clock = DefaultTracerClock() - #if swift(>=5.7.0) tracer.withSpan("") { _ in } tracer.withSpan("", at: clock.now) { _ in } tracer.withSpan("", context: .topLevel) { _ in } - #endif tracer.withAnySpan("") { _ in } tracer.withAnySpan("", at: clock.now) { _ in } @@ -385,7 +377,6 @@ final class TracerTests: XCTestCase { XCTAssertEqual(span.startTimestampNanosSinceEpoch, instant.nanosecondsSinceEpoch) } - #if swift(>=5.7.0) // @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *) /// Helper method to execute async operations until we can use async tests (currently incompatible with the generated LinuxMain file). /// - Parameter operation: The operation to test. @@ -402,25 +393,6 @@ final class TracerTests: XCTestCase { } group.wait() } - - #elseif swift(>=5.5) && canImport(_Concurrency) - @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) - /// Helper method to execute async operations until we can use async tests (currently incompatible with the generated LinuxMain file). - /// - Parameter operation: The operation to test. - func testAsync(_ operation: @escaping () async throws -> Void) rethrows { - let group = DispatchGroup() - group.enter() - Task.detached { - do { - try await operation() - } catch { - throw error - } - group.leave() - } - group.wait() - } - #endif } struct ExampleSpanError: Error, Equatable {} @@ -465,11 +437,7 @@ struct FakeHTTPServer { var context = ServiceContext.topLevel InstrumentationSystem.instrument.extract(request.headers, into: &context, using: HTTPHeadersExtractor()) - #if swift(>=5.7.0) let span = InstrumentationSystem.tracer.startSpan("GET \(request.path)", context: context) - #else - let span = InstrumentationSystem.legacyTracer.startAnySpan("GET \(request.path)", context: context) - #endif let response = self.catchAllHandler(span.context, request, self.client) span.attributes["http.status"] = response.status @@ -485,11 +453,8 @@ final class FakeHTTPClient { func performRequest(_ context: ServiceContext, request: FakeHTTPRequest) { var request = request - #if swift(>=5.7.0) let span = InstrumentationSystem.legacyTracer.startAnySpan("GET \(request.path)", context: context) - #else - let span = InstrumentationSystem.legacyTracer.startAnySpan("GET \(request.path)", context: context) - #endif + self.contexts.append(span.context) InstrumentationSystem.instrument.inject(context, into: &request.headers, using: HTTPHeadersInjector()) span.end() diff --git a/Tests/TracingTests/TracerTimeTests.swift b/Tests/TracingTests/TracerTimeTests.swift index 8ba2193..da54249 100644 --- a/Tests/TracingTests/TracerTimeTests.swift +++ b/Tests/TracingTests/TracerTimeTests.swift @@ -42,13 +42,8 @@ final class TracerTimeTests: XCTestCase { let mockClock = MockClock() mockClock.setTime(13) - #if swift(>=5.7.0) let span: TestSpan = tracer.startSpan("start", at: mockClock.now) XCTAssertEqual(span.startTimestampNanosSinceEpoch, 13) - #else - let span: TestSpan = tracer.startAnySpan("start", at: mockClock.now) as! TestSpan - XCTAssertEqual(span.startTimestampNanosSinceEpoch, 13) - #endif } } diff --git a/Tests/TracingTests/TracingInstrumentationSystemTests.swift b/Tests/TracingTests/TracingInstrumentationSystemTests.swift index d0d0ee6..dd32a04 100644 --- a/Tests/TracingTests/TracingInstrumentationSystemTests.swift +++ b/Tests/TracingTests/TracingInstrumentationSystemTests.swift @@ -21,11 +21,9 @@ extension InstrumentationSystem { self._findInstrument(where: { $0 is T }) as? T } - #if swift(>=5.7.0) public static func _tracer(of tracerType: T.Type) -> T? where T: Tracer { self._findInstrument(where: { $0 is T }) as? T } - #endif public static func _instrument(of instrumentType: I.Type) -> I? where I: Instrument { self._findInstrument(where: { $0 is I }) as? I @@ -42,9 +40,7 @@ final class TracingInstrumentationSystemTests: XCTestCase { let tracer = TestTracer() XCTAssertNil(InstrumentationSystem._legacyTracer(of: TestTracer.self)) - #if swift(>=5.7.0) XCTAssertNil(InstrumentationSystem._tracer(of: TestTracer.self)) - #endif InstrumentationSystem.bootstrapInternal(tracer) XCTAssertFalse(InstrumentationSystem.instrument is MultiplexInstrument) @@ -53,10 +49,8 @@ final class TracingInstrumentationSystemTests: XCTestCase { XCTAssert(InstrumentationSystem._legacyTracer(of: TestTracer.self) === tracer) XCTAssert(InstrumentationSystem.legacyTracer is TestTracer) - #if swift(>=5.7.0) XCTAssert(InstrumentationSystem._tracer(of: TestTracer.self) === tracer) XCTAssert(InstrumentationSystem.tracer is TestTracer) - #endif let multiplexInstrument = MultiplexInstrument([tracer]) InstrumentationSystem.bootstrapInternal(multiplexInstrument) @@ -65,9 +59,7 @@ final class TracingInstrumentationSystemTests: XCTestCase { XCTAssert(InstrumentationSystem._legacyTracer(of: TestTracer.self) === tracer) XCTAssert(InstrumentationSystem.legacyTracer is TestTracer) - #if swift(>=5.7.0) XCTAssert(InstrumentationSystem._tracer(of: TestTracer.self) === tracer) XCTAssert(InstrumentationSystem.tracer is TestTracer) - #endif } } diff --git a/docker/docker-compose.2004.56.yaml b/docker/docker-compose.2004.56.yaml deleted file mode 100644 index e9322cb..0000000 --- a/docker/docker-compose.2004.56.yaml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-distributed-tracing:20.04-5.6 - build: - args: - ubuntu_version: "focal" - swift_version: "5.6" - - test: - image: swift-distributed-tracing:20.04-5.6 - environment: - - FORCE_TEST_DISCOVERY=--enable-test-discovery - - shell: - image: swift-distributed-tracing:20.04-5.6 diff --git a/docker/docker-compose.2204.510.yaml b/docker/docker-compose.2204.510.yaml new file mode 100644 index 0000000..32c12c9 --- /dev/null +++ b/docker/docker-compose.2204.510.yaml @@ -0,0 +1,18 @@ +version: "3" + +services: + + runtime-setup: + image: swift-distributed-tracing:22.04-5.10 + build: + args: + base_image: "swiftlang/swift:nightly-5.10-jammy" + + test: + image: swift-distributed-tracing:22.04-5.10 + environment: + - FORCE_TEST_DISCOVERY=--enable-test-discovery + # - STRICT_CONCURRENCY_ARG=-Xswiftc -strict-concurrency=complete + + shell: + image: swift-distributed-tracing:22.04-5.10 diff --git a/docker/docker-compose.2204.59.yaml b/docker/docker-compose.2204.59.yaml index 2da890c..8442234 100644 --- a/docker/docker-compose.2204.59.yaml +++ b/docker/docker-compose.2204.59.yaml @@ -6,7 +6,8 @@ services: image: swift-distributed-tracing:22.04-5.9 build: args: - base_image: "swiftlang/swift:nightly-5.9-jammy" + ubuntu_version: "jammy" + swift_version: "5.9" test: image: swift-distributed-tracing:22.04-5.9 diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index d1277a5..83b3bf1 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -28,7 +28,9 @@ services: test: <<: *common - command: /bin/bash -xcl "swift test -Xswiftc -warnings-as-errors $${FORCE_TEST_DISCOVERY-} $${SANITIZER_ARG-} $${STRICT_CONCURRENCY_ARG-}" + # FIXME: We cannot use -warnings-as-errors because we inherit from a deprecated type in the Tracer type, + # and we need to keep supporting the old type still. This was introduced as we dropped Swift 5.6 and added 5.9/5.10. + command: /bin/bash -xcl "swift test $${FORCE_TEST_DISCOVERY-} $${SANITIZER_ARG-} $${STRICT_CONCURRENCY_ARG-}" # util