diff --git a/core-api/src/main/java/com/optimizely/ab/Optimizely.java b/core-api/src/main/java/com/optimizely/ab/Optimizely.java index 4f942ff69..6eead11c6 100644 --- a/core-api/src/main/java/com/optimizely/ab/Optimizely.java +++ b/core-api/src/main/java/com/optimizely/ab/Optimizely.java @@ -1303,6 +1303,8 @@ private OptimizelyDecision createOptimizelyDecision( ProjectConfig projectConfig ) { String userId = user.getUserId(); + String experimentId = null; + String variationId = null; Boolean flagEnabled = false; if (flagDecision.variation != null) { @@ -1336,6 +1338,8 @@ private OptimizelyDecision createOptimizelyDecision( Boolean decisionEventDispatched = false; + experimentId = flagDecision.experiment != null ? flagDecision.experiment.getId() : null; + variationId = flagDecision.variation != null ? flagDecision.variation.getId() : null; Map attributes = user.getAttributes(); Map copiedAttributes = new HashMap<>(attributes); @@ -1362,6 +1366,8 @@ private OptimizelyDecision createOptimizelyDecision( .withRuleKey(ruleKey) .withReasons(reasonsToReport) .withDecisionEventDispatched(decisionEventDispatched) + .withExperimentId(experimentId) + .withVariationId(variationId) .build(); notificationCenter.send(decisionNotification); diff --git a/core-api/src/main/java/com/optimizely/ab/notification/DecisionNotification.java b/core-api/src/main/java/com/optimizely/ab/notification/DecisionNotification.java index d97e5bf40..ab3fdc03d 100644 --- a/core-api/src/main/java/com/optimizely/ab/notification/DecisionNotification.java +++ b/core-api/src/main/java/com/optimizely/ab/notification/DecisionNotification.java @@ -364,6 +364,8 @@ public static class FlagDecisionNotificationBuilder { public final static String RULE_KEY = "ruleKey"; public final static String REASONS = "reasons"; public final static String DECISION_EVENT_DISPATCHED = "decisionEventDispatched"; + public final static String EXPERIMENT_ID = "experimentId"; + public final static String VARIATION_ID = "variationId"; private String flagKey; private Boolean enabled; @@ -374,6 +376,8 @@ public static class FlagDecisionNotificationBuilder { private String ruleKey; private List reasons; private Boolean decisionEventDispatched; + private String experimentId; + private String variationId; private Map decisionInfo; @@ -422,6 +426,16 @@ public FlagDecisionNotificationBuilder withDecisionEventDispatched(Boolean dispa return this; } + public FlagDecisionNotificationBuilder withExperimentId(String experimentId) { + this.experimentId = experimentId; + return this; + } + + public FlagDecisionNotificationBuilder withVariationId(String variationId) { + this.variationId = variationId; + return this; + } + public DecisionNotification build() { if (flagKey == null) { throw new OptimizelyRuntimeException("flagKey not set"); @@ -439,6 +453,8 @@ public DecisionNotification build() { put(RULE_KEY, ruleKey); put(REASONS, reasons); put(DECISION_EVENT_DISPATCHED, decisionEventDispatched); + put(EXPERIMENT_ID, experimentId); + put(VARIATION_ID, variationId); }}; return new DecisionNotification( diff --git a/core-api/src/test/java/com/optimizely/ab/OptimizelyUserContextTest.java b/core-api/src/test/java/com/optimizely/ab/OptimizelyUserContextTest.java index 34cf61543..bb2d36192 100644 --- a/core-api/src/test/java/com/optimizely/ab/OptimizelyUserContextTest.java +++ b/core-api/src/test/java/com/optimizely/ab/OptimizelyUserContextTest.java @@ -707,6 +707,8 @@ public void decisionNotification() { OptimizelyJSON variables = optimizely.getAllFeatureVariables(flagKey, userId); String ruleKey = "exp_no_audience"; List reasons = Collections.emptyList(); + String experimentId = "10420810910"; + String variationId = "10418551353"; final Map testDecisionInfoMap = new HashMap<>(); testDecisionInfoMap.put(FLAG_KEY, flagKey); @@ -715,6 +717,8 @@ public void decisionNotification() { testDecisionInfoMap.put(VARIABLES, variables.toMap()); testDecisionInfoMap.put(RULE_KEY, ruleKey); testDecisionInfoMap.put(REASONS, reasons); + testDecisionInfoMap.put(EXPERIMENT_ID, experimentId); + testDecisionInfoMap.put(VARIATION_ID, variationId); Map attributes = Collections.singletonMap("gender", "f"); OptimizelyUserContext user = optimizely.createUserContext(userId, attributes);