Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions tracer/src/Datadog.Trace/FeatureFlags/FeatureFlagsEvaluator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,13 @@ private static bool EvaluateCondition(ConditionConfiguration condition, Evaluati
return CompareNumber(attributeValue, condition.Value, (a, b) => a <= b);
case ConditionOperator.LT:
return CompareNumber(attributeValue, condition.Value, (a, b) => a < b);
case ConditionOperator.SEMVER_EQ:
case ConditionOperator.SEMVER_NEQ:
case ConditionOperator.SEMVER_LT:
case ConditionOperator.SEMVER_LTE:
case ConditionOperator.SEMVER_GT:
case ConditionOperator.SEMVER_GTE:
return CompareSemanticVersion(attributeValue, condition.Value, condition.Operator.Value);
default:
throw new FormatException($"Unknown condition operator {condition.Operator.ToString()}");
}
Expand Down Expand Up @@ -371,6 +378,29 @@ private static bool CompareNumber(object attributeValue, object? conditionValue,
return comparator(a, b);
}

internal static bool CompareSemanticVersion(object attributeValue, object? conditionValue, ConditionOperator conditionOperator)
{
if (attributeValue is not string attribute
|| conditionValue is not string comparand
|| !SemanticVersion.TryParse(attribute, out var attributeVersion)
|| !SemanticVersion.TryParse(comparand, out var comparandVersion))
{
return false;
}

var ordering = attributeVersion.CompareTo(comparandVersion);
return conditionOperator switch
{
ConditionOperator.SEMVER_EQ => ordering == 0,
ConditionOperator.SEMVER_NEQ => ordering != 0,
ConditionOperator.SEMVER_LT => ordering < 0,
ConditionOperator.SEMVER_LTE => ordering <= 0,
ConditionOperator.SEMVER_GT => ordering > 0,
ConditionOperator.SEMVER_GTE => ordering >= 0,
_ => false,
};
}

private static bool MatchesShard(Shard shard, string? targetingKey)
{
if (shard.Ranges is null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ internal enum ConditionOperator
LTE,
GT,
GTE,
SEMVER_EQ,
SEMVER_NEQ,
SEMVER_LT,
SEMVER_LTE,
SEMVER_GT,
SEMVER_GTE,
MATCHES,
NOT_MATCHES,
ONE_OF,
Expand Down
Loading
Loading