Skip to content

Commit ea830f9

Browse files
committed
Force manual keep of traces for AI Guard
1 parent 2fa3c0c commit ea830f9

3 files changed

Lines changed: 16 additions & 0 deletions

File tree

dd-java-agent/agent-aiguard/src/main/java/com/datadog/aiguard/AIGuardInternal.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.squareup.moshi.Types;
1313
import datadog.communication.http.OkHttpUtils;
1414
import datadog.trace.api.Config;
15+
import datadog.trace.api.DDTags;
1516
import datadog.trace.api.aiguard.AIGuard;
1617
import datadog.trace.api.aiguard.AIGuard.AIGuardAbortError;
1718
import datadog.trace.api.aiguard.AIGuard.AIGuardClientError;
@@ -218,6 +219,10 @@ public Evaluation evaluate(final List<Message> messages, final Options options)
218219
builder.asChildOf(parent.context());
219220
}
220221
final AgentSpan span = builder.start();
222+
final AgentSpan localRootSpan = span.getLocalRootSpan();
223+
if (localRootSpan != null) {
224+
localRootSpan.setTag(DDTags.MANUAL_KEEP, true);
225+
}
221226
try (final AgentScope scope = tracer.activateSpan(span)) {
222227
final Message last = messages.get(messages.size() - 1);
223228
if (isToolCall(last)) {

dd-java-agent/agent-aiguard/src/test/groovy/com/datadog/aiguard/AIGuardInternalTests.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies
66
import com.squareup.moshi.Moshi
77
import datadog.common.version.VersionInfo
88
import datadog.trace.api.Config
9+
import datadog.trace.api.DDTags
910
import datadog.trace.api.aiguard.AIGuard
1011
import datadog.trace.api.telemetry.WafMetricCollector
1112
import datadog.trace.bootstrap.instrumentation.api.AgentSpan
@@ -72,12 +73,15 @@ class AIGuardInternalTests extends DDSpecification {
7273
protected static final PROMPT = TOOL_OUTPUT + [AIGuard.Message.message('assistant', '2 + 2 is 5'), AIGuard.Message.message('user', '')]
7374

7475
protected AgentSpan span
76+
protected AgentSpan localRootSpan
7577

7678
void setup() {
7779
injectEnvConfig('SERVICE', 'ai_guard_test')
7880
injectEnvConfig('ENV', 'test')
7981

8082
span = Mock(AgentSpan)
83+
localRootSpan = Mock(AgentSpan)
84+
span.getLocalRootSpan() >> localRootSpan
8185
final builder = Mock(AgentTracer.SpanBuilder) {
8286
start() >> span
8387
}
@@ -185,6 +189,7 @@ class AIGuardInternalTests extends DDSpecification {
185189

186190
then:
187191
1 * span.setTag(AIGuardInternal.TARGET_TAG, suite.target)
192+
1 * localRootSpan.setTag(DDTags.MANUAL_KEEP, true)
188193
if (suite.target == 'tool') {
189194
1 * span.setTag(AIGuardInternal.TOOL_TAG, 'calc')
190195
}

dd-smoke-tests/appsec/springboot/src/test/groovy/datadog/smoketest/appsec/AIGuardSmokeTest.groovy

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,15 @@ class AIGuardSmokeTest extends AbstractAppSecServerSmokeTest {
6969
?.find {
7070
it.resource == 'ai_guard'
7171
} as DecodedSpan
72+
final rootSpan = traces*.spans
73+
?.flatten()
74+
?.find {
75+
it.traceId == span.traceId && it.parentId == 0
76+
} as DecodedSpan
7277
assert span.meta.get('ai_guard.action') == action
7378
assert span.meta.get('ai_guard.reason') == reason
7479
assert span.meta.get('ai_guard.target') == 'prompt'
80+
assert rootSpan.metrics.get('_sampling_priority_v1') == 2
7581
final messages = span.metaStruct.get('ai_guard').messages as List<Map<String, Object>>
7682
assert messages.size() == 2
7783
with(messages[0]) {

0 commit comments

Comments
 (0)