Skip to content

Commit 4c2a589

Browse files
Fix after merge
1 parent 85a888a commit 4c2a589

File tree

9 files changed

+250
-24
lines changed

9 files changed

+250
-24
lines changed

dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.datadog.appsec;
22

3-
import com.datadog.appsec.api.security.ApiSecurityDownstreamSampler;
4-
import com.datadog.appsec.api.security.ApiSecurityDownstreamSamplerImpl;
53
import com.datadog.appsec.api.security.ApiSecuritySampler;
64
import com.datadog.appsec.api.security.ApiSecuritySamplerImpl;
75
import com.datadog.appsec.api.security.AppSecSpanPostProcessor;
@@ -47,8 +45,6 @@ public class AppSecSystem {
4745
private static Runnable RESET_SUBSCRIPTION_SERVICE;
4846
private static final AtomicBoolean API_SECURITY_INITIALIZED = new AtomicBoolean(false);
4947
private static volatile ApiSecuritySampler API_SECURITY_SAMPLER = new ApiSecuritySampler.NoOp();
50-
private static volatile ApiSecurityDownstreamSampler API_SECURITY_DOWNSTREAM_SAMPLER =
51-
new ApiSecurityDownstreamSampler.NoOp();
5248

5349
public static void start(SubscriptionService gw, SharedCommunicationObjects sco) {
5450
try {
@@ -90,7 +86,6 @@ private static void doStart(SubscriptionService gw, SharedCommunicationObjects s
9086
gw,
9187
REPLACEABLE_EVENT_PRODUCER,
9288
() -> API_SECURITY_SAMPLER,
93-
() -> API_SECURITY_DOWNSTREAM_SAMPLER,
9489
APP_SEC_CONFIG_SERVICE.getTraceSegmentPostProcessors());
9590

9691
loadModules(
@@ -217,9 +212,6 @@ private static void maybeInitializeApiSecurity() {
217212
SpanPostProcessor.Holder.INSTANCE =
218213
new AppSecSpanPostProcessor(requestSampler, REPLACEABLE_EVENT_PRODUCER);
219214
API_SECURITY_SAMPLER = requestSampler;
220-
221-
final double rate = Config.get().getApiSecurityDownstreamRequestAnalysisSampleRate();
222-
API_SECURITY_DOWNSTREAM_SAMPLER = new ApiSecurityDownstreamSamplerImpl(rate);
223215
}
224216
}
225217
}

dd-java-agent/appsec/src/main/java/com/datadog/appsec/api/security/ApiSecurityDownstreamSampler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public interface ApiSecurityDownstreamSampler {
1010

1111
class NoOp implements ApiSecurityDownstreamSampler {
1212

13+
public static final NoOp INSTANCE = new NoOp();
14+
1315
@Override
1416
public boolean sampleHttpClientRequest(AppSecRequestContext ctx, long requestId) {
1517
return false;

dd-java-agent/appsec/src/main/java/com/datadog/appsec/api/security/ApiSecurityDownstreamSamplerImpl.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.datadog.appsec.api.security;
22

33
import com.datadog.appsec.gateway.AppSecRequestContext;
4+
import datadog.trace.api.Config;
45
import java.util.concurrent.atomic.AtomicLong;
56

67
public class ApiSecurityDownstreamSamplerImpl implements ApiSecurityDownstreamSampler {
@@ -9,12 +10,16 @@ public class ApiSecurityDownstreamSamplerImpl implements ApiSecurityDownstreamSa
910
private final AtomicLong globalRequestCount;
1011
private final double threshold;
1112

12-
public ApiSecurityDownstreamSamplerImpl(double rate) {
13+
public ApiSecurityDownstreamSamplerImpl() {
14+
this(Config.get().getApiSecurityDownstreamRequestAnalysisSampleRate());
15+
}
16+
17+
public ApiSecurityDownstreamSamplerImpl(final double rate) {
1318
threshold = samplingCutoff(rate < 0.0 ? 0 : (rate > 1.0 ? 1 : rate));
1419
globalRequestCount = new AtomicLong(0);
1520
}
1621

17-
private static double samplingCutoff(double rate) {
22+
private static double samplingCutoff(final double rate) {
1823
final double max = Math.pow(2, 64) - 1;
1924
if (rate < 0.5) {
2025
return (long) (rate * max) + Long.MIN_VALUE;

dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import com.datadog.appsec.AppSecSystem;
1313
import com.datadog.appsec.api.security.ApiSecurityDownstreamSampler;
14+
import com.datadog.appsec.api.security.ApiSecurityDownstreamSamplerImpl;
1415
import com.datadog.appsec.api.security.ApiSecuritySampler;
1516
import com.datadog.appsec.config.TraceSegmentPostProcessor;
1617
import com.datadog.appsec.event.EventProducerService;
@@ -100,8 +101,8 @@ public class GatewayBridge {
100101
private final SubscriptionService subscriptionService;
101102
private final EventProducerService producerService;
102103
private final Supplier<ApiSecuritySampler> requestSamplerSupplier;
103-
private final Supplier<ApiSecurityDownstreamSampler> downstreamSamplerSupplier;
104104
private final List<TraceSegmentPostProcessor> traceSegmentPostProcessors;
105+
private volatile ApiSecurityDownstreamSampler downstreamSampler;
105106

106107
// subscriber cache
107108
private volatile DataSubscriberInfo initialReqDataSubInfo;
@@ -129,12 +130,10 @@ public GatewayBridge(
129130
SubscriptionService subscriptionService,
130131
EventProducerService producerService,
131132
@Nonnull Supplier<ApiSecuritySampler> requestSamplerSupplier,
132-
@Nonnull Supplier<ApiSecurityDownstreamSampler> downstreamSamplerSupplier,
133133
List<TraceSegmentPostProcessor> traceSegmentPostProcessors) {
134134
this.subscriptionService = subscriptionService;
135135
this.producerService = producerService;
136136
this.requestSamplerSupplier = requestSamplerSupplier;
137-
this.downstreamSamplerSupplier = downstreamSamplerSupplier;
138137
this.traceSegmentPostProcessors = traceSegmentPostProcessors;
139138
}
140139

@@ -331,8 +330,7 @@ private Flow<Boolean> onHttpClientSampling(RequestContext ctx_, final long reque
331330
if (ctx == null) {
332331
return new Flow.ResultFlow<>(false);
333332
}
334-
final ApiSecurityDownstreamSampler sampler = downstreamSamplerSupplier.get();
335-
return new Flow.ResultFlow<>(sampler.sampleHttpClientRequest(ctx, requestId));
333+
return new Flow.ResultFlow<>(downstreamSampler().sampleHttpClientRequest(ctx, requestId));
336334
}
337335

338336
private Flow<Void> onHttpClientRequest(RequestContext ctx_, HttpClientRequest request) {
@@ -347,8 +345,7 @@ private Flow<Void> onHttpClientRequest(RequestContext ctx_, HttpClientRequest re
347345
.add(KnownAddresses.IO_NET_REQUEST_METHOD, request.getMethod())
348346
.add(KnownAddresses.IO_NET_REQUEST_HEADERS, request.getHeaders());
349347

350-
final ApiSecurityDownstreamSampler sampler = downstreamSamplerSupplier.get();
351-
if (sampler.isSampled(ctx, request.getRequestId())) {
348+
if (downstreamSampler().isSampled(ctx, request.getRequestId())) {
352349
final Object body = parseHttpClientBody(ctx, request);
353350
if (body != null) {
354351
bundleBuilder.add(KnownAddresses.IO_NET_REQUEST_BODY, body);
@@ -388,8 +385,7 @@ private Flow<Void> onHttpClientResponse(RequestContext ctx_, HttpClientResponse
388385
.add(KnownAddresses.IO_NET_RESPONSE_STATUS, Integer.toString(response.getStatus()))
389386
.add(KnownAddresses.IO_NET_RESPONSE_HEADERS, response.getHeaders());
390387
// ignore the response if not sampled
391-
final ApiSecurityDownstreamSampler sampler = downstreamSamplerSupplier.get();
392-
if (sampler.isSampled(ctx, response.getRequestId())) {
388+
if (downstreamSampler().isSampled(ctx, response.getRequestId())) {
393389
final Object body = parseHttpClientBody(ctx, response);
394390
if (body != null) {
395391
bundleBuilder.add(KnownAddresses.IO_NET_RESPONSE_BODY, body);
@@ -1209,6 +1205,14 @@ private Flow<Void> maybePublishResponseData(AppSecRequestContext ctx) {
12091205
}
12101206
}
12111207

1208+
private ApiSecurityDownstreamSampler downstreamSampler() {
1209+
if (downstreamSampler == null) {
1210+
// we don't care about concurrency too much
1211+
downstreamSampler = new ApiSecurityDownstreamSamplerImpl();
1212+
}
1213+
return downstreamSampler;
1214+
}
1215+
12121216
private static Map<String, List<String>> parseQueryStringParams(
12131217
String queryString, Charset uriEncoding) {
12141218
if (queryString == null) {

dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/gateway/GatewayBridgeIGRegistrationSpecification.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class GatewayBridgeIGRegistrationSpecification extends DDSpecification {
1010
SubscriptionService ig = Mock()
1111
EventDispatcher eventDispatcher = Mock()
1212

13-
GatewayBridge bridge = new GatewayBridge(ig, eventDispatcher, null, null, [])
13+
GatewayBridge bridge = new GatewayBridge(ig, eventDispatcher, null, [])
1414

1515
void 'request_body_start and request_body_done are registered'() {
1616
given:

dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/gateway/GatewayBridgeSpecification.groovy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ class GatewayBridgeSpecification extends DDSpecification {
9292
TraceSegmentPostProcessor pp = Mock()
9393
ApiSecuritySamplerImpl requestSampler = Mock(ApiSecuritySamplerImpl)
9494
ApiSecurityDownstreamSampler downstreamSampler = Mock(ApiSecurityDownstreamSampler)
95-
GatewayBridge bridge = new GatewayBridge(ig, eventDispatcher, () -> requestSampler, () -> downstreamSampler, [pp])
95+
GatewayBridge bridge = new GatewayBridge(ig, eventDispatcher, () -> requestSampler, [pp]).tap {
96+
it.downstreamSampler = downstreamSampler
97+
}
9698

9799
Supplier<Flow<AppSecRequestContext>> requestStartedCB
98100
BiFunction<RequestContext, AgentSpan, Flow<Void>> requestEndedCB

dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/HttpClientTest.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@ abstract class HttpClientTest extends VersionedNamingTestBase {
847847
}
848848

849849

850-
@IgnoreIf({ !instance.testAppSecAnalysis() })
850+
@IgnoreIf({ !instance.testAppSecClientRequest() })
851851
void 'test appsec client request analysis'() {
852852
given:
853853
final url = server.address.resolve(endpoint)
@@ -992,7 +992,7 @@ abstract class HttpClientTest extends VersionedNamingTestBase {
992992
true
993993
}
994994

995-
boolean testAppSecAnalysis() {
995+
boolean testAppSecClientRequest() {
996996
false
997997
}
998998

0 commit comments

Comments
 (0)