apple/swift-service-context
Minimal type-safe context propagation container
Overview
ServiceContext serves as currency type for carrying around additional contextual information between Swift tasks and functions.
One generally starts from a "top level" (empty) or the "current" (ServiceContext.current) context and then adds values to it.
The context is a value type and is propagated using task-local values so it can be safely used from concurrent contexts like this:
var context = ServiceContext.topLevel
context[FirstTestKey.self] = 42
func exampleFunction() async -> Int {
guard let context = ServiceContext.current else {
return 0
}
guard let value = context[FirstTestKey.self] else {
return 0
}
print("test = \(value)") // test = 42
return value
}
let c = await ServiceContext.withValue(context) {
await exampleFunction()
}
assert(c == 42)ServiceContext is a fundamental building block for how distributed tracing propagates trace identifiers.
Dependency
In order to depend on this library you can use the Swift Package Manager, and add the following dependency to your Package.swift:
dependencies: [
.package(
url: "https://github.com/apple/swift-service-context.git",
from: "1.0.0"
)
]and depend on the module in your target:
targets: [
.target(
name: "MyAwesomeApp",
dependencies: [
.product(
name: "ServiceContextModule",
package: "swift-service-context"
),
]
),
// ...
]Package Metadata
Repository: apple/swift-service-context
Homepage: https://github.com/apple/swift-distributed-tracing
Stars: 197
Forks: 27
Open issues: 3
Default branch: main
Primary language: swift
License: Apache-2.0
Topics: async-context, baggage, baggage-context, concurrency, context-propagation, distributed-systems, sswg, trace-context
README: README.md