|
17 | 17 |
|
18 | 18 | import grails.boot.GrailsApp; |
19 | 19 | import grails.boot.config.GrailsAutoConfiguration; |
20 | | -import io.opentelemetry.api.common.Attributes; |
21 | 20 | import io.opentelemetry.api.trace.SpanKind; |
22 | 21 | import io.opentelemetry.instrumentation.api.internal.HttpConstants; |
23 | 22 | import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; |
@@ -132,25 +131,40 @@ ConfigurableApplicationContext startServer(int port) { |
132 | 131 | return TestApplication.start(port, getContextPath()); |
133 | 132 | } |
134 | 133 |
|
135 | | - private static String getHandlerSpanName(ServerEndpoint endpoint) { |
| 134 | + private static String getHandlerMethod(ServerEndpoint endpoint) { |
136 | 135 | if (QUERY_PARAM.equals(endpoint)) { |
137 | | - return "TestController.query"; |
| 136 | + return "query"; |
138 | 137 | } else if (PATH_PARAM.equals(endpoint)) { |
139 | | - return "TestController.path"; |
| 138 | + return "path"; |
140 | 139 | } else if (CAPTURE_HEADERS.equals(endpoint)) { |
141 | | - return "TestController.captureHeaders"; |
| 140 | + return "captureHeaders"; |
142 | 141 | } else if (INDEXED_CHILD.equals(endpoint)) { |
143 | | - return "TestController.child"; |
| 142 | + return "child"; |
144 | 143 | } else if (NOT_FOUND.equals(endpoint)) { |
145 | | - return "ResourceHttpRequestHandler.handleRequest"; |
| 144 | + return "handleRequest"; |
146 | 145 | } |
147 | | - return "TestController." + endpoint.name().toLowerCase(Locale.ROOT); |
| 146 | + return endpoint.name().toLowerCase(Locale.ROOT); |
| 147 | + } |
| 148 | + |
| 149 | + private static String getHandlerClass(ServerEndpoint endpoint) { |
| 150 | + if (NOT_FOUND.equals(endpoint)) { |
| 151 | + return "org.springframework.web.servlet.resource.ResourceHttpRequestHandler"; |
| 152 | + } |
| 153 | + return "test.TestController"; |
148 | 154 | } |
149 | 155 |
|
150 | 156 | @Override |
151 | 157 | public SpanDataAssert assertHandlerSpan( |
152 | 158 | SpanDataAssert span, String method, ServerEndpoint endpoint) { |
153 | | - span.hasName(getHandlerSpanName(endpoint)).hasKind(SpanKind.INTERNAL); |
| 159 | + String handlerClass = getHandlerClass(endpoint); |
| 160 | + String handlerMethod = getHandlerMethod(endpoint); |
| 161 | + String handlerSpanName = |
| 162 | + handlerClass.substring(handlerClass.lastIndexOf('.') + 1) + "." + handlerMethod; |
| 163 | + span.hasName(handlerSpanName).hasKind(SpanKind.INTERNAL); |
| 164 | + |
| 165 | + span.hasAttributesSatisfyingExactly( |
| 166 | + SemconvCodeStabilityUtil.codeFunctionAssertions(handlerClass, handlerMethod)); |
| 167 | + |
154 | 168 | if (endpoint == EXCEPTION) { |
155 | 169 | span.hasStatus(StatusData.error()); |
156 | 170 | span.hasException(new IllegalStateException(EXCEPTION.getBody())); |
@@ -182,11 +196,14 @@ public List<Consumer<SpanDataAssert>> errorPageSpanAssertions( |
182 | 196 | String method, ServerEndpoint endpoint) { |
183 | 197 | List<Consumer<SpanDataAssert>> spanAssertions = new ArrayList<>(); |
184 | 198 | spanAssertions.add( |
185 | | - span -> |
186 | | - span.hasName( |
187 | | - endpoint == NOT_FOUND ? "ErrorController.notFound" : "ErrorController.index") |
188 | | - .hasKind(SpanKind.INTERNAL) |
189 | | - .hasAttributes(Attributes.empty())); |
| 199 | + span -> { |
| 200 | + String actionName = endpoint == NOT_FOUND ? "notFound" : "index"; |
| 201 | + span.hasName("ErrorController." + actionName) |
| 202 | + .hasKind(SpanKind.INTERNAL) |
| 203 | + .hasAttributesSatisfyingExactly( |
| 204 | + SemconvCodeStabilityUtil.codeFunctionAssertions( |
| 205 | + "test.ErrorController", actionName)); |
| 206 | + }); |
190 | 207 | if (endpoint == NOT_FOUND) { |
191 | 208 | spanAssertions.add( |
192 | 209 | span -> |
|
0 commit comments