Aracılığıyla paylaş


JavaScript özellik yönetimi

feature-management-npm-package

JavaScript özellik yönetimi kitaplığı, özellik bayraklarına göre uygulama işlevselliği geliştirmenin ve kullanıma sunmanın bir yolunu sağlar. Yeni bir özellik geliştirildikten sonra, birçok uygulamanın özelliğin ne zaman etkinleştirilmesi gerektiği ve hangi koşullar altında olduğu gibi özel gereksinimleri vardır. Bu kitaplık, bu ilişkileri tanımlamak için bir yol sağlar ve ayrıca bu özelliklerin kullanıma sunulmasını mümkün kılmak için ortak JavaScript kod desenleriyle tümleştirilir.

Özellik bayrakları, JavaScript uygulamalarının özellikleri dinamik olarak açması veya kapatması için bir yol sağlar. Geliştiriciler, koşullu deyimler gibi basit kullanım örneklerinde özellik bayraklarını kullanabilir.

JavaScript özellik yönetimi kitaplığı kullanmanın avantajlarından bazıları şunlardır:

  • Özellik yönetimi için ortak bir kural
  • Giriş için düşük bariyer
    • Hem JSON nesnelerini hem de harita tabanlı özellik bayrağı kaynaklarını destekler
    • Hem Node.js hem de tarayıcı ortamlarında kullanımı destekler
  • Azure Uygulaması Yapılandırması ile özellik bayrağı yaşam süresi yönetimi
    • Yapılandırma değerleri gerçek zamanlı olarak değişebilir
  • Ele alınan basit ve karmaşık senaryolar
    • Bildirim temelli yapılandırma dosyası aracılığıyla özellikleri açma/kapatma
    • Sunucu çağrısına göre özelliğin durumunu dinamik olarak değerlendirme

JavaScript özellik yönetimi kitaplığı açık kaynak. Daha fazla bilgi için GitHub deposunu ziyaret edin.

Not

Özellik yönetimi kitaplığını Azure Uygulaması Yapılandırması ile birlikte kullanmanız önerilir. Azure Uygulaması Yapılandırması, uygulama ayarlarını ve özellik bayraklarını merkezi olarak yönetmek için bir çözüm sağlar. Diğer ayrıntılar için lütfen bu bölüme bakın.

Özellik bayrakları

Özellik bayrakları, özelliği açmak için kullanılan bir ad ve özellik filtreleri listesi olmak üzere iki bölümden oluşur.

Özellik filtreleri

Özellik filtreleri, bir özelliğin ne zaman etkinleştirilmesi gerektiğine yönelik bir senaryo tanımlar. Özellik açık mı yoksa kapalı mı olduğu değerlendirildiğinde, filtrelerden biri özelliğin etkinleştirilmesi gerektiğine karar verene kadar özellik filtreleri listesinden geçilir. Bu noktada özellik etkin kabul edilir ve özellik filtreleri arasında geçiş durur. Özellik filtresi özelliğin etkinleştirilmesi gerektiğini belirtmiyorsa devre dışı olarak kabul edilir.

Örneğin, bir Microsoft Edge tarayıcı özellik filtresi tasarlanabilir. Bu özellik filtresi, Microsoft Edge'den http isteği geldiği sürece bu filtreye eklenen tüm özellikleri etkinleştirir.

Özellik bayrağı yapılandırması

JavaScript'te geliştiriciler genellikle yapılandırmaları temsil etmek için birincil veri yapıları olarak nesneleri veya eşlemeleri kullanır. JavaScript özellik yönetimi kitaplığı her iki yapılandırma yaklaşımını da destekler ve geliştiricilere ihtiyaçlarına en uygun seçeneği belirleme esnekliği sağlar. , FeatureManager yerleşik ConfigurationObjectFeatureFlagProvider ve ConfigurationMapFeatureFlagProviderkullanarak farklı yapılandırma türlerindeki özellik bayraklarını okuyabilir.

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 Uygulaması Yapılandırması'ndan özellik bayraklarını kullanma

Özellik bayraklarınızı uygulamanıza sabit kodlamak yerine, özellik bayraklarını uygulamanın dışında tutmanızı ve bunları ayrı olarak yönetmenizi öneririz. Bunu yapmak, bayrak durumlarını istediğiniz zaman değiştirmenize ve bu değişikliklerin uygulamada hemen geçerli olmasını sağlar. Azure Uygulaması Yapılandırma hizmeti, tüm özellik bayraklarınızı yönetmek için ayrılmış bir portal kullanıcı arabirimi sağlar. Öğreticiye bakın.

Azure Uygulaması Yapılandırma hizmeti ayrıca özellik bayraklarını doğrudan JavaScript istemci kitaplığı @azure/app-configuration-provider aracılığıyla uygulamanıza sunar. Aşağıdaki örnekte kitaplığın nasıl kullanılacağı gösterilmektedir.

Uygulama Yapılandırması JavaScript sağlayıcısı bir Map nesnede özellik bayrakları sağlar. Yerleşik ConfigurationMapFeatureFlagProvider , bu durumda özellik bayraklarının yüklenmesine yardımcı olur.

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

Özellik bayrağının durumunu dinamik olarak denetlemek için Azure Uygulama Yapılandırması'nı kullanma

Azure Uygulama Yapılandırması yalnızca özellik bayraklarınızın depolama alanını ve merkezi yönetimini dışlaştırmaya yönelik bir çözüm olmakla kalmaz, aynı zamanda özellik bayraklarını dinamik olarak açmanıza/kapatmanıza da olanak tanır.

Özellik bayrakları için dinamik yenilemeyi etkinleştirmek için Azure Uygulama Yapılandırması'ndan özellik bayraklarını yüklerken özelliğini refresh yapılandırmanız featureFlagOptions gerekir.

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

En son özellik bayrağı durumunu almak için yöntemini çağırmanız refresh gerekir.

await appConfig.refresh(); // Refresh to get the latest feature flags
const isBetaEnabled = await featureManager.isEnabled("Beta");
console.log(`Beta is enabled: ${isBetaEnabled}`);

Not

Azure Uygulaması Yapılandırması ile özellik yönetimi kitaplığını kullanma hakkında daha fazla bilgi için lütfen hızlı başlangıç sayfasına gidin.

Özellik bayrağı tanımı

Aşağıdaki örnekte, bir JSON dosyasında özellik bayraklarını ayarlamak için kullanılan biçim gösterilmektedir.

{
    "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 bölümü, geleneksel olarak özellik bayrağı ayarlarını yüklemek için kullanılır. feature_flags bölümü, kitaplığa yüklenen özellik bayraklarının listesidir. Yukarıdaki bölümde üç farklı özellik görüyoruz. Özellikler, özellik filtrelerini client_filters özelliğini tanımlayarak conditions içinde belirler. Özellik filtrelerinde FeatureT, tanımlı filtre olmadığını ve bunun sonucunda enabledtrue her zaman FeatureTtrue döndürüldüğünü görüyoruz. FeatureU, FeatureT ile aynıdır, ancak enabled'nin false olması, özelliğin her zaman false döndürülmesiyle sonuçlanır. FeatureV adlı Microsoft.TimeWindowbir özellik filtresi belirtir. FeatureV yapılandırılabilir özellik filtresi örneğidir. Örnekte filtrenin bir parameters özelliği olduğunu görebiliriz. parameters özelliği, filtreyi yapılandırmak için kullanılır. Bu durumda, özelliğin etkin olması için başlangıç ve bitiş saatleri yapılandırılır.

Bölümün feature_management ayrıntılı şemasına buradan ulaşabilirsiniz.

Gelişmiş: Özellik bayrağı adlarında ':' yani iki nokta üst üste kullanımı yasaktır.

Gereksinim türü

Bir özellik bayrağının requirement_type özelliği, bir özelliğin durumunu değerlendirirken filtrelerin Any veya All mantığını kullanıp kullanmayacağını belirlemek için kullanılır. Belirtilmezse requirement_type , varsayılan değer olur Any.

  • Any , özelliğin etkinleştirilmesi için yalnızca bir filtrenin true olarak hesaplanması gerektiği anlamına gelir.
  • All , özelliğin etkinleştirilmesi için her filtrenin true olarak hesaplanması gerektiği anlamına gelir.

requirement_type All Geçişi değiştirir. İlk olarak, filtre yoksa özellik devre dışı bırakılır. Ardından, filtrelerden biri özelliğin devre dışı bırakılması gerektiğini belirleyinceye kadar özellik filtreleri kontrolden geçirilir. Hiçbir filtre özelliğin devre dışı bırakılması gerektiğini belirtmezse etkin olarak kabul edilir.

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

Yukarıdaki örnekte, FeatureW, requirement_type öğesini All olarak belirtir, yani bu özelliğin etkinleştirilmesi için bütün filtrelerinin doğru olarak değerlendirilmesi gerekir. Bu durumda özellik, belirtilen zaman penceresinde kullanıcıların %50'sinde etkinleştirilir.

Tüketim

Özellik yönetiminin temel biçimi, özellik bayrağının etkinleştirilip etkinleştirilmediğini denetlemek ve ardından sonucta göre eylemler gerçekleştirmektir. Özellik bayrağının durumunu denetleme işlemi ' nin FeatureManager yöntemi aracılığıyla isEnabledyapılır.

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
}

Özellik filtresi uygulama

Özellik filtresi oluşturmak, tanımladığınız ölçütlere göre özellikleri etkinleştirmenin bir yolunu sağlar. Özellik filtresi uygulamak için arabiriminin IFeatureFilter uygulanması gerekir. IFeatureFilter adlı bir name özelliğine ve yöntemine evaluatesahiptir. , name bir özellik bayrağı içindeki özellik filtresine başvurmak için yapılandırmada kullanılmalıdır. Özellik, özellik filtresi için etkinleştirilebileceğini belirttiğinde evaluate yöntemi çağrılır. Eğer evaluatetrue döndürürse, özelliğin etkinleştirilmesi gerektiği anlamına gelir.

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

Aşağıdaki kod parçacığında, adlı MyCriteriaözelleştirilmiş bir özellik filtresinin nasıl uygulanacakları gösterilmektedir.

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

Özel filtreyi, customFilters oluşturucuya geçirilen FeatureManagerOptions nesnesinin FeatureManager özelliği altında kaydetmeniz gerekir.

const featureManager = new FeatureManager(ffProvider, {
    customFilters: [
        new MyCriteriaFilter() // add custom feature filters under FeatureManagerOptions.customFilters
    ]
});

Parametreli özellik filtreleri

Bazı özellik filtreleri, bir özelliğin açılıp açılmayacağı konusunda karar vermek için parametreler gerektirir. Örneğin, bir tarayıcı özellik filtresi belirli bir tarayıcı kümesi için bir özelliği açabilir. Edge ve Chrome tarayıcılarının bir özelliği etkinleştirmesi istenebilir ancak Firefox etkinleştirmez. Bunu yapmak için, bir özellik filtresi parametreleri bekleyecek şekilde tasarlanabilir. Bu parametreler, özellik yapılandırmasında belirtilecek ve kodda IFeatureFilterEvaluationContext parametresi aracılığıyla IFeatureFilter.Evaluate erişilebilecektir.

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

IFeatureFilterEvaluationContext adlı parametersbir özelliğe sahiptir. Bu parametreler özellik filtresinin özelliğin etkinleştirilip etkinleştirilmeyeceğine karar vermek için kullanabileceği ham yapılandırmayı temsil eder. Tarayıcı özellik filtresini bir kez daha örnek olarak kullanmak için, filtre özelliği için belirtilecek bir dizi izin verilen tarayıcıyı ayıklamak ve ardından isteğin bu tarayıcılardan birinden gönderilip gönderilmediğini denetlemek için kullanabilir parameters .

Özellik değerlendirmesi için uygulama bağlamı kullanma

Özellik filtresinin özellik bayrağını değerlendirmek için çalışma zamanı uygulama bağlamı gerekebilir. Bir fonksiyonu isEnabled çağırırken, bağlamı parametre olarak geçirebilirsiniz.

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

Özellik filtresi, isEnabled çağrıldığında aktarılan bağlamdan yararlanabilir. Uygulama bağlamı ikinci parametresi IFeatureFilter.Evaluateolarak geçirilir.

Yerleşik özellik filtreleri

Paketiyle birlikte FeatureManagement gelen iki özellik filtresi vardır: TimeWindowFilter ve TargetingFilter. Yerleşik tüm özellik filtreleri, FeatureManager oluşturulurken varsayılan olarak eklenir.

Yerleşik özellik filtrelerinin her birinin kendi parametreleri vardır. Örneklerle birlikte özellik filtrelerinin listesi aşağıda verilmiştir.

Microsoft.TimeWindow

Bu filtre, bir özelliği bir zaman penceresine göre etkinleştirme özelliği sağlar. Yalnızca End belirtilirse, özellik o zamana kadar açık olarak kabul edilir. Yalnızca Start belirtilirse, özellik bu sürenin ardından tüm noktalarda açık olarak kabul edilir.

"client_filters": [
    {
        "name": "Microsoft.TimeWindow",
        "parameters": {
            "Start": "Wed, 01 May 2019 13:59:59 GMT",
            "End": "Mon, 01 Jul 2019 00:00:00 GMT"
        }
    }
]     

Zaman penceresi düzenli aralıklarla yinelenecek şekilde yapılandırılabilir. Bu, bir günün düşük veya yüksek trafikli bir döneminde veya haftanın belirli günlerinde bir özelliği açması gerekebilecek senaryolar için yararlı olabilir. Tek tek zaman penceresini yinelenen zaman pencerelerine genişletmek için yinelenme kuralı parametresinde Recurrence belirtilmelidir.

Not

"Start ve End, Recurrence'yi etkinleştirmek için her ikisi de belirtilmelidir."

"client_filters": [
    {
        "name": "Microsoft.TimeWindow",
        "parameters": {
            "Start": "Fri, 22 Mar 2024 20:00:00 GMT",
            "End": "Sat, 23 Mar 2024 02:00:00 GMT",
            "Recurrence": {
                "Pattern": {
                    "Type": "Daily",
                    "Interval": 1
                },
                "Range": {
                    "Type": "NoEnd"
                }
            }
        }
    }
]

Ayarlar Recurrence iki bölümden oluşur: Pattern (zaman penceresinin yineleme sıklığı) ve Range (yineleme düzeninin ne kadar süreyle yinelenme süresi için).

Yinelenme Düzeni

İki olası yinelenme deseni türü vardır: Daily ve Weekly. Örneğin, bir zaman penceresi "her gün", "her üç günde bir", "her Pazartesi" veya "her cuma" yinelenebilir.

Türüne bağlı olarak, Pattern belirli alanların bulundurulması gereklidir, isteğe bağlıdır veya yoksayılır.

  • Daily

    Günlük yinelenme düzeni, zaman penceresinin her oluşum arasındaki gün sayısına göre yinelenmesine neden olur.

    Mülk İlgililik Açıklama
    Türü Gerekli Dailyolarak ayarlanmalıdır.
    Aralık Opsiyonel Her oluşum arasındaki gün sayısını belirtir. Varsayılan değer 1'dir.
  • Weekly

    Haftalık yinelenme düzeni, her yineleme kümesi arasındaki hafta sayısına bağlı olarak zaman penceresinin haftanın aynı günü veya günlerinde yinelenmesine neden olur.

    Mülk İlgililik Açıklama
    Türü Gerekli Weeklyolarak ayarlanmalıdır.
    DaysOfWeek Gerekli Olayın haftanın hangi günlerinde gerçekleştiğini belirtir.
    Aralık Opsiyonel Her oluşum kümesi arasındaki hafta sayısını belirtir. Varsayılan değer 1'dir.
    FirstDayOfWeek Opsiyonel Hangi günün haftanın ilk günü olarak kabul edileceğini belirtir. Varsayılan değer Sunday olarak belirlenmiştir.

    Aşağıdaki örnek, zaman penceresini her pazartesi ve salı günü yineler

    "Pattern": {
        "Type": "Weekly",
        "Interval": 2,
        "DaysOfWeek": ["Monday", "Tuesday"]
    }
    

Not

Start yinelenme düzenine uyan geçerli bir ilk oluşum olmalıdır. Ayrıca, zaman penceresinin süresi ne sıklıkta oluştuğundan daha uzun olamaz. Örneğin, her gün 25 saatlik bir zaman diliminin tekrarlanması geçersizdir.

Yinelenme Aralığı

Üç olası yineleme aralığı türü vardır: NoEnd, EndDate ve Numbered.

  • NoEnd

    Aralık NoEnd , yinelenmenin süresiz olarak gerçekleşmesine neden olur.

    Mülk İlgililik Açıklama
    Türü Gerekli NoEndolarak ayarlanmalıdır.
  • EndDate

    Bu aralık, EndDate zaman penceresinin bitiş tarihine kadar belirlenen desene uyan tüm günlerde oluşmasına neden olur.

    Mülk İlgililik Açıklama
    Türü Gerekli EndDateolarak ayarlanmalıdır.
    Bitiş Tarihi Gerekli Desenin uygulanmasının durdurulacağı tarih saatini belirtir. Son oluşumun başlangıç saati bitiş tarihinden önce olduğu sürece, bu oluşumun bitiş saatinin bunun ötesine geçmesine izin verilir.

    Aşağıdaki örnek, son oluşum 1 Nisan 2024'te gerçekleşene kadar zaman penceresini her gün yineleyecektir.

    "Start": "Fri, 22 Mar 2024 18:00:00 GMT",
    "End": "Fri, 22 Mar 2024 20:00:00 GMT",
    "Recurrence":{
        "Pattern": {
            "Type": "Daily",
            "Interval": 1
        },
        "Range": {
            "Type": "EndDate",
            "EndDate": "Mon, 1 Apr 2024 20:00:00 GMT"
        }
    }
    
  • Numbered

    Aralık, Numbered aynı kalıba göre zaman aralığının belirli bir sayıda tekrarlanmasını sağlar.

    Mülk İlgililik Açıklama
    Türü Gerekli Numberedolarak ayarlanmalıdır.
    OlaySayısı Gerekli Oluşum sayısını belirtir.

    Aşağıdaki örnek, pazartesi ve salı günleri saat penceresini, sırasıyla 1 Nisan (Mon), 2 Nisan (Sal) ve 8 Nisan (Mon) tarihlerinde gerçekleşen üç oluşum olana kadar yineleyecektir.

    "Start": "Mon, 1 Apr 2024 18:00:00 GMT",
    "End": "Mon, 1 Apr 2024 20:00:00 GMT",
    "Recurrence":{
        "Pattern": {
            "Type": "Weekly",
            "Interval": 1,
            "DaysOfWeek": ["Monday", "Tuesday"]
        },
        "Range": {
            "Type": "Numbered",
            "NumberOfOccurrences": 3
        }
    }
    

Yinelenme kuralı oluşturmak için hem hem Patternde Range belirtmeniz gerekir. Herhangi bir desen türü herhangi bir aralık türüyle çalışabilir.

İleri: Özelliğin Start saat dilimi uzaklığı yinelenme ayarlarına uygulanır.

Microsoft.Hedefleme

Bu filtre, bir özelliği hedef kitle için etkinleştirme özelliği sağlar. Hedeflemenin ayrıntılı açıklaması aşağıdaki hedefleme bölümünde açıklanmıştır. Filtre parametreleri, kullanıcıları, grupları, dışlanan kullanıcıları/grupları tanımlayan bir nesneyi ve özelliğe erişimi olması gereken kullanıcı tabanının varsayılan yüzdesini içerir Audience . Bölümünde listelenen Groups her grup nesnesi, grup üyelerinin yüzde kaçının erişimi olması gerektiğini de belirtmelidir. Eğer Exclusion bölümünde bir kullanıcı belirtilmişse, bu doğrudan ya da kullanıcı dışlanan bir grupta yer alıyorsa, özellik devre dışı bırakılır. Aksi takdirde, bir kullanıcı Users bölümünde doğrudan belirtilirse veya kullanıcı grup dağıtımlarından herhangi birinin dahil edilen yüzdesindeyse ya da kullanıcı varsayılan dağıtım yüzdesine düşerse, o kullanıcı için özellik etkinleştirilecektir.

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

Hedefleme

Hedefleme, geliştiricilerin yeni özellikleri kullanıcı tabanına aşamalı olarak dağıtmasını sağlayan bir özellik yönetimi stratejisidir. Strateji, hedef kitle olarak bilinen bir kullanıcı kümesini hedefleme kavramını temel alır. Hedef kitle belirli kullanıcılardan, gruplardan, dışlanan kullanıcılardan/gruplardan ve tüm kullanıcı tabanının belirlenmiş yüzdelerinden oluşur. Hedef kitleye dahil edilen gruplar, toplam üyelerinin yüzdelerine ayrılabilir.

Aşağıdaki adımlarda yeni bir 'Beta' özelliği için aşamalı dağıtım örneği gösterilmektedir:

  1. Bireysel kullanıcılar Jeff ve Alicia'ya Beta erişimi verilir.
  2. Başka bir kullanıcı olan Mark, katılmak ister ve dahil edilir.
  3. "Ring1" olarak bilinen bir grubun yüzde yirmisi Beta'ya dahil edilir.
  4. Beta'ya dahil edilen "Ring1" kullanıcılarının sayısı yüzde 100'e kadar artırılır.
  5. Kullanıcı tabanının yüzde beşi Beta'ya dahil edilir.
  6. Dağıtım yüzdesi yüzde 100'e kadar artırılır ve özellik tamamen kullanıma sunulmaktadır.

Bir özelliği dağıtmaya yönelik bu strateji, dahil edilen Microsoft.Targeting özellik filtresi aracılığıyla kitaplıkta yerleşik olarak bulunur.

Hedefleme bağlamı ile kullanıcıyı hedefleme

Hedefleme filtresi, bir özelliğin açık olup olmadığını değerlendirmek için bir hedefleme bağlamını kullanır. Bu hedefleme bağlamı, şu anda hangi kullanıcının değerlendirildiği ve kullanıcının hangi gruplarda olduğu gibi bilgileri içerir. Hedefleme bağlamı, isEnabled çağrıldığında doğrudan geçirilmelidir.

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

Hedef dışlama

Hedef kitle tanımlanırken, kullanıcılar ve gruplar hedef kitlenin dışında tutulabilir. Dışlamalar, bir özelliğin bir kullanıcı grubuna dağıtılması için yararlıdır, ancak birkaç kullanıcı veya grubun piyasaya sürülmesinin dışında tutulması gerekir. Dışlama, hedef kitlenin özelliğine Exclusion bir kullanıcı ve grup listesi eklenerek tanımlanır.

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

Yukarıdaki örnekte, özellik Jeff ve Alicia adlı kullanıcılar için etkinleştirilmiştir. Ayrıca adlı Ring0gruptaki kullanıcılar için de etkinleştirilir. Eğer kullanıcının adı Mark ise, grupta Ring0 olup olmadığına bakılmaksızın bu özellik devre dışı bırakılır. Dışlamalar, hedefleme filtresinin geri kalanından önceliklidir.

Web Uygulamasında Hedefleme

Hedefleme özelliği filtresini kullanan örnek bir web uygulaması bu örnek projede kullanılabilir.

Web uygulamalarında, özellikle birden çok bileşeni veya katmanı olanlar, her özellik bayrağı kontrolü sırasında hedefleme bağlamı (userId ve groups) geçirmek zahmetli ve tekrarlayıcı olabilir. Bu senaryo, kullanıcı kimliği bilgilerinin uygulama bağlamında (oturum verileri veya kimlik doğrulama bağlamı gibi) zaten kullanılabildiği ancak uygulama genelinde özellik yönetimi değerlendirmeleri için erişilebilir olması gereken "ortam hedefleme bağlamı" olarak adlandırılır.

ITargetingContextErişici

Kitaplık, desen aracılığıyla ITargetingContextAccessor bir çözüm sağlar.

interface ITargetingContext {
    userId?: string;
    groups?: string[];
}

interface ITargetingContextAccessor {
    getTargetingContext: () => ITargetingContext | undefined;
}

Hedefleme bağlamını her isEnabled veya getVariant çağrıyla açıkça geçirmek yerine, geçerli kullanıcının hedefleme bilgilerini uygulamanızın bağlamından nasıl alabileceğini bilen bir işlev sağlayabilirsiniz:

import { FeatureManager, ConfigurationObjectFeatureFlagProvider } from "@microsoft/feature-management";

// Create a targeting context accessor that uses your application's auth system
const targetingContextAccessor = {
    getTargetingContext: () => {
        // In a web application, this might access request context or session data
        // This is just an example - implement based on your application's architecture
        return {
            userId: getCurrentUserId(), // Your function to get current user
            groups: getUserGroups()     // Your function to get user groups
        };
    }
};

// Configure the feature manager with the accessor
const featureManager = new FeatureManager(featureProvider, {
    targetingContextAccessor: targetingContextAccessor
});

// Now you can call isEnabled without explicitly providing targeting context
// The feature manager will use the accessor to get the current user context
const isBetaEnabled = await featureManager.isEnabled("Beta");

Sunucu tarafı web uygulamalarında, kullanıcı bağlamının bir istek kapsamı içinde yer aldığı veya kullanıcı kimliğinin merkezi bir şekilde yönetildiği istemci uygulamalarında bu düzen özellikle kullanışlıdır.

İstek bağlamı için AsyncLocalStorage kullanma

Hedefleme bağlam erişimcisi desenini uygularken karşılaşılan yaygın zorluklardan biri, asenkron çağrı zinciri boyunca istek bağlamını korumaktır. Node.js web uygulamalarında, kullanıcı kimliği bilgileri genellikle istek nesnesinde bulunur, ancak zaman uyumsuz işlemler girdiğinizde erişilemez hale gelir.

Node.js bu sorunu çözmek için AsyncLocalStorage modülünden async_hooks sağlar. Aynı mantıksal "bağlam" içinde, zaman uyumsuz işlemler boyunca kalıcı olan ve tüm istek yaşam döngüsü boyunca istek verilerini korumak için mükemmel olan bir depo yaratır.

Express uygulamasında AsyncLocalStorage kullanarak hedefleme bağlamı erişimcisini şu şekilde uygulayacaksınız:

import { AsyncLocalStorage } from "async_hooks";
import express from "express";

const requestAccessor = new AsyncLocalStorage();

const app = express();
// Middleware to store request context
app.use((req, res, next) => {
    // Store the request in AsyncLocalStorage for this request chain
    requestAccessor.run(req, () => {
        next();
    });
});

// Create targeting context accessor that retrieves user data from the current request
const targetingContextAccessor = {
    getTargetingContext: () => {
        // Get the current request from AsyncLocalStorage
        const request = requestAccesor.getStore();
        if (!request) {
            return undefined; // Return undefined if there's no current request
        }
        // Extract user data from request (from session, auth token, etc.)
        return {
            userId: request.user?.id,
            groups: request.user?.groups || []
        };
    }
};

Varyantlar

Bir uygulamaya yeni özellikler eklendiğinde, bir özelliğin birden çok farklı tasarım seçeneğinin olduğu bir zaman gelebilir. Tasarıma karar vermek için yaygın bir çözüm, kullanıcı tabanının farklı segmentlerine özelliğin farklı bir sürümünü sağlamayı ve kullanıcı etkileşimini temel alan bir sürüm seçmeyi içeren bir tür A/B testidir. Bu kitaplıkta bu işlev, bir özelliğin farklı yapılandırmalarını çeşitlemelerle temsil ederek etkinleştirilir.

Çeşitlemeler, özellik bayrağının basit bir açık/kapalı bayrağından daha fazlasına dönüşebilmesini sağlar. Değişken, bir özellik bayrağının dize, sayı, boole, hatta yapılandırma nesnesi olabilecek bir değerini temsil eder. Varyantları bildiren bir özellik bayrağı, varyant ayırma bölümünde daha ayrıntılı olarak ele alınan her bir değişkenin hangi koşullarda kullanılması gerektiğini tanımlamalıdır.

Hedefleme bağlamı ile değişken elde etme

Her özellik için, FeatureManager'nin getVariant yöntemi kullanılarak bir varyant alınabilir. Varyant ataması, şu anda değerlendirilmekte olan kullanıcıya bağlıdır ve bu bilgiler, sizin sağladığınız hedefleme bağlamından alınır. Bir hedefleme bağlamı erişimcisini FeatureManager öğeye kaydettiyseniz, hedefleme bağlamı otomatik olarak ondan alınır. Ancak getVariant çağrısı yapılırken hedefleme bağlamını el ile geçerek bunu geçersiz kılabilirsiniz.

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

Değişken özellik bayrağı bildirimi

Normal özellik bayraklarıyla karşılaştırıldığında, değişken özellik bayraklarının iki özelliği daha vardır: variants ve allocation. variants özelliği, bu özellik için tanımlanan değişkenleri içeren bir dizidir. özelliği, allocation bu varyantların özellik için nasıl ayrılacaklarını tanımlar. Normal özellik bayraklarını bildirme gibi, bir JSON dosyasında da değişken özellik bayrakları ayarlayabilirsiniz. Aşağıda bir değişken özellik bayrağı örneği verilmiştır.

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

Varyantları tanımlama

Her değişken iki özelliğe sahiptir: ad ve yapılandırma. Ad, belirli bir değişkene başvurmak için kullanılır ve yapılandırma bu değişkenin değeridir. Yapılandırma özelliği kullanılarak configuration_value ayarlanabilir. configuration_value dize, sayı, boole veya yapılandırma nesnesi olabilecek bir satır içi yapılandırmadır. Belirtilmezse configuration_value , döndürülen değişkenin configuration özelliği olur undefined.

Özelliğin altındaki her özellik için tüm olası değişkenlerin variants listesi tanımlanır.

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

Çeşitlemeleri tahsis etme

Bir özelliğin değişkenlerini ayırma işlemi, özelliğin allocation özelliği tarafından belirlenir.

"allocation": { 
    "default_when_disabled": "Small",  
    "default_when_enabled": "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"
    } 
]

Bir allocation özelliğin ayarı aşağıdaki özelliklere sahiptir:

Mülk Açıklama
default_when_disabled Özellik devre dışı olarak kabul edilirken bir değişken istendiğinde hangi değişkenin kullanılacağını belirtir.
default_when_enabled Özellik etkin olarak kabul edilirken ve kullanıcıya başka bir değişken atanmadığında bir değişken istendiğinde hangi değişkenin kullanılacağını belirtir.
user Bir değişken ve bu değişkenin atanması gereken kullanıcıların listesini belirtir.
group Bir değişken ve grup listesi belirtir. Kullanıcı en az bir gruptaysa varyant atanır.
percentile Kullanıcının hesaplanan yüzdesinin belirli bir değişkene atanabilmesi için uyması gereken bir varyant ve yüzde aralığını belirtir.
seed Yüzde hesaplamalarının percentile temel aldığı değer. Belirli bir kullanıcı için yüzde hesaplaması, aynı değer kullanılırsa tüm özelliklerde aynı seed olur. Eğer seed belirtilmezse, özellik adına göre varsayılan bir tohum oluşturulur.

Özellik etkinleştirilmemişse, özellik yöneticisi geçerli kullanıcıya default_when_disabled olarak işaretlenmiş değişkeni atar; ki bu durumda Small'dir.

Özellik etkinleştirilirse, özellik yöneticisi bir varyant atamak için user, group, ve percentile ayırmalarını bu sırayla denetler. Bu belirli örnek için, değerlendirilen kullanıcı Marsha adlı kullanıcıysa, Ring1 adlı gruptaysa veya kullanıcı 0 ile 10. yüzde dilimi arasında kalıyorsa, belirtilen varyant kullanıcıya atanır. Bu durumda, atanan tüm kullanıcılar değişkenini Big döndürür. Eğer bu ayırmalardan hiçbiri eşleşmiyorsa, kullanıcıya default_when_enabled olan Small varyantı atanır.

Ayırma mantığı Microsoft.Targeting özellik filtresine benzer, ancak hedeflemede bulunan ve ayırmada olmayan bazı parametreler vardır ve tam tersi de geçerlidir. Hedefleme ve ayırmanın sonuçları ilişkili değildir.

Etkin durumu bir değişkenle geçersiz kılma

Özellik bayrağının etkin durumunu geçersiz kılmak için varyantları kullanabilirsiniz. Geçersiz kılma, varyantlara bir özellik bayrağının değerlendirmesini genişletme fırsatı sunar. Özellik yöneticisi, varyantları olan bir bayrak üzerinde çağrı is_enabled yaparken, geçerli kullanıcıya atanan değişkenin sonucu geçersiz kılacak şekilde yapılandırılıp yapılandırılmamış olduğunu denetler. Geçersiz kılma, opsiyonel variant özelliği status_override kullanılarak yapılır. Varsayılan olarak, bu özellik olarak Noneayarlanır. Bu, değişkenin bayrağın etkin veya devre dışı olarak kabul edilip edilmediğini etkilemediği anlamına gelir. ayarı status_overrideEnabled , seçildiğinde bir bayrağın etkinleştirilmesini geçersiz kılmak için değişkene izin verir. ayarı status_overrideDisabled tam tersi bir işlev sağlar, bu nedenle değişken seçildiğinde bayrağı devre dışı bırakır. Durumu enabled olan bir false özellik geçersiz kılınamaz.

İkili değişkenli bir özellik bayrağı kullanıyorsanız özelliği status_override yararlı olabilir. Uygulamanızda is_enabled gibi API'leri kullanmaya devam etmenizi sağlarken, yüzdelik ayırma ve rastgelelik çekirdeği gibi çeşitlemelerle birlikte gelen yeni özelliklerden yararlanmanızı sağlar.

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

Yukarıdaki örnekte özellik her zaman etkindir. Geçerli kullanıcı 10 ile 20 arasında hesaplanan yüzdelik dilim aralığındaysa, On varyantı döndürülür. Aksi takdirde, Off değişken döndürülür ve status_override değerine eşit Disabledolduğundan özellik artık devre dışı olarak kabul edilir.

Telemetri

Özellik bayrağı değişikliği dağıtıldığında, bunun uygulama üzerindeki etkisini analiz etmek genellikle önemlidir. Örneğin, ortaya çıkabilecek birkaç soru şunlardır:

  • Bayraklarım beklendiği gibi etkin/devre dışı mı?
  • Hedeflenen kullanıcılar beklendiği gibi belirli bir özelliğe erişiyor mu?
  • Belirli bir kullanıcı hangi varyantı görüyor?

Bu tür sorular, özellik bayrağı değerlendirme olaylarının emisyonu ve analizi aracılığıyla yanıtlanabilir.

Telemetriyi etkinleştirme

Varsayılan olarak, özellik bayraklarında telemetri gösterilmez. Belirli bir özellik bayrağı için telemetri yayımlamak amacıyla, bayrağın telemetri emisyonu için etkinleştirildiğini BİLDİRMESİ GEREKİR.

json'da tanımlanan özellik bayrakları için etkinleştirme özelliği kullanılarak telemetry gerçekleştirilir.

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

Yukarıdaki kod parçacığı, telemetri için etkinleştirilmiş adlı MyFeatureFlag bir özellik bayrağı tanımlar. Nesnenin telemetryenabled özelliği olarak trueayarlanır. Bayrak için telemetri yayınlamak amacıyla enabled özelliğinin değeri true olmalıdır.

Özellik telemetry bayrağının bölümü aşağıdaki özelliklere sahiptir:

Mülk Açıklama
enabled Özellik işareti için telemetrinin yayımlanıp yayımlanmayacağını belirtir.
metadata Değerlendirme olaylarına özellik bayrağı hakkında özel meta veriler eklemek için kullanılabilen, sözlük olarak modellenen anahtar-değer çiftleri koleksiyonu.

Özel telemetri yayımlama

Bir onFeatureEvaluated oluştururken bir FeatureManager geri çağırma işlevini kaydedebilirsiniz. Bu geri çağırma, bir özellik bayrağı değerlendirildiğinde ve bu bayrak için telemetri etkinleştirildiğinde çağrılır. Geri çağırma işlevi, parametre olarak özellik değerlendirme sonucunu alır.

Aşağıdaki örnekte, özellik değerlendirme sonucundan ayıklanan bilgilerle telemetri göndermek ve özellik yöneticisine kaydetmek için özel bir geri çağırma işlevinin nasıl uygulandığı gösterilmektedir.

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 entegrasyonu

JavaScript özellik yönetimi kitaplığı, Application Insights SDK'larıyla tümleşen uzantı paketleri sağlar.

Application Insights, web ve Node.js senaryoları için farklı SDK'lar sunar. Lütfen uygulamanız için doğru uzantı paketlerini seçin.

Uygulamanız tarayıcıda çalışıyorsa paketi yükleyin "@microsoft/feature-management-applicationinsights-browser" . Aşağıdaki örnek, yerleşik bir Application Insights telemetri yayımcısı oluşturup bunu özellik yöneticisine nasıl kaydedebileceğinizi gösterir.

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

Telemetri ile etkinleştirilmiş bir özellik bayrağı değerlendirildiğinde telemetri yayımcısı Application Insights'a özel olaylar gönderir FeatureEvaluation . Özel olay FeatureEvaluationEvent şemasını izler.

Telemetri işlemcisini hedefleme

Eğer ITargetingContextAccessor uyguladıysanız, createTargetingTelemetryProcessor işlevini çağırarak tüm telemetriye hedefleme kimliği bilgilerini otomatik olarak eklemek için yerleşik Application Insights telemetri işlemcisini kullanabilirsiniz.

const appInsights = require("applicationinsights");
appInsights.setup(process.env.APPINSIGHTS_CONNECTION_STRING).start();

const { createTargetingTelemetryProcessor } = require("@microsoft/feature-management-applicationinsights-node");
appInsights.defaultClient.addTelemetryProcessor(
    createTargetingTelemetryProcessor(targetingContextAccessor)
);

Bu, Application Insights'a gönderilen her telemetri öğesinin kullanıcının hedefleme kimliği bilgilerini (userId ve gruplar) içermesini sağlayarak özellik bayrağı kullanımını analizinizdeki belirli kullanıcılar veya gruplarla ilişkilendirmenizi sağlar.

Hedefleme telemetri işlemcisini kullanıyorsanız, özellik yönetim paketinin sağladığı trackEvent yöntemini çağırmak yerine, doğrudan Application Insights SDK'sındaki trackEvent yöntemini çağırabilirsiniz. Hedefleme kimliği bilgileri, özel olay telemetrisine customDimensionsotomatik olarak eklenir.

// Instead of calling trackEvent and passing the app insights client
// trackEvent(appInsights.defaultClient, "<TARGETING_ID>", {name: "TestEvent",  properties: {"Tag": "Some Value"}});

// directly call trackEvent method provided by App Insights SDK
appInsights.defaultClient.trackEvent({ name: "TestEvent" });

Sonraki adımlar

Uygulamalarınızda özellik bayraklarını kullanmayı öğrenmek için aşağıdaki hızlı başlangıçlara geçin.

Özellik filtrelerini kullanmayı öğrenmek için aşağıdaki eğitimlere devam edin.