Compartilhar via


Gerenciamento de recursos JavaScript

feature-management-npm-package

A biblioteca de gerenciamento de recursos JavaScript oferece uma forma de desenvolver e expor a funcionalidade do aplicativo com base em sinalizadores de recursos. Depois que um novo recurso é desenvolvido, muitos aplicativos têm requisitos especiais, como quando o recurso deve ser habilitado e sob quais condições. Essa biblioteca oferece uma forma de definir essas relações, além de se integrar a padrões comuns de código JavaScript para possibilitar a exposição desses recursos.

os sinalizadores de recursos permitem que aplicativos JavaScript ativem ou desativem recursos de maneira dinâmica. Os desenvolvedores podem usar sinalizadores de recursos em casos de uso simples, como instruções condicionais.

Confira alguns dos benefícios do uso da biblioteca de gerenciamento de recursos JavaScript:

  • Uma convenção comum para o gerenciamento de recursos
  • Baixa barreira de entrada
    • Dá suporte a objetos JSON e fontes de sinalizador de recursos baseadas em mapa
    • Dá suporte ao uso em ambientes do Node.js e do navegador
  • Gerenciamento de tempo de vida do sinalizador de recursos com a Configuração de Aplicativos do Azure
    • Os valores de configuração podem mudar em tempo real
  • Abrange cenários simples a complexos
    • Ative/desative recursos por meio do arquivo de configuração declarativa
    • Avalie dinamicamente o estado do recurso com base na chamada ao servidor

A biblioteca de gerenciamento de recursos JavaScript é de código aberto. Para obter mais informações, acesse o repositório do GitHub.

Observação

Recomendamos usar a biblioteca de gerenciamento de recursos junto com a Configuração de Aplicativos do Azure. A Configuração de Aplicativos do Azure oferece uma solução para gerenciar centralmente as configurações do aplicativo e os sinalizadores de recursos. Para obter mais detalhes, consulte esta seção.

Sinalizadores de recurso

Os sinalizadores de recursos são compostos por duas partes, um nome e uma lista de filtros de recursos usados para ativar o recurso.

Filtros de recursos

Os filtros de recursos definem um cenário para quando um recurso deve ser habilitado. Quando um recurso é avaliado se ele está ativado ou desativado, sua lista de filtros de recursos é percorrida até que um dos filtros decida que o recurso deve ser habilitado. Nesse ponto, o recurso é considerado habilitado e a passagem pelos filtros de recursos é interrompida. Se nenhum filtro de recurso indicar que o recurso deve ser habilitado, ele será considerado desabilitado.

Por exemplo, um filtro de recurso do navegador Microsoft Edge pode ser projetado. Este filtro de recursos ativaria quaisquer recursos a ele associados, desde que uma solicitação HTTP venha do Microsoft Edge.

Configuração do sinalizador de recurso

Em JavaScript, os desenvolvedores geralmente usam objetos ou mapas como as estruturas de dados primárias para representar as configurações. A biblioteca de gerenciamento de recursos JavaScript dá suporte às duas abordagens de configuração, fornecendo aos desenvolvedores a flexibilidade para escolher a opção que melhor atenda às respectivas necessidades. O FeatureManager pode ler sinalizadores de recursos de diferentes tipos de configuração usando o ConfigurationObjectFeatureFlagProvider e o ConfigurationMapFeatureFlagProvider internos.

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

Usar sinalizadores de recursos por meio da Configuração de Aplicativos do Azure

Em vez de embutir os sinalizadores de recursos no código do aplicativo, recomendamos que você os mantenha fora do aplicativo e os gerencie separadamente. Isso permite que você modifique os estados do sinalizador a qualquer momento e que essas alterações entrem em vigor no aplicativo imediatamente. O serviço de Configuração de Aplicativos do Azure fornece uma interface do usuário do portal dedicada para gerenciar todos os seus sinalizadores de recursos. Veja o tutorial.

O serviço de Configuração de Aplicativos do Azure também fornece os sinalizadores de recursos para seu aplicativo diretamente por meio da biblioteca de clientes JavaScript @azure/app-configuration-provider. O seguinte exemplo mostra como usar a biblioteca.

O provedor de JavaScript da Configuração de Aplicativos fornece sinalizadores de recurso em um objeto Map. O ConfigurationMapFeatureFlagProvider interno ajuda a carregar os sinalizadores de recursos nesse caso.

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

Observação

Para obter mais informações sobre como usar a biblioteca de gerenciamento de recursos com a Configuração de Aplicativos do Azure, acesse o início rápido.

Declaração do sinalizador de recurso

O exemplo a seguir mostra o formato usado para configurar os sinalizadores de recursos em um arquivo 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"
                            }
                        }
                    ]
                }
            }
        ]
    }
}

A seção feature_management é usada por convenção para carregar as configurações do sinalizador de recursos. A seção feature_flags é uma lista dos sinalizadores de recursos que são carregados na biblioteca. Na seção acima, vemos três recursos diferentes. Os recursos definem seus filtros de recursos usando a propriedade client_filters, dentro de conditions. Nos filtros de recurso de FeatureT, observamos que enabled é true sem filtros definidos, fazendo com que FeatureT sempre retorne true. FeatureU é o mesmo que FeatureT, mas com enabled sendo false, resultando em um recurso que sempre retorna false. FeatureV especifica um filtro de recurso chamado Microsoft.TimeWindow. FeatureV é um exemplo de um filtro de recurso configurável. Podemos ver no exemplo que o filtro tem uma propriedade parameters. A propriedade parameters é usada para configurar o filtro. Nesse caso, os horários de início e término do recurso a ser ativo são configurados.

O esquema detalhado da seção feature_management pode ser encontrado aqui.

Avançado: o uso de dois-pontos ':' é proibido em nomes de sinalizador de recurso.

Tipo de requisito

A propriedade requirement_type de um sinalizador de recurso é usada para determinar se os filtros devem usar a lógica Any ou All ao avaliar o estado de um recurso. Se requirement_type não for especificado, o valor padrão será Any.

  • Any significa que apenas um filtro precisa ser avaliado como true para que o recurso seja habilitado.
  • All significa que cada filtro precisa ser avaliado como true para que o recurso seja habilitado.

Um requirement_type de All altera a transversal. Primeiro, se não houver filtros, o recurso será desabilitado. Em seguida, os filtros de recurso são percorridos até que um dos filtros decida que o recurso deve ser desabilitado. Se nenhum filtro indicar que o recurso deve ser desabilitado, ele será considerado habilitado.

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

No exemplo acima, FeatureW especifica um requirement_type de All, o que significa que todos os seus filtros devem ser avaliados como verdadeiros para que o recurso seja habilitado. Nesse caso, o recurso está habilitado para 50% dos usuários durante a janela de tempo especificada.

Consumo

A forma básica de gerenciamento de recursos é verificar se um sinalizador de recurso está habilitado e executar ações com base no resultado. Verificar o estado de um sinalizador de recurso é feito através do método isEnabled de FeatureManager.

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
}

Implementando um filtro de recurso

A criação de um filtro de recursos fornece uma maneira de habilitar recursos com base nos critérios definidos por você. Para implementar um filtro de recurso, a interface IFeatureFilter deve ser implementada. IFeatureFilter tem uma propriedade name e um método chamado evaluate. O name deve ser usado na configuração para referenciar o filtro de recursos dentro de um sinalizador de recursos. Quando um recurso especifica que ele pode ser habilitado para um filtro de recurso, o método evaluate é chamado. Se evaluate retornar true, significa que o recurso deve ser habilitado.

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

O snippet a seguir demonstra como implementar um filtro de recurso personalizado com o nome MyCriteria.

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

Você precisa registrar o filtro personalizado ao criar o FeatureManager.

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

Filtros de recursos parametrizados

Alguns filtros de recursos exigem parâmetros para decidir se um recurso deve ser ativado ou não. Por exemplo, um filtro de recurso do navegador pode ativar um recurso para um determinado conjunto de navegadores. Pode ser desejado que os navegadores Edge e Chrome habilitem um recurso, enquanto o Firefox não. Para fazer isso, um filtro de recurso pode ser projetado para esperar parâmetros. Esses parâmetros seriam especificados na configuração do recurso e, no código, seriam acessíveis por meio do parâmetro IFeatureFilterEvaluationContext de IFeatureFilter.Evaluate.

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

IFeatureFilterEvaluationContext tem uma propriedade chamada parameters. Esses parâmetros representam uma configuração bruta que o filtro de recursos pode usar para decidir como avaliar se o recurso deve ser habilitado ou não. Para usar o filtro de recursos do navegador como exemplo mais uma vez, o filtro pode usar parameters para extrair um conjunto de navegadores permitidos que seriam especificados para o recurso e, em seguida, verificar se a solicitação está sendo enviada de um desses navegadores.

Usar o contexto do aplicativo para a avaliação de recursos

Um filtro de recurso pode precisar de contexto do aplicativo de runtime para avaliar um sinalizador de recursos. Você pode transmitir o contexto como um parâmetro ao chamar isEnabled.

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

O filtro de recursos pode aproveitar o contexto transmitido quando isEnabled é chamado. O contexto do aplicativo será transmitido como o segundo parâmetro de IFeatureFilter.Evaluate.

Filtros de recurso internos

Existem dois filtros de recursos que acompanham o pacote FeatureManagement: TimeWindowFilter e TargetingFilter.

Cada um dos filtros de recursos internos tem seus próprios parâmetros. Aqui está a lista de filtros de recursos junto com exemplos.

Microsoft.TimeWindow

Esse filtro fornece a capacidade de habilitar um recurso com base em uma janela de tempo. Se apenas End for especificado, o recurso será considerado até esse momento. Se apenas Start for especificado, o recurso será considerado em todos os pontos após esse tempo.

"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

Esse filtro fornece a capacidade de habilitar um recurso para um público-alvo. Uma explicação detalhada do direcionamento é explicada na seção direcionamento abaixo. Os parâmetros de filtro incluem um objeto Audience que descreve usuários, grupos, usuários/grupos excluídos e um percentual padrão da base de usuários que deve ter acesso ao recurso. Cada objeto de grupo listado na seção Groups também deve especificar qual porcentagem dos membros do grupo deve ter acesso. Se um usuário for especificado na seção Exclusion, diretamente ou se o usuário estiver em um grupo excluído, o recurso será desabilitado. Caso contrário, se um usuário for especificado diretamente na seção Users ou se o usuário estiver no percentual incluído de qualquer uma das distribuições de grupo ou se o usuário se enquadrar no percentual de distribuição padrão, esse usuário terá o recurso habilitado.

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

Direcionamento

A segmentação é uma estratégia de gerenciamento de recursos que permite aos desenvolvedores implementar progressivamente novos recursos para sua base de usuários. A estratégia baseia-se no conceito de atingir um conjunto de usuários conhecido como público-alvo. Um público é composto por usuários, grupos específicos e uma porcentagem designada de toda a base de usuários. Os grupos incluídos na audiência podem ser divididos ainda mais em percentuais de seus membros totais.

As etapas a seguir demonstram um exemplo de uma distribuição progressiva para um novo recurso "Beta":

  1. Os usuários individuais Júlio e Alice recebem acesso à versão beta.
  2. Outro usuário, Mark, pede para aceitar e é incluído.
  3. Vinte por cento de um grupo conhecido como usuários "Ring1" estão incluídos no Beta.
  4. O número de usuários “Ring1” incluídos na versão beta é aumentado para 100%.
  5. Cinco por cento da base de usuários está incluída na versão beta.
  6. O percentual de distribuição é aumentado em até 100% e o recurso é completamente distribuído.

Esta estratégia para implantar um recurso é incorporada à biblioteca por meio do filtro de recursos Microsoft.Targetingincluso.

Como direcionar um usuário com o contexto de direcionamento

O filtro de direcionamento depende de um contexto de direcionamento para avaliar se um recurso deve ser ativado. Esse contexto de direcionamento contém informações como o usuário que está sendo avaliado no momento e os grupos em que o usuário está. O contexto de direcionamento precisa ser transmitido diretamente quando isEnabled é chamado.

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

Exclusão de direcionamento

Ao definir um público-alvo, usuários e grupos podem ser excluídos do público-alvo. Exclusões são úteis quando um recurso está sendo distribuído para um grupo de usuários, mas alguns usuários ou grupos precisam ser excluídos da distribuição. A exclusão é definida adicionando uma lista de usuários e grupos à propriedade Exclusion do público-alvo.

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

No exemplo acima, o recurso está habilitado para usuários chamados Jeff e Alicia. Ele também está habilitado para usuários no grupo chamado Ring0. No entanto, se o usuário for chamado Mark, o recurso será desabilitado, independentemente de estar no grupo Ring0 ou não. As exclusões têm prioridade sobre o restante do filtro de direcionamento.

Variantes

Quando novos recursos são adicionados a um aplicativo, pode chegar um momento em que um recurso tem várias opções de design propostas diferentes. Uma solução comum para decidir sobre um design é uma forma de teste A/B, que envolve fornecer uma versão diferente do recurso para diferentes segmentos da base de usuários e escolher uma versão com base na interação do usuário. Nesta biblioteca, essa funcionalidade é habilitada por meio da representação de diferentes configurações de um recurso com variantes.

As variantes permitem que um sinalizador de recurso se torne mais do que um sinalizador simples de ativação/desativação. Uma variante representa um valor de um sinalizador de recurso que pode ser uma cadeia de caracteres, um número, um booliano ou até mesmo um objeto de configuração. Um sinalizador de recurso que declara variantes deve definir em quais circunstâncias cada variante deve ser usada, o que é abordado em maior detalhe na seção Alocação de variantes.

Como obter uma grade com o contexto de direcionamento

Para cada recurso, uma variante pode ser recuperada usando o método FeatureManager do getVariant. A atribuição de grade depende do usuário que está sendo avaliado no momento e essas informações são obtidas do contexto de destino transmitido.

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

Declaração do sinalizador de recurso variante

Comparado aos sinalizadores de recurso normais, os sinalizadores de recurso variantes têm mais duas propriedades: variants e allocation. A propriedade variants é uma matriz que contém as variantes definidas para esse recurso. A propriedade allocation define como essas variantes devem ser alocadas para o recurso. Assim como ao declarar sinalizadores de recurso normais, você pode configurar sinalizadores de recurso variantes em um arquivo JSON. Aqui está um exemplo de um sinalizador de recurso variante.

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

Definindo variantes

Cada variante tem duas propriedades: um nome e uma configuração. O nome é usado para se referir a uma variante específica e a configuração é o valor dessa variante. A configuração pode ser definida usando a propriedade configuration_value. configuration_value é uma configuração embutida que pode ser uma cadeia de caracteres, número, booliano ou objeto de configuração. Se configuration_value não for especificado, a propriedade configuration da variante retornada será undefined.

Uma lista de todas as variantes possíveis é definida para cada recurso na propriedade variants.

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

Alocando variantes

O processo de alocação das variantes de um recurso é determinado pela propriedade allocation do recurso.

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

A configuração allocation de um recurso tem as seguintes propriedades:

Propriedade Descrição
default_when_disabled Especifica qual variante deve ser usada quando uma variante é solicitada enquanto o recurso é considerado desabilitado.
default_when_enabled Especifica qual variante deve ser usada quando uma variante é solicitada enquanto o recurso é considerado habilitado e nenhuma outra variante foi atribuída ao usuário.
user Especifica uma variante e uma lista de usuários aos quais essa variante deve ser atribuída.
group Especifica uma variante e uma lista de grupos. A variante é atribuída se o usuário estiver em pelo menos um dos grupos.
percentile Especifica uma variante e um intervalo de porcentagem em que o percentual calculado do usuário precisa se ajustar para que essa variante seja atribuída.
seed O valor no qual os cálculos de porcentagem para percentile se baseiam. O cálculo de porcentagem para um usuário específico será o mesmo em todos os recursos se o mesmo valor seed for usado. Se nenhum seed for especificado, uma semente padrão será criada com base no nome do recurso.

Se o recurso não estiver habilitado, o gerente de recursos atribuirá a variante marcada como default_when_disabled ao usuário atual, que neste caso será Small.

Se o recurso estiver habilitado, o gerente de recursos verificará as alocações user, group e percentile nessa ordem para atribuir uma variante. Para este exemplo específico, se o usuário que está sendo avaliado for nomeado Marsha, no grupo nomeado Ring1, ou se o usuário estiver entre o percentil 0 e 10, a variante especificada será atribuída ao usuário. Nesse caso, todos os usuários atribuídos retornariam a variante Big. Se nenhuma dessas alocações corresponder, o usuário recebe a variante default_when_enabled, que é Small.

A lógica de alocação é semelhante ao filtro de recursos Microsoft.Targeting, mas há alguns parâmetros presentes no direcionamento que não estão em alocação e vice-versa. Os resultados de direcionamento e alocação não estão relacionados.

Substituindo o estado habilitado com uma variante

Você pode usar variantes para substituir o estado habilitado de um sinalizador de recurso. A substituição dá às variantes a oportunidade de estender a avaliação de um sinalizador de recurso. Ao chamar is_enabled em um sinalizador com variantes, o gerenciador de recursos verificará se a variante atribuída ao usuário atual está configurada para substituir o resultado. A substituição é feita usando a propriedade de variante opcional status_override. Por padrão, essa propriedade é definida como None, o que significa que a variante não afeta se o sinalizador é considerado habilitado ou desabilitado. A configuração status_override para Enabled permite que a variante, quando escolhida, substitua um sinalizador a ser habilitado. A configuração status_override para Disabled fornece a funcionalidade oposta, desabilitando o sinalizador quando a variante for escolhida. Um recurso com um estado enabled de false não pode ser substituído.

Se você estiver usando um sinalizador de recurso com variantes binárias, a propriedade status_override pode ser útil. Isso permite que você continue usando APIs como is_enabled em seu aplicativo, beneficiando-se das novas funcionalidades que acompanham as variantes, como alocação de percentil e semente.

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

No exemplo acima, o recurso está sempre habilitado. Se o usuário atual estiver no intervalo de percentil calculado de 10 a 20, a variante On será retornada. Caso contrário, a variante Off será retornada e, como status_override é igual a Disabled, o recurso agora será considerado desabilitado.

Telemetria

Quando uma alteração de sinalizador de recurso é implantada, geralmente é importante analisar seu efeito em um aplicativo. Por exemplo, aqui estão algumas perguntas que podem surgir:

  • Meus sinalizadores estão habilitados/desabilitados conforme o esperado?
  • Os usuários direcionados estão recebendo acesso a um determinado recurso conforme o esperado?
  • Qual variante um usuário específico vê?

Esses tipos de perguntas podem ser respondidas por meio da emissão e análise de eventos de avaliação do sinalizador de recurso.

Habilitando a telemetria

Por padrão, os sinalizadores de recursos não têm telemetria emitida. Para publicar a telemetria para um sinalizador de recurso específico, o sinalizador DEVE declarar que está habilitado para emissão de telemetria.

Para sinalizadores de recurso definidos em JSON, a habilitação é feita usando a propriedade telemetry.

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

O trecho acima define um sinalizador de recurso chamado MyFeatureFlag que está habilitado para telemetria. A propriedade enabled do objeto telemetry está configurada para true. O valor da propriedade enabled deve ser true para publicar telemetria para o sinalizador.

A seção telemetry de um sinalizador de recurso tem as seguintes propriedades:

Propriedade Descrição
enabled Especifica se a telemetria deve ser publicada para o sinalizador de recurso.
metadata Uma coleção de pares chave-valor, modelada como um dicionário, que pode ser usada para anexar metadados personalizados sobre o sinalizador de recurso a eventos de avaliação.

Publicação de telemetria personalizada

Você pode registrar uma função de retorno de chamada onFeatureEvaluated ao criar FeatureManager. Esse retorno de chamada é chamado sempre que um sinalizador de recurso é avaliado e a telemetria está habilitada para esse sinalizador. A função de retorno de chamada assumirá o resultado da avaliação do recurso como o parâmetro.

O exemplo a seguir mostra como implementar uma função de retorno de chamada personalizada para enviar dados telemétricos com as informações extraídas do resultado da avaliação do recurso e registrá-lo no gerenciador de recursos.

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

Integração do Application Insights

A biblioteca de gerenciamento de recursos JavaScript fornece pacotes de extensão que se integram aos SDKs do Application Insights.

O Application Insights oferece diferentes SDKs para cenários web e Node.js. Selecione os pacotes de extensão corretos para seu aplicativo.

Se o aplicativo for executado no navegador, instale o pacote "@microsoft/feature-management-applicationinsights-browser". O exemplo a seguir mostra como criar um editor de dados telemétricos interno do Application Insights e registrá-lo no gerenciador de recursos.

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

O editor de dados telemétricos envia eventos personalizados FeatureEvaluation para o Application Insights quando um sinalizador de recursos habilitado com os dados telemétricos é avaliado. O evento personalizado segue o esquema FeatureEvaluationEvent.

Próximas etapas

Para saber como usar sinalizadores de recursos em seus aplicativos, prossiga para os seguintes guias de início rápido.

Para saber como usar filtros de recursos, prossiga para os seguintes tutoriais.