分布式追踪器 (DistributedTracer)

我“用分布式追踪做的愚蠢技巧” - 从 XCTest 案例生成追踪。

我拼凑了这个东西,包装了 Moritz Langswift-otel 包的惊人工作,这样我就可以使用 Swift 分布式追踪 来检测一个库 - 并在本地运行测试时看到追踪。

诚然,这是一个临时拼凑的方案,因为一些追踪基础设施相关的库每个进程只能初始化一次。 为了适应这个限制,我将它设置为一个全局actor,你可以通过 shared 实例访问它,并且你必须调用它的异步方法 bootstrap(),传入你正在引导的“服务”的名称。你可以随意多次调用 bootstrap() 方法,但它实际上只在第一次有效。 由于测试可以以任何顺序运行(而且通常你希望如此),我在一个异步 setup 函数中调用 bootstrap

例如,使用 XCTest,一般结构如下:

final class SomeTestSuite: XCTestCase {
    override func setUp() async throws {
        await TestTracer.shared.bootstrap(serviceName: "TestService")
    }

    override func tearDown() async throws {
        if let tracer = await TestTracer.shared.tracer {
            tracer.forceFlush()
            // Testing does NOT have a polite shutdown waiting for a flush to complete, so
            // we explicitly give it some extra time here to flush out any spans remaining.
            try await Task.sleep(for: .milliseconds(100))

            // This would be a whole lot better at the tail end of the entire suite, or at least
            // at the class tearDown, but `override class func tearDown` doesn't appear to have
            // an async callback where we can do cleanup/flush work like this, so it's in
            // each test execution. Sorry about that.
        }
    }

    func testClosureInvokerTest() async throws {
        ...
    }
}

查看它

启动 Jaeger 追踪收集器

docker-compose up -d

运行 此包中的测试 以生成一些测试

swift test

打开浏览器查看生成的任何追踪,地址为 https://:16686/,这将访问在 Docker 中运行的 Jaeger。

可能的未来工作

我对进一步使用它有一些异想天开的想法,并且肯定会尝试使用 swift-testing,一旦它变得更容易使用。 总的来说,我真的希望能够既从测试中导出 spans,并且 - 特别是在集成测试的情况下 - 能够在集成测试的操作完成后检索它们,以便针对它们进行断言/验证。

另一个对我来说超级有趣的可能性是启用来自 Apple 原生平台应用(iOS、macOS 等)的追踪,该追踪与后端追踪协同工作。 在这方面存在更多挑战,其中包括:

如果这些听起来对你来说超级有趣,请告诉我 - 或者如果你喜欢,请参与并在此处贡献。 如果你希望你的公司也拥有类似的东西……请告诉我。 我可以自由职业,我们可以找到一种方法将该特性或功能添加到这个(或其他的)开源项目中,以支持我们喜欢使用的东西。