Skip to content

Commit bdc8d10

Browse files
Fix startup perf issues
1 parent 1d1e4ed commit bdc8d10

File tree

4 files changed

+35
-39
lines changed

4 files changed

+35
-39
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public class AppSecSystem {
4646
private static Runnable RESET_SUBSCRIPTION_SERVICE;
4747
private static final AtomicBoolean API_SECURITY_INITIALIZED = new AtomicBoolean(false);
4848
private static volatile ApiSecuritySampler API_SECURITY_SAMPLER = new ApiSecuritySampler.NoOp();
49+
private static volatile ApiSecurityDownstreamSampler API_SECURITY_DOWNSTREAM_SAMPLER =
50+
new ApiSecurityDownstreamSampler.NoOp();
4951

5052
public static void start(SubscriptionService gw, SharedCommunicationObjects sco) {
5153
try {
@@ -82,14 +84,12 @@ private static void doStart(SubscriptionService gw, SharedCommunicationObjects s
8284
}
8385
sco.createRemaining(config);
8486

85-
final double maxDownstreamRequestsRate =
86-
config.getApiSecurityDownstreamRequestAnalysisSampleRate();
8787
GatewayBridge gatewayBridge =
8888
new GatewayBridge(
8989
gw,
9090
REPLACEABLE_EVENT_PRODUCER,
9191
() -> API_SECURITY_SAMPLER,
92-
ApiSecurityDownstreamSampler.build(maxDownstreamRequestsRate),
92+
() -> API_SECURITY_DOWNSTREAM_SAMPLER,
9393
APP_SEC_CONFIG_SERVICE.getTraceSegmentPostProcessors());
9494

9595
loadModules(
@@ -216,6 +216,9 @@ private static void maybeInitializeApiSecurity() {
216216
SpanPostProcessor.Holder.INSTANCE =
217217
new AppSecSpanPostProcessor(requestSampler, REPLACEABLE_EVENT_PRODUCER);
218218
API_SECURITY_SAMPLER = requestSampler;
219+
220+
final double rate = Config.get().getApiSecurityDownstreamRequestAnalysisSampleRate();
221+
API_SECURITY_DOWNSTREAM_SAMPLER = ApiSecurityDownstreamSampler.build(rate);
219222
}
220223
}
221224
}

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

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,35 +8,25 @@ public interface ApiSecurityDownstreamSampler {
88

99
boolean isSampled(AppSecRequestContext ctx, long requestId);
1010

11-
ApiSecurityDownstreamSampler INCLUDE_ALL =
12-
new ApiSecurityDownstreamSampler() {
13-
@Override
14-
public boolean sampleHttpClientRequest(AppSecRequestContext ctx, long requestId) {
15-
return true;
16-
}
17-
18-
@Override
19-
public boolean isSampled(AppSecRequestContext ctx, long requestId) {
20-
return true;
21-
}
22-
};
23-
24-
ApiSecurityDownstreamSampler INCLUDE_NONE =
25-
new ApiSecurityDownstreamSampler() {
26-
@Override
27-
public boolean sampleHttpClientRequest(AppSecRequestContext ctx, long requestId) {
28-
return false;
29-
}
30-
31-
@Override
32-
public boolean isSampled(AppSecRequestContext ctx, long requestId) {
33-
return false;
34-
}
35-
};
11+
class NoOp implements ApiSecurityDownstreamSampler {
12+
13+
@Override
14+
public boolean sampleHttpClientRequest(AppSecRequestContext ctx, long requestId) {
15+
return false;
16+
}
17+
18+
@Override
19+
public boolean isSampled(AppSecRequestContext ctx, long requestId) {
20+
return false;
21+
}
22+
}
3623

3724
static ApiSecurityDownstreamSampler build(double rate) {
38-
return rate <= 0D
39-
? INCLUDE_NONE
40-
: (rate >= 1D ? INCLUDE_ALL : new ApiSecurityDownstreamSamplerImpl(rate));
25+
if (rate < 0.0D) {
26+
rate = 0.D;
27+
} else if (rate > 1.0D) {
28+
rate = 1.0D;
29+
}
30+
return new ApiSecurityDownstreamSamplerImpl(rate);
4131
}
4232
}

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public class GatewayBridge {
100100
private final SubscriptionService subscriptionService;
101101
private final EventProducerService producerService;
102102
private final Supplier<ApiSecuritySampler> requestSamplerSupplier;
103-
private final ApiSecurityDownstreamSampler downstreamSampler;
103+
private final Supplier<ApiSecurityDownstreamSampler> downstreamSamplerSupplier;
104104
private final List<TraceSegmentPostProcessor> traceSegmentPostProcessors;
105105

106106
// subscriber cache
@@ -129,12 +129,12 @@ public GatewayBridge(
129129
SubscriptionService subscriptionService,
130130
EventProducerService producerService,
131131
@Nonnull Supplier<ApiSecuritySampler> requestSamplerSupplier,
132-
ApiSecurityDownstreamSampler downstreamSampler,
132+
@Nonnull Supplier<ApiSecurityDownstreamSampler> downstreamSamplerSupplier,
133133
List<TraceSegmentPostProcessor> traceSegmentPostProcessors) {
134134
this.subscriptionService = subscriptionService;
135135
this.producerService = producerService;
136136
this.requestSamplerSupplier = requestSamplerSupplier;
137-
this.downstreamSampler = downstreamSampler;
137+
this.downstreamSamplerSupplier = downstreamSamplerSupplier;
138138
this.traceSegmentPostProcessors = traceSegmentPostProcessors;
139139
}
140140

@@ -332,7 +332,8 @@ private Flow<Boolean> onHttpClientSampling(RequestContext ctx_, final long reque
332332
return new Flow.ResultFlow<>(null);
333333
}
334334
ctx.increaseHttpClientRequestCount();
335-
return new Flow.ResultFlow<>(downstreamSampler.sampleHttpClientRequest(ctx, requestId));
335+
final ApiSecurityDownstreamSampler sampler = downstreamSamplerSupplier.get();
336+
return new Flow.ResultFlow<>(sampler.sampleHttpClientRequest(ctx, requestId));
336337
}
337338

338339
private Flow<Void> onHttpClientRequest(RequestContext ctx_, HttpClientRequest request) {
@@ -346,8 +347,9 @@ private Flow<Void> onHttpClientRequest(RequestContext ctx_, HttpClientRequest re
346347
.add(KnownAddresses.IO_NET_URL, request.getUrl())
347348
.add(KnownAddresses.IO_NET_REQUEST_METHOD, request.getMethod())
348349
.add(KnownAddresses.IO_NET_REQUEST_HEADERS, request.getHeaders());
349-
;
350-
if (downstreamSampler.isSampled(ctx, request.getRequestId())) {
350+
351+
final ApiSecurityDownstreamSampler sampler = downstreamSamplerSupplier.get();
352+
if (sampler.isSampled(ctx, request.getRequestId())) {
351353
final Object body = parseHttpClientBody(ctx, request);
352354
if (body != null) {
353355
bundleBuilder.add(KnownAddresses.IO_NET_REQUEST_BODY, body);
@@ -387,7 +389,8 @@ private Flow<Void> onHttpClientResponse(RequestContext ctx_, HttpClientResponse
387389
.add(KnownAddresses.IO_NET_RESPONSE_STATUS, response.getStatus())
388390
.add(KnownAddresses.IO_NET_RESPONSE_HEADERS, response.getHeaders());
389391
// ignore the response if not sampled
390-
if (downstreamSampler.isSampled(ctx, response.getRequestId())) {
392+
final ApiSecurityDownstreamSampler sampler = downstreamSamplerSupplier.get();
393+
if (sampler.isSampled(ctx, response.getRequestId())) {
391394
final Object body = parseHttpClientBody(ctx, response);
392395
if (body != null) {
393396
bundleBuilder.add(KnownAddresses.IO_NET_RESPONSE_BODY, body);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ 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, () -> downstreamSampler, [pp])
9696

9797
Supplier<Flow<AppSecRequestContext>> requestStartedCB
9898
BiFunction<RequestContext, AgentSpan, Flow<Void>> requestEndedCB

0 commit comments

Comments
 (0)