Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ class BugsnagPerformanceImpl: public PhasedStartup {
uint64_t maxPackageContentLength_{1000000};
std::atomic<bool> isStarted_{false};
bool hasCheckedAppStartDuration_{false};
bool isDebugMode_{false};

// Tasks
NSArray<Task> *buildInitialTasks() noexcept;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

static constexpr double SAMPLER_INTERVAL_SECONDS = 1.0;
static constexpr double SAMPLER_HISTORY_SECONDS = 10 * 60;
static constexpr NSTimeInterval WORK_INTERVAL_DEBUG_MODE_SECONDS = 5;

// App start spans will be thrown out if the early app start duration exceeds this.
static constexpr CFTimeInterval maxAppStartDuration = 2.0;
Expand Down Expand Up @@ -115,6 +116,9 @@
appStateTracker_.onTransitionToForeground = ^{
blockThis->onAppEnteredForeground();
};

// Check if app is built in debug mode
isDebugMode_ = config.isDebugMode;
}

void BugsnagPerformanceImpl::earlySetup() noexcept {
Expand All @@ -138,7 +142,7 @@

void BugsnagPerformanceImpl::configure(BugsnagPerformanceConfiguration *config) noexcept {
BSGLogDebug(@"BugsnagPerformanceImpl::configure()");
performWorkInterval_ = config.internal.performWorkInterval;
performWorkInterval_ = (isDebugMode_ == YES || config.debugMode == YES) ? WORK_INTERVAL_DEBUG_MODE_SECONDS : config.internal.performWorkInterval;
probabilityValueExpiresAfterSeconds_ = config.internal.probabilityValueExpiresAfterSeconds;
probabilityRequestsPauseForSeconds_ = config.internal.probabilityRequestsPauseForSeconds;
maxPackageContentLength_ = config.internal.maxPackageContentLength;
Expand Down
1 change: 1 addition & 0 deletions Sources/BugsnagPerformance/Private/EarlyConfiguration.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN

@property(nonatomic, readonly) BOOL enableSwizzling;
@property(nonatomic, readonly) BOOL swizzleViewLoadPreMain;
@property(nonatomic, readonly) BOOL isDebugMode;

@end

Expand Down
3 changes: 3 additions & 0 deletions Sources/BugsnagPerformance/Private/EarlyConfiguration.mm
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ - (instancetype) initWithBundleDictionary:(NSDictionary *)dict {
}
id swizzleViewLoadPreMain = [dict valueForKeyPath:@"bugsnag.performance.swizzleViewLoadPreMain"];
_swizzleViewLoadPreMain = swizzleViewLoadPreMain != nil && [swizzleViewLoadPreMain boolValue];

id debugMode = [dict valueForKeyPath:@"bugsnag.performance.debugMode"];
_isDebugMode = debugMode != nil && [debugMode boolValue];
}

return self;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ - (instancetype)initWithApiKey:(NSString *)apiKey {
_autoInstrumentAppStarts = YES;
_autoInstrumentViewControllers = YES;
_autoInstrumentNetworkRequests = YES;
_debugMode = NO;
_enabledMetrics = [BugsnagPerformanceEnabledMetrics new];
_onSpanStartCallbacks = [NSMutableArray array];
_onSpanEndCallbacks = [NSMutableArray array];
Expand Down Expand Up @@ -174,6 +175,7 @@ + (instancetype)loadConfigWithInfoDictionary:(NSDictionary * _Nullable)infoDicti
auto autoInstrumentAppStarts = BSGDynamicCast<NSNumber>(bugsnagPerformanceConfiguration[@"autoInstrumentAppStarts"]);
auto autoInstrumentViewControllers = BSGDynamicCast<NSNumber>(bugsnagPerformanceConfiguration[@"autoInstrumentViewControllers"]);
auto autoInstrumentNetworkRequests = BSGDynamicCast<NSNumber>(bugsnagPerformanceConfiguration[@"autoInstrumentNetworkRequests"]);
auto debugMode = BSGDynamicCast<NSNumber>(bugsnagPerformanceConfiguration[@"debugMode"]);
auto autoInstrumentRendering = BSGDynamicCast<NSNumber>(bugsnagPerformanceConfiguration[@"autoInstrumentRendering"]);
auto samplingProbability = BSGDynamicCast<NSNumber>(bugsnagPerformanceConfiguration[@"samplingProbability"]);
auto attributeArrayLengthLimit = BSGDynamicCast<NSNumber>(bugsnagPerformanceConfiguration[@"attributeArrayLengthLimit"]);
Expand Down Expand Up @@ -218,6 +220,9 @@ + (instancetype)loadConfigWithInfoDictionary:(NSDictionary * _Nullable)infoDicti
if (autoInstrumentRendering != nil) {
configuration.enabledMetrics.rendering = [autoInstrumentRendering boolValue];
}
if (debugMode != nil) {
configuration.debugMode = [debugMode boolValue];
}
if (samplingProbability != nil) {
configuration.samplingProbability = samplingProbability;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ OBJC_EXPORT

@property (nonatomic) BOOL autoInstrumentRendering DEPRECATED_ATTRIBUTE;

@property (nonatomic) BOOL debugMode;

@property(nonatomic,strong) BugsnagPerformanceEnabledMetrics *enabledMetrics;

/**
Expand Down
8 changes: 8 additions & 0 deletions features/default/sampling.feature
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,11 @@ Feature: Sampling
* a span field "name" equals "Pre-start"
* a span field "name" equals "Post-start"
* a span double attribute "bugsnag.sampling.p" equals 1.0

Scenario: Spans are sent regardless of batch being full if in debug mode
Given I run "DebugModeScenario"
And I wait to receive between 29 and 30 spans
* a span field "name" equals "DebugModeScenario-29"
And I wait for 5 seconds
And I wait to receive between 59 and 60 spans
* a span field "name" equals "DebugModeScenario-59"
4 changes: 4 additions & 0 deletions features/fixtures/ios/Fixture.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
09F3F5302D6F17B300BAA0A3 /* RenderingMetricsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F3F52F2D6F17B300BAA0A3 /* RenderingMetricsScenario.swift */; };
1C377BA02E78BDFE002148B2 /* StartupConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C377B9F2E78BDF8002148B2 /* StartupConfiguration.swift */; };
1C7852A62E5FA7DF00BB8E2D /* ManualSpanWithContextParentNilScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7852A52E5FA7C700BB8E2D /* ManualSpanWithContextParentNilScenario.swift */; };
1C8CB8C12EC3C975007BF492 /* DebugModeScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C8CB8C02EC3C970007BF492 /* DebugModeScenario.swift */; };
1CC791752E67838A0015FFBA /* AppStartTypeScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC791742E6783850015FFBA /* AppStartTypeScenario.swift */; };
1CFB95492EA798DC00025C16 /* AppStartTypeLateScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CFB95482EA798D600025C16 /* AppStartTypeLateScenario.swift */; };
960EECE92B2316E1009FAA11 /* AutoInstrumentGenericViewLoadScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 960EECE82B2316E1009FAA11 /* AutoInstrumentGenericViewLoadScenario.swift */; };
Expand Down Expand Up @@ -178,6 +179,7 @@
09F3F52F2D6F17B300BAA0A3 /* RenderingMetricsScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenderingMetricsScenario.swift; sourceTree = "<group>"; };
1C377B9F2E78BDF8002148B2 /* StartupConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartupConfiguration.swift; sourceTree = "<group>"; };
1C7852A52E5FA7C700BB8E2D /* ManualSpanWithContextParentNilScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualSpanWithContextParentNilScenario.swift; sourceTree = "<group>"; };
1C8CB8C02EC3C970007BF492 /* DebugModeScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugModeScenario.swift; sourceTree = "<group>"; };
1CC791742E6783850015FFBA /* AppStartTypeScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStartTypeScenario.swift; sourceTree = "<group>"; };
1CFB95482EA798D600025C16 /* AppStartTypeLateScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStartTypeLateScenario.swift; sourceTree = "<group>"; };
960EECE82B2316E1009FAA11 /* AutoInstrumentGenericViewLoadScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoInstrumentGenericViewLoadScenario.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -319,6 +321,7 @@
01FE4DC128E1AF0700D1F239 /* Scenarios */ = {
isa = PBXGroup;
children = (
1C8CB8C02EC3C970007BF492 /* DebugModeScenario.swift */,
96D528CB2C72B14300FEA2E2 /* AppDataOverrideScenario.swift */,
1CFB95482EA798D600025C16 /* AppStartTypeLateScenario.swift */,
1CC791742E6783850015FFBA /* AppStartTypeScenario.swift */,
Expand Down Expand Up @@ -550,6 +553,7 @@
09F3F5282D6C728300BAA0A3 /* MemoryMetricsScenario.swift in Sources */,
966634DE2C9DE2E0004A934D /* FrameMetricsFronzenFramesScenario.swift in Sources */,
09E9BDAF2C80907B00DC7C8E /* ModifyEarlySpansScenario.swift in Sources */,
1C8CB8C12EC3C975007BF492 /* DebugModeScenario.swift in Sources */,
099331FC2C11F6CF009EC92F /* AutoInstrumentAVAssetScenario.swift in Sources */,
962CE7FF2E64FF2300380522 /* LoadingIndicatorViewNestedViewStopScenario.swift in Sources */,
097FFC0B2C33D931000E03E8 /* AutoInstrumentNullNetworkCallbackScenario.swift in Sources */,
Expand Down
2 changes: 2 additions & 0 deletions features/fixtures/ios/Fixture/Info.template.plist
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
<false/>
<key>autoInstrumentAppStarts</key>
<true/>
<key>debugMode</key>
<false/>
</dict>
<key>enabledReleaseStages</key>
<array>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
1C3E2DB22EAA5F4900B32AD2 /* AppStartTypeScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C3E2DAE2EAA5F4900B32AD2 /* AppStartTypeScenario.swift */; };
1C3E2DB32EAA5F4900B32AD2 /* ManualSpanWithRemoteContextParentScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C3E2DB02EAA5F4900B32AD2 /* ManualSpanWithRemoteContextParentScenario.swift */; };
1C3E2DB42EAA5F4900B32AD2 /* AutoInstrumentGenericViewLoadScenario2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C3E2DAF2EAA5F4900B32AD2 /* AutoInstrumentGenericViewLoadScenario2.swift */; };
1C8CB8C32EC3D0D2007BF492 /* DebugModeScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C8CB8C22EC3D0D2007BF492 /* DebugModeScenario.swift */; };
1CA34CAB2E81A09F00512E2F /* StartupConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CA34CAA2E81A09F00512E2F /* StartupConfiguration.swift */; };
55A1B7CB2CBFF140009D68A7 /* BugsnagPerformance.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55A1B7C92CBFF140009D68A7 /* BugsnagPerformance.xcframework */; };
55A1B7CC2CBFF140009D68A7 /* BugsnagPerformance.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 55A1B7C92CBFF140009D68A7 /* BugsnagPerformance.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
Expand Down Expand Up @@ -196,6 +197,7 @@
1C3E2DAE2EAA5F4900B32AD2 /* AppStartTypeScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStartTypeScenario.swift; sourceTree = "<group>"; };
1C3E2DAF2EAA5F4900B32AD2 /* AutoInstrumentGenericViewLoadScenario2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoInstrumentGenericViewLoadScenario2.swift; sourceTree = "<group>"; };
1C3E2DB02EAA5F4900B32AD2 /* ManualSpanWithRemoteContextParentScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualSpanWithRemoteContextParentScenario.swift; sourceTree = "<group>"; };
1C8CB8C22EC3D0D2007BF492 /* DebugModeScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugModeScenario.swift; sourceTree = "<group>"; };
1CA34CAA2E81A09F00512E2F /* StartupConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartupConfiguration.swift; sourceTree = "<group>"; };
55A1B7C92CBFF140009D68A7 /* BugsnagPerformance.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BugsnagPerformance.xcframework; path = ../../../BugsnagPerformance.xcframework; sourceTree = "<group>"; };
55A1B7CA2CBFF140009D68A7 /* BugsnagPerformanceSwift.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BugsnagPerformanceSwift.xcframework; path = ../../../BugsnagPerformanceSwift.xcframework; sourceTree = "<group>"; };
Expand Down Expand Up @@ -342,6 +344,7 @@
01FE4DC128E1AF0700D1F239 /* Scenarios */ = {
isa = PBXGroup;
children = (
1C8CB8C22EC3D0D2007BF492 /* DebugModeScenario.swift */,
96D528CB2C72B14300FEA2E2 /* AppDataOverrideScenario.swift */,
1C3E2DAD2EAA5F4900B32AD2 /* AppStartTypeLateScenario.swift */,
1C3E2DAE2EAA5F4900B32AD2 /* AppStartTypeScenario.swift */,
Expand Down Expand Up @@ -625,6 +628,7 @@
098C3B502C53CEC0006F9886 /* ErrorGenerator.m in Sources */,
0921F02E2A69262300C764EB /* AutoInstrumentNetworkCallbackScenario.swift in Sources */,
01E7918A28EC7B5E00855993 /* ManualSpanBeforeStartScenario.swift in Sources */,
1C8CB8C32EC3D0D2007BF492 /* DebugModeScenario.swift in Sources */,
962CE8012E64FF6100380522 /* LoadingIndicatorViewNestedViewStopScenario.swift in Sources */,
09DC622A2C6DE242000AA8E1 /* EarlySpanOnEndScenario.swift in Sources */,
969EE0E72E784E7A00600F63 /* ConditionsBasicScenario.swift in Sources */,
Expand Down
32 changes: 32 additions & 0 deletions features/fixtures/ios/Scenarios/DebugModeScenario.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// DebugModeScenario.swift
// Fixture
//
// Created by Daria Bialobrzeska on 11/11/2025.
//

import Bugsnag
import BugsnagPerformance

@objcMembers
class DebugModeScenario: Scenario {

override func setInitialBugsnagConfiguration() {
super.setInitialBugsnagConfiguration()
bugsnagPerfConfig.debugMode = true
}

override func run() {
for i in 0..<30 {
var spanName = "DebugModeScenario-\(i)"
let span = BugsnagPerformance.startSpan(name: spanName)
span.end()
}
sleep(5)
for i in 30..<60 {
var spanName = "DebugModeScenario-\(i)"
let span = BugsnagPerformance.startSpan(name: spanName)
span.end()
}
}
}