Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Linux support via a TaskLocalContextManager #546

Merged
merged 31 commits into from
Jul 23, 2024
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
d295e34
Basic linux support via a concurrency based wrapper library
semicoleon Jun 7, 2024
2b175a4
Fix/don't run some tests when they can't pass on the current platform…
semicoleon Jun 8, 2024
b9e8efb
Remove swift-atomics from the direct dependencies on Darwin platforms
semicoleon Jun 8, 2024
e7e69cd
Merge remote-tracking branch 'origin/main' into linuxConcurrencyWrapper
semicoleon Jun 8, 2024
1e0cde6
Remove unnecessary protocol functions, and add some documentation com…
semicoleon Jun 8, 2024
9e6243d
Update some more doc comments
semicoleon Jun 8, 2024
2020b45
Rename OpenTelemetryTestCase to OpenTelemetryContextTestCase
semicoleon Jun 8, 2024
775ed4b
Remove an unnecessary import and assertion
semicoleon Jun 12, 2024
c57097d
Remove debugging code
semicoleon Jun 12, 2024
44a428e
Add linux test github action
semicoleon Jun 12, 2024
9034312
Add comments and clean up some issues in the tests
semicoleon Jun 13, 2024
48511a0
Add a concurrency example, and allow SpanBuilderBase to startSpans
semicoleon Jun 13, 2024
ea9fca2
Apply extensions to SpanBuilderBase instead of SpanBuilder
semicoleon Jun 13, 2024
619abcc
Split building and running the tests into separate steps
semicoleon Jun 14, 2024
387b99f
Avoid using docker
semicoleon Jun 14, 2024
a8bc0ac
Force noninteractive swiftly installation
semicoleon Jun 14, 2024
c982b2e
Try removing complex test case overrides
semicoleon Jun 14, 2024
e949d31
Revert "Try removing complex test case overrides"
semicoleon Jun 14, 2024
27f8d2c
Revert "Force noninteractive swiftly installation"
semicoleon Jun 14, 2024
c5d0003
Revert "Avoid using docker"
semicoleon Jun 14, 2024
1bf629f
Allow batch worker threads to exit once they are cancelled, and incre…
semicoleon Jun 15, 2024
d8f8fa2
Also check for cancellation on the inner loop in BatchWorker
semicoleon Jun 15, 2024
201bf1c
Merge branch 'main' into linuxConcurrencyWrapper
bryce-b Jul 2, 2024
7507d79
Merge branch 'main' into linuxConcurrencyWrapper
semicoleon Jul 12, 2024
19c40b2
Merge branch 'main' into linuxConcurrencyWrapper
bryce-b Jul 22, 2024
1d9ea39
Update Package.swift
bryce-b Jul 22, 2024
2d5e249
Update [email protected]
bryce-b Jul 22, 2024
76b4f0e
Update [email protected]
bryce-b Jul 22, 2024
0229179
Merge branch 'main' into linuxConcurrencyWrapper
bryce-b Jul 23, 2024
bea4dd7
fixed additional package issues
bryce-b Jul 23, 2024
16faaf9
added additional test skip
bryce-b Jul 23, 2024
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
9 changes: 9 additions & 0 deletions .github/workflows/BuildAndTest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,12 @@ jobs:
run: make build-for-testing-watchos
- name: Test for watchOS
run: make test-without-building-watchos
linux:
runs-on: ubuntu-latest
container: swift:5.10
steps:
- uses: actions/checkout@v2
- name: Build tests for Linux
run: swift build --build-tests
- name: Run tests for Linux
run: swift test
66 changes: 66 additions & 0 deletions Examples/ConcurrencyContext/main.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

#if canImport(_Concurrency)
import OpenTelemetrySdk
import OpenTelemetryConcurrency
import StdoutExporter

let sampleKey = "sampleKey"
let sampleValue = "sampleValue"

// On Apple platforms, the default is the activity based context manager. We want to opt-in to the structured concurrency based context manager instead.
OpenTelemetry.registerDefaultConcurrencyContextManager()

let stdout = StdoutExporter()
OpenTelemetry.registerTracerProvider(
tracerProvider: TracerProviderBuilder().add(
spanProcessor: SimpleSpanProcessor(spanExporter: stdout)
).build()
)

let tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: "ConcurrencyContext", instrumentationVersion: "semver:0.1.0")

extension Task where Failure == Never, Success == Never {
static func sleep(seconds: Double) async throws {
try await self.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
}
}

func simpleSpan() async throws {
let span = tracer.spanBuilder(spanName: "SimpleSpan").setSpanKind(spanKind: .client).startSpan()
span.setAttribute(key: sampleKey, value: sampleValue)
try await Task.sleep(seconds: 0.5)
span.end()
}

func childSpan() async throws {
// SpanBuilder's `setActive` method is not available here, since it isn't compatible with structured concurrency based context management
try await tracer.spanBuilder(spanName: "parentSpan").setSpanKind(spanKind: .client).withActiveSpan { span in
span.setAttribute(key: sampleKey, value: sampleValue)
await Task.detached {
// A detached task doesn't inherit the task local context, so this span won't have a parent.
let notAChildSpan = tracer.spanBuilder(spanName: "notAChild").setSpanKind(spanKind: .client).startSpan()
notAChildSpan.setAttribute(key: sampleKey, value: sampleValue)
notAChildSpan.end()
}.value

try await Task {
// Normal tasks should still inherit the context.
try await Task.sleep(seconds: 0.2)
let childSpan = tracer.spanBuilder(spanName: "childSpan").setSpanKind(spanKind: .client).startSpan()
childSpan.setAttribute(key: sampleKey, value: sampleValue)
try await Task.sleep(seconds: 0.5)
childSpan.end()
}.value
}
}

try await simpleSpan()
try await Task.sleep(seconds: 1)
try await childSpan()
try await Task.sleep(seconds: 1)

#endif
18 changes: 18 additions & 0 deletions Examples/Logging Tracer/LoggingTracer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,5 +69,23 @@ class LoggingTracer: Tracer {
func setActive(_ active: Bool) -> Self {
return self
}

func withActiveSpan<T>(_ operation: (any SpanBase) throws -> T) rethrows -> T {
bryce-b marked this conversation as resolved.
Show resolved Hide resolved
let span = self.startSpan()
defer {
span.end()
}
return try operation(span)
}

#if canImport(_Concurrency)
func withActiveSpan<T>(_ operation: (any SpanBase) async throws -> T) async rethrows -> T {
let span = self.startSpan()
defer {
span.end()
}
return try await operation(span)
}
#endif
}
}
62 changes: 40 additions & 22 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/grpc/grpc-swift.git",
"state" : {
"revision" : "87cecdeb2aae6b359b754d0dc7099e8237cf1824",
"version" : "1.11.0"
"revision" : "6a90b7e77e29f9bda6c2b3a4165a40d6c02cfda1",
"version" : "1.23.0"
}
},
{
Expand All @@ -23,89 +23,107 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-atomics.git",
"state" : {
"revision" : "919eb1d83e02121cdb434c7bfc1f0c66ef17febe",
"version" : "1.0.2"
"revision" : "cd142fd2f64be2100422d658e7411e39489da985",
"version" : "1.2.0"
}
},
{
"identity" : "swift-collections",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-collections.git",
"state" : {
"revision" : "f504716c27d2e5d4144fa4794b12129301d17729",
"version" : "1.0.3"
"revision" : "ee97538f5b81ae89698fd95938896dec5217b148",
"version" : "1.1.1"
}
},
{
"identity" : "swift-http-types",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-http-types",
"state" : {
"revision" : "9bee2fdb79cc740081abd8ebd80738063d632286",
"version" : "1.1.0"
}
},
{
"identity" : "swift-log",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-log.git",
"state" : {
"revision" : "6fe203dc33195667ce1759bf0182975e4653ba1c",
"version" : "1.4.4"
"revision" : "e97a6fcb1ab07462881ac165fdbb37f067e205d5",
"version" : "1.5.4"
}
},
{
"identity" : "swift-metrics",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-metrics.git",
"state" : {
"revision" : "3edd2f57afc4e68e23c3e4956bc8b65ca6b5b2ff",
"version" : "2.2.0"
"revision" : "ce594e71e92a1610015017f83f402894df540e51",
"version" : "2.4.4"
}
},
{
"identity" : "swift-nio",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio.git",
"state" : {
"revision" : "bc4c55b9f9584f09eb971d67d956e28d08caa9d0",
"version" : "2.43.1"
"revision" : "9428f62793696d9a0cc1f26a63f63bb31da0516d",
"version" : "2.66.0"
}
},
{
"identity" : "swift-nio-extras",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-extras.git",
"state" : {
"revision" : "fb70a0f5e984f23be48b11b4f1909f3bee016178",
"version" : "1.19.1"
"revision" : "a3b640d7dc567225db7c94386a6e71aded1bfa63",
"version" : "1.22.0"
}
},
{
"identity" : "swift-nio-http2",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-http2.git",
"state" : {
"revision" : "00576e6f1efa5c46dca2ca3081dc56dd233b402d",
"version" : "1.23.0"
"revision" : "8d8eb609929aee75336a0a3d2417280786265868",
"version" : "1.32.0"
}
},
{
"identity" : "swift-nio-ssl",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-ssl.git",
"state" : {
"revision" : "5e68c1ded15619bb281b273fa8c2d8fd7f7b2b7d",
"version" : "2.16.1"
"revision" : "2b09805797f21c380f7dc9bedaab3157c5508efb",
"version" : "2.27.0"
}
},
{
"identity" : "swift-nio-transport-services",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-transport-services.git",
"state" : {
"revision" : "e7f5278a26442dc46783ba7e063643d524e414a0",
"version" : "1.11.3"
"revision" : "38ac8221dd20674682148d6451367f89c2652980",
"version" : "1.21.0"
}
},
{
"identity" : "swift-protobuf",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-protobuf.git",
"state" : {
"revision" : "88c7d15e1242fdb6ecbafbc7926426a19be1e98a",
"version" : "1.20.2"
"revision" : "9f0c76544701845ad98716f3f6a774a892152bcb",
"version" : "1.26.0"
}
},
{
"identity" : "swift-system",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-system.git",
"state" : {
"revision" : "f9266c85189c2751589a50ea5aec72799797e471",
"version" : "1.3.0"
}
},
{
Expand Down
7 changes: 5 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ let package = Package(
dependencies: []),
.target(name: "OpenTelemetrySdk",
dependencies: ["OpenTelemetryApi"]),
.target(name: "OpenTelemetryTestUtils",
dependencies: ["OpenTelemetryApi", "OpenTelemetrySdk"]),
.target(name: "ResourceExtension",
dependencies: ["OpenTelemetrySdk"],
path: "Sources/Instrumentation/SDKResourceExtension",
Expand Down Expand Up @@ -120,11 +122,12 @@ let package = Package(
dependencies: ["NetworkStatus", .product(name: "Reachability", package: "Reachability.swift")],
path: "Tests/InstrumentationTests/NetworkStatusTests"),
.testTarget(name: "OpenTelemetryApiTests",
dependencies: ["OpenTelemetryApi"],
dependencies: ["OpenTelemetryApi", "OpenTelemetryTestUtils"],
path: "Tests/OpenTelemetryApiTests"),
.testTarget(name: "OpenTelemetrySdkTests",
dependencies: ["OpenTelemetryApi",
"OpenTelemetrySdk"],
"OpenTelemetrySdk",
"OpenTelemetryTestUtils"],
path: "Tests/OpenTelemetrySdkTests"),
.testTarget(name: "ResourceExtensionTests",
dependencies: ["ResourceExtension", "OpenTelemetrySdk"],
Expand Down
7 changes: 5 additions & 2 deletions [email protected]
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ let package = Package(
dependencies: []),
.target(name: "OpenTelemetrySdk",
dependencies: ["OpenTelemetryApi"]),
.target(name: "OpenTelemetryTestUtils",
dependencies: ["OpenTelemetryApi", "OpenTelemetrySdk"]),
.target(name: "ResourceExtension",
dependencies: ["OpenTelemetrySdk"],
path: "Sources/Instrumentation/SDKResourceExtension",
Expand Down Expand Up @@ -128,11 +130,12 @@ let package = Package(
],
path: "Tests/InstrumentationTests/NetworkStatusTests"),
.testTarget(name: "OpenTelemetryApiTests",
dependencies: ["OpenTelemetryApi"],
dependencies: ["OpenTelemetryApi", "OpenTelemetryTestUtils"],
path: "Tests/OpenTelemetryApiTests"),
.testTarget(name: "OpenTelemetrySdkTests",
dependencies: ["OpenTelemetryApi",
"OpenTelemetrySdk"],
"OpenTelemetrySdk",
"OpenTelemetryTestUtils"],
path: "Tests/OpenTelemetrySdkTests"),
.testTarget(name: "ResourceExtensionTests",
dependencies: ["ResourceExtension", "OpenTelemetrySdk"],
Expand Down
Loading
Loading