Класс FlagEvaluator
Правила разрешения значения флага по элементу снимка конфигурации. Состояния не хранит, поэтому один экземпляр обслуживает любое число оценок.
Тот же класс используется сервером OneFlag. Общий код исключает расхождение между тем, что показывает дашборд, и тем, что видит приложение.
Исходник: src/Классы/FlagEvaluator.os
Конструктор
Новый FlagEvaluator()Параметров нет.
ОценитьПоСнимку
Функция ОценитьПоСнимку(Знач Ключ, Знач Настройка, Знач Контекст = Неопределено,
Знач ЗначениеПоУмолчанию = Неопределено) ЭкспортРазрешает значение флага по его настройке в окружении.
Параметры
| Параметр | Тип | Назначение |
|---|---|---|
Ключ | Строка | Ключ флага. Участвует в хешировании процентной выкатки |
Настройка | Соответствие | Элемент снимка конфигурации |
Контекст | Соответствие | Атрибуты пользователя, включая targetingKey |
ЗначениеПоУмолчанию | Произвольный | Значение при внештатной ситуации |
Поля Настройка:
| Поле | Тип | Назначение |
|---|---|---|
включен | Булево | Флаг включён в окружении |
варианты | Соответствие | Имя варианта → значение |
вариантПоУмолчанию | Строка | Вариант, когда правила не сработали |
процентВыкатки | Число | Доля аудитории, 100 по умолчанию |
правила | Массив | Правила таргетинга, проверяются по порядку |
Возвращаемое значение
Соответствие с полями:
| Поле | Тип | Содержимое |
|---|---|---|
значение | Произвольный | Значение варианта либо ЗначениеПоУмолчанию |
вариант | Строка | Имя выбранного варианта, пустая строка при отказе |
причина | Строка | STATIC, TARGETING_MATCH, SPLIT, DISABLED или ERROR |
кодОшибки | Строка | Код ошибки OpenFeature, пустая строка при успехе |
Порядок разрешения
Настройкане передана -ERRORс кодомFLAG_NOT_FOUND;включенне равноИстина- значение по умолчанию, причинаDISABLED;- сработало правило таргетинга - вариант правила, причина
TARGETING_MATCH; процентВыкаткине меньше 100 - вариант по умолчанию, причинаSTATIC;- в контексте нет непустого
targetingKey-ERRORс кодомTARGETING_KEY_MISSING; - пользователь не попал в выкатку - значение по умолчанию, причина
SPLIT; - иначе вариант по умолчанию, причина
SPLIT.
Без targetingKey процентная выкатка была бы случайной при каждом вызове, поэтому она не выполняется, а не выбирает наугад. Попадание считается через bucketer от пары «ключ флага + ключ таргетинга»: один и тот же пользователь всегда попадает в тот же бакет, поэтому при увеличении процента никто не выключается обратно.
Если варианты отсутствуют или названного варианта в них нет - ERROR с кодом PARSE_ERROR.
Правило таргетинга
{ "атрибут": "plan", "оператор": "равно", "значения": ["pro"], "вариант": "вкл" }| Поле | Назначение |
|---|---|
атрибут | Имя атрибута контекста. Отсутствующий атрибут правило пропускает |
оператор | См. таблицу ниже. По умолчанию равно |
значения | Массив эталонов. Пустой массив правило не выбирает |
вариант | Имя варианта при срабатывании |
Правила проверяются по порядку, срабатывает первое подошедшее.
Операторы
| Оператор | Условие |
|---|---|
равно | Значение атрибута совпадает с одним из эталонов |
не равно | Значение атрибута не совпадает ни с одним эталоном |
содержит | Эталон входит в значение как подстрока |
начинается с | Значение начинается с эталона |
заканчивается на | Значение заканчивается эталоном |
больше, меньше | Числовое сравнение |
версия равна, версия больше, версия меньше | Сравнение по semver |
версия в диапазоне | Вхождение в диапазон semver |
Нечисловое значение числовые операторы не выбирают, а не роняют оценку. То же с версиями: значение или эталон, которые версией не разбираются, правило не выбирает.
Диапазон принимает форму >=1.2.0, ^1.2.3, ~1.2, 1.2.x или составную >=1.0.0 <2.0.0. Составной диапазон собирается по частям: Версии.ВерсияВДиапазоне читает из строки только первое условие и молча отбрасывает остальные, из-за чего 5.0.0 прошла бы проверку >=1.0.0 <2.0.0. Пустой эталон диапазона считается ошибкой настройки и правило не выбирает, хотя semver трактовал бы его как *.
Оценщик = Новый FlagEvaluator();
Настройка = Новый Соответствие();
Настройка.Вставить("включен", Истина);
Настройка.Вставить("варианты", Новый Соответствие());
Настройка["варианты"].Вставить("вкл", Истина);
Настройка["варианты"].Вставить("выкл", Ложь);
Настройка.Вставить("вариантПоУмолчанию", "выкл");
Настройка.Вставить("процентВыкатки", 100);
Контекст = Новый Соответствие();
Контекст.Вставить("targetingKey", "user-42");
Оценка = Оценщик.ОценитьПоСнимку("new-checkout", Настройка, Контекст, Ложь);
Сообщить(Оценка["значение"]); // Ложь
Сообщить(Оценка["вариант"]); // выкл
Сообщить(Оценка["причина"]); // STATIC