/
LocalTrace.scala
63 lines (49 loc) · 1.81 KB
/
LocalTrace.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Copyright (c) 2019-2020 by Rob Norris and Contributors
// This software is licensed under the MIT License (MIT).
// For more information see LICENSE or https://opensource.org/licenses/MIT
package natchez
package mtl
import cats.~>
import cats.mtl.Local
import cats.effect.MonadCancel
import cats.effect.Resource
import cats.syntax.all._
import java.net.URI
import cats.Applicative
private[mtl] class LocalTrace[F[_]](local: Local[F, Span[F]])(implicit
ev: MonadCancel[F, Throwable]
) extends Trace[F] {
override def kernel: F[Kernel] =
local.ask.flatMap(_.kernel)
override def put(fields: (String, TraceValue)*): F[Unit] =
local.ask.flatMap(_.put(fields: _*))
override def attachError(err: Throwable, fields: (String, TraceValue)*): F[Unit] =
local.ask.flatMap(_.attachError(err, fields: _*))
override def log(fields: (String, TraceValue)*): F[Unit] =
local.ask.flatMap(_.log(fields: _*))
override def log(event: String): F[Unit] =
local.ask.flatMap(_.log(event))
override def spanR(name: String, options: Span.Options): Resource[F, F ~> F] =
Resource(
local.ask.flatMap(t =>
t.span(name, options).allocated.map { case (child, release) =>
new (F ~> F) {
def apply[A](fa: F[A]): F[A] =
local.scope(fa)(child)
} -> release
}
)
)
override def span[A](name: String, options: Span.Options)(k: F[A]): F[A] =
local.ask.flatMap { span =>
span.span(name, options).use { s =>
local.scope(k)(s).onError { case err => s.attachError(err) }
}
}
override def traceId: F[Option[String]] =
local.ask.flatMap(_.traceId)
override def spanId(implicit F: Applicative[F]): F[Option[String]] =
local.ask.flatMap(_.spanId)
override def traceUri: F[Option[URI]] =
local.ask.flatMap(_.traceUri)
}