Skip to content

Commit 121d6d3

Browse files
Merge afaa316 into 5f8ee7a
2 parents 5f8ee7a + afaa316 commit 121d6d3

File tree

11 files changed

+88
-14
lines changed

11 files changed

+88
-14
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
- Stop sending empty thread names (#3361)
1212
- Work around edge case with a thread info kernel call sometimes returning invalid data, leading to a crash (#3364)
13+
- Crash when initializing SentryHub manually (#3374)
1314

1415
## 8.14.2
1516

Sentry.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
622C08DB29E554B9002571D4 /* SentrySpanContext+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 622C08D929E554B9002571D4 /* SentrySpanContext+Private.h */; };
8080
623C45B02A651D8200D9E88B /* SentryCoreDataTracker+Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 623C45AF2A651D8200D9E88B /* SentryCoreDataTracker+Test.m */; };
8181
627E7589299F6FE40085504D /* SentryInternalDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E7588299F6FE40085504D /* SentryInternalDefines.h */; };
82+
62831DB62AF4E2E500B6B854 /* SentryPropagationContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62831DB52AF4E2E500B6B854 /* SentryPropagationContextTests.swift */; };
8283
62885DA729E946B100554F38 /* TestConncurrentModifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62885DA629E946B100554F38 /* TestConncurrentModifications.swift */; };
8384
62950F1029E7FE0100A42624 /* SentryTransactionContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62950F0F29E7FE0100A42624 /* SentryTransactionContextTests.swift */; };
8485
629690532AD3E060000185FA /* SentryReachabilitySwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 629690522AD3E060000185FA /* SentryReachabilitySwiftTests.swift */; };
@@ -959,6 +960,7 @@
959960
623C45AE2A651C4500D9E88B /* SentryCoreDataTracker+Test.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SentryCoreDataTracker+Test.h"; sourceTree = "<group>"; };
960961
623C45AF2A651D8200D9E88B /* SentryCoreDataTracker+Test.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SentryCoreDataTracker+Test.m"; sourceTree = "<group>"; };
961962
627E7588299F6FE40085504D /* SentryInternalDefines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SentryInternalDefines.h; path = include/SentryInternalDefines.h; sourceTree = "<group>"; };
963+
62831DB52AF4E2E500B6B854 /* SentryPropagationContextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryPropagationContextTests.swift; sourceTree = "<group>"; };
962964
62885DA629E946B100554F38 /* TestConncurrentModifications.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestConncurrentModifications.swift; sourceTree = "<group>"; };
963965
62950F0F29E7FE0100A42624 /* SentryTransactionContextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryTransactionContextTests.swift; sourceTree = "<group>"; };
964966
629690522AD3E060000185FA /* SentryReachabilitySwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryReachabilitySwiftTests.swift; sourceTree = "<group>"; };
@@ -2698,6 +2700,7 @@
26982700
children = (
26992701
7B944FAD2469B43700A10721 /* TestHub.swift */,
27002702
7B7A30C924B48523005A4C6E /* SentryHub+Test.h */,
2703+
62831DB52AF4E2E500B6B854 /* SentryPropagationContextTests.swift */,
27012704
);
27022705
path = State;
27032706
sourceTree = "<group>";
@@ -4436,6 +4439,7 @@
44364439
63FE721320DA66EC00CDBAE8 /* SentryCrashMonitor_Signal_Tests.m in Sources */,
44374440
7BBD18B32451805500427C76 /* SentryRateLimitsParserTests.swift in Sources */,
44384441
7B82722B27A3220A00F4BFF4 /* SentryFileIoTrackingUnitTests.swift in Sources */,
4442+
62831DB62AF4E2E500B6B854 /* SentryPropagationContextTests.swift in Sources */,
44394443
7BF9EF7A2722B58900B5BBEF /* SentrySubClassFinderTests.swift in Sources */,
44404444
7B59398224AB47650003AAD2 /* SentrySessionTrackerTests.swift in Sources */,
44414445
7B05A61824A4D14A00EF211D /* SentrySessionGeneratorTests.swift in Sources */,

Sources/Sentry/SentryClient.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,8 @@ - (nullable SentryTraceContext *)getTraceStateWithEvent:(SentryEvent *)event
371371
}
372372

373373
if (event.error || event.exceptions.count > 0) {
374-
return scope.propagationContext.traceContext;
374+
return [scope.propagationContext getTraceContext:self.options
375+
userSegment:scope.userObject.segment];
375376
}
376377

377378
return nil;

Sources/Sentry/SentryNetworkTracker.m

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#import "SentryTraceHeader.h"
2424
#import "SentryTraceOrigins.h"
2525
#import "SentryTracer.h"
26+
#import "SentryUser.h"
2627
#import <objc/runtime.h>
2728
@import SentryPrivate;
2829

@@ -216,7 +217,10 @@ - (void)urlSessionTaskResume:(NSURLSessionTask *)sessionTask
216217
- (void)addTraceWithoutTransactionToTask:(NSURLSessionTask *)sessionTask
217218
{
218219
SentryPropagationContext *propagationContext = SentrySDK.currentHub.scope.propagationContext;
219-
[self addBaggageHeader:[[propagationContext traceContext] toBaggage]
220+
SentryTraceContext *traceContext =
221+
[propagationContext getTraceContext:SentrySDK.currentHub.client.options
222+
userSegment:SentrySDK.currentHub.scope.userObject.segment];
223+
[self addBaggageHeader:[traceContext toBaggage]
220224
traceHeader:[propagationContext traceHeader]
221225
toRequest:sessionTask];
222226
}
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
#import <Foundation/Foundation.h>
22

3-
@class SentryId, SentrySpanId, SentryTraceContext, SentryTraceHeader;
3+
@class SentryId, SentrySpanId, SentryTraceContext, SentryTraceHeader, SentryOptions, SentryScope;
44

55
NS_ASSUME_NONNULL_BEGIN
66

77
@interface SentryPropagationContext : NSObject
88

99
@property (nonatomic, strong) SentryId *traceId;
1010
@property (nonatomic, strong) SentrySpanId *spanId;
11-
@property (nonatomic, readonly, nullable) SentryTraceContext *traceContext;
12-
1311
@property (nonatomic, readonly) SentryTraceHeader *traceHeader;
1412

1513
- (NSDictionary<NSString *, NSString *> *)traceContextForEvent;
1614

15+
/**
16+
* We need to pass in the options and the user segment instead of retrieving them from the static
17+
* API cause, for example, the SentryClient can have multiple instances with different options and
18+
* scopes running and in that scenario we need can't retrieve these values from the static API.
19+
*
20+
* @param options The current active options.
21+
* @param userSegment You can retrieve this usually from the `scope.userObject.segment`.
22+
*/
23+
- (SentryTraceContext *)getTraceContext:(SentryOptions *)options
24+
userSegment:(nullable NSString *)userSegment
25+
NS_SWIFT_NAME(getTraceContext(options:userSegment:));
26+
1727
@end
1828

1929
NS_ASSUME_NONNULL_END

Sources/Sentry/SentryPropagationContext.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ - (SentryTraceHeader *)traceHeader
2828
sampled:kSentrySampleDecisionNo];
2929
}
3030

31-
- (SentryTraceContext *)traceContext
31+
- (SentryTraceContext *)getTraceContext:(SentryOptions *)options
32+
userSegment:(nullable NSString *)userSegment
3233
{
33-
SentryOptions *options = SentrySDK.options;
34-
SentryScope *scope = SentrySDK.currentHub.scope;
34+
3535
return [[SentryTraceContext alloc] initWithTraceId:self.traceId
3636
publicKey:options.parsedDsn.url.user
3737
releaseName:options.releaseName
3838
environment:options.environment
3939
transaction:nil
40-
userSegment:scope.userObject.segment
40+
userSegment:userSegment
4141
sampleRate:nil
4242
sampled:nil];
4343
}

Tests/SentryTests/Integrations/Performance/Network/SentryNetworkTrackerTests.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,8 @@ class SentryNetworkTrackerTests: XCTestCase {
590590
sut.urlSessionTaskResume(task)
591591

592592
let expectedTraceHeader = SentrySDK.currentHub().scope.propagationContext.traceHeader.value()
593-
let expectedBaggageHeader = SentrySDK.currentHub().scope.propagationContext.traceContext?.toBaggage().toHTTPHeader()
593+
let traceContext = SentrySDK.currentHub().scope.propagationContext.getTraceContext(options: self.fixture.options, userSegment: self.fixture.scope.userObject?.segment)
594+
let expectedBaggageHeader = traceContext.toBaggage().toHTTPHeader()
594595
XCTAssertEqual(task.currentRequest?.allHTTPHeaderFields?["baggage"] ?? "", expectedBaggageHeader)
595596
XCTAssertEqual(task.currentRequest?.allHTTPHeaderFields?["sentry-trace"] ?? "", expectedTraceHeader)
596597
}
@@ -601,7 +602,8 @@ class SentryNetworkTrackerTests: XCTestCase {
601602
sut.urlSessionTaskResume(task)
602603

603604
let expectedTraceHeader = SentrySDK.currentHub().scope.propagationContext.traceHeader.value()
604-
let expectedBaggageHeader = SentrySDK.currentHub().scope.propagationContext.traceContext?.toBaggage().toHTTPHeader()
605+
let traceContext = SentrySDK.currentHub().scope.propagationContext.getTraceContext(options: self.fixture.options, userSegment: self.fixture.scope.userObject?.segment)
606+
let expectedBaggageHeader = traceContext.toBaggage().toHTTPHeader()
605607
XCTAssertEqual(task.currentRequest?.allHTTPHeaderFields?["baggage"] ?? "", expectedBaggageHeader)
606608
XCTAssertEqual(task.currentRequest?.allHTTPHeaderFields?["sentry-trace"] ?? "", expectedTraceHeader)
607609
}

Tests/SentryTests/SentryClientTests.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,8 +555,9 @@ class SentryClientTest: XCTestCase {
555555
try assertValidErrorEvent(eventWithSessionArguments.event, error)
556556
XCTAssertEqual(fixture.session, eventWithSessionArguments.session)
557557

558-
XCTAssertEqual(eventWithSessionArguments.traceContext?.traceId,
559-
scope.propagationContext.traceContext?.traceId)
558+
let expectedTraceContext = scope.propagationContext.getTraceContext(options: Options(), userSegment: "segment")
559+
XCTAssertEqual(eventWithSessionArguments.traceContext?.traceId,
560+
expectedTraceContext.traceId)
560561
}
561562
}
562563

Tests/SentryTests/SentryHubTests.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,17 @@ class SentryHubTests: XCTestCase {
8080
fixture.fileManager.deleteAllEnvelopes()
8181
}
8282

83+
func testCaptureErrorWithRealDSN() {
84+
let sentryOption = Options()
85+
sentryOption.dsn = "https://[email protected]/5428557"
86+
87+
let scope = Scope()
88+
let sentryHub = SentryHub(client: SentryClient(options: sentryOption), andScope: scope)
89+
90+
let error = NSError(domain: "Test.CaptureErrorWithRealDSN", code: 12)
91+
sentryHub.capture(error: error)
92+
}
93+
8394
func testBeforeBreadcrumbWithoutCallbackStoresBreadcrumb() {
8495
let hub = fixture.getSut()
8596

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import SentryTestUtils
2+
import XCTest
3+
4+
final class SentryPropagationContextTests: XCTestCase {
5+
6+
func testGetTraceContextWithOptionsAndSegment() throws {
7+
let options = Options()
8+
options.dsn = TestConstants.realDSN
9+
10+
let sut = SentryPropagationContext()
11+
let traceContext = try XCTUnwrap(sut.getTraceContext(options: options, userSegment: "segment"))
12+
13+
XCTAssertEqual(options.parsedDsn?.url.user, traceContext.publicKey)
14+
XCTAssertEqual(sut.traceId, traceContext.traceId)
15+
XCTAssertEqual(options.releaseName, traceContext.releaseName)
16+
XCTAssertEqual(options.environment, traceContext.environment)
17+
XCTAssertNil(traceContext.transaction)
18+
XCTAssertEqual("segment", traceContext.userSegment)
19+
XCTAssertNil(traceContext.sampleRate)
20+
XCTAssertNil(traceContext.sampled)
21+
}
22+
23+
func testGetTraceContextWithOptionsOnly() throws {
24+
let options = Options()
25+
options.dsn = TestConstants.realDSN
26+
27+
let sut = SentryPropagationContext()
28+
let traceContext = try XCTUnwrap(sut.getTraceContext(options: options, userSegment: nil))
29+
30+
XCTAssertEqual(options.parsedDsn?.url.user, traceContext.publicKey)
31+
XCTAssertEqual(sut.traceId, traceContext.traceId)
32+
XCTAssertEqual(options.releaseName, traceContext.releaseName)
33+
XCTAssertEqual(options.environment, traceContext.environment)
34+
XCTAssertNil(traceContext.transaction)
35+
XCTAssertNil(traceContext.userSegment)
36+
XCTAssertNil(traceContext.sampleRate)
37+
XCTAssertNil(traceContext.sampled)
38+
}
39+
40+
}

0 commit comments

Comments
 (0)