Skip to content

Commit d288500

Browse files
authored
Fix XPASS for http.route in Java (#4274)
1 parent 1e22951 commit d288500

File tree

11 files changed

+78
-5
lines changed

11 files changed

+78
-5
lines changed

manifests/java.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1917,10 +1917,9 @@ tests/:
19171917
spring-boot-3-native: missing_feature (GraalVM. Tracing support only)
19181918
Test_StandardTagsMethod: v0.102.0
19191919
Test_StandardTagsRoute:
1920-
'*': missing_feature
1921-
spring-boot: v0.102.0
1922-
spring-boot-jetty: v0.102.0
1923-
spring-boot-wildfly: v0.102.0
1920+
'*': v0.102.0
1921+
akka-http: bug (AIDM-594)
1922+
play: bug (AIDM-593)
19241923
Test_StandardTagsStatusCode: v0.102.0
19251924
Test_StandardTagsUrl: v0.107.1
19261925
Test_StandardTagsUserAgent: v0.107.1

tests/test_standard_tags.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ def setup_route(self):
203203
self.r = weblog.get("/sample_rate_route/1")
204204

205205
def test_route(self):
206+
assert self.r.status_code == 200
207+
206208
tags = {"http.route": "/sample_rate_route/{i}"}
207209

208210
# specify the route syntax if needed
@@ -221,6 +223,9 @@ def test_route(self):
221223
tags["http.route"] = "/sample_rate_route/<i>"
222224
elif context.weblog_variant in ("django-poc", "python3.12", "django-py3.13"):
223225
tags["http.route"] = "sample_rate_route/<int:i>"
226+
if context.library == "java":
227+
if context.weblog_variant in ("ratpack", "vertx3", "vertx4"):
228+
tags["http.route"] = "/sample_rate_route/:i"
224229

225230
interfaces.library.add_span_tag_validation(request=self.r, tags=tags)
226231

utils/build/docker/java/akka-http/src/main/scala/com/datadoghq/akka_http/Main.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import scala.util.{Failure, Success, Try}
1515
object Main extends App {
1616

1717
private val bindingFuture: Future[Http.ServerBinding] =
18-
Http().newServerAt("0.0.0.0", 7777).bindFlow(AppSecRoutes.route ~ IastRoutes.route ~ RaspRoutes.route ~ HealthcheckRoutes.route)
18+
Http().newServerAt("0.0.0.0", 7777).bindFlow(MainRoutes.route ~ AppSecRoutes.route ~ IastRoutes.route ~ RaspRoutes.route ~ HealthcheckRoutes.route)
1919

2020
LoggerFactory.getLogger(this.getClass).info("Server online at port 7777")
2121
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.datadoghq.akka_http
2+
3+
import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse, StatusCodes}
4+
import akka.http.scaladsl.server.Directives._
5+
import akka.http.scaladsl.server.Route
6+
7+
object MainRoutes {
8+
9+
val route: Route = path("sample_rate_route" / """\d{1,3}""".r) { (i) =>
10+
get {
11+
complete(
12+
HttpResponse(
13+
status = StatusCodes.OK,
14+
entity = HttpEntity(ContentTypes.`text/plain(UTF-8)`, "OK\n")
15+
)
16+
)
17+
}
18+
}
19+
20+
}

utils/build/docker/java/jersey-grizzly2/src/main/java/com/datadoghq/jersey/MyResource.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,14 @@ public Response tagValuePostJson(@PathParam("tag_value") String value, @PathPara
118118
return tagValue(value, code);
119119
}
120120

121+
@GET
122+
@Path("/sample_rate_route/{i}")
123+
public Response sampleRateRoute(@PathParam("i") int i) {
124+
return Response.status(200)
125+
.header("content-type", "text/plain")
126+
.entity("OK\n").build();
127+
}
128+
121129
@GET
122130
@Path("/api_security/sampling/{i}")
123131
public Response apiSecuritySamplingWithStatus(@PathParam("i") int i) {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package controllers
2+
3+
import akka.stream.Materializer
4+
import play.api.libs.ws.WSClient
5+
import play.api.mvc._
6+
7+
import javax.inject.{Inject, Singleton}
8+
import scala.concurrent.ExecutionContext
9+
10+
@Singleton
11+
class MainController @Inject()(cc: MessagesControllerComponents, ws: WSClient, mat: Materializer)
12+
(implicit ec: ExecutionContext) extends AbstractController(cc) {
13+
14+
def sampleRateRoute(i: Int) = Action { request =>
15+
Results.Status(200)("OK!\n")
16+
.as("text/plain; charset=utf-8")
17+
}
18+
}

utils/build/docker/java/play/conf/routes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ GET /healthcheck controllers.AppSecController.healthcheck
33
GET /headers controllers.AppSecController.headers
44
GET /tag_value/:tag_value/:status_code controllers.AppSecController.tagValue(tag_value: String, status_code: Int)
55
POST /tag_value/:tag_value/:status_code controllers.AppSecController.tagValuePost(tag_value: String, status_code: Int)
6+
GET /sample_rate_route/:i controllers.MainController.sampleRateRoute(i: Int)
67
GET /api_security/sampling/:i controllers.AppSecController.apiSecuritySamplingWithStatus(i: Int)
78
GET /api_security_sampling/:i controllers.AppSecController.apiSecuritySampling(i: Int)
89
GET /params/*segments controllers.AppSecController.params(segments: Seq[String])

utils/build/docker/java/ratpack/src/main/java/com/datadoghq/ratpack/Main.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ public static void main(String[] args) throws Exception {
177177
ctx.getResponse().status(code).send("Value tagged");
178178
});
179179
})
180+
.get("sample_rate_route/:i", ctx -> {
181+
final int i = Integer.parseInt(ctx.getPathTokens().get("i"));
182+
ctx.getResponse().status(200).send("OK\n");
183+
})
180184
.get("api_security/sampling/:i", ctx -> {
181185
final int i = Integer.parseInt(ctx.getPathTokens().get("i"));
182186
ctx.getResponse().status(i).send("Hello!\n");

utils/build/docker/java/resteasy-netty3/src/main/java/com/datadoghq/resteasy/MyResource.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,14 @@ public Response tagValuePostJson(@PathParam("tag_value") String value, @PathPara
119119
return tagValue(value, code);
120120
}
121121

122+
@GET
123+
@Path("/sample_rate_route/{i}")
124+
public Response sampleRateRoute(@PathParam("i") int i) {
125+
return Response.status(200)
126+
.header("content-type", "text/plain")
127+
.entity("OK\n").build();
128+
}
129+
122130
@GET
123131
@Path("/api_security/sampling/{i}")
124132
public Response apiSecuritySamplingWithStatus(@PathParam("i") int i) {

utils/build/docker/java/vertx3/src/main/java/com/datadoghq/vertx3/Main.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ public static void main(String[] args) {
9797
.setStatusCode(Integer.parseInt(ctx.pathParam("status_code")))
9898
.end("Value tagged");
9999
});
100+
router.get("/sample_rate_route/:i")
101+
.handler(ctx -> {
102+
final int i = Integer.parseInt(ctx.pathParam("i"));
103+
ctx.response().setStatusCode(200).end("OK\n");
104+
});
100105
router.get("/api_security/sampling/:i")
101106
.produces("text/plain")
102107
.handler(ctx -> {

utils/build/docker/java/vertx4/src/main/java/com/datadoghq/vertx4/Main.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ public static void main(String[] args) {
9494
.setStatusCode(Integer.parseInt(ctx.pathParam("status_code")))
9595
.end("Value tagged");
9696
});
97+
router.get("/sample_rate_route/:i")
98+
.handler(ctx -> {
99+
final int i = Integer.parseInt(ctx.pathParam("i"));
100+
ctx.response().setStatusCode(200).end("OK\n");
101+
});
97102
router.get("/api_security/sampling/:i")
98103
.produces("text/plain")
99104
.handler(ctx -> {

0 commit comments

Comments
 (0)