Skip to content

Commit 6afd135

Browse files
committed
Add method to run code with activated span for interop with Java libraries
1 parent 64c292d commit 6afd135

File tree

6 files changed

+39
-0
lines changed

6 files changed

+39
-0
lines changed

modules/core/shared/src/main/scala/Span.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ trait Span[F[_]] {
5151
*/
5252
def traceUri: F[Option[URI]]
5353

54+
/** Run impure code with the span of underlying tracing backend activated on the current thread
55+
* for the duration of the call.
56+
*
57+
* This is useful when calling into Java or other non-cats-effect code that is instrumented by the tracing backend.
58+
*
59+
* This should always be wrapped in `Sync.suspend` or equivalent.
60+
*/
61+
def unsafeRunWithActivatedSpan[T](run: => T): T = run
62+
5463
/** Converts this `Span[F]` to a `Span[G]` using a `F ~> G`. */
5564
def mapK[G[_]](f: F ~> G)(implicit
5665
F: MonadCancel[F, _],

modules/datadog/src/main/scala/DDSpan.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,10 @@ final case class DDSpan[F[_]: Sync](
112112
) ++ fields.toList.nested.map(_.value).value.toMap).asJava
113113
)
114114
}.void
115+
116+
override def unsafeRunWithActivatedSpan[T](run: => T): T = {
117+
val scope = tracer.activateSpan(span)
118+
try run
119+
finally scope.close()
120+
}
115121
}

modules/jaeger/src/main/scala/JaegerSpan.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ private[jaeger] final case class JaegerSpan[F[_]: Sync](
100100
(Nested(prefix.pure[F]), Nested(traceId)).mapN { (uri, id) =>
101101
uri.resolve(s"/trace/$id")
102102
}.value
103+
104+
override def unsafeRunWithActivatedSpan[T](run: => T): T = {
105+
val scope = tracer.activateSpan(span)
106+
try run
107+
finally scope.close()
108+
}
103109
}
104110

105111
private[jaeger] object JaegerSpan {

modules/lightstep/src/main/scala/LightstepSpan.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,10 @@ private[lightstep] final case class LightstepSpan[F[_]: Sync](
9696

9797
// TODO
9898
def traceUri: F[Option[URI]] = none.pure[F]
99+
100+
override def unsafeRunWithActivatedSpan[T](run: => T): T = {
101+
val scope = tracer.activateSpan(span)
102+
try run
103+
finally scope.close()
104+
}
99105
}

modules/opencensus/src/main/scala/OpenCensusSpan.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ private[opencensus] final case class OpenCensusSpan[F[_]: Sync](
9595
("error.class" -> TraceValue.StringValue(err.getClass.getSimpleName)) ::
9696
fields.toList: _*
9797
)
98+
99+
override def unsafeRunWithActivatedSpan[T](run: => T): T = {
100+
val scope = tracer.withSpan(span)
101+
try run
102+
finally scope.close()
103+
}
98104
}
99105

100106
private[opencensus] object OpenCensusSpan {

modules/opentelemetry/src/main/scala/natchez/opentelemetry/OpenTelemetrySpan.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ private[opentelemetry] final case class OpenTelemetrySpan[F[_]: Sync](
131131
(Nested(prefix.pure[F]), Nested(traceId)).mapN { (uri, id) =>
132132
uri.resolve(s"/trace/$id")
133133
}.value
134+
135+
override def unsafeRunWithActivatedSpan[T](run: => T): T = {
136+
val scope = span.makeCurrent()
137+
try run
138+
finally scope.close()
139+
}
134140
}
135141

136142
private[opentelemetry] object OpenTelemetrySpan {

0 commit comments

Comments
 (0)