Test fix
This commit is contained in:
parent
fe6eecf830
commit
094c83c190
|
|
@ -14,9 +14,6 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import static io.opentelemetry.trace.Span.Kind.INTERNAL
|
|
||||||
import static io.opentelemetry.trace.Span.Kind.SERVER
|
|
||||||
|
|
||||||
import io.opentelemetry.auto.test.AgentTestRunner
|
import io.opentelemetry.auto.test.AgentTestRunner
|
||||||
import io.opentelemetry.auto.test.utils.OkHttpUtils
|
import io.opentelemetry.auto.test.utils.OkHttpUtils
|
||||||
import io.opentelemetry.trace.attributes.SemanticAttributes
|
import io.opentelemetry.trace.attributes.SemanticAttributes
|
||||||
|
|
@ -34,6 +31,9 @@ import server.FooModel
|
||||||
import server.SpringWebFluxTestApplication
|
import server.SpringWebFluxTestApplication
|
||||||
import server.TestController
|
import server.TestController
|
||||||
|
|
||||||
|
import static io.opentelemetry.trace.Span.Kind.INTERNAL
|
||||||
|
import static io.opentelemetry.trace.Span.Kind.SERVER
|
||||||
|
|
||||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = [SpringWebFluxTestApplication, ForceNettyAutoConfiguration])
|
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = [SpringWebFluxTestApplication, ForceNettyAutoConfiguration])
|
||||||
class SpringWebfluxTest extends AgentTestRunner {
|
class SpringWebfluxTest extends AgentTestRunner {
|
||||||
|
|
||||||
|
|
@ -131,7 +131,6 @@ class SpringWebfluxTest extends AgentTestRunner {
|
||||||
response.code == 200
|
response.code == 200
|
||||||
response.body().string() == expectedResponseBody
|
response.body().string() == expectedResponseBody
|
||||||
assertTraces(1) {
|
assertTraces(1) {
|
||||||
println TEST_WRITER
|
|
||||||
trace(0, 3) {
|
trace(0, 3) {
|
||||||
span(0) {
|
span(0) {
|
||||||
operationName urlPathWithVariables
|
operationName urlPathWithVariables
|
||||||
|
|
@ -173,7 +172,7 @@ class SpringWebfluxTest extends AgentTestRunner {
|
||||||
}
|
}
|
||||||
span(2) {
|
span(2) {
|
||||||
operationName "tracedMethod"
|
operationName "tracedMethod"
|
||||||
childOf span(1)
|
childOf span(0)
|
||||||
errored false
|
errored false
|
||||||
attributes {
|
attributes {
|
||||||
}
|
}
|
||||||
|
|
@ -184,14 +183,96 @@ class SpringWebfluxTest extends AgentTestRunner {
|
||||||
where:
|
where:
|
||||||
testName | urlPath | urlPathWithVariables | annotatedMethod | expectedResponseBody
|
testName | urlPath | urlPathWithVariables | annotatedMethod | expectedResponseBody
|
||||||
"functional API traced method from mono" | "/greet-mono-from-callable/4" | "/greet-mono-from-callable/{id}" | null | SpringWebFluxTestApplication.GreetingHandler.DEFAULT_RESPONSE + " 4"
|
"functional API traced method from mono" | "/greet-mono-from-callable/4" | "/greet-mono-from-callable/{id}" | null | SpringWebFluxTestApplication.GreetingHandler.DEFAULT_RESPONSE + " 4"
|
||||||
"functional API traced method" | "/greet-traced-method/5" | "/greet-traced-method/{id}" | null | SpringWebFluxTestApplication.GreetingHandler.DEFAULT_RESPONSE + " 5"
|
|
||||||
"functional API traced method with delay" | "/greet-delayed-mono/6" | "/greet-delayed-mono/{id}" | null | SpringWebFluxTestApplication.GreetingHandler.DEFAULT_RESPONSE + " 6"
|
"functional API traced method with delay" | "/greet-delayed-mono/6" | "/greet-delayed-mono/{id}" | null | SpringWebFluxTestApplication.GreetingHandler.DEFAULT_RESPONSE + " 6"
|
||||||
|
|
||||||
"annotation API traced method from mono" | "/foo-mono-from-callable/7" | "/foo-mono-from-callable/{id}" | "getMonoFromCallable" | new FooModel(7L, "tracedMethod").toString()
|
"annotation API traced method from mono" | "/foo-mono-from-callable/7" | "/foo-mono-from-callable/{id}" | "getMonoFromCallable" | new FooModel(7L, "tracedMethod").toString()
|
||||||
"annotation API traced method" | "/foo-traced-method/8" | "/foo-traced-method/{id}" | "getTracedMethod" | new FooModel(8L, "tracedMethod").toString()
|
|
||||||
"annotation API traced method with delay" | "/foo-delayed-mono/9" | "/foo-delayed-mono/{id}" | "getFooDelayedMono" | new FooModel(9L, "tracedMethod").toString()
|
"annotation API traced method with delay" | "/foo-delayed-mono/9" | "/foo-delayed-mono/{id}" | "getFooDelayedMono" | new FooModel(9L, "tracedMethod").toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This test differs from the previous in one important aspect.
|
||||||
|
The test above calls endpoints which does not create any spans during their invocation.
|
||||||
|
They merely assemble reactive pipeline where some steps create spans.
|
||||||
|
Thus all those spans are created when WebFlux span created by DispatcherHandlerInstrumentation
|
||||||
|
has already finished. Therefore, they have `SERVER` span as their parent.
|
||||||
|
|
||||||
|
This test below calls endpoints which do create spans right inside endpoint handler.
|
||||||
|
Therefore, in theory, those spans should have INTERNAL span created by DispatcherHandlerInstrumentation
|
||||||
|
as their parent. But there is a difference how Spring WebFlux handles functional endpoints
|
||||||
|
(created in server.SpringWebFluxTestApplication.greetRouterFunction) and annotated endpoints
|
||||||
|
(created in server.TestController).
|
||||||
|
In the former case org.springframework.web.reactive.function.server.support.HandlerFunctionAdapter.handle
|
||||||
|
calls handler function directly. Thus "tracedMethod" span below has INTERNAL handler span as its parent.
|
||||||
|
In the latter case org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter.handle
|
||||||
|
merely wraps handler call into Mono and thus actual invocation of handler function happens later,
|
||||||
|
when INTERNAL handler span has already finished. Thus, "tracedMethod" has SERVER Netty span as its parent.
|
||||||
|
*/
|
||||||
|
def "Create span during handler function"() {
|
||||||
|
setup:
|
||||||
|
String url = "http://localhost:$port$urlPath"
|
||||||
|
def request = new Request.Builder().url(url).get().build()
|
||||||
|
when:
|
||||||
|
def response = client.newCall(request).execute()
|
||||||
|
|
||||||
|
then:
|
||||||
|
response.code == 200
|
||||||
|
response.body().string() == expectedResponseBody
|
||||||
|
assertTraces(1) {
|
||||||
|
trace(0, 3) {
|
||||||
|
span(0) {
|
||||||
|
operationName urlPathWithVariables
|
||||||
|
spanKind SERVER
|
||||||
|
parent()
|
||||||
|
attributes {
|
||||||
|
"${SemanticAttributes.NET_PEER_IP.key()}" "127.0.0.1"
|
||||||
|
"${SemanticAttributes.NET_PEER_PORT.key()}" Long
|
||||||
|
"${SemanticAttributes.HTTP_URL.key()}" url
|
||||||
|
"${SemanticAttributes.HTTP_METHOD.key()}" "GET"
|
||||||
|
"${SemanticAttributes.HTTP_STATUS_CODE.key()}" 200
|
||||||
|
"${SemanticAttributes.HTTP_FLAVOR.key()}" "HTTP/1.1"
|
||||||
|
"${SemanticAttributes.HTTP_USER_AGENT.key()}" String
|
||||||
|
"${SemanticAttributes.HTTP_CLIENT_IP.key()}" "127.0.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
span(1) {
|
||||||
|
if (annotatedMethod == null) {
|
||||||
|
// Functional API
|
||||||
|
operationNameContains(SPRING_APP_CLASS_ANON_NESTED_CLASS_PREFIX, ".handle")
|
||||||
|
} else {
|
||||||
|
// Annotation API
|
||||||
|
operationName TestController.getSimpleName() + "." + annotatedMethod
|
||||||
|
}
|
||||||
|
spanKind INTERNAL
|
||||||
|
childOf span(0)
|
||||||
|
attributes {
|
||||||
|
if (annotatedMethod == null) {
|
||||||
|
// Functional API
|
||||||
|
"request.predicate" "(GET && $urlPathWithVariables)"
|
||||||
|
"handler.type" { String tagVal ->
|
||||||
|
return tagVal.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Annotation API
|
||||||
|
"handler.type" TestController.getName()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
span(2) {
|
||||||
|
operationName "tracedMethod"
|
||||||
|
childOf span(annotatedMethod ? 0 : 1)
|
||||||
|
errored false
|
||||||
|
attributes {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
where:
|
||||||
|
testName | urlPath | urlPathWithVariables | annotatedMethod | expectedResponseBody
|
||||||
|
"functional API traced method" | "/greet-traced-method/5" | "/greet-traced-method/{id}" | null | SpringWebFluxTestApplication.GreetingHandler.DEFAULT_RESPONSE + " 5"
|
||||||
|
"annotation API traced method" | "/foo-traced-method/8" | "/foo-traced-method/{id}" | "getTracedMethod" | new FooModel(8L, "tracedMethod").toString()
|
||||||
|
}
|
||||||
|
|
||||||
def "404 GET test"() {
|
def "404 GET test"() {
|
||||||
setup:
|
setup:
|
||||||
String url = "http://localhost:$port/notfoundgreet"
|
String url = "http://localhost:$port/notfoundgreet"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue