Ce guide explique comment configurer et exécuter un déploiement progressif de fonctionnalités à l'aide des indicateurs de fonctionnalité App Lifecycle Manager. Vous apprendrez à définir des attributs de ciblage, à configurer des allocations basées sur des pourcentages et à effectuer un déploiement progressif de manière sécurisée.
Nous allons utiliser un scénario dans lequel vous souhaitez activer un algorithme enhanced-search pour seulement 1 % de votre trafic, randomisé par l'attribut userID, tandis que les 99 % restants continueront d'utiliser la recherche standard.
Prérequis
Avant de commencer, assurez-vous d'avoir suivi l'un des guides de démarrage rapide standards pour provisionner votre infrastructure de base ou vos ressources de flags de fonctionnalité autonomes :
- Guide de démarrage rapide : déployer des indicateurs de fonctionnalité avec App Lifecycle Manager
- Guide de démarrage rapide : utiliser des flags de fonctionnalité autonome
Intégrer le flag dans votre application
Pour prendre en charge les allocations basées sur des pourcentages et pilotées par les données utilisateur, votre application doit associer la valeur de l'attribut (par exemple, userID) au contexte d'évaluation OpenFeature au moment de l'exécution avant d'appeler la méthode d'évaluation.
Les exemples suivants montrent comment récupérer le client initialisé et évaluer le flag avec le contexte de ciblage associé.
"github.com/open-feature/go-sdk/pkg/openfeature"
)
// Exemple d'ID utilisateur : dans une application réelle, il proviendrait du contexte de la requête. var userID = "example-user-123"
// 1. Obtenir le client client := openfeature.NewClient("simple-api")
// 2. Créez un contexte d'évaluation avec des données utilisateur. evalCtx := openfeature.NewEvaluationContext( userID, map[string]interface{}{ "userID": userID, // Ensure userID is passed dynamically }, )
// 3. Evaluate flag (defaults to false if unreachable) isEnhanced, err := client.BooleanValue(context.Background(), "enhanced-search", false, evalCtx) if err != nil { log.Printf("Flag evaluation failed: %v", err) }
// 4. Exécuter la logique métier
if isEnhanced {
log.Printf("Enhanced search algorithm for user %s", userID)
} else {
log.Printf("Standard search algorithm for user %s", userID)
}
</devsite-tab>
<devsite-tab title="Java">java
// 1. Obtenir le client
var client = OpenFeatureAPI.getInstance().getClient("simple-api");
// 2. Créer un contexte d'évaluation avec des données utilisateur var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);
// 3. Évaluer le flag boolean isEnhanced = client.getBooleanValue("enhanced-search", false, context);
// 4. Exécuter la logique métier
if (isEnhanced) {
System.out.println("Executing enhanced search algorithm...");
} else {
System.out.println("Executing standard search algorithm...");
}
</devsite-tab>
<devsite-tab title="Python">python
import openfeature
from openfeature.evaluation_context import EvaluationContext
1. Obtenir un client
client = openfeature.api.get_client()
2. Créer un contexte d'évaluation avec des données utilisateur
eval_ctx = EvaluationContext(
targeting_key=str(user_id),
attributes={
"userID": user_id,
}
)
3. Évaluer l'option
is_enhanced = client.get_boolean_value( "enhanced-search", False, eval_ctx )
4. Exécuter la logique métier
if is_enhanced: print(f"Executing enhanced search for user {user_id}") else: print(f"Executing standard search for user {user_id}") ```
Configurer le comportement des indicateurs
Définissez le paramètre d'attribut aléatoire et associez-le à une règle d'allocation basée sur un pourcentage sur la ressource de flag de fonctionnalité.
Créez l'attribut de ciblage : définissez la ressource d'attribut
userIDde manière globale pour l'enregistrer pour l'évaluation du ciblage.gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \ --key="userID" \ --attribute-value-type="STRING" \ --location="global"Définissez la règle d'allocation des flags de fonctionnalité : créez la ressource de flag de fonctionnalité pour attribuer un poids de 1 % à la variante
enabledrandomisée suruserID.gcloud beta app-lifecycle-manager flags create "enhanced-search" \ --key="enhanced-search" \ --flag-value-type=BOOL \ --location="global" \ --unit-kind="demo-test-unitKind" \ --variants='[ { "id": "Enabled", "booleanValue": true }, { "id": "Disabled", "booleanValue": false } ]' \ --evaluation-spec='{ "allocations": [{ "id": "percentage-rollout", "randomizedOn": "userID", "slots": [ {"variant": "enabled", "weight": 1}, {"variant": "disabled", "weight": 99} ] }], "defaultTarget": "percentage-rollout", "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"] }' \
Créer un déploiement de configuration de flag
Pour distribuer la règle d'allocation progressive que vous venez de créer de manière sécurisée, suivez les phases de déploiement immuables standards.
Créez une révision : capturez un instantané de la configuration d'allocation de 1 %.
gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \ --location="global" \ --flag="enhanced-search"Créez une version : packagez la révision pour le déploiement sur vos types d'unités.
gcloud beta app-lifecycle-manager flags releases create "release-of-enhanced-search" \ --location="global" \ --unit-kind="demo-test-unitkind" \ --flag-revisions="enhanced-search-rev-1"Lancez le déploiement : définissez votre stratégie d'orchestration et déployez la configuration.
gcloud beta app-lifecycle-manager rollout-kinds create "rollout-kind-of-enhanced-search" \ --unit-kind="demo-test-unikind" \ --rollout-orchestration-strategy="Google.Cloud.Simple.AllAtOnce" \ --location="global" gcloud beta app-lifecycle-manager rollouts create "rollout-of-enhanced-search" \ --flag-release="release-of-enhanced-search" \ --rollout-kind="rollout-kind-of-enhanced-search" \ --location="global"Surveillez le déploiement : vérifiez que le déploiement atteint l'état
SUCCEEDED.gcloud beta app-lifecycle-manager rollouts describe "rollout-of-enhanced-search" \ --location="global"
Modifier le ciblage des indicateurs
Une fois que le déploiement à 1 % est jugé réussi et stable, augmentez le pourcentage de l'audience en modifiant le poids de l'allocation interne du flag (par exemple, à 50 %).
Mettez à jour la spécification du flag : définissez les emplacements d'allocation sur 50 % activés et 50 % désactivés.
gcloud beta app-lifecycle-manager flags update "enhanced-search" \ --evaluation-spec='{ "allocations": [{ "id": "percentage-rollout", "randomizedOn": "userID", "slots": [ {"variant": "enabled", "weight": 50}, {"variant": "disabled", "weight": 50} ] }], "defaultTarget": "percentage-rollout", "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"] }'Déployez l'expansion : suivez le cycle de vie pour distribuer le nouveau poids aux clients connectés.
gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-2" \ --location="global" \ --flag="enhanced-search" gcloud beta app-lifecycle-manager flags releases create "enhanced-search-50pct" \ --location="global" \ --unit-kind="demo-test-unitkind" \ --flag-revisions="enhanced-search-rev-2" gcloud beta app-lifecycle-manager rollouts create "rollout-of-enhanced-search-50pct" \ --flag-release="enhanced-search-50pct" \ --rollout-kind="rollout-kind-of-enhanced-search" \ --location="global"Cette opération peut être répétée en continu jusqu'à ce que la fonctionnalité soit déployée à 100 %.
Mettre hors service un indicateur
curl --request POST
"https://saasservicemgmt.googleapis.com/v1beta1/projects/PROJECT_ID/locations/global/flagReleases?flagReleaseId=obsolete-enhanced-search"
--header "Authorization: Bearer $(gcloud auth application-default print-access-token)"
--header "Content-Type: application/json"
--header "Accept: application/json"
--data "{ "unitKind": "projects/PROJECT_ID/locations/global/unitKinds/UNIT_KIND_ID", "obsoleteFlags": ["projects/PROJECT_ID/locations/global/flags/enhanced-search"] }"
Une fois qu'un flag de fonctionnalité a terminé son déploiement et qu'il sert de comportement opérationnel standard, il doit être mis hors service de manière sécurisée.
- Supprimez-les de l'application : supprimez toute la logique conditionnelle d'évaluation des indicateurs de la base de code de votre application et déployez la charge utile mise à jour en production.
- Marquer pour nettoyage : définissez l'état de l'indicateur sur
CLEANUPpour signaler explicitement l'intention de le déprovisionner. - Déployer le déploiement final : exécutez un déploiement final pour rendre la configuration du backend explicitement indisponible. Vous pourrez ensuite supprimer en toute sécurité les métadonnées de l'indicateur et de la révision du plan de gestion.