Skip to content

Commit bf11bb1

Browse files
authored
Merge pull request #101 from massimosiani/natchez-0.3.x
upgrade to natchez 0.3.x
2 parents 63db567 + 4ca1374 commit bf11bb1

File tree

25 files changed

+166
-71
lines changed

25 files changed

+166
-71
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.idea/
2+
.vscode/
23
dist/*
34
target/
45
lib_managed/

build.sbt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import microsites.MicrositesPlugin.autoImport.micrositeDescription
22

33
val scala213Version = "2.13.8"
4-
val scala3Version = "3.2.2"
4+
val scala3Version = "3.3.0"
55

66
val scalaVersions = Seq(scala213Version, scala3Version)
77

@@ -63,7 +63,7 @@ lazy val metricsCommon = projectMatrix
6363
.settings(common :+ (name := "natchez-extras-metrics"))
6464

6565
val log4catsVersion = "2.2.0"
66-
val natchezVersion = "0.1.6"
66+
val natchezVersion = "0.3.3"
6767
val http4sMilestoneVersion = "1.0.0-M38"
6868
val http4sStableVersion = "0.23.14"
6969
val circeVersion = "0.14.1"

natchez-ce3/src/main/scala/com/ovoenergy/natchez/extras/combine/ce3/IOLocalEntrypoint.scala

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,18 @@ class IOLocalEntrypoint(private val ep: EntryPoint[IO], private val local: IOLoc
99
private def localise(span: Span[IO]): Resource[IO, Span[IO]] =
1010
Resource.make(local.getAndSet(span))(parentSpan => local.set(parentSpan))
1111

12-
override def root(name: String): Resource[IO, Span[IO]] = ep.root(name).flatTap(localise)
12+
override def root(name: String, options: Span.Options): Resource[IO, Span[IO]] =
13+
ep.root(name, options).flatTap(localise)
1314

14-
override def continue(name: String, kernel: Kernel): Resource[IO, Span[IO]] =
15-
ep.continue(name, kernel).flatTap(localise)
15+
override def continue(name: String, kernel: Kernel, options: Span.Options): Resource[IO, Span[IO]] =
16+
ep.continue(name, kernel, options).flatTap(localise)
1617

17-
override def continueOrElseRoot(name: String, kernel: Kernel): Resource[IO, Span[IO]] =
18-
ep.continueOrElseRoot(name, kernel).flatTap(localise)
18+
override def continueOrElseRoot(
19+
name: String,
20+
kernel: Kernel,
21+
options: Span.Options
22+
): Resource[IO, Span[IO]] =
23+
ep.continueOrElseRoot(name, kernel, options).flatTap(localise)
1924
}
2025

2126
object IOLocalEntrypoint {

natchez-ce3/src/main/scala/com/ovoenergy/natchez/extras/combine/ce3/IOLocalTrace.scala

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import natchez.{Kernel, Span, Trace, TraceValue}
44
import cats.effect.{IO, IOLocal, MonadCancel}
55

66
import java.net.URI
7+
import cats.effect.Resource
8+
import cats.~>
79

810
class IOLocalTrace(private val local: IOLocal[Span[IO]]) extends Trace[IO] {
911

@@ -16,9 +18,9 @@ class IOLocalTrace(private val local: IOLocal[Span[IO]]) extends Trace[IO] {
1618
private def scope[G](t: Span[IO])(f: IO[G]): IO[G] =
1719
MonadCancel[IO, Throwable].bracket(local.getAndSet(t))(_ => f)(local.set)
1820

19-
override def span[A](name: String)(k: IO[A]): IO[A] =
21+
override def span[A](name: String, options: Span.Options)(k: IO[A]): IO[A] =
2022
local.get.flatMap {
21-
_.span(name).use { span =>
23+
_.span(name, options).use { span =>
2224
scope(span)(k)
2325
}
2426
}
@@ -28,4 +30,22 @@ class IOLocalTrace(private val local: IOLocal[Span[IO]]) extends Trace[IO] {
2830

2931
override def traceUri: IO[Option[URI]] =
3032
local.get.flatMap(_.traceUri)
33+
34+
override def attachError(err: Throwable, fields: (String, TraceValue)*): IO[Unit] =
35+
local.get.flatMap(_.attachError(err, fields: _*))
36+
override def log(event: String): IO[Unit] = local.get.flatMap(_.log(event))
37+
override def log(fields: (String, TraceValue)*): IO[Unit] = local.get.flatMap(_.log(fields: _*))
38+
override def spanR(name: String, options: Span.Options): Resource[IO, IO ~> IO] =
39+
for {
40+
parent <- Resource.eval(local.get)
41+
child <- parent.span(name, options)
42+
} yield new (IO ~> IO) {
43+
def apply[A](fa: IO[A]): IO[A] =
44+
local.get.flatMap { old =>
45+
local
46+
.set(child)
47+
.bracket(_ => fa.onError(child.attachError(_)))(_ => local.set(old))
48+
}
49+
50+
}
3151
}

natchez-ce3/src/test/scala/com/ovoenergy/natchez/extras/combine/ce3/IOLocalEntrypointTest.scala

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ class IOLocalEntrypointTest extends CatsEffectSuite {
1212
for {
1313
local <- IOLocal[Span[IO]](rootSpan)
1414
ep = new TestEntrypoint {
15-
override def continue(name: String, kernel: Kernel): Resource[IO, Span[IO]] = Resource.pure(childSpan)
15+
override def continue(name: String, kernel: Kernel, options: Span.Options): Resource[IO, Span[IO]] =
16+
Resource.pure(childSpan)
1617
}
1718
epUnderTest = new IOLocalEntrypoint(ep, local)
1819
spanR = epUnderTest.continue("", Kernel(Map.empty))
@@ -26,7 +27,8 @@ class IOLocalEntrypointTest extends CatsEffectSuite {
2627
for {
2728
local <- IOLocal[Span[IO]](rootSpan)
2829
ep = new TestEntrypoint {
29-
override def root(name: String): Resource[IO, Span[IO]] = Resource.pure(childSpan)
30+
override def root(name: String, options: Span.Options): Resource[IO, Span[IO]] =
31+
Resource.pure(childSpan)
3032
}
3133
epUnderTest = new IOLocalEntrypoint(ep, local)
3234
spanR = epUnderTest.root("")
@@ -40,7 +42,11 @@ class IOLocalEntrypointTest extends CatsEffectSuite {
4042
for {
4143
local <- IOLocal[Span[IO]](rootSpan)
4244
ep = new TestEntrypoint {
43-
override def continueOrElseRoot(name: String, kernel: Kernel): Resource[IO, Span[IO]] =
45+
override def continueOrElseRoot(
46+
name: String,
47+
kernel: Kernel,
48+
options: Span.Options
49+
): Resource[IO, Span[IO]] =
4450
Resource.pure(childSpan)
4551
}
4652
epUnderTest = new IOLocalEntrypoint(ep, local)
@@ -59,10 +65,14 @@ class IOLocalEntrypointTest extends CatsEffectSuite {
5965
}
6066

6167
private class TestEntrypoint extends EntryPoint[IO] {
62-
override def root(name: String): Resource[IO, Span[IO]] = ???
68+
override def root(name: String, options: Span.Options): Resource[IO, Span[IO]] = ???
6369

64-
override def continue(name: String, kernel: Kernel): Resource[IO, Span[IO]] = ???
70+
override def continue(name: String, kernel: Kernel, options: Span.Options): Resource[IO, Span[IO]] = ???
6571

66-
override def continueOrElseRoot(name: String, kernel: Kernel): Resource[IO, Span[IO]] = ???
72+
override def continueOrElseRoot(
73+
name: String,
74+
kernel: Kernel,
75+
options: Span.Options
76+
): Resource[IO, Span[IO]] = ???
6777
}
6878
}

natchez-ce3/src/test/scala/com/ovoenergy/natchez/extras/combine/ce3/TestSpan.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@ import java.net.URI
88
protected[ce3] abstract class TestSpan(val name: String) extends Span[IO] {
99
override def put(fields: (String, TraceValue)*): IO[Unit] = ???
1010
override def kernel: IO[Kernel] = ???
11-
override def span(name: String): Resource[IO, Span[IO]] = ???
11+
override def span(name: String, options: Span.Options): Resource[IO, Span[IO]] = ???
1212
override def traceId: IO[Option[String]] = ???
1313
override def spanId: IO[Option[String]] = ???
1414
override def traceUri: IO[Option[URI]] = ???
15+
override def attachError(err: Throwable, fields: (String, TraceValue)*): IO[Unit] = ???
16+
override def log(event: String): IO[Unit] = ???
17+
override def log(fields: (String, TraceValue)*): IO[Unit] = ???
1518
}
1619

1720
protected[ce3] object TestSpan {
1821
val childSpan = new TestSpan("child") {}
1922
val rootSpan = new TestSpan("root") {
20-
override def span(name: String): Resource[IO, Span[IO]] = Resource.pure(childSpan)
23+
override def span(name: String, options: Span.Options): Resource[IO, Span[IO]] = Resource.pure(childSpan)
2124
}
2225
}

natchez-extras-combine/src/main/scala/com/ovoenergy/natchez/extras/combine/Combine.scala

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ object Combine {
1919
def kernel: F[Kernel] =
2020
(s1.kernel, s2.kernel).mapN { case (k1, k2) => Kernel(k1.toHeaders ++ k2.toHeaders) }
2121

22-
def span(name: String): Resource[F, Span[F]] =
23-
(s1.span(name), s2.span(name)).mapN[Span[F]](combineSpan[F])
24-
2522
def put(fields: (String, TraceValue)*): F[Unit] =
2623
(s1.put(fields: _*), s2.put(fields: _*)).tupled.as(())
2724

@@ -33,17 +30,32 @@ object Combine {
3330

3431
def traceUri: F[Option[URI]] =
3532
OptionT(s1.traceUri).orElseF(s2.traceUri).value
33+
34+
def attachError(err: Throwable, fields: (String, TraceValue)*): F[Unit] =
35+
(s1.attachError(err, fields: _*), s2.attachError(err, fields: _*)).tupled.as(())
36+
37+
def log(event: String): F[Unit] = (s1.log(event), s2.log(event)).tupled.as(())
38+
39+
def log(fields: (String, TraceValue)*): F[Unit] = (s1.log(fields: _*), s2.log(fields: _*)).tupled.as(())
40+
41+
def span(name: String, options: Span.Options): Resource[F, Span[F]] =
42+
(s1.span(name, options), s2.span(name, options)).mapN[Span[F]](combineSpan[F])
3643
}
3744

3845
def combine[F[_]: Sync](e1: EntryPoint[F], e2: EntryPoint[F]): EntryPoint[F] =
3946
new EntryPoint[F] {
40-
def root(name: String): Resource[F, Span[F]] =
41-
(e1.root(name), e2.root(name)).mapN(combineSpan[F])
42-
43-
def continue(name: String, kernel: Kernel): Resource[F, Span[F]] =
44-
(e1.continue(name, kernel), e2.continue(name, kernel)).mapN(combineSpan[F])
45-
46-
def continueOrElseRoot(name: String, kernel: Kernel): Resource[F, Span[F]] =
47-
(e1.continueOrElseRoot(name, kernel), e2.continueOrElseRoot(name, kernel)).mapN(combineSpan[F])
47+
override def root(name: String, options: Span.Options): Resource[F, Span[F]] =
48+
(e1.root(name, options), e2.root(name, options)).mapN(combineSpan[F])
49+
50+
override def continue(name: String, kernel: Kernel, options: Span.Options): Resource[F, Span[F]] =
51+
(e1.continue(name, kernel, options), e2.continue(name, kernel, options)).mapN(combineSpan[F])
52+
53+
override def continueOrElseRoot(
54+
name: String,
55+
kernel: Kernel,
56+
options: Span.Options
57+
): Resource[F, Span[F]] =
58+
(e1.continueOrElseRoot(name, kernel, options), e2.continueOrElseRoot(name, kernel, options))
59+
.mapN(combineSpan[F])
4860
}
4961
}

natchez-extras-datadog/src/main/scala/com/ovoenergy/natchez/extras/datadog/Datadog.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,16 @@ object Datadog {
127127
_ <- submitter(client, agentHost, queue)
128128
} yield {
129129
new EntryPoint[F] {
130-
def root(name: String): Resource[F, Span[F]] =
130+
def root(name: String, options: Span.Options): Resource[F, Span[F]] =
131131
Resource
132132
.eval(SpanIdentifiers.create.flatMap(Ref.of[F, SpanIdentifiers]))
133133
.flatMap(DatadogSpan.create(queue, names(name)))
134134
.widen
135135

136-
def continue(name: String, kernel: Kernel): Resource[F, Span[F]] =
136+
def continue(name: String, kernel: Kernel, options: Span.Options): Resource[F, Span[F]] =
137137
DatadogSpan.fromKernel(queue, names(name), kernel).widen
138138

139-
def continueOrElseRoot(name: String, kernel: Kernel): Resource[F, Span[F]] =
139+
def continueOrElseRoot(name: String, kernel: Kernel, options: Span.Options): Resource[F, Span[F]] =
140140
DatadogSpan.fromKernel(queue, names(name), kernel).widen
141141
}
142142
}

natchez-extras-datadog/src/main/scala/com/ovoenergy/natchez/extras/datadog/DatadogSpan.scala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import natchez.TraceValue.{BooleanValue, NumberValue, StringValue}
1414
import natchez.{Kernel, Span, TraceValue}
1515

1616
import java.net.URI
17+
import natchez.Tags
1718

1819
/**
1920
* Models an in-progress span we'll eventually send to Datadog.
@@ -42,7 +43,7 @@ case class DatadogSpan[F[_]: Async](
4243
meta.update(m => fields.foldLeft(m) { case (m, (k, v)) => m.updated(k, v) }) >>
4344
updateTraceToken(fields.toMap)
4445

45-
def span(name: String): Resource[F, Span[F]] =
46+
def span(name: String, options: Span.Options): Resource[F, Span[F]] =
4647
DatadogSpan.fromParent(name, parent = this).widen
4748

4849
def kernel: F[Kernel] =
@@ -56,6 +57,13 @@ case class DatadogSpan[F[_]: Async](
5657

5758
def traceUri: F[Option[URI]] =
5859
Monad[F].pure(None)
60+
61+
override def attachError(err: Throwable, fields: (String, TraceValue)*): F[Unit] =
62+
put(Tags.error(true) :: fields.toList: _*)
63+
64+
override def log(event: String): F[Unit] = put("event" -> TraceValue.StringValue(event))
65+
66+
override def log(fields: (String, TraceValue)*): F[Unit] = put(fields: _*)
5967
}
6068

6169
object DatadogSpan {

natchez-extras-datadog/src/main/scala/com/ovoenergy/natchez/extras/datadog/SpanIdentifiers.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ object SpanIdentifiers {
5353
* partial data (i.e. just a trace token) is still useful to us
5454
*/
5555
def fromKernel[F[_]: Sync](rawKernel: Kernel): F[SpanIdentifiers] = {
56-
val headers = Headers(rawKernel.toHeaders.toSeq)
56+
val headers = Headers(rawKernel.toHeaders.map { case (k, v) => k.toString -> v }.toSeq)
5757
(
5858
traceId(headers),
5959
UnsignedLong.random[F],
@@ -70,6 +70,6 @@ object SpanIdentifiers {
7070
`X-B3-Trace-Id`(ids.traceId),
7171
`X-B3-Span-Id`(ids.spanId),
7272
"X-Trace-Token" -> ids.traceToken
73-
).headers.map(r => r.name.toString -> r.value).toMap
73+
).headers.map(r => r.name -> r.value).toMap
7474
)
7575
}

0 commit comments

Comments
 (0)