diff --git a/Sources/Sentry/SentryDiscardReasonMapper.m b/Sources/Sentry/SentryDiscardReasonMapper.m index a4e004ea49d..81b9b29bc13 100644 --- a/Sources/Sentry/SentryDiscardReasonMapper.m +++ b/Sources/Sentry/SentryDiscardReasonMapper.m @@ -7,6 +7,7 @@ NSString *const kSentryDiscardReasonNameQueueOverflow = @"queue_overflow"; NSString *const kSentryDiscardReasonNameCacheOverflow = @"cache_overflow"; NSString *const kSentryDiscardReasonNameRateLimitBackoff = @"ratelimit_backoff"; +NSString *const kSentryDiscardReasonNameInsufficientData = @"insufficient_data"; NSString *_Nonnull nameForSentryDiscardReason(SentryDiscardReason reason) { @@ -25,5 +26,7 @@ return kSentryDiscardReasonNameCacheOverflow; case kSentryDiscardReasonRateLimitBackoff: return kSentryDiscardReasonNameRateLimitBackoff; + case kSentryDiscardReasonInsufficientData: + return kSentryDiscardReasonNameInsufficientData; } } diff --git a/Sources/Sentry/SentryProfiler.mm b/Sources/Sentry/SentryProfiler.mm index ee8b146db1e..5590f0fcf9e 100644 --- a/Sources/Sentry/SentryProfiler.mm +++ b/Sources/Sentry/SentryProfiler.mm @@ -179,7 +179,8 @@ NSDictionary * serializedProfileData(NSDictionary *profileData, SentryTransaction *transaction, SentryId *profileID, NSString *truncationReason, NSString *environment, NSString *release, - NSDictionary *serializedMetrics, NSArray *debugMeta) + NSDictionary *serializedMetrics, NSArray *debugMeta, + SentryHub *hub) { NSMutableArray *const samples = profileData[@"profile"][@"samples"]; // We need at least two samples to be able to draw a stack frame for any given function: one @@ -187,6 +188,8 @@ // stack frame with 0 duration, which wouldn't make sense. if ([samples count] < 2) { SENTRY_LOG_DEBUG(@"Not enough samples in profile"); + [hub.getClient recordLostEvent:kSentryDataCategoryProfile + reason:kSentryDiscardReasonEventProcessor]; return nil; } @@ -194,6 +197,8 @@ const auto slicedSamples = slicedProfileSamples(samples, transaction); if (slicedSamples.count < 2) { SENTRY_LOG_DEBUG(@"Not enough samples in profile during the transaction"); + [hub.getClient recordLostEvent:kSentryDataCategoryProfile + reason:kSentryDiscardReasonEventProcessor]; return nil; } const auto payload = [NSMutableDictionary dictionary]; @@ -549,7 +554,8 @@ + (SentryEnvelopeItem *)createProfilingEnvelopeItemForTransaction:(SentryTransac ?: _gCurrentProfiler->_hub.getClient.options.environment, _gCurrentProfiler->_hub.getClient.options.releaseName, [_gCurrentProfiler->_metricProfiler serializeForTransaction:transaction], - [_gCurrentProfiler->_debugImageProvider getDebugImagesCrashed:NO]); + [_gCurrentProfiler->_debugImageProvider getDebugImagesCrashed:NO], + _gCurrentProfiler -> _hub); } + (void)timeoutAbort diff --git a/Sources/Sentry/include/SentryDiscardReason.h b/Sources/Sentry/include/SentryDiscardReason.h index 96e302ebe1a..d87e9acea3b 100644 --- a/Sources/Sentry/include/SentryDiscardReason.h +++ b/Sources/Sentry/include/SentryDiscardReason.h @@ -11,10 +11,11 @@ typedef NS_ENUM(NSUInteger, SentryDiscardReason) { kSentryDiscardReasonNetworkError = 3, kSentryDiscardReasonQueueOverflow = 4, kSentryDiscardReasonCacheOverflow = 5, - kSentryDiscardReasonRateLimitBackoff = 6 + kSentryDiscardReasonRateLimitBackoff = 6, + kSentryDiscardReasonInsufficientData = 7 }; static DEPRECATED_MSG_ATTRIBUTE( "Use nameForSentryDiscardReason() instead.") NSString *_Nonnull const SentryDiscardReasonNames[] = { @"before_send", @"event_processor", @"sample_rate", @"network_error", @"queue_overflow", - @"cache_overflow", @"ratelimit_backoff" }; + @"cache_overflow", @"ratelimit_backoff", @"insufficient_data" }; diff --git a/Sources/Sentry/include/SentryDiscardReasonMapper.h b/Sources/Sentry/include/SentryDiscardReasonMapper.h index 1171685e197..8937e13b3b8 100644 --- a/Sources/Sentry/include/SentryDiscardReasonMapper.h +++ b/Sources/Sentry/include/SentryDiscardReasonMapper.h @@ -10,6 +10,7 @@ FOUNDATION_EXPORT NSString *const kSentryDiscardReasonNameNetworkError; FOUNDATION_EXPORT NSString *const kSentryDiscardReasonNameQueueOverflow; FOUNDATION_EXPORT NSString *const kSentryDiscardReasonNameCacheOverflow; FOUNDATION_EXPORT NSString *const kSentryDiscardReasonNameRateLimitBackoff; +FOUNDATION_EXPORT NSString *const kSentryDiscardReasonNameInsufficientData; NSString *nameForSentryDiscardReason(SentryDiscardReason reason); diff --git a/Sources/Sentry/include/SentryProfiler+Test.h b/Sources/Sentry/include/SentryProfiler+Test.h index ee07199123e..e59001c84d5 100644 --- a/Sources/Sentry/include/SentryProfiler+Test.h +++ b/Sources/Sentry/include/SentryProfiler+Test.h @@ -15,7 +15,7 @@ NS_ASSUME_NONNULL_BEGIN NSDictionary *serializedProfileData(NSDictionary *profileData, SentryTransaction *transaction, SentryId *profileID, NSString *truncationReason, NSString *environment, NSString *release, NSDictionary *serializedMetrics, - NSArray *debugMeta); + NSArray *debugMeta, SentryHub *hub); NS_ASSUME_NONNULL_END diff --git a/Tests/SentryProfilerTests/SentryProfilerTests.mm b/Tests/SentryProfilerTests/SentryProfilerTests.mm index 2ab454a1e4c..ed8419e7aff 100644 --- a/Tests/SentryProfilerTests/SentryProfilerTests.mm +++ b/Tests/SentryProfilerTests/SentryProfilerTests.mm @@ -1,4 +1,5 @@ #import "SentryEvent+Private.h" +#import "SentryHub+TestInit.h" #import "SentryId.h" #import "SentryProfileTimeseries.h" #import "SentryProfiler+Test.h" @@ -216,7 +217,7 @@ - (void)testProfilerMutationDuringSerialization const auto profileID = [[SentryId alloc] init]; const auto serialization = serializedProfileData(profileData, transaction, profileID, profilerTruncationReasonName(SentryProfilerTruncationReasonNormal), @"test", @"someRelease", - @{}, @[]); + @{}, @[], [[SentryHub alloc] initWithClient:nil andScope:nil]); // cause the data structures to be modified again: add new addresses { diff --git a/Tests/SentryTests/Networking/SentryDiscardReasonMapperTests.swift b/Tests/SentryTests/Networking/SentryDiscardReasonMapperTests.swift index 6b6a10a48c8..b6313abe674 100644 --- a/Tests/SentryTests/Networking/SentryDiscardReasonMapperTests.swift +++ b/Tests/SentryTests/Networking/SentryDiscardReasonMapperTests.swift @@ -10,5 +10,6 @@ class SentryDiscardReasonMapperTests: XCTestCase { XCTAssertEqual(kSentryDiscardReasonNameQueueOverflow, nameForSentryDiscardReason(.queueOverflow)) XCTAssertEqual(kSentryDiscardReasonNameCacheOverflow, nameForSentryDiscardReason(.cacheOverflow)) XCTAssertEqual(kSentryDiscardReasonNameRateLimitBackoff, nameForSentryDiscardReason(.rateLimitBackoff)) + XCTAssertEqual(kSentryDiscardReasonNameInsufficientData, nameForSentryDiscardReason(.insufficientData)) } } diff --git a/Tests/SentryTests/State/SentryHub+TestInit.h b/Tests/SentryTests/State/SentryHub+TestInit.h index 302f048b28c..f6c3a904b16 100644 --- a/Tests/SentryTests/State/SentryHub+TestInit.h +++ b/Tests/SentryTests/State/SentryHub+TestInit.h @@ -1,5 +1,9 @@ #import +@class SentryClient; +@class SentryCrashWrapper; +@protocol SentryCurrentDateProvider; + NS_ASSUME_NONNULL_BEGIN /** Expose the internal test init for testing. */