Skip to content

Commit 4da5478

Browse files
committed
fix: downgrade null-arg track logs from warn to debug per spec
1 parent 4c96dca commit 4da5478

2 files changed

Lines changed: 32 additions & 18 deletions

File tree

lib/sdk/server-ai/src/main/java/com/launchdarkly/sdk/server/ai/internal/LDAIConfigTrackerImpl.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ public String getResumptionToken() {
155155
@Override
156156
public void trackDuration(Duration duration) {
157157
if (duration == null) {
158-
logger.warn("Skipping trackDuration: duration was null.");
158+
logger.debug("Skipping trackDuration: duration was null.");
159159
return;
160160
}
161161
long ms = Math.max(0L, duration.toMillis());
@@ -181,7 +181,7 @@ public <T> T trackDurationOf(Callable<T> operation) throws Exception {
181181
@Override
182182
public void trackTimeToFirstToken(Duration duration) {
183183
if (duration == null) {
184-
logger.warn("Skipping trackTimeToFirstToken: duration was null.");
184+
logger.debug("Skipping trackTimeToFirstToken: duration was null.");
185185
return;
186186
}
187187
long ms = Math.max(0L, duration.toMillis());
@@ -213,7 +213,7 @@ public void trackError() {
213213
@Override
214214
public void trackFeedback(FeedbackKind kind) {
215215
if (kind == null) {
216-
logger.warn("Skipping trackFeedback: kind was null.");
216+
logger.debug("Skipping trackFeedback: kind was null.");
217217
return;
218218
}
219219
// Resolve event name BEFORE claiming the guard — an exception here must not burn the slot.
@@ -228,7 +228,7 @@ public void trackFeedback(FeedbackKind kind) {
228228
@Override
229229
public void trackTokens(TokenUsage tokens) {
230230
if (tokens == null) {
231-
logger.warn("Skipping trackTokens: tokens was null.");
231+
logger.debug("Skipping trackTokens: tokens was null.");
232232
return;
233233
}
234234
boolean hasPositive = tokens.getTotal() > 0 || tokens.getInput() > 0 || tokens.getOutput() > 0;
@@ -254,7 +254,7 @@ public void trackTokens(TokenUsage tokens) {
254254
@Override
255255
public void trackToolCall(String toolKey) {
256256
if (toolKey == null) {
257-
logger.warn("Skipping trackToolCall: toolKey was null.");
257+
logger.debug("Skipping trackToolCall: toolKey was null.");
258258
return;
259259
}
260260
toolCalls.add(toolKey);
@@ -275,7 +275,7 @@ public void trackToolCalls(List<String> toolKeys) {
275275
@Override
276276
public void trackJudgeResult(JudgeResult result) {
277277
if (result == null) {
278-
logger.warn("Skipping trackJudgeResult: result was null.");
278+
logger.debug("Skipping trackJudgeResult: result was null.");
279279
return;
280280
}
281281
if (!result.isSampled()) {

lib/sdk/server-ai/src/test/java/com/launchdarkly/sdk/server/ai/internal/LDAIConfigTrackerImplTest.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.hamcrest.MatcherAssert.assertThat;
44
import static org.hamcrest.Matchers.containsInAnyOrder;
55
import static org.hamcrest.Matchers.containsString;
6+
import static org.hamcrest.Matchers.empty;
67
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
78
import static org.hamcrest.Matchers.is;
89
import static org.hamcrest.Matchers.notNullValue;
@@ -82,6 +83,13 @@ private List<String> warnings() {
8283
.collect(Collectors.toList());
8384
}
8485

86+
private List<String> debugs() {
87+
return logCapture.getMessages().stream()
88+
.filter(m -> m.getLevel() == LDLogLevel.DEBUG)
89+
.map(LogCapture.Message::getText)
90+
.collect(Collectors.toList());
91+
}
92+
8593
private LDValue baseExpectedData() {
8694
return LDValue.buildObject()
8795
.put("runId", RUN_ID)
@@ -172,10 +180,11 @@ public void trackDurationAtMostOnce() {
172180
}
173181

174182
@Test
175-
public void trackDurationNullIsIgnoredWithWarning() {
183+
public void trackDurationNullIsIgnoredWithDebugLog() {
176184
tracker.trackDuration(null);
177185
verify(client, never()).trackMetric(eq("$ld:ai:duration:total"), any(), any(), anyDouble());
178-
assertThat(warnings().size(), greaterThanOrEqualTo(1));
186+
assertThat(debugs().size(), greaterThanOrEqualTo(1));
187+
assertThat(warnings(), is(empty()));
179188
}
180189

181190
// ---- trackDurationOf ------------------------------------------------------
@@ -215,10 +224,11 @@ public void trackTimeToFirstTokenAtMostOnce() {
215224
}
216225

217226
@Test
218-
public void trackTimeToFirstTokenNullIsIgnoredWithWarning() {
227+
public void trackTimeToFirstTokenNullIsIgnoredWithDebugLog() {
219228
tracker.trackTimeToFirstToken(null);
220229
verify(client, never()).trackMetric(eq("$ld:ai:tokens:ttf"), any(), any(), anyDouble());
221-
assertThat(warnings().size(), greaterThanOrEqualTo(1));
230+
assertThat(debugs().size(), greaterThanOrEqualTo(1));
231+
assertThat(warnings(), is(empty()));
222232
}
223233

224234
// ---- trackSuccess / trackError --------------------------------------------
@@ -299,9 +309,10 @@ public void trackFeedbackAtMostOnce() {
299309
}
300310

301311
@Test
302-
public void trackFeedbackNullIsIgnoredWithWarning_slotNotBurned() {
312+
public void trackFeedbackNullIsIgnoredWithDebugLog_slotNotBurned() {
303313
tracker.trackFeedback(null);
304-
assertThat(warnings().size(), greaterThanOrEqualTo(1));
314+
assertThat(debugs().size(), greaterThanOrEqualTo(1));
315+
assertThat(warnings(), is(empty()));
305316
// Slot should not be burned — a subsequent valid call should still work
306317
tracker.trackFeedback(FeedbackKind.POSITIVE);
307318
verify(client, times(1)).trackMetric(eq("$ld:ai:feedback:user:positive"), any(), any(), anyDouble());
@@ -342,10 +353,11 @@ public void trackTokensAtMostOnce() {
342353
}
343354

344355
@Test
345-
public void trackTokensNullIsIgnoredWithWarning() {
356+
public void trackTokensNullIsIgnoredWithDebugLog() {
346357
tracker.trackTokens(null);
347358
verify(client, never()).trackMetric(eq("$ld:ai:tokens:total"), any(), any(), anyDouble());
348-
assertThat(warnings().size(), greaterThanOrEqualTo(1));
359+
assertThat(debugs().size(), greaterThanOrEqualTo(1));
360+
assertThat(warnings(), is(empty()));
349361
}
350362

351363
// ---- trackToolCall --------------------------------------------------------
@@ -382,10 +394,11 @@ public void trackToolCallsDelegate() {
382394
}
383395

384396
@Test
385-
public void trackToolCallNullIsIgnoredWithWarning() {
397+
public void trackToolCallNullIsIgnoredWithDebugLog() {
386398
tracker.trackToolCall(null);
387399
verify(client, never()).trackMetric(eq("$ld:ai:tool_call"), any(), any(), anyDouble());
388-
assertThat(warnings().size(), greaterThanOrEqualTo(1));
400+
assertThat(debugs().size(), greaterThanOrEqualTo(1));
401+
assertThat(warnings(), is(empty()));
389402
}
390403

391404
// ---- trackJudgeResult -----------------------------------------------------
@@ -470,9 +483,10 @@ public void trackJudgeResultIsNotAtMostOnce() {
470483
}
471484

472485
@Test
473-
public void trackJudgeResultNullIsIgnoredWithWarning() {
486+
public void trackJudgeResultNullIsIgnoredWithDebugLog() {
474487
tracker.trackJudgeResult(null);
475-
assertThat(warnings().size(), greaterThanOrEqualTo(1));
488+
assertThat(debugs().size(), greaterThanOrEqualTo(1));
489+
assertThat(warnings(), is(empty()));
476490
}
477491

478492
// ---- trackMetricsOf -------------------------------------------------------

0 commit comments

Comments
 (0)