@@ -19,6 +19,7 @@ package org.typelevel.otel4s.java.trace
19
19
import cats .effect .IO
20
20
import cats .effect .Resource
21
21
import cats .effect .testkit .TestControl
22
+ import fs2 .Stream
22
23
import io .opentelemetry .api .common .Attributes
23
24
import io .opentelemetry .api .trace .StatusCode
24
25
import io .opentelemetry .sdk .common .InstrumentationScopeInfo
@@ -451,6 +452,51 @@ class TracerSuite extends CatsEffectSuite {
451
452
}
452
453
}
453
454
455
+ test(" propagate trace info over stream scopes" ) {
456
+ def expected (now : FiniteDuration ) =
457
+ SpanNode (
458
+ " span" ,
459
+ now,
460
+ now,
461
+ List (
462
+ SpanNode (" span-3" , now, now, Nil ),
463
+ SpanNode (" span-2" , now, now, Nil )
464
+ )
465
+ )
466
+
467
+ def flow (tracer : Tracer [IO ]): Stream [IO , Unit ] =
468
+ for {
469
+ span <- Stream .resource(tracer.span(" span" ))
470
+ _ <- Stream .eval(
471
+ tracer.currentSpanContext.assertEquals(Some (span.context))
472
+ )
473
+ span2 <- Stream .resource(tracer.span(" span-2" ))
474
+ _ <- Stream .eval(
475
+ tracer.currentSpanContext.assertEquals(Some (span2.context))
476
+ )
477
+ span3 <- Stream .resource(
478
+ tracer.spanBuilder(" span-3" ).withParent(span.context).createAuto
479
+ )
480
+ _ <- Stream .eval(
481
+ tracer.currentSpanContext.assertEquals(Some (span3.context))
482
+ )
483
+ } yield ()
484
+
485
+ TestControl .executeEmbed {
486
+ for {
487
+ now <- IO .monotonic.delayBy(1 .second) // otherwise returns 0
488
+ sdk <- makeSdk()
489
+ tracer <- sdk.provider.tracer(" tracer" ).get
490
+ _ <- tracer.currentSpanContext.assertEquals(None )
491
+ _ <- flow(tracer).compile.drain
492
+ _ <- tracer.currentSpanContext.assertEquals(None )
493
+ spans <- sdk.finishedSpans
494
+ tree <- IO .pure(SpanNode .fromSpans(spans))
495
+ // _ <- IO.println(tree.map(SpanNode.render).mkString("\n"))
496
+ } yield assertEquals(tree, List (expected(now)))
497
+ }
498
+ }
499
+
454
500
private def assertIdsNotEqual (s1 : Span [IO ], s2 : Span [IO ]): Unit = {
455
501
assertNotEquals(s1.context.traceIdHex, s2.context.traceIdHex)
456
502
assertNotEquals(s1.context.spanIdHex, s2.context.spanIdHex)
0 commit comments