Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Библиотека управления функциями JavaScript предоставляет способ разработки и предоставления функциональных возможностей приложений на основе флагов компонентов. После разработки новой функции многие приложения имеют особые требования, например, когда эта функция должна быть включена и в каких условиях. Эта библиотека предоставляет способ определения этих связей, а также интеграции с общими шаблонами кода JavaScript для предоставления этих функций.
Флаги функций позволяют приложениям JavaScript включать или отключать функции динамически. Разработчики могут использовать функциональные флаги в простых сценариях, таких как условные конструкции.
Ниже приведены некоторые преимущества использования библиотеки управления функциями JavaScript:
- Общее соглашение об управлении функциями
- Низкий барьер для входа
- Поддерживает как объекты JSON, так и источники флагов функций на основе карт
- Поддержка использования как в Node.js, так и в средах браузера
- Управление жизненным циклом фич-флагов в Конфигурации приложений Azure
- Значения конфигурации могут изменяться в режиме реального времени
- Простые и сложные сценарии, описанные
- Включение и отключение функций с помощью декларативного файла конфигурации
- Динамическое вычисление состояния функции на основе вызова сервера
Библиотека управления функциями JavaScript открытый код. Дополнительные сведения см. в репозитории GitHub.
Примечание.
Рекомендуется использовать библиотеку управления функциями вместе с Конфигурацией приложений Azure. Конфигурация приложений Azure предоставляет решение для централизованного управления параметрами приложения и флагами компонентов. Дополнительные сведения см. в этом разделе.
Флаги функций
Флаги компонентов состоят из двух частей, имени и списка фильтров функций, которые используются для включения функции.
Фильтры функций
Фильтры функций определяют сценарий, в котором должна быть включена функция. Если функция оценивается для того, включена ли она или отключена, список фильтров функций проходит до тех пор, пока один из фильтров не решит, что эта функция должна быть включена. На этом этапе функция считается включенной и прохождение через фильтры функций останавливается. Если фильтр компонентов не указывает, что эта функция должна быть включена, считается отключенной.
Например, можно создать фильтр функций браузера Microsoft Edge. Этот фильтр функций активирует все функции, подключенные к нему, если HTTP-запрос поступает из Microsoft Edge.
Конфигурация флага компонента
В JavaScript разработчики обычно используют объекты или карты в качестве основных структур данных для представления конфигураций. Библиотека управления функциями JavaScript поддерживает оба подхода к конфигурации, предоставляя разработчикам гибкость, чтобы выбрать вариант, который лучше всего соответствует их потребностям. Флаги возможностей FeatureManager
можно считывать из различных типов конфигурации с помощью встроенных ConfigurationObjectFeatureFlagProvider
и ConfigurationMapFeatureFlagProvider
.
const config = new Map([
["feature_management", {
"feature_flags": [
{
"id": "FeatureT",
"enabled": true
},
{
"id": "FeatureU",
"enabled": false
}
]
}],
["some other configuration", " some value"]
]);
import { ConfigurationMapFeatureFlagProvider, FeatureManager } from "@microsoft/feature-management";
const featureProvider = new ConfigurationMapFeatureFlagProvider(config);
const featureManager = new FeatureManager(featureProvider);
Используйте флаги функций в Конфигурации приложений Azure
Вместо того, чтобы прописывать флаги компонентов в коде приложения, рекомендуется хранить их за пределами приложения и управлять ими отдельно. Так вы можете изменять состояния флагов в любое время и немедленно применять эти изменения в приложении. Служба Конфигурации приложений Azure предоставляет выделенный пользовательский интерфейс портала для управления всеми флагами компонентов. Ознакомьтесь с руководством.
Служба Конфигурация приложений Azure также предоставляет флаги функций приложению непосредственно через клиентскую библиотеку JavaScript @azure/app-configuration-provider. В следующем примере показано, как использовать библиотеку.
Поставщик JavaScript для конфигурации приложений предоставляет флаги возможностей в объекте Map
. Встроенная ConfigurationMapFeatureFlagProvider
функция помогает загрузить флаги функций в этом случае.
import { DefaultAzureCredential } from "@azure/identity";
import { load } from "@azure/app-configuration-provider";
import { ConfigurationMapFeatureFlagProvider, FeatureManager } from "@microsoft/feature-management";
const appConfig = await load("YOUR_APP-CONFIG-ENDPOINT",
new DefaultAzureCredential(), // For more information: https://learn.microsoft.com/javascript/api/overview/azure/identity-readme
{ featureFlagOptions: { enabled: true } }); // load feature flags from Azure App Configuration service
const featureProvider = new ConfigurationMapFeatureFlagProvider(appConfig);
const featureManager = new FeatureManager(featureProvider);
Использование конфигурации приложений Azure для динамического управления состоянием флага функции
Конфигурация приложений Azure — это не только решение для внешнего использования хранилища и централизованного управления флагами функций, но и динамическое включение и отключение флагов функций.
Чтобы включить динамическое обновление флагов компонентов, необходимо настроить refresh
свойство featureFlagOptions
при загрузке флагов компонентов из конфигурации приложений Azure.
const appConfig = await load("YOUR_APP-CONFIG-ENDPOINT", new DefaultAzureCredential(), {
featureFlagOptions: {
enabled: true,
refresh: {
enabled: true, // enable the dynamic refresh for feature flags
refreshIntervalInMs: 30_000
}
}
});
const featureProvider = new ConfigurationMapFeatureFlagProvider(appConfig);
const featureManager = new FeatureManager(featureProvider);
Чтобы получить последнее состояние флага refresh
компонента, необходимо вызвать метод.
await appConfig.refresh(); // Refresh to get the latest feature flags
const isBetaEnabled = await featureManager.isEnabled("Beta");
console.log(`Beta is enabled: ${isBetaEnabled}`);
Примечание.
Дополнительные сведения об использовании библиотеки управления функциями с Azure App Configuration см. в кратком руководстве.
Объявление флага функции
В следующем примере показан формат, используемый для настройки флагов компонентов в JSON-файле.
{
"feature_management": {
"feature_flags": [
{
"id": "FeatureT",
"enabled": true
},
{
"id": "FeatureU",
"enabled": false
},
{
"id": "FeatureV",
"enabled": true,
"conditions": {
"client_filters": [
{
"name": "Microsoft.TimeWindow",
"parameters": {
"Start": "Wed, 01 May 2019 13:59:59 GMT",
"End": "Mon, 01 Jul 2019 00:00:00 GMT"
}
}
]
}
}
]
}
}
Этот feature_management
раздел обычно используется для загрузки параметров фич-флагов. Этот feature_flags
раздел содержит список флагов функций, загруженных в библиотеку. В приведенном выше разделе мы видим три различных компонента. Функции определяют фильтры функций с помощью client_filters
свойства внутри conditions
. В функциях фильтров для FeatureT
мы видим, что enabled
является true
без определенных фильтров, что приводит к тому, что FeatureT
всегда возвращает true
.
FeatureU
так же, как и FeatureT
, но с enabled
является false
, в результате чего функция всегда возвращает false
.
FeatureV
указывает фильтр признаков с именем Microsoft.TimeWindow
.
FeatureV
пример настраиваемого фильтра компонентов. Мы видим в примере, что фильтр имеет parameters
свойство. Свойство parameters
используется для настройки фильтра. В этом случае настроено время начала и окончания для активной функции.
Подробные схемы feature_management
раздела можно найти здесь.
Продвинутая настройка: Использование двоеточия ":" запрещено в именах флагов функций.
Тип требования
Свойство requirement_type
флага компонента используется для определения того, должны ли фильтры использовать Any
или All
логику при оценке состояния компонента. Если requirement_type
не указан, значение по умолчанию будет равно Any
.
-
Any
означает, что только один фильтр должен иметь значение true для включения функции. -
All
означает, что каждый фильтр должен иметь значение true для включения функции.
requirement_type
изменение All
изменяет обход. Во-первых, если фильтров нет, функция отключена. Затем осуществляется прохождение по фильтрам, пока один из них не решит, что функция должна быть отключена. Если фильтр не указывает, что функция должна быть отключена, она считается включенной.
{
"feature_management": {
"feature_flags": [
{
"id": "FeatureW",
"enabled": true,
"conditions": {
"requirement_type": "All",
"client_filters": [
{
"name": "Microsoft.TimeWindow",
"parameters": {
"Start": "Wed, 01 May 2019 13:59:59 GMT",
"End": "Mon, 01 Jul 2019 00:00:00 GMT"
}
},
{
"name": "Percentage",
"parameters": {
"Value": "50"
}
}
]
}
},
]
}
}
В приведенном выше примере FeatureW
задает requirement_type
со значением All
, что означает, что все его фильтры должны оцениваться как истинные, чтобы функция была активирована. В этом случае функция включена для 50% пользователей в течение указанного периода времени.
Потребление
Базовая форма управления функциями проверяет, включен ли флаг компонента, а затем выполняет действия на основе результата. Проверка состояния флага компонента выполняется с помощью FeatureManager
isEnabled
метода.
import { ConfigurationMapFeatureFlagProvider, FeatureManager } from "@microsoft/feature-management";
const featureProvider = new ConfigurationMapFeatureFlagProvider(config);
const featureManager = new FeatureManager(featureProvider);
const isBetaEnabled = await featureManager.isEnabled("Beta");
if (isBetaEnabled) {
// Do something
}
Реализация фильтра компонентов
Создание фильтра функций позволяет включить функции на основе заданных критериев. Для реализации фильтра признаков интерфейс IFeatureFilter
должен быть реализован.
IFeatureFilter
name
имеет свойство и метод с именемevaluate
. Он name
должен использоваться в конфигурации для ссылки на фильтр функций в флаге функции. Если функция указывает, что она может быть включена для фильтра функций, вызывается метод evaluate
. Если evaluate
возвращает true
, это означает, что функцию следует включить.
interface IFeatureFilter {
name: string;
evaluate(context: IFeatureFilterEvaluationContext, appContext?: unknown): boolean | Promise<boolean>;
}
В следующем фрагменте показано, как реализовать настраиваемый фильтр компонентов с именем MyCriteria
.
class MyCriteriaFilter {
name = "MyCriteria";
evaluate(context, appContext) {
if (satisfyCriteria()) {
return true;
}
else {
return false;
}
}
}
Необходимо зарегистрировать пользовательский фильтр в свойстве customFilters
объекта FeatureManagerOptions
, который передан в конструктор FeatureManager
.
const featureManager = new FeatureManager(ffProvider, {
customFilters: [
new MyCriteriaFilter() // add custom feature filters under FeatureManagerOptions.customFilters
]
});
Параметризованные фильтры компонентов
Некоторые фильтры функций требуют параметров, чтобы решить, следует ли включить или нет функцию. Например, фильтр функций браузера может включить функцию для определенного набора браузеров. Возможно, требуется, чтобы браузеры Edge и Chrome включили функцию, в то время как Firefox этого не делает. Для этого можно настроить фильтр компонентов для ожидания параметров. Эти параметры будут указаны в конфигурации функции, и в коде они будут доступны через параметр IFeatureFilterEvaluationContext
IFeatureFilter.Evaluate
.
interface IFeatureFilterEvaluationContext {
featureName: string;
parameters?: unknown;
}
IFeatureFilterEvaluationContext
имеет свойство с именем parameters
. Эти параметры представляют необработанную конфигурацию, которую фильтр компонентов может использовать для определения того, следует ли включить или нет эту функцию. Чтобы использовать фильтр функций браузера в качестве примера, фильтр может использовать parameters
для извлечения набора разрешенных браузеров, которые будут указаны для функции, а затем проверить, отправляется ли запрос из одного из этих браузеров.
Использование контекста приложения для оценки компонентов
Для оценки флага функции может потребоваться контекст приложения среды выполнения. Контекст можно передать в качестве параметра при вызове isEnabled
.
featureManager.isEnabled("Beta", { userId : "Sam" })
Фильтр возможностей может воспользоваться контекстом, передаваемым при вызове isEnabled
. Контекст приложения будет передан в качестве второго параметра IFeatureFilter.Evaluate
.
Встроенные фильтры функций
Существует два фильтра функций, которые поставляется с пакетом FeatureManagement
: TimeWindowFilter
и TargetingFilter
. Все встроенные фильтры функций будут добавлены по умолчанию при создании FeatureManager
.
Каждый из встроенных фильтров функций имеет собственные параметры. Ниже приведен список фильтров функций вместе с примерами.
Microsoft.TimeWindow
Этот фильтр предоставляет возможность включить функцию на основе периода времени. Если указан только End
, функция считается включенной до указанного времени. Если указан только Start
, функция считается включенной во всех точках после этого времени.
"client_filters": [
{
"name": "Microsoft.TimeWindow",
"parameters": {
"Start": "Wed, 01 May 2019 13:59:59 GMT",
"End": "Mon, 01 Jul 2019 00:00:00 GMT"
}
}
]
Microsoft.Targeting
Этот фильтр предоставляет возможность включить функцию для целевой аудитории. Подробное объяснение целевого назначения объясняется в приведенном ниже разделе о целевом объекте . Параметры фильтра включают Audience
объект, описывающий пользователей, групп, исключенных пользователей и групп, а также процент базы пользователей по умолчанию, который должен иметь доступ к этой функции. Каждый объект группы, указанный в Groups
разделе, также должен указывать, какой процент членов группы должен иметь доступ. Если пользователь указан в Exclusion
разделе, либо непосредственно, либо если пользователь находится в исключенной группе, функция отключена. В противном случае, если пользователь указан в Users
разделе напрямую, или если пользователь находится в процентах от любого из развернутых групп или если пользователь попадает в процент развертывания по умолчанию, то этот пользователь будет включен.
"client_filters": [
{
"name": "Microsoft.Targeting",
"parameters": {
"Audience": {
"Users": [
"Jeff",
"Alicia"
],
"Groups": [
{
"Name": "Ring0",
"RolloutPercentage": 100
},
{
"Name": "Ring1",
"RolloutPercentage": 50
}
],
"DefaultRolloutPercentage": 20,
"Exclusion": {
"Users": [
"Ross"
],
"Groups": [
"Ring2"
]
}
}
}
}
]
Таргетинг
Таргетинг — это стратегия управления функциональностью, которая позволяет разработчикам постепенно развертывать новые функции для пользовательской базы. Стратегия основана на концепции целевой аудитории для набора пользователей, известных как целевая аудитория. Аудитория состоит из конкретных пользователей, групп, исключенных пользователей и групп, и указанного процента всей базы пользователей. Группы, включенные в аудиторию, могут быть дополнительно разбиты по проценту их участников.
Ниже приведен пример прогрессивного развертывания для новой функции Beta:
- Отдельные пользователи Джефф и Алисия получают доступ к бета-версии.
- Другой пользователь, Марк, просит принять участие и включен в список.
- Двадцать процентов группы, известной как "Ring1", участвуют в бета-тестировании.
- Число пользователей Ring1, включенных в бета-версию, увеличено до 100 процентов.
- Пять процентов пользовательской базы включены в бета-версию.
- Процент развертывания вырос до 100 процентов, и функция полностью развернута.
Эта стратегия развертывания компонента встроена в библиотеку с помощью включенного фильтра компонентов Microsoft.Targeting .
Таргетирование пользователя с учётом целевого контекста
Фильтр целевых объектов зависит от контекста целевого объекта, чтобы оценить, следует ли включить функцию. Этот контекст целевого объекта содержит такую информацию, как какой пользователь в данный момент оценивается и в каких группах он состоит. Контекст целевого объекта должен передаваться непосредственно при isEnabled
вызове.
featureManager.isEnabled("Beta", { userId: "Aiden", groups: ["Ring1"] })
Исключение при нацеливании
При определении аудитории пользователи и группы могут быть исключены из аудитории. Исключения полезны, если функция развертывается в группе пользователей, но некоторые пользователи или группы должны быть исключены из развертывания. Исключение определяется путем добавления списка пользователей и групп в свойство Exclusion
для аудитории.
"Audience": {
"Users": [
"Jeff",
"Alicia"
],
"Groups": [
{
"Name": "Ring0",
"RolloutPercentage": 100
}
],
"DefaultRolloutPercentage": 0,
"Exclusion": {
"Users": [
"Mark"
]
}
}
В приведенном выше примере функция включена для пользователей с именем Jeff
и Alicia
. Он также включен для пользователей в группе с именем Ring0
. Однако если пользователь называется Mark
, функция отключена независимо от того, находятся ли они в группе Ring0
или нет. Исключения имеют приоритет над остальной частью целевого фильтра.
Варианты
При добавлении новых функций в приложение может возникнуть время, когда функция имеет несколько различных предлагаемых вариантов проектирования. Общее решение для принятия решения о проектировании — это некоторая форма тестирования A/B, которая включает в себя предоставление другой версии функции различным сегментам пользовательской базы и выбор версии на основе взаимодействия с пользователем. В этой библиотеке эта функция включена путем представления различных конфигураций компонента с вариантами.
Варианты позволяют флагу функции стать более простым флагом включения и выключения. Вариант представляет значение ключа функции, которое может быть строкой, числом, логическим значением или даже объектом конфигурации. Флаг компонента, объявляющий варианты, должен определять, в каких обстоятельствах следует использовать каждый вариант, который подробно рассматривается в разделе "Выделение вариантов ".
Получение варианта с контекстом нацеливания
Для каждой функции можно получить вариант с помощью FeatureManager
getVariant
метода. Назначение вариантов зависит от пользователя, который в данный момент оценивается, и эта информация получается из передаваемого вами контекста таргетирования.
const variant = await featureManager.getVariant("MyVariantFeatureFlag", { userId: "Sam" });
const variantName = variant.name;
const variantConfiguration = variant.configuration;
// Do something with the resulting variant and its configuration
Объявление флага функции Variant
По сравнению с обычными флагами функций флаги вариантов имеют два дополнительных свойства: variants
и allocation
. Это variants
массив, содержащий варианты, определенные для этой особенности. Свойство allocation
определяет, как эти варианты должны быть выделены для функции. Как и объявление обычных флагов функций, можно настроить флаги вариантных функций в JSON-файле. Пример флага функционального варианта.
{
"feature_management": {
"feature_flags": [
{
"id": "MyVariantFeatureFlag",
"enabled": true,
"allocation": {
"default_when_enabled": "Small",
"group": [
{
"variant": "Big",
"groups": [
"Ring1"
]
}
]
},
"variants": [
{
"name": "Big"
},
{
"name": "Small"
}
]
}
]
}
}
Определение вариантов
Каждый вариант имеет два свойства: имя и конфигурацию. Имя используется для ссылки на конкретный вариант, а конфигурация — это значение этого варианта. Конфигурацию можно задать с помощью configuration_value
свойства.
configuration_value
— это встроенная конфигурация, которая может быть строкой, номером, логическим объектом или объектом конфигурации. Если configuration_value
значение не указано, свойство возвращаемого варианта configuration
имеет значение undefined
.
Список всех возможных вариантов определяется для каждой функции в свойстве variants
.
{
"feature_management": {
"feature_flags": [
{
"id": "MyVariantFeatureFlag",
"variants": [
{
"name": "Big",
"configuration_value": {
"Size": 500
}
},
{
"name": "Small",
"configuration_value": {
"Size": 300
}
}
]
}
]
}
}
Выделение вариантов
Процесс выделения вариантов компонента определяется свойством allocation
функции.
"allocation": {
"default_when_enabled": "Small",
"default_when_disabled": "Small",
"user": [
{
"variant": "Big",
"users": [
"Marsha"
]
}
],
"group": [
{
"variant": "Big",
"groups": [
"Ring1"
]
}
],
"percentile": [
{
"variant": "Big",
"from": 0,
"to": 10
}
],
"seed": "13973240"
},
"variants": [
{
"name": "Big",
"configuration_value": "500px"
},
{
"name": "Small",
"configuration_value": "300px"
}
]
Параметр allocation
компонента имеет следующие свойства:
Свойство | Описание |
---|---|
default_when_disabled |
Указывает, какой вариант следует использовать при запросе варианта, когда функция считается отключенной. |
default_when_enabled |
Указывает, какой вариант следует использовать при запросе варианта, если компонент считается включенным, и другой вариант не был назначен пользователю. |
user |
Задает вариант и список пользователей, которым должен быть назначен этот вариант. |
group |
Задает вариант и список групп. Вариант назначается, если пользователь находится по крайней мере в одной из групп. |
percentile |
Задает вариант и процентный диапазон, в котором вычисляемый процент пользователя должен соответствовать назначенному варианту. |
seed |
Значение, используемое для процентных расчетов с percentile . Процентное вычисление для конкретного пользователя будет одинаковым для всех функций, если используется одно и то же seed значение. Если seed не указано, то начальное значение по умолчанию создается на основе названия функции. |
Если функция не включена, диспетчер компонентов назначает вариант, помеченный как default_when_disabled
, текущему пользователю, который является Small
в данном случае.
Если функция включена, диспетчер функций проверяет выделения user
, group
, и percentile
в этом порядке, чтобы назначить вариант. В этом примере, если вычисляемый пользователь называется Marsha
, в группе с именем Ring1
или пользователь попадает между 0 и 10-м процентилем, то указанный вариант назначается пользователю. В этом случае все назначенные пользователи возвращают вариант Big
. Если ни одно из этих распределений не соответствует, пользователю назначается вариант default_when_enabled
, который является Small
.
Логика распределения аналогична фильтру объектов Microsoft.Targeting, но существуют некоторые параметры, которые присутствуют в таргетинге, но отсутствуют в распределении, и наоборот. Результаты таргетинга и распределения не связаны.
Переопределение активного состояния с использованием варианта
Варианты можно использовать для переопределения состояния включенного функционального флага. Переопределение дает вариантам возможность расширить оценку флага функции. При вызове is_enabled
флага с вариантами менеджер функций проверяет, настроена ли конфигурация варианта, назначенного текущему пользователю, чтобы переопределить результат. Переопределение выполняется с помощью необязательного свойства варианта status_override
. По умолчанию это свойство имеет значение None
, что означает, что вариант не влияет на то, включен или отключен флаг. Параметр status_override
, установленный в Enabled
, позволяет выбранному варианту переопределить флаг для его активации. Установка параметра status_override
в Disabled
предоставляют противоположную функциональность, тем самым отключая флаг при выборе варианта. Функцию enabled
с состоянием false
нельзя переопределить.
Если вы используете флаг функции с двоичными вариантами, status_override
это свойство может оказаться полезным. Она позволяет вам продолжать использовать такие API, как is_enabled
в вашем приложении, одновременно извлекая преимущества новых функций, которые появляются с вариантами, такими как распределение процентилей и начальное число.
{
"id": "MyVariantFeatureFlag",
"enabled": true,
"allocation": {
"percentile": [
{
"variant": "On",
"from": 10,
"to": 20
}
],
"default_when_enabled": "Off",
"seed": "Enhanced-Feature-Group"
},
"variants": [
{
"name": "On"
},
{
"name": "Off",
"status_override": "Disabled"
}
]
}
В приведенном выше примере функция всегда включена. Возвращается вариант On
, если текущий пользователь находится в вычисляемом диапазоне процентиля от 10 до 20. В противном случае возвращается вариант Off
, и, так как status_override
равен Disabled
, функция теперь будет считаться отключенной.
Телеметрия
При развертывании изменения флага функции часто важно проанализировать его влияние на приложение. Например, вот несколько вопросов, которые могут возникнуть:
- Включены ли флаги и отключены ли они должным образом?
- Получают ли целевые пользователи доступ к определенной функции должным образом?
- Какой вариант видит конкретный пользователь?
Эти типы вопросов можно ответить с помощью выбросов и анализа событий оценки флага признаков.
Включение телеметрии
По умолчанию флаги функций не эмитируют телеметрию. Чтобы опубликовать данные телеметрии для заданного флажка, флажок ДОЛЖЕН объявить, что он включен для передачи данных телеметрии.
Для флагов компонентов, определенных в json, включение выполняется с помощью telemetry
свойства.
{
"feature_management": {
"feature_flags": [
{
"id": "MyFeatureFlag",
"enabled": true,
"telemetry": {
"enabled": true
}
}
]
}
}
Приведенный выше фрагмент определяет флаг компонента с именем MyFeatureFlag
, который включен для телеметрии. Для telemetry
свойства объекта enabled
задано значение true
. Значение enabled
свойства должно быть true
для публикации телеметрии для флага.
Раздел telemetry
флага компонента имеет следующие свойства:
Собственность | Описание |
---|---|
enabled |
Указывает, следует ли публиковать данные телеметрии для флага компонента. |
metadata |
Коллекция пар "ключ-значение", моделируемая как словарь, которая может использоваться для присоединения пользовательских метаданных о флажке функции к событиям оценки. |
Публикация телеметрии, настроенной пользователем
При создании onFeatureEvaluated
можно зарегистрировать функцию обратного FeatureManager
вызова. Этот обратный вызов вызывается всякий раз, когда вычисляется флаг функции, и для этого флага включена телеметрия. Функция обратного вызова принимает результат оценки функции в качестве параметра.
В следующем примере показано, как реализовать пользовательскую функцию обратного вызова для отправки данных телеметрии с информацией, извлеченной из результата оценки компонента, и зарегистрировать ее в диспетчере функций.
const sendTelemetry = (evaluationResult) => {
const featureId = evaluationResult.feature.id;
const featureEnabled = evaluationResult.enabled;
const targetingId = evaluationResult.targetingId;
const variantName = evaluationResult.variant?.name;
const variantAssignmentReason = evaluationResult.variantAssignmentReason;
// custom code to send the telemetry
// ...
}
const featureManager = new FeatureManager(featureProvider, { onFeatureEvaluated : sendTelemtry});
Интеграция с Application Insights
Библиотека управления функциями JavaScript предоставляет пакеты расширений, которые интегрируются с пакетами SDK Application Insights .
Application Insights предлагает различные пакеты SDK для веб-приложений и сценариев Node.js . Выберите правильные пакеты расширений для приложения.
Если приложение выполняется в браузере, установите "@microsoft/feature-management-applicationinsights-browser"
пакет. В следующем примере показано, как создать встроенного издателя телеметрии Application Insights и зарегистрировать его в диспетчере функций.
import { ApplicationInsights } from "@microsoft/applicationinsights-web"
import { FeatureManager, ConfigurationObjectFeatureFlagProvider } from "@microsoft/feature-management";
import { createTelemetryPublisher, trackEvent } from "@microsoft/feature-management-applicationinsights-browser";
const appInsights = new ApplicationInsights({ config: {
connectionString: "<APPINSIGHTS_CONNECTION_STRING>"
}});
appInsights.loadAppInsights();
const publishTelemetry = createTelemetryPublisher(appInsights);
const provider = new ConfigurationObjectFeatureFlagProvider(jsonObject);
const featureManager = new FeatureManager(provider, {onFeatureEvaluated: publishTelemetry});
// FeatureEvaluation event will be emitted when a feature flag is evaluated
featureManager.getVariant("TestFeature", {userId : TARGETING_ID}).then((variant) => { /* do something*/ });
// Emit a custom event with targeting id attached.
trackEvent(appInsights, TARGETING_ID, {name: "TestEvent"}, {"Tag": "Some Value"});
Издатель телеметрии отправляет FeatureEvaluation
пользовательские события в Application Insights при оценке флага компонента, включенного с помощью телеметрии. Настраиваемое событие следует схеме FeatureEvaluationEvent .
Следующие шаги
Чтобы узнать, как использовать флаги функций в приложениях, перейдите к следующим кратким руководствам.
Чтобы узнать, как использовать фильтры функций, перейдите к следующим руководствам.