Skip to content

Commit 5001d6d

Browse files
committed
Update tracing test
1 parent 1c79343 commit 5001d6d

File tree

3 files changed

+20
-95
lines changed

3 files changed

+20
-95
lines changed

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ let package = Package(
6969
.target(name: "FluentBenchmark"),
7070
.target(name: "FluentSQL"),
7171
.target(name: "XCTFluent"),
72+
.product(name: "InMemoryTracing", package: "swift-distributed-tracing")
7273
],
7374
swiftSettings: swiftSettings
7475
),

Sources/FluentKit/Query/Database/DatabaseQuery.swift

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,32 +35,26 @@ public struct DatabaseQuery: Sendable {
3535

3636
func withTracing<T>(_ closure: () async throws -> T) async rethrows -> T {
3737
if shouldTrace {
38-
try await withSpan(
39-
"db.query",
40-
context: self.serviceContext,
41-
ofKind: .server
42-
) { span in
43-
self.setSpanAttributes(span)
38+
try await withSpan("db.query", context: self.serviceContext, ofKind: .server) { span in
39+
// https://opentelemetry.io/docs/specs/semconv/database/database-spans/#span-definition
40+
// We add what we can. The rest is up to the underlying driver packages
41+
span.updateAttributes { attributes in
42+
// db.system.name
43+
attributes["db.collection.name"] = self.schema
44+
attributes["db.namespace"] = self.space
45+
attributes["db.operation.name"] = "\(self.action)"
46+
// db.response.status_code
47+
// error.type
48+
// server.port
49+
attributes["db.query.summary"] = "\(self.action) \(self.space.map { "\($0)." } ?? "")\(self.schema)"
50+
}
4451
return try await closure()
4552
}
4653
} else {
4754
try await closure()
4855
}
4956
}
5057

51-
// https://opentelemetry.io/docs/specs/semconv/database/database-spans/#span-definition
52-
fileprivate func setSpanAttributes(_ span: any Span) {
53-
span.updateAttributes { attributes in
54-
// db.system.name
55-
attributes["db.collection.name"] = self.schema
56-
attributes["db.namespace"] = self.space
57-
attributes["db.operation.name"] = "\(self.action)"
58-
// db.response.status_code
59-
// error.type
60-
// server.port
61-
attributes["db.query.summary"] = "\(self.action) \(self.space.map { "\($0)." } ?? "")\(self.schema)"
62-
}
63-
}
6458
}
6559

6660
extension DatabaseQuery: CustomStringConvertible {
Lines changed: 6 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,20 @@
11
import FluentBenchmark
22
import FluentKit
33
import Tracing
4+
import InMemoryTracing
45
import XCTest
56

67
final class TracingTests: XCTestCase {
78
func testTracing() async throws {
89
let db = DummyDatabaseForTestSQLSerializer()
9-
let tracer = TestTracer()
10+
let tracer = InMemoryTracer()
1011
InstrumentationSystem.bootstrap(tracer)
1112

1213
_ = try await Planet.query(on: db).sort(\.$name, .descending).all()
13-
let span = try XCTUnwrap(tracer.spans.first)
14+
let span = try XCTUnwrap(tracer.finishedSpans.first)
1415

15-
XCTAssertEqual(span.attributes["db.action"]?.toSpanAttribute(), "read")
16-
}
17-
}
18-
19-
final class TestTracer: Tracer, @unchecked Sendable {
20-
typealias Span = TestSpan
21-
22-
var spans: [TestSpan] = []
23-
24-
func startSpan(
25-
_ operationName: String,
26-
context: @autoclosure () -> ServiceContext,
27-
ofKind kind: SpanKind,
28-
at instant: @autoclosure () -> some TracerInstant,
29-
function: String,
30-
file fileID: String,
31-
line: UInt
32-
) -> TestSpan {
33-
let span = TestSpan(
34-
operationName,
35-
context: context()
36-
)
37-
self.spans.append(span)
38-
return span
39-
}
40-
41-
func forceFlush() {
42-
return
43-
}
44-
45-
func extract<Carrier, Extract>(_ carrier: Carrier, into context: inout ServiceContextModule.ServiceContext, using extractor: Extract)
46-
where Carrier == Extract.Carrier, Extract: Instrumentation.Extractor {
47-
return
48-
}
49-
50-
func inject<Carrier, Inject>(_ context: ServiceContextModule.ServiceContext, into carrier: inout Carrier, using injector: Inject)
51-
where Carrier == Inject.Carrier, Inject: Instrumentation.Injector {
52-
return
53-
}
54-
}
55-
56-
final class TestSpan: Span, @unchecked Sendable {
57-
let context: ServiceContext
58-
var operationName: String
59-
var attributes: Tracing.SpanAttributes = .init()
60-
var isRecording: Bool = true
61-
62-
private var status: SpanStatus?
63-
private var events: [SpanEvent] = []
64-
65-
init(_ operationName: String, context: ServiceContext) {
66-
self.operationName = operationName
67-
self.context = context
68-
}
69-
70-
func setStatus(_ status: SpanStatus) {
71-
self.status = status
72-
}
73-
74-
func addEvent(_ event: SpanEvent) {
75-
events.append(event)
76-
}
77-
78-
func recordError<Instant>(_ error: any Error, attributes: Tracing.SpanAttributes, at instant: @autoclosure () -> Instant)
79-
where Instant: Tracing.TracerInstant {
80-
return
81-
}
82-
83-
func addLink(_ link: Tracing.SpanLink) {
84-
return
85-
}
86-
87-
func end<Instant>(at instant: @autoclosure () -> Instant) where Instant: Tracing.TracerInstant {
88-
isRecording = false
16+
XCTAssertEqual(span.attributes["db.operation.name"]?.toSpanAttribute(), "read")
17+
XCTAssertEqual(span.attributes["db.query.summary"]?.toSpanAttribute(), "read planets")
18+
XCTAssertEqual(span.attributes["db.collection.name"]?.toSpanAttribute(), "\(Planet.schema)")
8919
}
9020
}

0 commit comments

Comments
 (0)