Contents

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