Skip to content

Commit c9d3d17

Browse files
[FSSDK-11177] review update 2
1 parent 90fdcf9 commit c9d3d17

File tree

4 files changed

+58
-2
lines changed

4 files changed

+58
-2
lines changed

OptimizelySDK/Bucketing/DecisionService.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,17 @@ public virtual Result<FeatureDecision> GetVariationForFeatureExperiment(
815815
decisionVariation = variationResult?.Variation;
816816
#if USE_CMAB
817817
cmabUuid = variationResult?.CmabUuid;
818+
819+
if (variationResult?.CmabError == true)
820+
{
821+
Logger.Log(LogLevel.ERROR,
822+
reasons.AddInfo(
823+
$"Failed to fetch CMAB decision for user \"{userId}\" in experiment \"{experiment.Key}\" of feature \"{featureFlag.Key}\"."));
824+
825+
var errorDecision = new FeatureDecision(experiment, null,
826+
FeatureDecision.DECISION_SOURCE_FEATURE_TEST, null, error: true);
827+
return Result<FeatureDecision>.NewResult(errorDecision, reasons);
828+
}
818829
#endif
819830
}
820831

@@ -825,7 +836,6 @@ public virtual Result<FeatureDecision> GetVariationForFeatureExperiment(
825836
$"The user \"{userId}\" is bucketed into experiment \"{experiment.Key}\" of feature \"{featureFlag.Key}\"."));
826837

827838
#if USE_CMAB
828-
// Extract CmabUuid from VariationDecisionResult
829839
var featureDecision = new FeatureDecision(experiment, decisionVariation,
830840
FeatureDecision.DECISION_SOURCE_FEATURE_TEST, cmabUuid);
831841
#else

OptimizelySDK/Entity/FeatureDecision.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ public class FeatureDecision
2525
public Variation Variation { get; }
2626
public string Source { get; }
2727
public string CmabUuid { get; }
28+
public bool Error { get; }
2829

29-
public FeatureDecision(ExperimentCore experiment, Variation variation, string source, string cmabUuid = null)
30+
public FeatureDecision(ExperimentCore experiment, Variation variation, string source, string cmabUuid = null, bool error = false)
3031
{
3132
Experiment = experiment;
3233
Variation = variation;
3334
Source = source;
3435
CmabUuid = cmabUuid;
36+
Error = error;
3537
}
3638
}
3739
}

OptimizelySDK/Optimizely.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,6 +1043,27 @@ internal Dictionary<string, OptimizelyDecision> DecideForKeys(OptimizelyUserCont
10431043
var flagDecision = flagDecisions[key];
10441044
var decisionReasons = decisionReasonsMap[key];
10451045

1046+
if (flagDecision?.Error == true)
1047+
{
1048+
var includeReasons = allOptions.Contains(OptimizelyDecideOption.INCLUDE_REASONS);
1049+
var reasonsToReport = decisionReasons.ToReport(includeReasons).ToArray();
1050+
1051+
var errorDecision = OptimizelyDecision.NewErrorDecision(
1052+
key,
1053+
user,
1054+
reasonsToReport,
1055+
ErrorHandler,
1056+
Logger
1057+
);
1058+
1059+
if (!allOptions.Contains(OptimizelyDecideOption.ENABLED_FLAGS_ONLY) ||
1060+
errorDecision.Enabled)
1061+
{
1062+
decisionDictionary.Add(key, errorDecision);
1063+
}
1064+
continue;
1065+
}
1066+
10461067
var optimizelyDecision = CreateOptimizelyDecision(user, key, flagDecision,
10471068
decisionReasons, allOptions.ToList(), projectConfig);
10481069
if (!allOptions.Contains(OptimizelyDecideOption.ENABLED_FLAGS_ONLY) ||

OptimizelySDK/OptimizelyDecisions/OptimizelyDecision.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,5 +107,28 @@ ILogger logger
107107
optimizelyUserContext,
108108
new string[] { error });
109109
}
110+
111+
/// <summary>
112+
/// Static function to return OptimizelyDecision with multiple error reasons.
113+
/// Similar to the single error overload but accepts an array of reasons.
114+
/// OptimizelyDecision will have null variation key, false enabled, empty variables, null rule key
115+
/// and the provided reasons array.
116+
/// </summary>
117+
public static OptimizelyDecision NewErrorDecision(string key,
118+
OptimizelyUserContext optimizelyUserContext,
119+
string[] reasons,
120+
IErrorHandler errorHandler,
121+
ILogger logger
122+
)
123+
{
124+
return new OptimizelyDecision(
125+
null,
126+
false,
127+
new OptimizelyJSON(new Dictionary<string, object>(), errorHandler, logger),
128+
null,
129+
key,
130+
optimizelyUserContext,
131+
reasons);
132+
}
110133
}
111134
}

0 commit comments

Comments
 (0)