Skip to content

Commit f88663a

Browse files
committed
fix: skip graph edge tracking events when node keys are blank
1 parent 23f1c50 commit f88663a

2 files changed

Lines changed: 49 additions & 0 deletions

File tree

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ public void trackPath(List<String> path) {
207207
* @param redirectedTarget the key of the node that was actually used
208208
*/
209209
public void trackRedirect(String sourceKey, String redirectedTarget) {
210+
if (isNullOrBlank(sourceKey) || isNullOrBlank(redirectedTarget)) {
211+
logger.debug("Skipping trackRedirect: sourceKey or redirectedTarget was null or blank.");
212+
return;
213+
}
210214
LDValue data = baseData()
211215
.put("sourceKey", sourceKey)
212216
.put("redirectedTarget", redirectedTarget)
@@ -223,6 +227,10 @@ public void trackRedirect(String sourceKey, String redirectedTarget) {
223227
* @param targetKey the key of the target node
224228
*/
225229
public void trackHandoffSuccess(String sourceKey, String targetKey) {
230+
if (isNullOrBlank(sourceKey) || isNullOrBlank(targetKey)) {
231+
logger.debug("Skipping trackHandoffSuccess: sourceKey or targetKey was null or blank.");
232+
return;
233+
}
226234
LDValue data = baseData()
227235
.put("sourceKey", sourceKey)
228236
.put("targetKey", targetKey)
@@ -239,6 +247,10 @@ public void trackHandoffSuccess(String sourceKey, String targetKey) {
239247
* @param targetKey the key of the target node
240248
*/
241249
public void trackHandoffFailure(String sourceKey, String targetKey) {
250+
if (isNullOrBlank(sourceKey) || isNullOrBlank(targetKey)) {
251+
logger.debug("Skipping trackHandoffFailure: sourceKey or targetKey was null or blank.");
252+
return;
253+
}
242254
LDValue data = baseData()
243255
.put("sourceKey", sourceKey)
244256
.put("targetKey", targetKey)
@@ -284,4 +296,8 @@ private ObjectBuilder baseData() {
284296
return b;
285297
}
286298

299+
private static boolean isNullOrBlank(String value) {
300+
return value == null || value.trim().isEmpty();
301+
}
302+
287303
}

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,17 @@ public void trackRedirectIsMultiFire() {
265265
eq("$ld:ai:graph:redirect"), any(), any(), anyDouble());
266266
}
267267

268+
@Test
269+
public void trackRedirectSkipsWhenKeyBlankOrNull() {
270+
tracker.trackRedirect(null, "target-b");
271+
tracker.trackRedirect("source-a", " ");
272+
tracker.trackRedirect("", "target-b");
273+
verify(client, never()).trackMetric(
274+
eq("$ld:ai:graph:redirect"), any(), any(), anyDouble());
275+
assertThat(debugs().stream().anyMatch(
276+
w -> w.contains("Skipping trackRedirect")), is(true));
277+
}
278+
268279
// ---- trackHandoffSuccess --------------------------------------------------
269280

270281
@Test
@@ -288,6 +299,17 @@ public void trackHandoffSuccessIsMultiFire() {
288299
eq("$ld:ai:graph:handoff_success"), any(), any(), anyDouble());
289300
}
290301

302+
@Test
303+
public void trackHandoffSuccessSkipsWhenKeyBlankOrNull() {
304+
tracker.trackHandoffSuccess(null, "target-b");
305+
tracker.trackHandoffSuccess("source-a", " ");
306+
tracker.trackHandoffSuccess("source-a", "");
307+
verify(client, never()).trackMetric(
308+
eq("$ld:ai:graph:handoff_success"), any(), any(), anyDouble());
309+
assertThat(debugs().stream().anyMatch(
310+
w -> w.contains("Skipping trackHandoffSuccess")), is(true));
311+
}
312+
291313
// ---- trackHandoffFailure --------------------------------------------------
292314

293315
@Test
@@ -311,6 +333,17 @@ public void trackHandoffFailureIsMultiFire() {
311333
eq("$ld:ai:graph:handoff_failure"), any(), any(), anyDouble());
312334
}
313335

336+
@Test
337+
public void trackHandoffFailureSkipsWhenKeyBlankOrNull() {
338+
tracker.trackHandoffFailure(null, "target-b");
339+
tracker.trackHandoffFailure("source-a", " ");
340+
tracker.trackHandoffFailure("source-a", "");
341+
verify(client, never()).trackMetric(
342+
eq("$ld:ai:graph:handoff_failure"), any(), any(), anyDouble());
343+
assertThat(debugs().stream().anyMatch(
344+
w -> w.contains("Skipping trackHandoffFailure")), is(true));
345+
}
346+
314347
// ---- getSummary -----------------------------------------------------------
315348

316349
@Test

0 commit comments

Comments
 (0)