Поделиться через


Управление функциями JavaScript

пакет feature-management-npm-package

Библиотека управления функциями 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% пользователей в течение указанного периода времени.

Потребление

Базовая форма управления функциями проверяет, включен ли флаг компонента, а затем выполняет действия на основе результата. Проверка состояния флага компонента выполняется с помощью FeatureManagerisEnabled метода.

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 этого не делает. Для этого можно настроить фильтр компонентов для ожидания параметров. Эти параметры будут указаны в конфигурации функции, и в коде они будут доступны через параметр IFeatureFilterEvaluationContextIFeatureFilter.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:

  1. Отдельные пользователи Джефф и Алисия получают доступ к бета-версии.
  2. Другой пользователь, Марк, просит принять участие и включен в список.
  3. Двадцать процентов группы, известной как "Ring1", участвуют в бета-тестировании.
  4. Число пользователей Ring1, включенных в бета-версию, увеличено до 100 процентов.
  5. Пять процентов пользовательской базы включены в бета-версию.
  6. Процент развертывания вырос до 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, которая включает в себя предоставление другой версии функции различным сегментам пользовательской базы и выбор версии на основе взаимодействия с пользователем. В этой библиотеке эта функция включена путем представления различных конфигураций компонента с вариантами.

Варианты позволяют флагу функции стать более простым флагом включения и выключения. Вариант представляет значение ключа функции, которое может быть строкой, числом, логическим значением или даже объектом конфигурации. Флаг компонента, объявляющий варианты, должен определять, в каких обстоятельствах следует использовать каждый вариант, который подробно рассматривается в разделе "Выделение вариантов ".

Получение варианта с контекстом нацеливания

Для каждой функции можно получить вариант с помощью FeatureManagergetVariant метода. Назначение вариантов зависит от пользователя, который в данный момент оценивается, и эта информация получается из передаваемого вами контекста таргетирования.

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 .

Следующие шаги

Чтобы узнать, как использовать флаги функций в приложениях, перейдите к следующим кратким руководствам.

Чтобы узнать, как использовать фильтры функций, перейдите к следующим руководствам.