Skip to content

Commit

Permalink
Merge pull request #285 from NthPortal/Tracer-propagate/PR
Browse files Browse the repository at this point in the history
Add `Tracer#propagate`
  • Loading branch information
rossabaker authored Aug 11, 2023
2 parents a8b2937 + aa7cb8c commit 7686cfc
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 3 deletions.
16 changes: 16 additions & 0 deletions core/trace/src/main/scala/org/typelevel/otel4s/trace/Tracer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,20 @@ trait Tracer[F[_]] extends TracerMacro[F] {
*/
def noopScope[A](fa: F[A]): F[A]

/** Propagates this tracer's context into an immutable carrier.
*
* @param carrier
* the immutable carrier to append the context to
* @tparam C
* the type of the carrier
* @return
* a copy of the immutable carrier with this tracer's context appended to
* it
* @see
* [[org.typelevel.otel4s.TextMapPropagator.injected TextMapPropagator#injected]]
*/
def propagate[C: TextMapUpdater](carrier: C): F[C]

}

object Tracer {
Expand Down Expand Up @@ -207,6 +221,8 @@ object Tracer {
def childScope[A](parent: SpanContext)(fa: F[A]): F[A] = fa
def spanBuilder(name: String): SpanBuilder[F] = builder
def joinOrRoot[A, C: TextMapGetter](carrier: C)(fa: F[A]): F[A] = fa
def propagate[C: TextMapUpdater](carrier: C): F[C] =
Applicative[F].pure(carrier)
}

object Implicits {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ package org.typelevel.otel4s.java.trace
import cats.effect.Sync
import io.opentelemetry.api.trace.{TracerProvider => JTracerProvider}
import org.typelevel.otel4s.ContextPropagators
import org.typelevel.otel4s.context.AskVault
import org.typelevel.otel4s.trace._

private[java] final case class TracerBuilderImpl[F[_]: Sync](
private[java] final case class TracerBuilderImpl[F[_]: Sync: AskVault](
jTracerProvider: JTracerProvider,
propagators: ContextPropagators[F],
scope: TraceScope[F],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,21 @@
package org.typelevel.otel4s.java.trace

import cats.effect.Sync
import cats.mtl.Ask
import cats.syntax.flatMap._
import cats.syntax.functor._
import io.opentelemetry.api.trace.{Span => JSpan}
import io.opentelemetry.api.trace.{Tracer => JTracer}
import org.typelevel.otel4s.ContextPropagators
import org.typelevel.otel4s.TextMapGetter
import org.typelevel.otel4s.TextMapUpdater
import org.typelevel.otel4s.context.AskVault
import org.typelevel.otel4s.trace.SpanBuilder
import org.typelevel.otel4s.trace.SpanContext
import org.typelevel.otel4s.trace.Tracer
import org.typelevel.vault.Vault

private[java] class TracerImpl[F[_]: Sync](
private[java] class TracerImpl[F[_]: Sync: AskVault](
jTracer: JTracer,
scope: TraceScope[F],
propagators: ContextPropagators[F]
Expand Down Expand Up @@ -72,4 +75,7 @@ private[java] class TracerImpl[F[_]: Sync](
rootScope(fa)
}
}

def propagate[C: TextMapUpdater](carrier: C): F[C] =
Ask[F, Vault].reader(propagators.textMapPropagator.injected(_, carrier))
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,12 @@ import cats.effect.Sync
import cats.mtl.Local
import io.opentelemetry.api.trace.{TracerProvider => JTracerProvider}
import org.typelevel.otel4s.ContextPropagators
import org.typelevel.otel4s.context.AskVault
import org.typelevel.otel4s.trace.TracerBuilder
import org.typelevel.otel4s.trace.TracerProvider
import org.typelevel.vault.Vault

private[java] class TracerProviderImpl[F[_]: Sync](
private[java] class TracerProviderImpl[F[_]: Sync: AskVault](
jTracerProvider: JTracerProvider,
propagators: ContextPropagators[F],
scope: TraceScope[F]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,25 @@ class TracerSuite extends CatsEffectSuite {
}
}

test("propagate to an arbitrary carrier") {
TestControl.executeEmbed {
for {
sdk <- makeSdk()
tracer <- sdk.provider.get("tracer")
_ <- tracer.span("span").use { span =>
for {
carrier <- tracer.propagate(Map("key" -> "value"))
} yield {
assertEquals(carrier.get("key"), Some("value"))
val expected =
s"00-${span.context.traceIdHex}-${span.context.spanIdHex}-01"
assertEquals(carrier.get("traceparent"), Some(expected))
}
}
} yield ()
}
}

test("automatically start and stop span") {
val sleepDuration = 500.millis

Expand Down

0 comments on commit 7686cfc

Please sign in to comment.