@@ -112,7 +112,9 @@ impl TransactionContext {
112
112
)
113
113
}
114
114
TransactionOrSpan :: Span ( span) => {
115
- ( span. span . trace_id , span. span . span_id , Some ( span. sampled ) )
115
+ let sampled = span. sampled ;
116
+ let span = span. span . lock ( ) . unwrap ( ) ;
117
+ ( span. trace_id , span. span_id , Some ( sampled) )
116
118
}
117
119
} ;
118
120
@@ -158,6 +160,14 @@ impl From<Span> for TransactionOrSpan {
158
160
}
159
161
160
162
impl TransactionOrSpan {
163
+ /// Set some extra information to be sent with this Transaction/Span.
164
+ pub fn set_data ( & self , key : & str , value : protocol:: Value ) {
165
+ match self {
166
+ TransactionOrSpan :: Transaction ( transaction) => transaction. set_data ( key, value) ,
167
+ TransactionOrSpan :: Span ( span) => span. set_data ( key, value) ,
168
+ }
169
+ }
170
+
161
171
/// Returns the headers needed for distributed tracing.
162
172
pub fn iter_headers ( & self ) -> TraceHeadersIter {
163
173
match self {
@@ -187,11 +197,14 @@ impl TransactionOrSpan {
187
197
TransactionOrSpan :: Transaction ( transaction) => {
188
198
transaction. inner . lock ( ) . unwrap ( ) . context . clone ( )
189
199
}
190
- TransactionOrSpan :: Span ( span) => protocol:: TraceContext {
191
- span_id : span. span . span_id ,
192
- trace_id : span. span . trace_id ,
193
- ..Default :: default ( )
194
- } ,
200
+ TransactionOrSpan :: Span ( span) => {
201
+ let span = span. span . lock ( ) . unwrap ( ) ;
202
+ protocol:: TraceContext {
203
+ span_id : span. span_id ,
204
+ trace_id : span. trace_id ,
205
+ ..Default :: default ( )
206
+ }
207
+ }
195
208
} ;
196
209
event. contexts . insert ( "trace" . into ( ) , context. into ( ) ) ;
197
210
}
@@ -266,6 +279,14 @@ impl Transaction {
266
279
}
267
280
}
268
281
282
+ /// Set some extra information to be sent with this Transaction.
283
+ pub fn set_data ( & self , key : & str , value : protocol:: Value ) {
284
+ let mut inner = self . inner . lock ( ) . unwrap ( ) ;
285
+ if let Some ( transaction) = inner. transaction . as_mut ( ) {
286
+ transaction. data . insert ( key. into ( ) , value) ;
287
+ }
288
+ }
289
+
269
290
/// Returns the headers needed for distributed tracing.
270
291
pub fn iter_headers ( & self ) -> TraceHeadersIter {
271
292
let inner = self . inner . lock ( ) . unwrap ( ) ;
@@ -326,7 +347,7 @@ impl Transaction {
326
347
Span {
327
348
transaction : Arc :: clone ( & self . inner ) ,
328
349
sampled : inner. sampled ,
329
- span,
350
+ span : Arc :: new ( Mutex :: new ( span ) ) ,
330
351
}
331
352
}
332
353
}
@@ -339,13 +360,22 @@ impl Transaction {
339
360
pub struct Span {
340
361
transaction : TransactionArc ,
341
362
sampled : bool ,
342
- span : protocol :: Span ,
363
+ span : SpanArc ,
343
364
}
344
365
366
+ type SpanArc = Arc < Mutex < protocol:: Span > > ;
367
+
345
368
impl Span {
369
+ /// Set some extra information to be sent with this Transaction.
370
+ pub fn set_data ( & self , key : & str , value : protocol:: Value ) {
371
+ let mut span = self . span . lock ( ) . unwrap ( ) ;
372
+ span. data . insert ( key. into ( ) , value) ;
373
+ }
374
+
346
375
/// Returns the headers needed for distributed tracing.
347
376
pub fn iter_headers ( & self ) -> TraceHeadersIter {
348
- let trace = SentryTrace ( self . span . trace_id , self . span . span_id , Some ( self . sampled ) ) ;
377
+ let span = self . span . lock ( ) . unwrap ( ) ;
378
+ let trace = SentryTrace ( span. trace_id , span. span_id , Some ( self . sampled ) ) ;
349
379
TraceHeadersIter {
350
380
sentry_trace : Some ( trace. to_string ( ) ) ,
351
381
}
@@ -355,12 +385,17 @@ impl Span {
355
385
///
356
386
/// This will record the end timestamp and add the span to the transaction
357
387
/// in which it was started.
358
- pub fn finish ( mut self ) {
359
- self . span . finish ( ) ;
388
+ pub fn finish ( self ) {
389
+ let mut span = self . span . lock ( ) . unwrap ( ) ;
390
+ if span. timestamp . is_some ( ) {
391
+ // the span was already finished
392
+ return ;
393
+ }
394
+ span. finish ( ) ;
360
395
let mut inner = self . transaction . lock ( ) . unwrap ( ) ;
361
396
if let Some ( transaction) = inner. transaction . as_mut ( ) {
362
397
if transaction. spans . len ( ) <= MAX_SPANS {
363
- transaction. spans . push ( self . span ) ;
398
+ transaction. spans . push ( span. clone ( ) ) ;
364
399
}
365
400
}
366
401
}
@@ -370,9 +405,10 @@ impl Span {
370
405
/// The span must be explicitly finished via [`Span::finish`].
371
406
#[ must_use = "a span must be explicitly closed via `finish()`" ]
372
407
pub fn start_child ( & self , op : & str , description : & str ) -> Span {
408
+ let span = self . span . lock ( ) . unwrap ( ) ;
373
409
let span = protocol:: Span {
374
- trace_id : self . span . trace_id ,
375
- parent_span_id : Some ( self . span . span_id ) ,
410
+ trace_id : span. trace_id ,
411
+ parent_span_id : Some ( span. span_id ) ,
376
412
op : Some ( op. into ( ) ) ,
377
413
description : if description. is_empty ( ) {
378
414
None
@@ -384,7 +420,7 @@ impl Span {
384
420
Span {
385
421
transaction : self . transaction . clone ( ) ,
386
422
sampled : self . sampled ,
387
- span,
423
+ span : Arc :: new ( Mutex :: new ( span ) ) ,
388
424
}
389
425
}
390
426
}
0 commit comments