Udostępnij za pośrednictwem


Zarządzanie funkcjami języka JavaScript

feature-management-npm-package

Biblioteka zarządzania funkcjami języka JavaScript umożliwia opracowywanie i uwidacznianie funkcji aplikacji na podstawie flag funkcji. Po utworzeniu nowej funkcji wiele aplikacji ma specjalne wymagania, takie jak włączenie funkcji i określenie warunków. Ta biblioteka umożliwia zdefiniowanie tych relacji, a także integruje się z typowymi wzorcami kodu JavaScript, aby uwidocznić te funkcje.

Flagi funkcji umożliwiają aplikacjom JavaScript dynamiczne włączanie lub wyłączanie funkcji. Deweloperzy mogą używać flag funkcji w prostych przypadkach użycia, takich jak instrukcje warunkowe.

Poniżej przedstawiono niektóre korzyści wynikające z używania biblioteki zarządzania funkcjami języka JavaScript:

  • Wspólna konwencja zarządzania funkcjami
  • Niska bariera wejścia
    • Obsługuje zarówno obiekty JSON, jak i źródła flag funkcji oparte na mapie
    • Obsługuje użycie w środowiskach Node.js i przeglądarki
  • Zarządzanie okresem istnienia flag funkcji przy użyciu konfiguracji aplikacja systemu Azure
    • Wartości konfiguracji mogą ulec zmianie w czasie rzeczywistym
  • Scenariusze proste i złożone
    • Przełączanie/wyłączanie funkcji za pomocą deklaratywnego pliku konfiguracji
    • Dynamiczne ocenianie stanu funkcji na podstawie wywołania do serwera

Biblioteka zarządzania funkcjami języka JavaScript jest typu open source. Aby uzyskać więcej informacji, odwiedź repozytorium GitHub.

Uwaga

Zaleca się używanie biblioteki zarządzania funkcjami wraz z konfiguracją aplikacja systemu Azure. aplikacja systemu Azure Configuration udostępnia rozwiązanie do centralnego zarządzania ustawieniami aplikacji i flagami funkcji. Aby uzyskać więcej informacji, zapoznaj się z tą sekcją.

Flagi funkcji

Flagi funkcji składają się z dwóch części, nazwy i listy filtrów funkcji, które są używane do włączania funkcji.

Filtry funkcji

Filtry funkcji definiują scenariusz włączania funkcji. Gdy funkcja jest oceniana pod kątem tego, czy jest włączona, czy wyłączona, jej lista filtrów funkcji jest przechodzina do momentu, aż jeden z filtrów zdecyduje, że funkcja powinna zostać włączona. W tym momencie funkcja jest uznawana za włączoną i przechodzi przez filtry funkcji. Jeśli żaden filtr funkcji nie wskazuje, że funkcja powinna być włączona, jest uważana za wyłączoną.

Na przykład można zaprojektować filtr funkcji przeglądarki Microsoft Edge. Ten filtr funkcji aktywuje wszystkie dołączone do niego funkcje, o ile żądanie HTTP pochodzi z przeglądarki Microsoft Edge.

Konfiguracja flagi funkcji

W języku JavaScript deweloperzy często używają obiektów lub map jako podstawowych struktur danych do reprezentowania konfiguracji. Biblioteka zarządzania funkcjami języka JavaScript obsługuje obie metody konfiguracji, zapewniając deweloperom elastyczność wyboru opcji, która najlepiej odpowiada ich potrzebom. Może FeatureManager odczytywać flagi funkcji z różnych typów konfiguracji przy użyciu wbudowanych ConfigurationObjectFeatureFlagProvider i 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);

Używanie flag funkcji z konfiguracji aplikacja systemu Azure

Zamiast kodować flagi funkcji w aplikacji, zalecamy, aby flagi funkcji były przechowywane poza aplikacją i zarządzać nimi oddzielnie. Dzięki temu można w dowolnym momencie modyfikować stany flagi i od razu wprowadzać te zmiany w aplikacji. Usługa aplikacja systemu Azure Configuration udostępnia dedykowany interfejs użytkownika portalu do zarządzania wszystkimi flagami funkcji. Zobacz samouczek.

Usługa aplikacja systemu Azure Configuration udostępnia również flagi funkcji aplikacji bezpośrednio za pośrednictwem biblioteki klienta JavaScript @azure/app-configuration-provider. W poniższym przykładzie pokazano, jak używać biblioteki.

Dostawca języka JavaScript usługi App Configuration udostępnia flagi funkcji w Map obiekcie. Wbudowany element ConfigurationMapFeatureFlagProvider ułatwia ładowanie flag funkcji w tym przypadku.

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);

Uwaga

Aby uzyskać więcej informacji na temat korzystania z biblioteki zarządzania funkcjami w usłudze aplikacja systemu Azure Configuration, przejdź do przewodnika Szybki start.

Deklaracja flagi funkcji

W poniższym przykładzie pokazano format używany do konfigurowania flag funkcji w pliku 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"
                            }
                        }
                    ]
                }
            }
        ]
    }
}

Sekcja feature_management jest używana przez konwencję do ładowania ustawień flag funkcji. Sekcja feature_flags to lista flag funkcji załadowanych do biblioteki. W powyższej sekcji przedstawiono trzy różne funkcje. Funkcje definiują filtry funkcji przy użyciu client_filters właściwości w obiekcie conditions. W filtrach funkcji dla FeatureTparametru widzimy enabledtrue , że nie zdefiniowano żadnych filtrów, co powoduje, że FeatureT zawsze zwracany true jest element . FeatureU jest taka sama jak FeatureT w przypadku, gdy enabled funkcja zawsze false zwraca falsewartość . FeatureV określa filtr funkcji o nazwie Microsoft.TimeWindow. FeatureV to przykład konfigurowalnego filtru funkcji. W przykładzie widać, że filtr ma parameters właściwość . Właściwość parameters służy do konfigurowania filtru. W takim przypadku konfigurowane są czasy rozpoczęcia i zakończenia dla funkcji, która ma być aktywna.

Szczegółowy schemat feature_management sekcji można znaleźć tutaj.

Zaawansowane: użycie dwukropka ":" jest zabronione w nazwach flag funkcji.

Typ wymagania

Właściwość requirement_type flagi funkcji służy do określania, czy filtry powinny być używane Any , czy All logika podczas oceniania stanu funkcji. Jeśli requirement_type nie zostanie określony, wartość domyślna to Any.

  • Any oznacza, że tylko jeden filtr musi mieć wartość true, aby funkcja została włączona.
  • All oznacza, że każdy filtr musi mieć wartość true, aby funkcja została włączona.

A requirement_type zmiany All przechodzenia. Po pierwsze, jeśli nie ma filtrów, funkcja jest wyłączona. Następnie filtry funkcji są przechodzine do momentu, aż jeden z filtrów zdecyduje, że funkcja powinna zostać wyłączona. Jeśli żaden filtr nie wskazuje, że funkcja powinna być wyłączona, jest uważana za włączoną.

{
    "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"
                            }
                        }
                    ]
                }
            },
        ]
    }
}

W powyższym przykładzie określa wartość requirement_typeAll, co oznacza, FeatureW że wszystkie jego filtry muszą mieć wartość true, aby funkcja została włączona. W takim przypadku funkcja jest włączona dla 50% użytkowników w określonym przedziale czasu.

Zużycie

Podstawową formą zarządzania funkcjami jest sprawdzenie, czy flaga funkcji jest włączona, a następnie wykonuje akcje na podstawie wyniku. Sprawdzanie stanu flagi funkcji odbywa się za pomocą FeatureManagermetody .s 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
}

Implementowanie filtru funkcji

Tworzenie filtru funkcji umożliwia włączanie funkcji na podstawie zdefiniowanych kryteriów. Aby zaimplementować filtr funkcji, IFeatureFilter należy zaimplementować interfejs. IFeatureFilter name ma właściwość i metodę o nazwie evaluate. Element name powinien być używany w konfiguracji do odwołowania się do filtru funkcji w ramach flagi funkcji. Gdy funkcja określa, że można ją włączyć dla filtru funkcji, wywoływana evaluate jest metoda . Jeśli evaluate funkcja zwraca truewartość , oznacza to, że funkcja powinna być włączona.

interface IFeatureFilter {
    name: string;
    evaluate(context: IFeatureFilterEvaluationContext, appContext?: unknown): boolean | Promise<boolean>;
}

Poniższy fragment kodu pokazuje, jak zaimplementować dostosowany filtr funkcji o nazwie MyCriteria.

    class MyCriteriaFilter {
        name = "MyCriteria";
        evaluate(context, appContext) {
            if (satisfyCriteria()) {
                return true;
            }
            else {
                return false;
            }
        }
    }

Należy zarejestrować filtr niestandardowy podczas tworzenia elementu FeatureManager.

const featureManager = new FeatureManager(ffProvider, {customFilters: [new MyCriteriaFilter()]});

Filtry funkcji sparametryzowanych

Niektóre filtry funkcji wymagają parametrów, aby zdecydować, czy funkcja powinna być włączona, czy nie. Na przykład filtr funkcji przeglądarki może włączyć funkcję dla określonego zestawu przeglądarek. Może być pożądane, aby przeglądarki Edge i Chrome włączały funkcję, a Przeglądarka Firefox nie. W tym celu można zaprojektować filtr funkcji, aby oczekiwać parametrów. Te parametry zostaną określone w konfiguracji funkcji, a w kodzie będzie dostępny za pośrednictwem IFeatureFilterEvaluationContext parametru IFeatureFilter.Evaluate.

interface IFeatureFilterEvaluationContext {
    featureName: string;
    parameters?: unknown;
}

IFeatureFilterEvaluationContext ma właściwość o nazwie parameters. Te parametry reprezentują konfigurację nieprzetworzonej, której filtr funkcji może użyć, aby zdecydować, jak ocenić, czy funkcja powinna być włączona, czy nie. Aby ponownie użyć filtru funkcji przeglądarki jako przykładu, filtr może użyć parameters do wyodrębnienia zestawu dozwolonych przeglądarek, które zostaną określone dla tej funkcji, a następnie sprawdź, czy żądanie jest wysyłane z jednej z tych przeglądarek.

Używanie kontekstu aplikacji do oceny funkcji

Filtr funkcji może wymagać kontekstu aplikacji środowiska uruchomieniowego, aby ocenić flagę funkcji. Kontekst można przekazać jako parametr podczas wywoływania metody isEnabled.

featureManager.isEnabled("Beta", { userId : "Sam" })

Filtr funkcji może korzystać z kontekstu przekazywanego w momencie isEnabled wywołania. Kontekst aplikacji zostanie przekazany jako drugi parametr .IFeatureFilter.Evaluate

Filtry funkcji wbudowanych

Istnieją dwa filtry funkcji, które są dostarczane z pakietem FeatureManagement : TimeWindowFilter, i TargetingFilter.

Każdy z wbudowanych filtrów funkcji ma własne parametry. Oto lista filtrów funkcji wraz z przykładami.

Microsoft.TimeWindow

Ten filtr zapewnia możliwość włączenia funkcji na podstawie przedziału czasu. End Jeśli tylko zostanie określona, funkcja jest rozważana do tego czasu. Start Jeśli tylko zostanie określona, funkcja jest uwzględniana we wszystkich punktach po tym czasie.

"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

Ten filtr zapewnia możliwość włączenia funkcji dla odbiorców docelowych. Szczegółowe wyjaśnienie określania wartości docelowej zostało wyjaśnione w poniższej sekcji określania wartości docelowej . Parametry filtru obejmują obiekt opisujący Audience użytkowników, grupy, wykluczonych użytkowników/grup oraz domyślny procent bazy użytkowników, który powinien mieć dostęp do funkcji. Każdy obiekt grupy wymieniony w Groups sekcji musi również określić, jaki procent członków grupy powinien mieć dostęp. Jeśli użytkownik jest określony w Exclusion sekcji , bezpośrednio lub jeśli użytkownik znajduje się w wykluczonej grupie, funkcja jest wyłączona. W przeciwnym razie, jeśli użytkownik jest określony bezpośrednio w Users sekcji lub jeśli użytkownik znajduje się w uwzględnionych procentach dowolnego wdrożenia grupy, lub jeśli użytkownik mieści się w domyślnym procentu wdrożenia, ten użytkownik będzie miał włączoną funkcję.

"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"
                    ]
                }
            }
        }
    }
]

Określanie celu

Określanie wartości docelowej to strategia zarządzania funkcjami, która umożliwia deweloperom stopniowe wdrażanie nowych funkcji w bazie użytkowników. Strategia jest oparta na koncepcji określania celu grupy użytkowników znanej jako docelowa grupa odbiorców. Grupa odbiorców składa się z określonych użytkowników, grup, wykluczonych użytkowników/grup oraz wyznaczonego procentu całej bazy użytkowników. Grupy, które są uwzględnione w grupie odbiorców, można podzielić dalej na wartości procentowe ich całkowitej liczby członków.

W poniższych krokach przedstawiono przykład progresywnego wdrożenia nowej funkcji "Beta":

  1. Indywidualni użytkownicy Jeff i Alicia otrzymują dostęp do wersji beta.
  2. Inny użytkownik, Mark, prosi o wyrażenie zgody i jest uwzględniony.
  3. Dwadzieścia procent grupy znanej jako "Ring1" użytkowników jest uwzględnionych w wersji beta.
  4. Liczba użytkowników "Ring1" uwzględnionych w wersji beta wzrosła do 100 procent.
  5. Pięć procent bazy użytkowników jest uwzględnionych w wersji beta.
  6. Procent wdrożenia jest wyprzedzony do 100 procent, a funkcja jest całkowicie wdrażana.

Ta strategia wdrażania funkcji jest wbudowana w bibliotekę za pomocą dołączonego filtru funkcji Microsoft.Targeting .

Określanie wartości docelowej dla użytkownika z kontekstem określania wartości docelowej

Filtr określania wartości docelowej opiera się na kontekście określania wartości docelowej, aby ocenić, czy funkcja powinna być włączona. Ten kontekst określania wartości docelowej zawiera informacje, takie jak aktualnie oceniany użytkownik i grupy, w których znajduje się użytkownik. Kontekst określania wartości docelowej musi być przekazywany bezpośrednio, gdy isEnabled jest wywoływany.

featureManager.isEnabled("Beta", { userId: "Aiden", groups: ["Ring1"] })

Wykluczanie elementów docelowych

Podczas definiowania odbiorców użytkownicy i grupy mogą zostać wykluczeni z odbiorców. Wykluczenia są przydatne, gdy funkcja jest wdrażana w grupie użytkowników, ale kilka użytkowników lub grup musi zostać wykluczonych z wdrożenia. Wykluczenie jest definiowane przez dodanie listy użytkowników i grup do Exclusion właściwości odbiorców.

"Audience": {
    "Users": [
        "Jeff",
        "Alicia"
    ],
    "Groups": [
        {
            "Name": "Ring0",
            "RolloutPercentage": 100
        }
    ],
    "DefaultRolloutPercentage": 0,
    "Exclusion": {
        "Users": [
            "Mark"
        ]
    }
}

W powyższym przykładzie funkcja jest włączona dla użytkowników o nazwach Jeff i Alicia. Jest ona również włączona dla użytkowników w grupie o nazwie Ring0. Jeśli jednak użytkownik ma nazwę Mark, funkcja jest wyłączona, niezależnie od tego, czy znajdują się w grupie Ring0 , czy nie. Wykluczenia mają priorytet nad resztą filtru określania wartości docelowej.

Warianty

Po dodaniu nowych funkcji do aplikacji może dojść do czasu, gdy funkcja ma wiele różnych proponowanych opcji projektowania. Typowym rozwiązaniem do podejmowania decyzji o projekcie jest pewna forma testowania A/B, która polega na udostępnieniu innej wersji funkcji różnym segmentom bazy użytkowników i wybraniu wersji na podstawie interakcji użytkownika. W tej bibliotece ta funkcja jest włączona przez reprezentowanie różnych konfiguracji funkcji z wariantami.

Warianty umożliwiają flagę funkcji stać się bardziej niż prostą flagą włączania/wyłączania. Wariant reprezentuje wartość flagi funkcji, która może być ciągiem, liczbą, wartością logiczną, a nawet obiektem konfiguracji. Flaga funkcji, która deklaruje warianty, powinna określać, w jakich okolicznościach należy używać każdego wariantu, co zostało szczegółowo omówione w sekcji Przydzielanie wariantów .

Pobieranie wariantu z kontekstem określania wartości docelowej

Dla każdej funkcji można pobrać wariant przy użyciu FeatureManagermetody "s getVariant ". Przypisanie wariantu zależy od aktualnie ocenianego użytkownika, a informacje te są uzyskiwane z przekazanego kontekstu określania wartości docelowej.

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

Deklaracja flagi funkcji wariantu

W porównaniu z flagami funkcji normalnych flagi funkcji wariantu mają jeszcze dwie właściwości: variants i allocation. Właściwość variants jest tablicą zawierającą warianty zdefiniowane dla tej funkcji. Właściwość allocation definiuje sposób przydzielania tych wariantów dla funkcji. Podobnie jak deklarowanie flag funkcji normalnych, można skonfigurować flagi funkcji wariantu w pliku JSON. Oto przykład flagi funkcji wariantu.

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "MyVariantFeatureFlag",
                "enabled": true,
                "allocation": {
                    "default_when_enabled": "Small",
                    "group": [
                        {
                            "variant": "Big",
                            "groups": [
                                "Ring1"
                            ]
                        }
                    ]
                },
                "variants": [
                    { 
                        "name": "Big"
                    },  
                    { 
                        "name": "Small"
                    } 
                ]
            }
        ]
    }
}

Definiowanie wariantów

Każdy wariant ma dwie właściwości: nazwę i konfigurację. Nazwa jest używana do odwoływania się do określonego wariantu, a konfiguracja jest wartością tego wariantu. Konfigurację można ustawić przy użyciu configuration_value właściwości . configuration_value jest konfiguracją śródliniową, która może być ciągiem, liczbą, wartością logiczną lub obiektem konfiguracji. Jeśli configuration_value nie zostanie określony, zwrócona właściwość wariantu configuration to undefined.

Lista wszystkich możliwych wariantów jest zdefiniowana dla każdej funkcji w variants ramach właściwości .

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "MyVariantFeatureFlag",
                "variants": [
                    { 
                        "name": "Big", 
                        "configuration_value": {
                            "Size": 500
                        }
                    },  
                    { 
                        "name": "Small", 
                        "configuration_value": {
                            "Size": 300
                        }
                    } 
                ]
            }
        ]
    }
}

Przydzielanie wariantów

Proces przydzielania wariantów funkcji zależy od allocation właściwości funkcji.

"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"
    } 
]

Ustawienie allocation funkcji ma następujące właściwości:

Właściwości opis
default_when_disabled Określa, który wariant ma być używany, gdy jest wymagany wariant, gdy funkcja jest uznawana za wyłączoną.
default_when_enabled Określa, który wariant ma być używany, gdy jest wymagany wariant, gdy funkcja jest uznawana za włączoną i żaden inny wariant nie został przypisany do użytkownika.
user Określa wariant i listę użytkowników, do których należy przypisać ten wariant.
group Określa wariant i listę grup. Wariant jest przypisywany, jeśli użytkownik znajduje się w co najmniej jednej grupie.
percentile Określa wariant i zakres procentowy, do którego ma zostać przypisana wartość procentowa obliczona przez użytkownika.
seed Wartość, na podstawie której są obliczane percentile wartości procentowe. Obliczanie procentowe dla określonego użytkownika będzie takie samo we wszystkich funkcjach, jeśli jest używana ta sama seed wartość. Jeśli nie seed zostanie określony, zostanie utworzony domyślny inicjator na podstawie nazwy funkcji.

Jeśli funkcja nie jest włączona, menedżer funkcji przypisuje wariant oznaczony jako default_when_disabled do bieżącego użytkownika, który jest Small w tym przypadku.

Jeśli funkcja jest włączona, menedżer funkcji sprawdza user, groupi percentile alokacje w tym celu w celu przypisania wariantu. W tym konkretnym przykładzie, jeśli oceniany użytkownik ma nazwę Marsha, w grupie o nazwie Ring1lub użytkownik może spaść między 0 a 10. percentylem, określony wariant zostanie przypisany do użytkownika. W takim przypadku wszyscy przypisani użytkownicy zwróciliby Big wariant. Jeśli żadna z tych alokacji nie jest zgodna default_when_enabled , użytkownik ma przypisany wariant , czyli Small.

Logika alokacji jest podobna do filtru funkcji Microsoft.Targeting, ale istnieją pewne parametry, które znajdują się w określaniu wartości docelowej, które nie znajdują się w alokacji i na odwrót. Wyniki określania wartości docelowej i alokacji nie są powiązane.

Zastępowanie stanu włączonego z wariantem

Można użyć wariantów, aby zastąpić włączony stan flagi funkcji. Zastępowanie daje wariantom możliwość rozszerzenia oceny flagi funkcji. Podczas wywoływania is_enabled flagi z wariantami menedżer funkcji sprawdzi, czy wariant przypisany do bieżącego użytkownika jest skonfigurowany do zastąpienia wyniku. Zastępowanie odbywa się przy użyciu opcjonalnej właściwości status_overridewariantu . Domyślnie ta właściwość jest ustawiona na None, co oznacza, że wariant nie ma wpływu na to, czy flaga jest uznawana za włączoną, czy wyłączoną. Ustawienie status_override zezwala na Enabled włączenie wariantu, po wybraniu, przesłonięcia flagi. Ustawienie status_override na Disabled wartość zapewnia przeciwną funkcjonalność, dlatego wyłączenie flagi po wybraniu wariantu. Nie można zastąpić funkcji ze stanem enabledfalse .

Jeśli używasz flagi funkcji z wariantami binarnymi, właściwość może być przydatna status_override . Umożliwia to kontynuowanie korzystania z interfejsów API, takich jak is_enabled w aplikacji, a jednocześnie korzystanie z nowych funkcji, które są dostarczane z wariantami, takimi jak alokacja percentylu i inicjowanie.

{
    "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"
        }
    ]
}

W powyższym przykładzie funkcja jest zawsze włączona. Jeśli bieżący użytkownik znajduje się w obliczonym zakresie percentylu od 10 do 20, On zwracany jest wariant. Off W przeciwnym razie zwracany jest wariant i ponieważ status_override jest równy Disabled, funkcja zostanie teraz uznana za wyłączoną.

Telemetria

Po wdrożeniu zmiany flagi funkcji często ważne jest analizowanie jej wpływu na aplikację. Oto na przykład kilka pytań, które mogą wystąpić:

  • Czy moje flagi są włączone/wyłączone zgodnie z oczekiwaniami?
  • Czy docelowi użytkownicy uzyskują dostęp do określonej funkcji zgodnie z oczekiwaniami?
  • Który wariant jest widoczny dla określonego użytkownika?

Odpowiedzi na te typy pytań można uzyskać za pośrednictwem emisji i analizy zdarzeń oceny flag funkcji.

Włączanie telemetrii

Domyślnie flagi funkcji nie mają emitowanych danych telemetrycznych. Aby opublikować dane telemetryczne dla danej flagi funkcji, flaga MUSI zadeklarować , że jest włączona dla emisji telemetrii.

W przypadku flag funkcji zdefiniowanych w formacie json włączenie odbywa się przy użyciu telemetry właściwości .

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "MyFeatureFlag",
                "enabled": true,
                "telemetry": {
                    "enabled": true
                }
            }
        ]
    }
}

Powyższy fragment kodu definiuje flagę funkcji o nazwie MyFeatureFlag , która jest włączona dla telemetrii. Właściwość telemetry obiektu jest ustawiona enabled na truewartość . Wartość enabled właściwości musi być true publikowania danych telemetrycznych dla flagi.

Sekcja telemetry flagi funkcji ma następujące właściwości:

Właściwości opis
enabled Określa, czy dane telemetryczne mają być publikowane dla flagi funkcji.
metadata Kolekcja par klucz-wartość, modelowana jako słownik, która może służyć do dołączania niestandardowych metadanych dotyczących flagi funkcji do zdarzeń oceny.

Publikowanie niestandardowych danych telemetrycznych

Funkcję wywołania zwrotnego onFeatureEvaluated można zarejestrować podczas tworzenia FeatureManagerelementu . To wywołanie zwrotne jest wywoływane za każdym razem, gdy flaga funkcji jest oceniana, a dane telemetryczne są włączone dla tej flagi. Funkcja wywołania zwrotnego pobiera wynik oceny funkcji jako parametr .

W poniższym przykładzie pokazano, jak zaimplementować niestandardową funkcję wywołania zwrotnego w celu wysyłania danych telemetrycznych przy użyciu informacji wyodrębnionych z wyniku oceny funkcji i zarejestrowania jej w menedżerze funkcji.

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});

Integracja z usługą Application Insights

Biblioteka zarządzania funkcjami języka JavaScript udostępnia pakiety rozszerzeń zintegrowane z zestawami SDK usługi Application Insights .

Usługa Application Insights oferuje różne zestawy SDK dla scenariuszy internetowych i Node.js . Wybierz odpowiednie pakiety rozszerzeń dla aplikacji.

Jeśli aplikacja działa w przeglądarce, zainstaluj "@microsoft/feature-management-applicationinsights-browser" pakiet. W poniższym przykładzie pokazano, jak utworzyć wbudowanego wydawcę telemetrii usługi Application Insights i zarejestrować go w menedżerze funkcji.

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"});

Wydawca telemetrii wysyła FeatureEvaluation zdarzenia niestandardowe do usługi Application Insights po ocenie flagi funkcji z telemetrią. Zdarzenie niestandardowe jest zgodne ze schematem FeatureEvaluationEvent .

Następne kroki

Aby dowiedzieć się, jak używać flag funkcji w aplikacjach, przejdź do następujących przewodników Szybki start.

Aby dowiedzieć się, jak używać filtrów funkcji, przejdź do następujących samouczków.