From 1a5c3f8d0579062df1b708b6d43c22d0251fc2ce Mon Sep 17 00:00:00 2001 From: Josh Elkins Date: Thu, 13 Nov 2025 10:32:23 -0600 Subject: [PATCH] feat\!: Remove smithy-swift-opentelemetry --- Package.swift | 22 --- ...onfiguration+HTTPClientConfiguration.swift | 2 +- .../OpenTelemetry/OTelProvider.swift | 40 ------ .../Providers/OpenTelemetry/OTelTracing.swift | 134 ------------------ .../Providers/OpenTelemetry/OTelUtils.swift | 55 ------- 5 files changed, 1 insertion(+), 252 deletions(-) delete mode 100644 Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelProvider.swift delete mode 100644 Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelTracing.swift delete mode 100644 Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelUtils.swift diff --git a/Package.swift b/Package.swift index 755b40342..1d29051fe 100644 --- a/Package.swift +++ b/Package.swift @@ -58,7 +58,6 @@ let package = Package( var dependencies: [Package.Dependency] = [ .package(url: "https://github.com/awslabs/aws-crt-swift.git", exact: "0.54.2"), .package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"), - .package(url: "https://github.com/open-telemetry/opentelemetry-swift", from: "1.13.0"), ] let isDocCEnabled = ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_ENABLE_DOCC"] != nil @@ -97,27 +96,6 @@ let package = Package( "SmithyChecksums", "SmithyCBOR", .product(name: "AwsCommonRuntimeKit", package: "aws-crt-swift"), - // Only include these on macOS, iOS, tvOS, watchOS, and macCatalyst (visionOS and Linux are excluded) - .product( - name: "InMemoryExporter", - package: "opentelemetry-swift", - condition: .when(platforms: [.macOS, .iOS, .tvOS, .watchOS, .macCatalyst]) - ), - .product( - name: "OpenTelemetryApi", - package: "opentelemetry-swift", - condition: .when(platforms: [.macOS, .iOS, .tvOS, .watchOS, .macCatalyst]) - ), - .product( - name: "OpenTelemetrySdk", - package: "opentelemetry-swift", - condition: .when(platforms: [.macOS, .iOS, .tvOS, .watchOS, .macCatalyst]) - ), - .product( - name: "OpenTelemetryProtocolExporterHTTP", - package: "opentelemetry-swift", - condition: .when(platforms: [.macOS, .iOS, .tvOS, .watchOS, .macCatalyst]) - ), ], resources: [ .copy("PrivacyInfo.xcprivacy") diff --git a/Sources/ClientRuntime/Networking/Http/URLSession/URLSessionConfiguration+HTTPClientConfiguration.swift b/Sources/ClientRuntime/Networking/Http/URLSession/URLSessionConfiguration+HTTPClientConfiguration.swift index 0f43116f3..e473f756c 100644 --- a/Sources/ClientRuntime/Networking/Http/URLSession/URLSessionConfiguration+HTTPClientConfiguration.swift +++ b/Sources/ClientRuntime/Networking/Http/URLSession/URLSessionConfiguration+HTTPClientConfiguration.swift @@ -11,7 +11,7 @@ import class Foundation.URLSessionConfiguration extension URLSessionConfiguration { - public static func from(httpClientConfiguration: HttpClientConfiguration) -> URLSessionConfiguration { + static func from(httpClientConfiguration: HttpClientConfiguration) -> URLSessionConfiguration { let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = httpClientConfiguration.socketTimeout config.httpShouldSetCookies = false diff --git a/Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelProvider.swift b/Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelProvider.swift deleted file mode 100644 index d8e01cdc9..000000000 --- a/Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelProvider.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright Amazon.com Inc. or its affiliates. -// All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 -// - - #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) -import Foundation - -// OpenTelemetrySdk specific imports -@preconcurrency import protocol OpenTelemetrySdk.SpanExporter - -/// Namespace for the SDK Telemetry implementation. -public enum OpenTelemetrySwift { - /// The SDK TelemetryProviderOTel Implementation. - /// - /// - contextManager: no-op - /// - loggerProvider: provides SwiftLoggers - /// - meterProvider: no-op - /// - tracerProvider: provides OTelTracerProvider with InMemoryExporter - public static func provider(spanExporter: any SpanExporter) -> TelemetryProvider { - return OpenTelemetrySwiftProvider(spanExporter: spanExporter) - } - - public final class OpenTelemetrySwiftProvider: TelemetryProvider { - public let contextManager: TelemetryContextManager - public let loggerProvider: LoggerProvider - public let meterProvider: MeterProvider - public let tracerProvider: TracerProvider - - public init(spanExporter: SpanExporter) { - self.contextManager = DefaultTelemetry.defaultContextManager - self.loggerProvider = DefaultTelemetry.defaultLoggerProvider - self.meterProvider = DefaultTelemetry.defaultMeterProvider - self.tracerProvider = OTelTracerProvider(spanExporter: spanExporter) - } - } -} -#endif diff --git a/Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelTracing.swift b/Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelTracing.swift deleted file mode 100644 index cd068bb11..000000000 --- a/Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelTracing.swift +++ /dev/null @@ -1,134 +0,0 @@ -// -// Copyright Amazon.com Inc. or its affiliates. -// All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 -// - - #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) -@preconcurrency import enum OpenTelemetryApi.AttributeValue -@preconcurrency import protocol OpenTelemetryApi.Span -@preconcurrency import enum OpenTelemetryApi.SpanKind -@preconcurrency import enum OpenTelemetryApi.Status -// OpenTelemetryApi specific imports -@preconcurrency import protocol OpenTelemetryApi.Tracer - -@preconcurrency import struct OpenTelemetrySdk.Resource -@preconcurrency import struct OpenTelemetrySdk.SimpleSpanProcessor -@preconcurrency import protocol OpenTelemetrySdk.SpanExporter -@preconcurrency import class OpenTelemetrySdk.TracerProviderBuilder -// OpenTelemetrySdk specific imports -@preconcurrency import class OpenTelemetrySdk.TracerProviderSdk - -// Smithy specific imports -import struct Smithy.AttributeKey -import struct Smithy.Attributes - -public typealias OpenTelemetryTracer = OpenTelemetryApi.Tracer -public typealias OpenTelemetrySpanKind = OpenTelemetryApi.SpanKind -public typealias OpenTelemetrySpan = OpenTelemetryApi.Span -public typealias OpenTelemetryStatus = OpenTelemetryApi.Status - -// Trace -public final class OTelTracerProvider: TracerProvider { - private let sdkTracerProvider: TracerProviderSdk - - public init(spanExporter: SpanExporter) { - self.sdkTracerProvider = TracerProviderBuilder() - .add(spanProcessor: SimpleSpanProcessor(spanExporter: spanExporter)) - .with(resource: Resource()) - .build() - } - - public func getTracer(scope: String) -> any Tracer { - let tracer = self.sdkTracerProvider.get(instrumentationName: scope) - return OTelTracerImpl(otelTracer: tracer) - } -} - -public final class OTelTracerImpl: Tracer { - private let otelTracer: OpenTelemetryTracer - - public init(otelTracer: OpenTelemetryTracer) { - self.otelTracer = otelTracer - } - - public func createSpan( - name: String, - initialAttributes: Attributes?, spanKind: SpanKind, parentContext: (any TelemetryContext)? - ) -> any TraceSpan { - let spanBuilder = self.otelTracer - .spanBuilder(spanName: name) - .setSpanKind(spanKind: spanKind.toOTelSpanKind()) - - initialAttributes?.getKeys().forEach { key in - spanBuilder.setAttribute( - key: key, - value: (initialAttributes?.get(key: AttributeKey(name: key)))! - ) - } - - return OTelTraceSpanImpl(name: name, otelSpan: spanBuilder.startSpan()) - } -} - -private final class OTelTraceSpanImpl: TraceSpan { - let name: String - private let otelSpan: OpenTelemetrySpan - - public init(name: String, otelSpan: OpenTelemetrySpan) { - self.name = name - self.otelSpan = otelSpan - } - - func emitEvent(name: String, attributes: Attributes?) { - if let attributes = attributes, !(attributes.size == 0) { - self.otelSpan.addEvent(name: name, attributes: attributes.toOtelAttributes()) - } else { - self.otelSpan.addEvent(name: name) - } - } - - func setAttribute(key: AttributeKey, value: T) { - self.otelSpan.setAttribute(key: key.getName(), value: AttributeValue.init(value)) - } - - func setStatus(status: TraceSpanStatus) { - self.otelSpan.status = status.toOTelStatus() - } - - func end() { - self.otelSpan.end() - } -} - -extension SpanKind { - func toOTelSpanKind() -> OpenTelemetrySpanKind { - switch self { - case .client: - return .client - case .consumer: - return .consumer - case .internal: - return .internal - case .producer: - return .producer - case .server: - return .server - } - } -} - -extension TraceSpanStatus { - func toOTelStatus() -> OpenTelemetryStatus { - switch self { - case .error: - return .error(description: "An error occured!") // status doesn't have error description - case .ok: - return .ok - case .unset: - return .unset - } - } -} -#endif diff --git a/Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelUtils.swift b/Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelUtils.swift deleted file mode 100644 index d95855e6d..000000000 --- a/Sources/ClientRuntime/Telemetry/Providers/OpenTelemetry/OTelUtils.swift +++ /dev/null @@ -1,55 +0,0 @@ -// -// Copyright Amazon.com Inc. or its affiliates. -// All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 -// - - #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) -@preconcurrency import class OpenTelemetryApi.AttributeArray -// OpenTelemetryApi specific imports -@preconcurrency import enum OpenTelemetryApi.AttributeValue - -import struct Smithy.AttributeKey -// Smithy imports -import struct Smithy.Attributes - -extension Attributes { - public func toOtelAttributes() -> [String: AttributeValue] { - let keys: [String] = self.getKeys() - var otelKeys: [String: AttributeValue] = [:] - - guard !keys.isEmpty else { - return [:] - } - - keys.forEach { key in - // Try to get the value as different types - if let stringValue = self.get(key: AttributeKey(name: key)) { - otelKeys[key] = AttributeValue.string(stringValue) - } else if let intValue = self.get(key: AttributeKey(name: key)) { - otelKeys[key] = AttributeValue.int(intValue) - } else if let doubleValue = self.get(key: AttributeKey(name: key)) { - otelKeys[key] = AttributeValue.double(doubleValue) - } else if let boolValue = self.get(key: AttributeKey(name: key)) { - otelKeys[key] = AttributeValue.bool(boolValue) - } else if let arrayValue = self.get(key: AttributeKey<[String]>(name: key)) { - let attributeArray = arrayValue.map { AttributeValue.string($0) } - otelKeys[key] = AttributeValue.array(AttributeArray(values: attributeArray)) - } else if let arrayValue = self.get(key: AttributeKey<[Int]>(name: key)) { - let attributeArray = arrayValue.map { AttributeValue.int($0) } - otelKeys[key] = AttributeValue.array(AttributeArray(values: attributeArray)) - } else if let arrayValue = self.get(key: AttributeKey<[Double]>(name: key)) { - let attributeArray = arrayValue.map { AttributeValue.double($0) } - otelKeys[key] = AttributeValue.array(AttributeArray(values: attributeArray)) - } else if let arrayValue = self.get(key: AttributeKey<[Bool]>(name: key)) { - let attributeArray = arrayValue.map { AttributeValue.bool($0) } - otelKeys[key] = AttributeValue.array(AttributeArray(values: attributeArray)) - } - // If none of the above types match, the value is skipped - } - - return otelKeys - } -} -#endif