Skip to content
This repository has been archived by the owner on Mar 29, 2020. It is now read-only.

Commit

Permalink
Merge pull request #62 from ivantopo/http2-support
Browse files Browse the repository at this point in the history
HTTP/2 support, fixes #48
  • Loading branch information
ivantopo authored Sep 30, 2019
2 parents 12a5ce5 + abcf5eb commit f27fb4f
Show file tree
Hide file tree
Showing 16 changed files with 487 additions and 159 deletions.
7 changes: 5 additions & 2 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@ val kanelaAgent = "io.kamon" % "kanela-agent" % "1.0.1
val akkaHttpJson = "de.heikoseeberger" %% "akka-http-json4s" % "1.27.0"
val json4sNative = "org.json4s" %% "json4s-native" % "3.6.7"
val http25 = "com.typesafe.akka" %% "akka-http" % "10.1.9"
val http2Support = "com.typesafe.akka" %% "akka-http2-support" % "10.1.9"
val httpTestKit25 = "com.typesafe.akka" %% "akka-http-testkit" % "10.1.9"
val stream25 = "com.typesafe.akka" %% "akka-stream" % "2.5.24"
val okHttp = "com.squareup.okhttp3" % "okhttp" % "3.14.2"


lazy val root = (project in file("."))
Expand All @@ -46,7 +48,8 @@ lazy val kamonAkkaHttp25 = Project("kamon-akka-http", file("kamon-akka-http"))
moduleName := "kamon-akka-http",
bintrayPackage := "kamon-akka-http",
crossScalaVersions := Seq("2.11.12", "2.12.8", "2.13.0")),
javaAgents += "org.mortbay.jetty.alpn" % "jetty-alpn-agent" % "2.0.9" % "test",
libraryDependencies ++=
compileScope(kamonCore, kamonAkka25, kamonCommon) ++
providedScope(kanelaAgent, http25, stream25) ++
testScope(httpTestKit25, scalatest, slf4jApi, slf4jnop, kamonTestKit, akkaHttpJson, json4sNative))
providedScope(kanelaAgent, http25, http2Support, stream25) ++
testScope(httpTestKit25, scalatest, slf4jApi, slf4jnop, kamonTestKit, akkaHttpJson, json4sNative, okHttp))
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package kamon.instrumentation.akka.http;

import akka.http.scaladsl.model.HttpRequest;
import akka.http.scaladsl.model.HttpResponse;
import kanela.agent.libs.net.bytebuddy.asm.Advice;
import scala.Function1;
import scala.concurrent.Future;

public class Http2ExtBindAndHandleAdvice {

@Advice.OnMethodEnter(suppress = Throwable.class)
public static void onEnter(@Advice.Argument(value = 0, readOnly = false) Function1<HttpRequest, Future<HttpResponse>> handler,
@Advice.Argument(1) String iface,
@Advice.Argument(2) Integer port) {

handler = new Http2BlueprintInterceptor.HandlerWithEndpoint(iface, port, handler);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import java.util.concurrent.Callable

import akka.http.scaladsl.marshalling.{ToResponseMarshallable, ToResponseMarshaller}
import akka.http.scaladsl.model.StatusCodes.Redirection
import akka.http.scaladsl.model.Uri
import akka.http.scaladsl.model.{HttpRequest, HttpResponse, Uri}
import akka.http.scaladsl.server.PathMatcher.{Matched, Unmatched}
import akka.http.scaladsl.server.directives.{BasicDirectives, CompleteOrRecoverWithMagnet, OnSuccessMagnet}
import akka.http.scaladsl.server.directives.RouteDirectives.reject
Expand All @@ -23,7 +23,10 @@ import scala.util.control.NonFatal
import scala.util.{Failure, Success, Try}
import java.util.regex.Pattern

import akka.NotUsed
import akka.stream.scaladsl.Flow
import kamon.context.Context
import kanela.agent.libs.net.bytebuddy.matcher.ElementMatchers.isPublic


class AkkaHttpServerInstrumentation extends InstrumentationBuilder {
Expand All @@ -40,6 +43,16 @@ class AkkaHttpServerInstrumentation extends InstrumentationBuilder {
onType("akka.http.scaladsl.HttpExt")
.advise(method("bindAndHandle"), classOf[HttpExtBindAndHandleAdvice])

/**
* For the HTTP/2 instrumentation, since the parts where we can capture the interface/port and the actual flow
* creation happen at different times we are wrapping the handler with the interface/port data and reading that
* information when turning the handler function into a flow and wrapping it the same way we would for HTTP/1.
*/
onType("akka.http.scaladsl.Http2Ext")
.advise(method("bindAndHandleAsync") and isPublic(), classOf[Http2ExtBindAndHandleAdvice])

onType("akka.http.impl.engine.http2.Http2Blueprint$")
.intercept(method("handleWithStreamIdHeader"), Http2BlueprintInterceptor)

/**
* The rest of these sections are just about making sure that we can generate an appropriate operation name (i.e. free
Expand Down Expand Up @@ -79,7 +92,6 @@ class AkkaHttpServerInstrumentation extends InstrumentationBuilder {
.intercept(method("transformWith$extension1"), FastFutureTransformWithAdvice)
}


trait HasMatchingContext {
def defaultOperationName: String
def matchingContext: Seq[PathMatchingContext]
Expand Down Expand Up @@ -208,7 +220,6 @@ object ResolveOperationNameOnRouteInterceptor {
}
}


class LastAutomaticOperationNameEdit(@volatile var operationName: String)

object LastAutomaticOperationNameEdit {
Expand Down Expand Up @@ -252,7 +263,6 @@ object PathDirectivesRawPathPrefixInterceptor {
}
}


object FastFutureTransformWithAdvice {

@RuntimeType
Expand Down Expand Up @@ -291,4 +301,26 @@ object FastFutureTransformWithAdvice {
}
}
}
}

object Http2BlueprintInterceptor {

case class HandlerWithEndpoint(interface: String, port: Int, handler: HttpRequest => Future[HttpResponse])
extends (HttpRequest => Future[HttpResponse]) {

override def apply(request: HttpRequest): Future[HttpResponse] = handler(request)
}

@RuntimeType
def handleWithStreamIdHeader(@Argument(1) handler: HttpRequest => Future[HttpResponse],
@SuperCall zuper: Callable[Flow[HttpRequest, HttpResponse, NotUsed]]): Flow[HttpRequest, HttpResponse, NotUsed] = {

handler match {
case HandlerWithEndpoint(interface, port, _) =>
ServerFlowWrapper(zuper.call(), interface, port)

case _ =>
zuper.call()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import java.util.concurrent.Callable

import akka.http.scaladsl.marshalling.{ToResponseMarshallable, ToResponseMarshaller}
import akka.http.scaladsl.model.StatusCodes.Redirection
import akka.http.scaladsl.model.Uri
import akka.http.scaladsl.model.{HttpRequest, HttpResponse, Uri}
import akka.http.scaladsl.server.PathMatcher.{Matched, Unmatched}
import akka.http.scaladsl.server.directives.{BasicDirectives, CompleteOrRecoverWithMagnet, OnSuccessMagnet}
import akka.http.scaladsl.server.directives.RouteDirectives.reject
Expand All @@ -23,7 +23,10 @@ import scala.util.control.NonFatal
import scala.util.{Failure, Success, Try}
import java.util.regex.Pattern

import akka.NotUsed
import akka.stream.scaladsl.Flow
import kamon.context.Context
import kanela.agent.libs.net.bytebuddy.matcher.ElementMatchers.isPublic


class AkkaHttpServerInstrumentation extends InstrumentationBuilder {
Expand All @@ -40,6 +43,17 @@ class AkkaHttpServerInstrumentation extends InstrumentationBuilder {
onType("akka.http.scaladsl.HttpExt")
.advise(method("bindAndHandle"), classOf[HttpExtBindAndHandleAdvice])

/**
* For the HTTP/2 instrumentation, since the parts where we can capture the interface/port and the actual flow
* creation happen at different times we are wrapping the handler with the interface/port data and reading that
* information when turning the handler function into a flow and wrapping it the same way we would for HTTP/1.
*/
onType("akka.http.scaladsl.Http2Ext")
.advise(method("bindAndHandleAsync") and isPublic(), classOf[Http2ExtBindAndHandleAdvice])

onType("akka.http.impl.engine.http2.Http2Blueprint$")
.intercept(method("handleWithStreamIdHeader"), Http2BlueprintInterceptor)

/**
* The rest of these sections are just about making sure that we can generate an appropriate operation name (i.e. free
* of variables) and take a Sampling Decision in case none has been taken so far.
Expand Down Expand Up @@ -286,4 +300,27 @@ object FastFutureTransformWithAdvice {
}
}
}
}


object Http2BlueprintInterceptor {

case class HandlerWithEndpoint(interface: String, port: Int, handler: HttpRequest => Future[HttpResponse])
extends (HttpRequest => Future[HttpResponse]) {

override def apply(request: HttpRequest): Future[HttpResponse] = handler(request)
}

@RuntimeType
def handleWithStreamIdHeader(@Argument(1) handler: HttpRequest => Future[HttpResponse],
@SuperCall zuper: Callable[Flow[HttpRequest, HttpResponse, NotUsed]]): Flow[HttpRequest, HttpResponse, NotUsed] = {

handler match {
case HandlerWithEndpoint(interface, port, _) =>
ServerFlowWrapper(zuper.call(), interface, port)

case _ =>
zuper.call()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import java.util.concurrent.Callable

import akka.http.scaladsl.marshalling.{ToResponseMarshallable, ToResponseMarshaller}
import akka.http.scaladsl.model.StatusCodes.Redirection
import akka.http.scaladsl.model.Uri
import akka.http.scaladsl.model.{HttpRequest, HttpResponse, Uri}
import akka.http.scaladsl.server.PathMatcher.{Matched, Unmatched}
import akka.http.scaladsl.server.directives.{BasicDirectives, CompleteOrRecoverWithMagnet, OnSuccessMagnet}
import akka.http.scaladsl.server.directives.RouteDirectives.reject
Expand All @@ -23,7 +23,10 @@ import scala.util.control.NonFatal
import scala.util.{Failure, Success, Try}
import java.util.regex.Pattern

import akka.NotUsed
import akka.stream.scaladsl.Flow
import kamon.context.Context
import kanela.agent.libs.net.bytebuddy.matcher.ElementMatchers.isPublic


class AkkaHttpServerInstrumentation extends InstrumentationBuilder {
Expand All @@ -40,6 +43,17 @@ class AkkaHttpServerInstrumentation extends InstrumentationBuilder {
onType("akka.http.scaladsl.HttpExt")
.advise(method("bindAndHandle"), classOf[HttpExtBindAndHandleAdvice])

/**
* For the HTTP/2 instrumentation, since the parts where we can capture the interface/port and the actual flow
* creation happen at different times we are wrapping the handler with the interface/port data and reading that
* information when turning the handler function into a flow and wrapping it the same way we would for HTTP/1.
*/
onType("akka.http.scaladsl.Http2Ext")
.advise(method("bindAndHandleAsync") and isPublic(), classOf[Http2ExtBindAndHandleAdvice])

onType("akka.http.impl.engine.http2.Http2Blueprint$")
.intercept(method("handleWithStreamIdHeader"), Http2BlueprintInterceptor)

/**
* The rest of these sections are just about making sure that we can generate an appropriate operation name (i.e. free
* of variables) and take a Sampling Decision in case none has been taken so far.
Expand Down Expand Up @@ -292,4 +306,27 @@ object FastFutureTransformWithAdvice {
}
}
}
}


object Http2BlueprintInterceptor {

case class HandlerWithEndpoint(interface: String, port: Int, handler: HttpRequest => Future[HttpResponse])
extends (HttpRequest => Future[HttpResponse]) {

override def apply(request: HttpRequest): Future[HttpResponse] = handler(request)
}

@RuntimeType
def handleWithStreamIdHeader(@Argument(1) handler: HttpRequest => Future[HttpResponse],
@SuperCall zuper: Callable[Flow[HttpRequest, HttpResponse, NotUsed]]): Flow[HttpRequest, HttpResponse, NotUsed] = {

handler match {
case HandlerWithEndpoint(interface, port, _) =>
ServerFlowWrapper(zuper.call(), interface, port)

case _ =>
zuper.call()
}
}
}
4 changes: 3 additions & 1 deletion kamon-akka-http/src/test/resources/application.conf
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
kamon {
trace.sampler = "always"
}
}

akka.http.server.preview.enable-http2 = on
40 changes: 40 additions & 0 deletions kamon-akka-http/src/test/resources/https/chain.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
-----BEGIN CERTIFICATE-----
MIIDJDCCAgwCFCBVhkPbLsrPvH5jjO4+u9O6rcRzMA0GCSqGSIb3DQEBCwUAMEUx
CzAJBgNVBAYTAkhSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
cm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTkwODEwMDgyODU3WhcNMjkwNTA5MDgy
ODU3WjBYMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE
CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMREwDwYDVQQDDAhrYW1vbi5pbzCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKmiEbbgaz+JzLCG0gDcPWFF
oecyEK18AwrrLLwSz+C3PhvYCGv9s/oqbEAfYX4LeFraVB9FopOhBYtpAvC1Kofz
5vVigFNx+Wq09fotHdKTwwHEa1gJczIic3eonKWNLTM6Ge0v7LY/b9Z9lB331TRU
2rePGYZIeO9DRF6snjLYt1YXpqLf7KS0Ue8rZKa8Y1fMUvOSATCX188XDIHalbNi
X4Ph+bJPHsJDGNvIY5/7PVX66bGjEOSoHovZu04mtn7icMUh24QF1YfTEYF7yVcy
7EP1+jLYHvBY3cgHt1j1n1StVMQVttD19T37dBYTLHlITO5ANtgTAbMemkS3vMsC
AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAFN7wTeOq7xTWYc4ffWvjf/uAYrhUXoRz
7fQRYaPdqNrmik3Dv+eo9akRr8PQeT8S8wH8nZyQi/V4HOCXOTjqIE9A+XVDysFF
8Ehs+nKSw6uZAQ5LMVab9GFVAK8CLwRuP03yclEB4thDzykAusZTz7CrfHI96lco
CTJda1YZAEX1Tq4oUsnBzjQ1Y67x9LR/svnLghdDFaN9EvXQOVp1uMDfWfIlD8Pd
ZqH/FC+PIZk8oT/DcgZDfH9JOnnqRpqmuZ3h6sdn66opDRCqD6wXpCwbgFwJAF/h
SOU4bRRVhMsWIoHc76Gc99P+5WQRSIfxU/pi0iqP7V8vRnfynuD0pg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwIBAgIUDA+mHhmaAXWoplJ+4vuWX27TNewwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCSFIxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA4MTAwODI3NTdaFw0yOTA1
MDkwODI3NTdaMEUxCzAJBgNVBAYTAkhSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDDcWKGaVMQgf2NaQCFsKRKSYI2B18gjVAeRDkvVWuf
XiR2ZH4DNMJ7H+FDN8G22ngkO/+3kIQ5cFh2lKgstjQUMu00Zc/xv+SYzL7WpgR6
r1rxMs4LSRvEg6UivLk79trdSME7fz6u/H3L5rR5J6B9ha+BKxn8+bOFZvC/GAM6
75u+C+7ymcVFEqZIKzPvY4kD+naIIr40hnHf1nwh0ku7wxr+ih460jwSQIM9iVPQ
LTmH1YbxtizBs4Fk3/qhEkiujtZPluQAD20wPkKU7kwMt0tVp2eBEahFkY+erwLS
my8viAT3Py4ACvMWGBTTg0GYr8s8/cpz4+UW3H99kx0rAgMBAAGjUzBRMB0GA1Ud
DgQWBBQbUz5bJSWJ6P8MEGTrMESAgcWSejAfBgNVHSMEGDAWgBQbUz5bJSWJ6P8M
EGTrMESAgcWSejAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAa
ffFvW1xdjQExZSANCOIxPpQL/tqVjzhVUEU4MK9vyZynemqdEXGeWg0P638wXsIc
U3baTmi0IFv+7XdLDSLPB83R6h4m03TBmYY8IfmedqppZVcKd4e1H+bzakMJS3FJ
Xq5/mt80Lb5FYaDw7OgYntdFPKW+wrIE+Hsz/lB0PxGUW2Qqvlt48fFuBbj0xR8n
InCUbr7bUz5K01med27ZrMrWrMfwMuUmxki3ZV6Gw0RYAottTfi5vjjR4j5Xm0nk
2AkQKVrKuVJvTGZdtXP80s0r7Ckk/inlKq7OyJth9Ff17uyIPcL1pBRhH7gVfc3I
p7S/IIgiwccbfMqVAKxe
-----END CERTIFICATE-----
21 changes: 21 additions & 0 deletions kamon-akka-http/src/test/resources/https/rootCA.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwIBAgIUDA+mHhmaAXWoplJ+4vuWX27TNewwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCSFIxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA4MTAwODI3NTdaFw0yOTA1
MDkwODI3NTdaMEUxCzAJBgNVBAYTAkhSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDDcWKGaVMQgf2NaQCFsKRKSYI2B18gjVAeRDkvVWuf
XiR2ZH4DNMJ7H+FDN8G22ngkO/+3kIQ5cFh2lKgstjQUMu00Zc/xv+SYzL7WpgR6
r1rxMs4LSRvEg6UivLk79trdSME7fz6u/H3L5rR5J6B9ha+BKxn8+bOFZvC/GAM6
75u+C+7ymcVFEqZIKzPvY4kD+naIIr40hnHf1nwh0ku7wxr+ih460jwSQIM9iVPQ
LTmH1YbxtizBs4Fk3/qhEkiujtZPluQAD20wPkKU7kwMt0tVp2eBEahFkY+erwLS
my8viAT3Py4ACvMWGBTTg0GYr8s8/cpz4+UW3H99kx0rAgMBAAGjUzBRMB0GA1Ud
DgQWBBQbUz5bJSWJ6P8MEGTrMESAgcWSejAfBgNVHSMEGDAWgBQbUz5bJSWJ6P8M
EGTrMESAgcWSejAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAa
ffFvW1xdjQExZSANCOIxPpQL/tqVjzhVUEU4MK9vyZynemqdEXGeWg0P638wXsIc
U3baTmi0IFv+7XdLDSLPB83R6h4m03TBmYY8IfmedqppZVcKd4e1H+bzakMJS3FJ
Xq5/mt80Lb5FYaDw7OgYntdFPKW+wrIE+Hsz/lB0PxGUW2Qqvlt48fFuBbj0xR8n
InCUbr7bUz5K01med27ZrMrWrMfwMuUmxki3ZV6Gw0RYAottTfi5vjjR4j5Xm0nk
2AkQKVrKuVJvTGZdtXP80s0r7Ckk/inlKq7OyJth9Ff17uyIPcL1pBRhH7gVfc3I
p7S/IIgiwccbfMqVAKxe
-----END CERTIFICATE-----
27 changes: 27 additions & 0 deletions kamon-akka-http/src/test/resources/https/rootCA.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAw3FihmlTEIH9jWkAhbCkSkmCNgdfII1QHkQ5L1Vrn14kdmR+
AzTCex/hQzfBttp4JDv/t5CEOXBYdpSoLLY0FDLtNGXP8b/kmMy+1qYEeq9a8TLO
C0kbxIOlIry5O/ba3UjBO38+rvx9y+a0eSegfYWvgSsZ/PmzhWbwvxgDOu+bvgvu
8pnFRRKmSCsz72OJA/p2iCK+NIZx39Z8IdJLu8Ma/ooeOtI8EkCDPYlT0C05h9WG
8bYswbOBZN/6oRJIro7WT5bkAA9tMD5ClO5MDLdLVadngRGoRZGPnq8C0psvL4gE
9z8uAArzFhgU04NBmK/LPP3Kc+PlFtx/fZMdKwIDAQABAoIBAG/vna07344h1TVL
gTgQjlfZuBD3sdzz8oITMulQNB6HjbydG6r8abKY9KxJ39G5WHvwPSpGQ+Sd2py3
0YYiKLu02zRaZ3mfHO8CvP41AXW+vwhLv8So75VijI7TpgeY/4sjY0CPRTh1dhr1
HEITlxCtI3KIXA8OeGocJiBcQWVb28GWx6A3R1W+CWcgydw4mR2S8YeCnS7y175s
Ni6emuQIb7CZp6sqGK5xXs/iy0RMLRNi6f5IEPH/zn+l1G+XmfR7HAL+CRTkuNDU
dlp30gUuOyntVZgzU5rSrt00vDg7TR92GLsFQscmdT+uIdhpy79yksA6K4e+VEOQ
D+hTSdECgYEA6tjZche6qcCM7vjKTqIEvcpKG4UdWAPH6qNwkn/V/hwqVwXzovej
TJwXvo9oq9MNOC3vBqpYpxa+pgcbfSEab8NtP4eMFZkB6mSDPMaQ+Mh3XfKio7U9
ghjnvLK0ravY0/sPltTZOjv6srY9+wGCD/Ung4SH9AhEmrXaD9P3T2MCgYEA1Qvy
TqW/s/xAC7JP/r3sLucitDfe4VV8KziwKv4rkjz1lbqp+NpJ6SYrn87R6HCjLzUA
rMCruN/JyIaHvcIEBJFeaLkld2BBGEeH4EEGuX1AiC3kUuxjrUbbsjLgq/edHXEi
sN7GaAIeqrcya5CSuXFmpB3Uuuas0K2gZeEsGZkCgYBhC98/gILIZyNWFUU0nUss
So25NZbcqiNQ2N1KDL2XVnhAodr+OysmG1LMkmKErqBF2OVvcbFUytdZsJIxcR6F
lNJucEr5GdNq0sJQuRVrWRvKnNuMnvad7kDE/2weYGcnohXdFHP31pVQiHKwaP0g
LwR3Gqs7srb237MO217VVQKBgByzgFBCGiJoQESTIB3EflYPQ2ieAkO/HXxBJdKU
7U/FMJycShvBZKWpQ8VCupqi2gkZDd84EapVU7zVCuJwidQHtX1MPBTp/bsEn/SB
LiO9EP2HmTPmrsMAQcau/f+M2zjFLhQ/3uDSMEl1ZrCBCJM9CMPhVPBc9TkjuvEe
ta85AoGBALxexsnE4SX3KREUmw7etEGOmnk2bpgVfCFe1ewDbCnsajAFKU9cizcx
EYVIOEkCuwX+VfHt2Z1yEJrWYtT8SoLwIJiZRNIns2iAtQiifaDOkBRewwNcM6p1
nKzia++0GpKhsj0CZ6zMpGx1/LzT26IceaRLSIHsE58OHG9kKlVz
-----END RSA PRIVATE KEY-----
1 change: 1 addition & 0 deletions kamon-akka-http/src/test/resources/https/rootCA.srl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
20558643DB2ECACFBC7E638CEE3EBBD3BAADC473
19 changes: 19 additions & 0 deletions kamon-akka-http/src/test/resources/https/server.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDJDCCAgwCFCBVhkPbLsrPvH5jjO4+u9O6rcRzMA0GCSqGSIb3DQEBCwUAMEUx
CzAJBgNVBAYTAkhSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
cm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTkwODEwMDgyODU3WhcNMjkwNTA5MDgy
ODU3WjBYMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE
CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMREwDwYDVQQDDAhrYW1vbi5pbzCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKmiEbbgaz+JzLCG0gDcPWFF
oecyEK18AwrrLLwSz+C3PhvYCGv9s/oqbEAfYX4LeFraVB9FopOhBYtpAvC1Kofz
5vVigFNx+Wq09fotHdKTwwHEa1gJczIic3eonKWNLTM6Ge0v7LY/b9Z9lB331TRU
2rePGYZIeO9DRF6snjLYt1YXpqLf7KS0Ue8rZKa8Y1fMUvOSATCX188XDIHalbNi
X4Ph+bJPHsJDGNvIY5/7PVX66bGjEOSoHovZu04mtn7icMUh24QF1YfTEYF7yVcy
7EP1+jLYHvBY3cgHt1j1n1StVMQVttD19T37dBYTLHlITO5ANtgTAbMemkS3vMsC
AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAFN7wTeOq7xTWYc4ffWvjf/uAYrhUXoRz
7fQRYaPdqNrmik3Dv+eo9akRr8PQeT8S8wH8nZyQi/V4HOCXOTjqIE9A+XVDysFF
8Ehs+nKSw6uZAQ5LMVab9GFVAK8CLwRuP03yclEB4thDzykAusZTz7CrfHI96lco
CTJda1YZAEX1Tq4oUsnBzjQ1Y67x9LR/svnLghdDFaN9EvXQOVp1uMDfWfIlD8Pd
ZqH/FC+PIZk8oT/DcgZDfH9JOnnqRpqmuZ3h6sdn66opDRCqD6wXpCwbgFwJAF/h
SOU4bRRVhMsWIoHc76Gc99P+5WQRSIfxU/pi0iqP7V8vRnfynuD0pg==
-----END CERTIFICATE-----
Loading

0 comments on commit f27fb4f

Please sign in to comment.