我“用分布式追踪做的愚蠢技巧” - 从 XCTest 案例生成追踪。
我拼凑了这个东西,包装了 Moritz Lang 的 swift-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 等)的追踪,该追踪与后端追踪协同工作。 在这方面存在更多挑战,其中包括:
如果这些听起来对你来说超级有趣,请告诉我 - 或者如果你喜欢,请参与并在此处贡献。 如果你希望你的公司也拥有类似的东西……请告诉我。 我可以自由职业,我们可以找到一种方法将该特性或功能添加到这个(或其他的)开源项目中,以支持我们喜欢使用的东西。