Skip to content

Commit a533cdd

Browse files
authored
feat: support log events (#932)
* feat: support log event.name * preserve log record data in session processor * upgrade to swift-core 2.2.0 * remove event name * use default logger
1 parent 18545a6 commit a533cdd

File tree

6 files changed

+60
-18
lines changed

6 files changed

+60
-18
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ let package = Package(
2929
.executable(name: "StableMetricSample", targets: ["StableMetricSample"])
3030
],
3131
dependencies: [
32-
.package(url: "https://github.com/open-telemetry/opentelemetry-swift-core.git", from: "2.1.1"),
32+
.package(url: "https://github.com/open-telemetry/opentelemetry-swift-core.git", from: "2.2.0"),
3333
.package(url: "https://github.com/apple/swift-nio.git", from: "2.86.0"),
3434
.package(url: "https://github.com/grpc/grpc-swift.git", exact: "1.26.1"),
3535
.package(url: "https://github.com/apple/swift-protobuf.git", from: "1.30.0"),

Sources/Exporters/OpenTelemetryProtocolCommon/logs/LogRecordAdapter.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ public class LogRecordAdapter {
4646

4747
protoLogRecord.timeUnixNano = logRecord.timestamp.timeIntervalSince1970.toNanoseconds
4848

49+
if let eventName = logRecord.eventName {
50+
protoLogRecord.eventName = eventName
51+
}
52+
4953
if let body = logRecord.body {
5054
protoLogRecord.body = CommonAdapter.toProtoAnyValue(attributeValue: body)
5155
}

Sources/Instrumentation/Sessions/SessionLogRecordProcessor.swift

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class SessionLogRecordProcessor: LogRecordProcessor {
2222

2323
/// Called when a log record is emitted - adds session attributes and forwards to next processor
2424
public func onEmit(logRecord: ReadableLogRecord) {
25-
var newAttributes = logRecord.attributes
25+
var enhancedRecord = logRecord
2626

2727
// For session.start and session.end events, preserve existing session attributes
2828
if let body = logRecord.body,
@@ -33,23 +33,12 @@ public class SessionLogRecordProcessor: LogRecordProcessor {
3333
} else {
3434
// For other log records, add current session attributes
3535
let session = sessionManager.getSession()
36-
newAttributes[SessionConstants.id] = AttributeValue.string(session.id)
36+
enhancedRecord.setAttribute(key: SessionConstants.id, value: AttributeValue.string(session.id))
3737
if let previousId = session.previousId {
38-
newAttributes[SessionConstants.previousId] = AttributeValue.string(previousId)
38+
enhancedRecord.setAttribute(key: SessionConstants.previousId, value: AttributeValue.string(previousId))
3939
}
4040
}
4141

42-
let enhancedRecord = ReadableLogRecord(
43-
resource: logRecord.resource,
44-
instrumentationScopeInfo: logRecord.instrumentationScopeInfo,
45-
timestamp: logRecord.timestamp,
46-
observedTimestamp: logRecord.observedTimestamp,
47-
spanContext: logRecord.spanContext,
48-
severity: logRecord.severity,
49-
body: logRecord.body,
50-
attributes: newAttributes
51-
)
52-
5342
nextProcessor.onEmit(logRecord: enhancedRecord)
5443
}
5544

Tests/ExportersTests/OpenTelemetryProtocol/LogRecordAdapterTests.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ class LogRecordAdapterTests: XCTestCase {
4242
spanContext: spanContext,
4343
severity: .fatal,
4444
body: AttributeValue.string("Hello, world"),
45-
attributes: ["event.name": AttributeValue.string("name"), "event.domain": AttributeValue.string("domain")])
45+
attributes: ["event.name": AttributeValue.string("name"), "event.domain": AttributeValue.string("domain")],
46+
eventName: "session.start")
4647

4748
let protoLog = LogRecordAdapter.toProtoLogRecord(logRecord: logRecord)
4849

@@ -55,5 +56,6 @@ class LogRecordAdapterTests: XCTestCase {
5556
XCTAssertEqual(protoLog.traceID, Data(bytes: traceIdBytes, count: 16))
5657
XCTAssertEqual(protoLog.timeUnixNano, timestamp.timeIntervalSince1970.toNanoseconds)
5758
XCTAssertEqual(protoLog.attributes.count, 2)
59+
XCTAssertEqual(protoLog.eventName, "session.start")
5860
}
5961
}

Tests/InstrumentationTests/SessionTests/SessionLogRecordProcessorTests.swift

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,53 @@ final class SessionLogRecordProcessorTests: XCTestCase {
204204
}
205205
}
206206

207+
func testDataIsPreserved() {
208+
let logRecordWithEventName = ReadableLogRecord(
209+
resource: Resource(attributes: [:]),
210+
instrumentationScopeInfo: InstrumentationScopeInfo(),
211+
timestamp: Date(),
212+
observedTimestamp: Date(),
213+
spanContext: nil,
214+
severity: .info,
215+
body: AttributeValue.string("Test log message"),
216+
attributes: ["test.key": AttributeValue.string("test.value")],
217+
eventName: "user.login"
218+
)
219+
220+
mockSessionManager.sessionId = "test-session-123"
221+
logRecordProcessor.onEmit(logRecord: logRecordWithEventName)
222+
223+
XCTAssertEqual(mockNextProcessor.receivedLogRecords.count, 1)
224+
let enhancedRecord = mockNextProcessor.receivedLogRecords[0]
225+
226+
// Verify all fields are preserved
227+
XCTAssertEqual(enhancedRecord.eventName, "user.login", "EventName should be preserved")
228+
XCTAssertEqual(enhancedRecord.resource.attributes, logRecordWithEventName.resource.attributes)
229+
XCTAssertEqual(enhancedRecord.instrumentationScopeInfo.name, logRecordWithEventName.instrumentationScopeInfo.name)
230+
XCTAssertEqual(enhancedRecord.timestamp, logRecordWithEventName.timestamp)
231+
XCTAssertEqual(enhancedRecord.observedTimestamp, logRecordWithEventName.observedTimestamp)
232+
XCTAssertEqual(enhancedRecord.severity, logRecordWithEventName.severity)
233+
XCTAssertEqual(enhancedRecord.body?.description, logRecordWithEventName.body?.description)
234+
XCTAssertEqual(enhancedRecord.spanContext, logRecordWithEventName.spanContext)
235+
236+
// Verify session attributes were added
237+
if case let .string(sessionId) = enhancedRecord.attributes[SessionConstants.id] {
238+
XCTAssertEqual(sessionId, "test-session-123")
239+
} else {
240+
XCTFail("Expected session.id attribute to be added")
241+
}
242+
243+
// Verify original attributes preserved
244+
if case let .string(testValue) = enhancedRecord.attributes["test.key"] {
245+
XCTAssertEqual(testValue, "test.value")
246+
} else {
247+
XCTFail("Expected original attributes to be preserved")
248+
}
249+
250+
// Verify total attribute count (original + session attributes)
251+
XCTAssertEqual(enhancedRecord.attributes.count, 2, "Should have original attribute + session.id")
252+
}
253+
207254
func testConcurrentOnEmitThreadSafety() {
208255
let mockNextProcessor = MockLogRecordProcessor()
209256
let expectation = XCTestExpectation(description: "Concurrent processing")

0 commit comments

Comments
 (0)