From 8333ddf364c9d6618644fb18b989ff305e4f96e2 Mon Sep 17 00:00:00 2001 From: "alejandro.gonzalez" Date: Mon, 16 Jun 2025 09:22:58 +0200 Subject: [PATCH] http route fallback --- .../datadog/appsec/gateway/GatewayBridge.java | 8 ++++---- .../gateway/GatewayBridgeSpecification.groovy | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java index b4bdb9b64c9..0083e6c2c3b 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java @@ -773,11 +773,11 @@ private NoopFlow onRequestEnded(RequestContext ctx_, IGSpanInfo spanInfo) { private boolean maybeSampleForApiSecurity( AppSecRequestContext ctx, IGSpanInfo spanInfo, Map tags) { log.debug("Checking API Security for end of request handler on span: {}", spanInfo.getSpanId()); - // API Security sampling requires http.route tag. + // API Security sampling requires http.route tag. If it is not present, we set empty string to + // avoid filtering all requests when http route is not implemented for some frameworks. final Object route = tags.get(Tags.HTTP_ROUTE); - if (route != null) { - ctx.setRoute(route.toString()); - } + String routeStr = route != null ? route.toString() : ""; + ctx.setRoute(routeStr); return requestSampler.preSampleRequest(ctx); } diff --git a/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/gateway/GatewayBridgeSpecification.groovy b/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/gateway/GatewayBridgeSpecification.groovy index 6839b7061b9..a36dd4d5eda 100644 --- a/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/gateway/GatewayBridgeSpecification.groovy +++ b/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/gateway/GatewayBridgeSpecification.groovy @@ -1185,6 +1185,24 @@ class GatewayBridgeSpecification extends DDSpecification { 0 * traceSegment.setTagTop(Tags.PROPAGATED_TRACE_SOURCE, ProductTraceSource.ASM) } + void 'test api security sampling - No http route'() { + given: + AppSecRequestContext mockAppSecCtx = Mock(AppSecRequestContext) + RequestContext mockCtx = Stub(RequestContext) { + getData(RequestContextSlot.APPSEC) >> mockAppSecCtx + getTraceSegment() >> traceSegment + } + IGSpanInfo spanInfo = Mock(AgentSpan) + when: + def flow = requestEndedCB.apply(mockCtx, spanInfo) + then: + 1 * mockAppSecCtx.transferCollectedEvents() >> [] + 1 * spanInfo.getTags() >> ['http.route': null] + 1 * requestSampler.preSampleRequest(_) >> true + 0 * traceSegment.setTagTop(Tags.ASM_KEEP, true) + 0 * traceSegment.setTagTop(Tags.PROPAGATED_TRACE_SOURCE, ProductTraceSource.ASM) + } + void 'test api security sampling - trace excluded'() { given: AppSecRequestContext mockAppSecCtx = Mock(AppSecRequestContext)