Skip to content

Commit 3775fff

Browse files
committed
Improve detection of missing request end events
1 parent fa1d1fe commit 3775fff

File tree

5 files changed

+47
-1
lines changed

5 files changed

+47
-1
lines changed

dd-java-agent/appsec/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ dependencies {
2323
testImplementation project(':utils:test-utils')
2424
testImplementation group: 'org.hamcrest', name: 'hamcrest', version: '2.2'
2525
testImplementation group: 'com.flipkart.zjsonpatch', name: 'zjsonpatch', version: '0.4.11'
26+
testImplementation libs.logback.classic
2627

2728
testFixturesApi project(':dd-java-agent:testing')
2829
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ public class AppSecRequestContext implements DataBundle, Closeable {
143143
// keep a reference to the last published usr.session_id
144144
private volatile String sessionId;
145145

146+
// Used to detect missing request-end event at close.
147+
private volatile boolean requestEndCalled;
148+
146149
private static final AtomicIntegerFieldUpdater<AppSecRequestContext> WAF_TIMEOUTS_UPDATER =
147150
AtomicIntegerFieldUpdater.newUpdater(AppSecRequestContext.class, "wafTimeouts");
148151
private static final AtomicIntegerFieldUpdater<AppSecRequestContext> RASP_TIMEOUTS_UPDATER =
@@ -584,10 +587,15 @@ public void close() {
584587
/* Should be accessible from the modules */
585588

586589
public void close(boolean requiresPostProcessing) {
587-
if (additive != null || derivatives != null) {
590+
if (!requestEndCalled) {
591+
log.debug(SEND_TELEMETRY, "Request end event was not called before close");
592+
}
593+
if (additive != null) {
588594
log.debug(
589595
SEND_TELEMETRY, "WAF object had not been closed (probably missed request-end event)");
590596
closeAdditive();
597+
}
598+
if (derivatives != null) {
591599
derivatives = null;
592600
}
593601

@@ -699,4 +707,9 @@ public boolean isThrottled(RateLimiter rateLimiter) {
699707
public boolean isAdditiveClosed() {
700708
return additiveClosed;
701709
}
710+
711+
/** Must be called during request end event processing. */
712+
void setRequestEndCalled() {
713+
requestEndCalled = true;
714+
}
702715
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,7 @@ private NoopFlow onRequestEnded(RequestContext ctx_, IGSpanInfo spanInfo) {
767767
if (ctx == null) {
768768
return NoopFlow.INSTANCE;
769769
}
770+
ctx.setRequestEndCalled();
770771

771772
maybeExtractSchemas(ctx);
772773

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import com.datadog.appsec.config.CurrentAppSecConfig
55
import com.datadog.appsec.event.data.KnownAddresses
66
import com.datadog.appsec.event.data.MapDataBundle
77
import com.datadog.appsec.report.AppSecEvent
8+
import datadog.trace.api.telemetry.LogCollector
9+
import datadog.trace.test.logging.TestLogCollector
810
import datadog.trace.util.stacktrace.StackTraceEvent
911
import com.datadog.appsec.test.StubAppSecConfigService
1012
import datadog.trace.test.util.DDSpecification
@@ -316,4 +318,21 @@ class AppSecRequestContextSpecification extends DDSpecification {
316318
ctx.getWafError(AppSecRequestContext.DD_WAF_RUN_INVALID_ARGUMENT_ERROR) == 0
317319
ctx.getWafError(0) == 0
318320
}
321+
322+
void 'close logs if request end was not called'() {
323+
given:
324+
TestLogCollector.enable()
325+
def ctx = new AppSecRequestContext()
326+
327+
when:
328+
ctx.close()
329+
330+
then:
331+
def log = TestLogCollector.drainCapturedLogs().find { it.message.contains('Request end event was not called before close') }
332+
log != null
333+
log.marker == LogCollector.SEND_TELEMETRY
334+
335+
cleanup:
336+
TestLogCollector.disable()
337+
}
319338
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<configuration>
2+
<appender name="TEST" class="datadog.trace.test.logging.TestLogbackAppender"/>
3+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
4+
<encoder>
5+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
6+
</encoder>
7+
</appender>
8+
<root level="DEBUG">
9+
<appender-ref ref="TEST"/>
10+
<appender-ref ref="STDOUT"/>
11+
</root>
12+
</configuration>

0 commit comments

Comments
 (0)