@@ -21,7 +21,7 @@ public class MainActivity : Activity
2121 private string _friendlyName = null ! ; // set on OnCreate
2222 private IHost _host = null ! ; // set on OnCreate
2323 private IServiceProvider _serviceProvider = null ! ; // set on OnCreate
24- private ITransactionTracer _startupTransaction = null ! ; // set on OnCreate
24+ private SentryTraceHeader _parentTraceHeader = null ! ;
2525
2626 protected override void OnCreate ( Bundle ? savedInstanceState )
2727 {
@@ -35,10 +35,12 @@ protected override void OnCreate(Bundle? savedInstanceState)
3535 _serviceProvider = _host . Services ;
3636
3737 // It's set in Host.Init above
38- SentrySdk . ConfigureScope ( s => _startupTransaction = s . Transaction ! ) ;
38+ ITransactionTracer startupTransaction = null ! ;
39+ SentrySdk . ConfigureScope ( s => startupTransaction = s . Transaction ! ) ;
40+ _parentTraceHeader = startupTransaction . GetTraceHeader ( ) ;
3941 AddSentryContext ( ) ;
4042
41- var span = _startupTransaction . StartChild ( "OnCreate" ) ;
43+ var onCreateSpan = startupTransaction . StartChild ( "OnCreate" ) ;
4244 try
4345 {
4446 base . OnCreate ( savedInstanceState ) ;
@@ -71,10 +73,23 @@ protected override void OnCreate(Bundle? savedInstanceState)
7173 uploadButton . Click += OnUploadButtonOnClick ;
7274 cancelButton . Click += OnCancelButtonOnClick ;
7375
76+ onCreateSpan . Finish ( SpanStatus . Ok ) ;
77+ startupTransaction . Finish ( SpanStatus . Ok ) ;
78+ return ;
79+
80+ void OnCancelButtonOnClick ( object ? sender , EventArgs args )
81+ {
82+ SentrySdk . AddBreadcrumb ( "OnCancelButtonOnClick" , category : "ui.event" ) ;
83+ Unfocus ( ) ;
84+ source . Cancel ( ) ;
85+ }
86+
7487 async void OnUploadButtonOnClick ( object ? sender , EventArgs args )
7588 {
7689 // The scope tracks the overall app transaction while this is only batch uploading
77- var uploadTransaction = SentrySdk . StartTransaction ( "BatchUpload" , "batch.upload" , _startupTransaction . GetTraceHeader ( ) ) ;
90+ var uploadTransaction = SentrySdk . StartTransaction ( "BatchUpload" , "batch.upload" , _parentTraceHeader ) ;
91+ // startup transaction has completed at this point, this starts when the user pressed Upload so make this transaction global:
92+ SentrySdk . ConfigureScope ( s => s . Transaction = uploadTransaction ) ;
7893
7994 try
8095 {
@@ -89,32 +104,23 @@ async void OnUploadButtonOnClick(object? sender, EventArgs args)
89104 uploadButton . Enabled = false ;
90105 source = new CancellationTokenSource ( ) ;
91106
92- var uploadTask = uploader . StartUpload ( _friendlyName , source . Token ) ;
107+ var uploadTask = uploader . StartUpload ( _friendlyName , uploadTransaction , source . Token ) ;
93108 var updateUiTask = StartUiUpdater ( source . Token , metrics ) ;
94109
95- await UploadAsync ( uploadTask , updateUiTask , metrics , cancelButton , uploadButton , uploadTransaction , source ) ;
110+ // Successful completion (or timeout) of the transaction is handled internally.
111+ await AwaitOnUploadAndCancellationTasks ( uploadTask , updateUiTask , metrics , cancelButton , uploadButton , uploadTransaction , source ) ;
96112 }
97113 catch ( Exception e )
98114 {
99115 uploadTransaction . Finish ( e ) ;
100116 throw ;
101117 }
102118 }
103-
104- void OnCancelButtonOnClick ( object ? sender , EventArgs args )
105- {
106- SentrySdk . AddBreadcrumb ( "OnCancelButtonOnClick" , category : "ui.event" ) ;
107- Unfocus ( ) ;
108- source . Cancel ( ) ;
109- }
110-
111- span . Finish ( SpanStatus . Ok ) ;
112- _startupTransaction . Finish ( SpanStatus . Ok ) ;
113119 }
114120 catch ( Exception e )
115121 {
116- span . Finish ( e ) ;
117- _startupTransaction . Finish ( e ) ;
122+ onCreateSpan . Finish ( e ) ;
123+ startupTransaction . Finish ( e ) ;
118124 throw ;
119125 }
120126 }
@@ -128,13 +134,13 @@ private void Unfocus()
128134 }
129135 }
130136
131- private async Task UploadAsync (
137+ private async Task AwaitOnUploadAndCancellationTasks (
132138 Task uploadTask ,
133139 Task updateUiTask ,
134140 ClientMetrics metrics ,
135141 View cancelButton ,
136142 View uploadButton ,
137- ISpan span ,
143+ ISpan uploadTransaction ,
138144 CancellationTokenSource source )
139145 {
140146 var container = base . FindViewById ( Resource . Id . metrics_container ) ! ;
@@ -159,28 +165,28 @@ private async Task UploadAsync(
159165 ranForContainer . Visibility = ViewStates . Visible ;
160166
161167 ranForLabel . Text = metrics . RanFor . ToString ( ) ;
162- span . Finish ( SpanStatus . Ok ) ;
168+ uploadTransaction . Finish ( SpanStatus . Ok ) ;
163169 }
164170 else if ( uploadTask . IsFaulted )
165171 {
166172 await ShowError ( uploadTask . Exception ) ;
167- span . Finish ( SpanStatus . InternalError ) ;
173+ uploadTransaction . Finish ( SpanStatus . InternalError ) ;
168174 }
169175 else
170176 {
171177 cancelButton . Enabled = false ;
172178 uploadButton . Enabled = true ;
173- span . Finish ( SpanStatus . Cancelled ) ;
179+ uploadTransaction . Finish ( SpanStatus . Cancelled ) ;
174180 }
175181 }
176182 catch ( Exception e )
177183 {
178184 await ShowError ( e ) ;
179- span . Finish ( e ) ;
185+ uploadTransaction . Finish ( e ) ;
180186 }
181187 finally
182188 {
183- source . Cancel ( ) ;
189+ await source . CancelAsync ( ) ;
184190 }
185191 }
186192
@@ -278,8 +284,6 @@ private void AddSentryContext()
278284
279285 SentrySdk . ConfigureScope ( s =>
280286 {
281- s . Transaction = _startupTransaction ;
282-
283287 if ( uname is { } )
284288 {
285289 s . Contexts [ "uname" ] = new
0 commit comments