Skip to content

Commit 7085b82

Browse files
committed
Update to http4s 0.22
1 parent ef3c3eb commit 7085b82

File tree

7 files changed

+55
-56
lines changed

7 files changed

+55
-56
lines changed

build.sbt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,20 @@
1313
* =========================================================================================
1414
*/
1515

16-
val kamonCore = "io.kamon" %% "kamon-core" % "2.1.0"
17-
val kamonTestkit = "io.kamon" %% "kamon-testkit" % "2.1.0"
18-
val kamonCommon = "io.kamon" %% "kamon-instrumentation-common" % "2.1.0"
16+
val kamonCore = "io.kamon" %% "kamon-core" % "2.2.2"
17+
val kamonTestkit = "io.kamon" %% "kamon-testkit" % "2.2.2"
18+
val kamonCommon = "io.kamon" %% "kamon-instrumentation-common" % "2.2.2"
1919

20-
val server = "org.http4s" %% "http4s-blaze-server" % "0.21.3"
21-
val client = "org.http4s" %% "http4s-blaze-client" % "0.21.3"
22-
val dsl = "org.http4s" %% "http4s-dsl" % "0.21.3"
20+
val server = "org.http4s" %% "http4s-blaze-server" % "0.22.0-RC1"
21+
val client = "org.http4s" %% "http4s-blaze-client" % "0.22.0-RC1"
22+
val dsl = "org.http4s" %% "http4s-dsl" % "0.22.0-RC1"
2323

2424

2525
lazy val root = (project in file("."))
2626
.settings(Seq(
2727
name := "kamon-http4s",
28-
scalaVersion := "2.13.1",
29-
crossScalaVersions := Seq("2.12.11", "2.13.1")))
28+
scalaVersion := "2.13.6",
29+
crossScalaVersions := Seq("2.12.14", "2.13.6")))
3030
.settings(resolvers += Resolver.bintrayRepo("kamon-io", "snapshots"))
3131
.settings(resolvers += Resolver.mavenLocal)
3232
.settings(scalacOptions ++= (CrossVersion.partialVersion(scalaVersion.value) match {

project/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.3.9
1+
sbt.version=1.5.5

src/main/scala/kamon/http4s/middleware/client/KamonSupport.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ object KamonSupport {
4242
def apply[F[_]](underlying: Client[F])(implicit F:Sync[F]): Client[F] = Client { request =>
4343

4444
for {
45-
ctx <- Resource.liftF(F.delay(Kamon.currentContext()))
45+
ctx <- Resource.eval(F.delay(Kamon.currentContext()))
4646
k <- kamonClient(underlying)(request)(ctx)(_instrumentation)
4747
} yield k
4848
}
@@ -54,9 +54,9 @@ object KamonSupport {
5454
(instrumentation: HttpClientInstrumentation)
5555
(implicit F:Sync[F]): Resource[F, Response[F]] =
5656
for {
57-
requestHandler <- Resource.liftF(F.delay(instrumentation.createHandler(getRequestBuilder(request), ctx)))
57+
requestHandler <- Resource.eval(F.delay(instrumentation.createHandler(getRequestBuilder(request), ctx)))
5858
response <- underlying.run(requestHandler.request).attempt
59-
trackedResponse <- Resource.liftF(handleResponse(response, requestHandler))
59+
trackedResponse <- Resource.eval(handleResponse(response, requestHandler))
6060
} yield trackedResponse
6161

6262
def handleResponse[F[_]](

src/main/scala/kamon/http4s/package.scala

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,57 @@ package kamon
33
import org.http4s.{Header, Headers, Request, Response, Status}
44
import kamon.instrumentation.http.HttpMessage
55
import kamon.instrumentation.http.HttpMessage.ResponseBuilder
6-
import org.http4s.util.CaseInsensitiveString
6+
import org.typelevel.ci.CIString
77

88
package object http4s {
99

1010

1111
def buildRequestMessage[F[_]](inner: Request[F]): HttpMessage.Request = new HttpMessage.Request {
1212
override def url: String = inner.uri.toString()
1313

14-
override def path: String = inner.uri.path
14+
override def path: String = inner.uri.path.renderString
1515

1616
override def method: String = inner.method.name
1717

1818
override def host: String = inner.uri.authority.map(_.host.value).getOrElse("")
1919

2020
override def port: Int = inner.uri.authority.flatMap(_.port).getOrElse(0)
2121

22-
override def read(header: String): Option[String] = inner.headers.get(CaseInsensitiveString(header)).map(_.value)
22+
override def read(header: String): Option[String] = inner.headers.get(CIString(header)).map(_.head.value)
2323

2424
override def readAll(): Map[String, String] = {
2525
val builder = Map.newBuilder[String, String]
26-
inner.headers.foreach(h => builder += (h.name.value -> h.value))
26+
inner.headers.foreach(h => builder += (h.name.toString -> h.value))
2727
builder.result()
2828
}
2929
}
3030

3131
def errorResponseBuilder[F[_]]: HttpMessage.ResponseBuilder[Response[F]] = new ResponseBuilder[Response[F]] {
3232
override def write(header: String, value: String): Unit = ()
3333
override def statusCode: Int = 500
34-
override def build(): Response[F] = new Response[F](status = Status.InternalServerError)
34+
override def build(): Response[F] = Response[F](status = Status.InternalServerError)
3535
}
3636

3737
//TODO both of these
3838
def notFoundResponseBuilder[F[_]]: HttpMessage.ResponseBuilder[Response[F]] = new ResponseBuilder[Response[F]] {
3939
private var _headers = Headers.empty
4040

4141
override def write(header: String, value: String): Unit =
42-
_headers = _headers.put(Header(header, value))
42+
_headers = _headers.put(Header.Raw(CIString(header), value))
4343

4444
override def statusCode: Int = 404
45-
override def build(): Response[F] = new Response[F](status = Status.NotFound, headers = _headers)
45+
override def build(): Response[F] = Response[F](status = Status.NotFound, headers = _headers)
4646
}
4747

48-
def getResponseBuilder[F[_]](response: Response[F]) = new HttpMessage.ResponseBuilder[Response[F]] {
48+
def getResponseBuilder[F[_]](response: Response[F]): ResponseBuilder[Response[F]] = new HttpMessage.ResponseBuilder[Response[F]] {
4949
private var _headers = response.headers
5050

5151
override def statusCode: Int = response.status.code
5252

5353
override def build(): Response[F] = response.withHeaders(_headers)
5454

5555
override def write(header: String, value: String): Unit =
56-
_headers = _headers.put(Header(header, value))
56+
_headers = _headers.put(Header.Raw(CIString(header), value))
5757
}
5858

5959

@@ -63,23 +63,23 @@ package object http4s {
6363
override def build(): Request[F] = request.withHeaders(_headers)
6464

6565
override def write(header: String, value: String): Unit =
66-
_headers = _headers.put(Header(header, value))
66+
_headers = _headers.put(Header.Raw(CIString(header), value))
6767

6868
override def url: String = request.uri.toString()
6969

70-
override def path: String = request.uri.path
70+
override def path: String = request.uri.path.renderString
7171

7272
override def method: String = request.method.name
7373

7474
override def host: String = request.uri.authority.map(_.host.value).getOrElse("")
7575

7676
override def port: Int = request.uri.authority.flatMap(_.port).getOrElse(0)
7777

78-
override def read(header: String): Option[String] = _headers.get(CaseInsensitiveString(header)).map(_.value)
78+
override def read(header: String): Option[String] = _headers.get(CIString(header)).map(_.head.value)
7979

8080
override def readAll(): Map[String, String] = {
8181
val builder = Map.newBuilder[String, String]
82-
request.headers.foreach(h => builder += (h.name.value -> h.value))
82+
request.headers.foreach(h => builder += (h.name.toString -> h.value))
8383
builder.result()
8484
}
8585
}

src/test/scala/kamon/http4s/ClientInstrumentationSpec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class ClientInstrumentationSpec extends WordSpec
7474
"close and finish a span even if an exception is thrown by the client" in {
7575
val okSpan = Kamon.spanBuilder("client-exception").start()
7676
val client: Client[IO] = KamonSupport[IO](
77-
Client(_ => Resource.liftF(IO.raiseError[Response[IO]](new ConnectException("Connection Refused."))))
77+
Client(_ => Resource.eval(IO.raiseError[Response[IO]](new ConnectException("Connection Refused."))))
7878
)
7979

8080
Kamon.runWithSpan(okSpan) {

src/test/scala/kamon/http4s/HttpMetricsSpec.scala

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,22 @@
1717
package kamon.http4s
1818

1919
import cats.effect._
20+
import cats.implicits._
21+
import kamon.http4s.middleware.server.KamonSupport
22+
import kamon.instrumentation.http.HttpServerMetrics
2023
import kamon.testkit.InstrumentInspection
2124
import org.http4s.HttpRoutes
25+
import org.http4s.blaze.client.BlazeClientBuilder
26+
import org.http4s.blaze.server.BlazeServerBuilder
27+
import org.http4s.client.Client
2228
import org.http4s.dsl.io._
29+
import org.http4s.implicits._
2330
import org.http4s.server.Server
24-
import org.http4s.server.blaze.BlazeServerBuilder
2531
import org.scalatest.concurrent.Eventually
2632
import org.scalatest.time.SpanSugar
2733
import org.scalatest.{Matchers, OptionValues, WordSpec}
28-
import cats.implicits._
29-
import kamon.http4s.middleware.server.KamonSupport
30-
import kamon.instrumentation.http.HttpServerMetrics
31-
import org.http4s.client.blaze.BlazeClientBuilder
32-
import org.http4s.client.Client
3334

3435
import scala.concurrent.ExecutionContext
35-
import org.http4s.implicits._
3636

3737
class HttpMetricsSpec extends WordSpec
3838
with Matchers
@@ -46,7 +46,7 @@ class HttpMetricsSpec extends WordSpec
4646
implicit val timer: Timer[IO] = IO.timer(ExecutionContext.global)
4747

4848
val srv =
49-
BlazeServerBuilder[IO]
49+
BlazeServerBuilder[IO](ExecutionContext.global)
5050
.bindLocal(43567)
5151
.withHttpApp(KamonSupport(HttpRoutes.of[IO] {
5252
case GET -> Root / "tracing" / "ok" => Ok("ok")
@@ -59,13 +59,13 @@ class HttpMetricsSpec extends WordSpec
5959
BlazeClientBuilder[IO](ExecutionContext.global).withMaxTotalConnections(10).resource
6060

6161
val metrics =
62-
Resource.liftF(IO(HttpServerMetrics.of("http4s.server", "/127.0.0.1", 43567)))
62+
Resource.eval(IO(HttpServerMetrics.of("http4s.server", "/127.0.0.1", 43567)))
6363

6464

65-
def withServerAndClient[A](f: (Server[IO], Client[IO], HttpServerMetrics.HttpServerInstruments) => IO[A]): A =
65+
def withServerAndClient[A](f: (Server, Client[IO], HttpServerMetrics.HttpServerInstruments) => IO[A]): A =
6666
(srv, client, metrics).tupled.use(f.tupled).unsafeRunSync()
6767

68-
private def get[F[_]: Sync](path: String)(server: Server[F], client: Client[F]): F[String] = {
68+
private def get[F[_]: Sync](path: String)(server: Server, client: Client[F]): F[String] = {
6969
client.expect[String](s"http://127.0.0.1:${server.address.getPort}$path")
7070
}
7171

src/test/scala/kamon/http4s/ServerInstrumentationSpec.scala

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,24 @@
1717
package kamon.http4s
1818

1919
import cats.effect.{ContextShift, IO, Sync, Timer}
20+
import cats.implicits._
2021
import kamon.http4s.middleware.server.KamonSupport
22+
import kamon.tag.Lookups.{plain, plainLong}
23+
import kamon.testkit.TestSpanReporter
2124
import kamon.trace.Span
22-
import org.http4s.{Headers, HttpRoutes}
25+
import org.http4s.blaze.client.BlazeClientBuilder
26+
import org.http4s.blaze.server.BlazeServerBuilder
2327
import org.http4s.client.Client
24-
import org.http4s.client.blaze.BlazeClientBuilder
2528
import org.http4s.dsl.io._
26-
import org.http4s.server.{Server}
27-
import org.http4s.server.blaze.BlazeServerBuilder
29+
import org.http4s.implicits._
30+
import org.http4s.server.Server
31+
import org.http4s.{Headers, HttpRoutes}
2832
import org.scalatest.concurrent.Eventually
2933
import org.scalatest.time.SpanSugar
3034
import org.scalatest.{BeforeAndAfterAll, Matchers, OptionValues, WordSpec}
35+
import org.typelevel.ci.CIString
3136

3237
import scala.concurrent.ExecutionContext
33-
import org.http4s.implicits._
34-
import cats.implicits._
35-
import kamon.testkit.TestSpanReporter
36-
import kamon.tag.Lookups.{plain, plainLong}
37-
import org.http4s.util.CaseInsensitiveString
3838

3939
class ServerInstrumentationSpec extends WordSpec
4040
with Matchers
@@ -48,9 +48,8 @@ class ServerInstrumentationSpec extends WordSpec
4848
implicit val timer: Timer[IO] = IO.timer(ExecutionContext.global)
4949

5050
val srv =
51-
BlazeServerBuilder[IO]
51+
BlazeServerBuilder[IO](ExecutionContext.global)
5252
.bindAny()
53-
.withExecutionContext(ExecutionContext.global)
5453
.withHttpApp(KamonSupport(HttpRoutes.of[IO] {
5554
case GET -> Root / "tracing" / "ok" => Ok("ok")
5655
case GET -> Root / "tracing" / "error" => InternalServerError("error!")
@@ -63,19 +62,19 @@ class ServerInstrumentationSpec extends WordSpec
6362
val client =
6463
BlazeClientBuilder[IO](ExecutionContext.global).resource
6564

66-
def withServerAndClient[A](f: (Server[IO], Client[IO]) => IO[A]): A =
65+
def withServerAndClient[A](f: (Server, Client[IO]) => IO[A]): A =
6766
(srv, client).tupled.use(f.tupled).unsafeRunSync()
6867

69-
private def getResponse[F[_]: Sync](path: String)(server: Server[F], client: Client[F]): F[(String, Headers)] = {
70-
client.get(s"http://127.0.0.1:${server.address.getPort}$path"){ r =>
71-
r.bodyAsText.compile.toList.map(_.mkString).map(_ -> r.headers)
68+
private def getResponse[F[_]: Sync](path: String)(server: Server, client: Client[F]): F[(String, Headers)] = {
69+
client.get(s"http://127.0.0.1:${server.address.getPort}$path") { r =>
70+
r.bodyText.compile.toList.map(_.mkString).map(_ -> r.headers)
7271
}
7372
}
7473

7574
"The Server instrumentation" should {
7675
"propagate the current context and respond to the ok action" in withServerAndClient { (server, client) =>
7776
val request = getResponse("/tracing/ok")(server, client).map { case (body, headers) =>
78-
headers.exists(_.name == CaseInsensitiveString("trace-id")) shouldBe true
77+
headers.get(CIString("trace-id")).nonEmpty shouldBe true
7978
body should startWith("ok")
8079
}
8180

@@ -96,7 +95,7 @@ class ServerInstrumentationSpec extends WordSpec
9695

9796
"propagate the current context and respond to the not-found action" in withServerAndClient { (server, client) =>
9897
val request = getResponse("/tracing/not-found")(server, client).map { case (body, headers) =>
99-
headers.exists(_.name == CaseInsensitiveString("trace-id")) shouldBe true
98+
headers.get(CIString("trace-id")).nonEmpty shouldBe true
10099
}
101100

102101
val test = IO {
@@ -116,7 +115,7 @@ class ServerInstrumentationSpec extends WordSpec
116115

117116
"propagate the current context and respond to the error action" in withServerAndClient { (server, client) =>
118117
val request = getResponse("/tracing/error")(server, client).map { case (body, headers) =>
119-
headers.exists(_.name == CaseInsensitiveString("trace-id")) shouldBe true
118+
headers.get(CIString("trace-id")).nonEmpty shouldBe true
120119
body should startWith("error!")
121120
}
122121

@@ -139,7 +138,7 @@ class ServerInstrumentationSpec extends WordSpec
139138
val request = getResponse("/tracing/errorinternal")(server, client)
140139
/* TODO serviceErrorHandler kicks in and rewrites response, loosing trace information
141140
.map { case (body, headers) =>
142-
headers.exists(_.name == CaseInsensitiveString("trace-id")) shouldBe true
141+
headers.exists(_.name == CIString("trace-id")) shouldBe true
143142
}
144143
*/
145144

0 commit comments

Comments
 (0)