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