Ce produit n'est pas pris en charge par le site Datadog que vous avez sélectionné. ().
Présentation
Cette page décrit comment instrumenter votre application .NET avec le Datadog Feature Flags SDK. Le SDK .NET s’intègre à OpenFeature, une norme ouverte pour la gestion des feature flags, et utilise le Datadog .NET tracer (dd-trace-dotnet) pour recevoir les mises à jour des feature flags depuis le CDN géré ou Agent Remote Configuration.
À partir de la version 3.54.0 du traceur, les nouvelles configurations chargent par défaut la configuration des feature flags depuis le CDN géré par Datadog. Ce guide explique comment installer le SDK, créer un client OpenFeature et évaluer les feature flags dans votre application.
Dans la version 3.54.0, le mode sans agent modifie uniquement la configuration des feature flags. Les événements d'exposition des expérimentations nécessitent toujours un Agent local compatible ou un relais de télémétrie ; le recours direct au proxy de la plateforme d'événements (EVP) n'est pas pris en charge. Les métriques d'évaluation nécessitent un chemin d'exportation OpenTelemetry configuré séparément. Sans chemin de télémétrie, seuls la distribution de la configuration et l'évaluation locale des feature flags fonctionnent.
Prérequis
Pour une distribution de configuration sans agent, installez le traceur .NET Datadog version 3.54.0 ou ultérieure et Datadog.FeatureFlags.OpenFeature version 2.3.1 ou ultérieure. Le traceur doit être chargé avec l’instrumentation automatique ; l’installation du fournisseur OpenFeature seul ne suffit pas. Un Datadog Agent distinct n’est pas requis pour récupérer la configuration des feature flags.
Définissez ces variables d’environnement dans le processus de l’application avant le démarrage :
Utilisez une clé d’API Datadog et le site qui héberge votre organisation, tel que datadoghq.com. Aucune activation des Feature Flags ni aucun paramètre de source n’est requis pour une nouvelle configuration. Initialisez le fournisseur OpenFeature Datadog dans votre application pour commencer l’interrogation ; l’installation ou l’initialisation du traceur seul ne lance pas l’interrogation du CDN. Les évaluations utilisent une configuration mise en cache localement et n’effectuent pas de requêtes réseau.
Pour une distribution basée sur l’Agent, utilisez Datadog Agent 7.55 ou une version ultérieure avec Remote Configuration activé et une clé d’API configurée sur l’Agent. Les versions minimales du traceur sont 3.36.0 pour .NET 6+ et 3.38.0 pour .NET Framework 4.6.2+.
Avec le traceur 3.54.0 ou une version ultérieure, sélectionnez explicitement la source :
Les versions antérieures du traceur utilisent DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true. Dans la version 3.54.0, ce paramètre obsolète préserve Remote Configuration lorsque ni le nouveau paramètre d’activation ni une source explicite ne sont fournis. Pour migrer, supprimez le paramètre hérité, configurez les informations d’identification de l’application ci-dessus et définissez DD_FEATURE_FLAGS_CONFIGURATION_SOURCE=agentless si vous sélectionnez déjà une source explicitement. DD_FEATURE_FLAGS_ENABLED=false désactive les Feature Flags, quelle que soit la source sélectionnée.
Consultez Configuration Sources pour les paramètres d’interrogation, de délai d’attente de requête, d’endpoint personnalisé et de migration. L’intervalle d’interrogation sans agent par défaut est de 30 secondes, le délai d’attente de la requête est de 5 secondes et l’initialisation du fournisseur attend jusqu’à 30 secondes pour la première configuration.
Installation
Installez le Datadog .NET SDK 3 et l’OpenFeature SDK 4 à l’aide de NuGet :
Enregistrez le provider Datadog OpenFeature auprès de l’API OpenFeature. Le fournisseur active la source de configuration sélectionnée dans le traceur .NET de Datadog.
Initialisation bloquante
Utilisez SetProviderAsync avec await pour bloquer l’évaluation jusqu’à ce que la configuration initiale du flag soit reçue. Cela garantit que les flags sont prêts avant que votre application ne commence à traiter les requêtes.
usingOpenFeature;usingDatadog.FeatureFlags.OpenFeature;// Create and register the Datadog providervarprovider=newDatadogProvider();awaitApi.Instance.SetProviderAsync(provider);// Create an OpenFeature clientvarclient=Api.Instance.GetClient("my-service");// Your application code here
Initialisation non bloquante
Utilisez SetProvider pour enregistrer le fournisseur sans attendre. Les évaluations de flags renvoient des valeurs par défaut jusqu’à ce que la configuration soit reçue.
usingOpenFeature;usingDatadog.FeatureFlags.OpenFeature;// Create and register the Datadog providervarprovider=newDatadogProvider();Api.Instance.SetProvider(provider);// Create an OpenFeature clientvarclient=Api.Instance.GetClient("my-service");// Your application code here// Flag evaluations return defaults until configuration is received
Créer un client
Créez un client OpenFeature pour évaluer les flags. Vous pouvez créer plusieurs clients avec des noms différents pour différentes parties de votre application :
// Create a client for your applicationvarclient=Api.Instance.GetClient("my-service");
Définir le contexte d’évaluation
Définissez un contexte d’évaluation qui identifie l’utilisateur ou l’entité pour le ciblage des Feature Flags. Le contexte d’évaluation inclut des attributs utilisés pour déterminer quelles variations de Feature Flags doivent être renvoyées :
Datadog Feature Flags nécessite que les attributs du contexte d'évaluation soient des valeurs primitives plates : chaînes de caractères, nombres et booléens. Ne transmettez pas d'objets ou de tableaux imbriqués ; ils ne sont pas pris en charge et peuvent entraîner la perte des données d'exposition.
usingOpenFeature.Model;varevalCtx=EvaluationContext.Builder().SetTargetingKey("user-123")// Targeting key (typically user ID).Set("email","user@example.com").Set("country","US").Set("tier","premium").Set("age",25).Build();
Remarque : Dans les applications côté serveur, créez le contexte d’évaluation une fois par requête en fonction de l’utilisateur actuel, puis transmettez le même contexte à toutes les évaluations des flags au sein de cette requête. Ne reconstruisez le contexte que si les attributs de l’utilisateur changent.
La clé de ciblage est utilisée pour une distribution cohérente du trafic (déploiements progressifs). Des attributs supplémentaires permettent de définir des règles de ciblage, telles que « activer pour les utilisateurs aux États-Unis » ou « activer pour les utilisateurs de niveau premium » dans l’exemple ci-dessus.
Évaluer les Feature Flags
Après avoir configuré le fournisseur et créé un client, vous pouvez évaluer les Feature Flags dans toute votre application. L’évaluation des Feature Flags est locale et rapide : le SDK utilise des données de configuration mises en cache localement, de sorte qu’aucune requête réseau n’est effectuée pendant l’évaluation.
Chaque Feature Flag est identifié par une clé (une chaîne unique) et peut être évalué avec une méthode typée qui renvoie une valeur du type attendu. Si le Feature Flag n’existe pas ou ne peut pas être évalué, le SDK renvoie la valeur par défaut fournie.
Feature Flags booléens
Utilisez GetBooleanValueAsync pour les flags qui représentent des conditions activé/désactivé ou vrai/faux :
Pour les flags numériques, utilisez GetIntegerValueAsync ou GetDoubleValueAsync. Ils sont appropriés lorsqu’une fonctionnalité dépend d’un paramètre numérique tel qu’une limite, un pourcentage ou un multiplicateur :
Lorsque vous avez besoin de plus que la simple valeur du flag, utilisez les méthodes *DetailsAsync. Celles-ci renvoient à la fois la valeur évaluée et les métadonnées expliquant l’évaluation :
Les détails des indicateurs vous aident à déboguer le comportement d’évaluation et à comprendre pourquoi un utilisateur a reçu une valeur donnée.
En attente de l’initialisation du fournisseur
Par défaut, le fournisseur s’initialise de manière asynchrone et les évaluations des feature flags renvoient des valeurs par défaut jusqu’à ce que la première configuration de feature flags soit reçue. Si votre application nécessite que les flags soient prêts avant de traiter les requêtes, vous pouvez attendre que le fournisseur s’initialise en utilisant des gestionnaires d’événements :
usingOpenFeature;usingOpenFeature.Constant;vartaskCompletionSource=newTaskCompletionSource<bool>();// Register event handlerApi.Instance.AddHandler(ProviderEventTypes.ProviderReady,(eventDetails)=>{Console.WriteLine("Provider is ready");taskCompletionSource.SetResult(true);});Api.Instance.AddHandler(ProviderEventTypes.ProviderError,(eventDetails)=>{Console.WriteLine($"Provider error: {eventDetails.Message}");taskCompletionSource.SetResult(false);});// Set providervarprovider=newDatadogProvider();Api.Instance.SetProvider(provider);// Wait for provider to be ready (with timeout)vartimeout=Task.Delay(TimeSpan.FromSeconds(30));varcompletedTask=awaitTask.WhenAny(taskCompletionSource.Task,timeout);if(completedTask==timeout){Console.WriteLine("Provider initialization timed out");}// Create client and evaluate flagsvarclient=Api.Instance.GetClient();
Nettoyage
Lorsque votre application se ferme, arrêtez l’API OpenFeature pour libérer les ressources :
awaitApi.Instance.ShutdownAsync();
Tests
Vous pouvez effectuer des tests sur un environnement de test Datadog dédié avec le DatadogProvider réel, ou le remplacer par le InMemoryProvider d’OpenFeature pour contrôler directement les valeurs des indicateurs dans le code de test. Cette section présente l’approche en mémoire, qui permet de garder les tests hermétiques et hors ligne. InMemoryProvider est fourni dans le package NuGet OpenFeature (espace de noms OpenFeature.Providers.Memory), donc aucune dépendance supplémentaire n’est requise au-delà de ce qui est déjà installé pour la production.
Api.Instance est un singleton. Utilisez IAsyncLifetime de xUnit pour définir le fournisseur par test et le supprimer dans DisposeAsync, ce qui évite les tests dépendants de l’ordre. Pour des suites plus rapides qui partagent la configuration, utilisez InMemoryProvider.UpdateFlagsAsync(...) pour modifier l’état du flag entre les tests sans réenregistrer le fournisseur.
Le même modèle s’applique à NUnit ([SetUp]/[TearDown]) et MSTest ([TestInitialize]/[TestCleanup]). Pour les tests d’intégration ASP.NET Core, enregistrez le InMemoryProvider dans WebApplicationFactory.ConfigureTestServices avant le démarrage de l’application.
Pour éviter de coupler les tests aux composants internes du SDK, préférez remplacer par InMemoryProvider plutôt que de simuler le fournisseur Datadog avec Moq ou des bibliothèques similaires.
Dépannage
La configuration Agentless ne fonctionne pas
Vérifiez que le traceur 3.54.0 ou une version ultérieure est chargé et que le fournisseur OpenFeature est initialisé.
Vérifiez DD_API_KEY, DD_SITE et DD_ENV dans le processus de l’application.
Confirmez que DD_FEATURE_FLAGS_ENABLED n’est pas false. Laissez DD_FEATURE_FLAGS_CONFIGURATION_SOURCE non défini pour une nouvelle configuration, ou définissez-le explicitement sur agentless. Supprimez le paramètre hérité DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED lors de la migration.
Autorisez le trafic HTTPS sortant vers ufc-server.ff-cdn.<DD_SITE>.
Activez DD_TRACE_DEBUG=true et vérifiez les logs du traceur pour détecter les erreurs d’authentification, de délai d’attente ou de configuration incorrecte.
Avant la première configuration valide, les évaluations renvoient les valeurs par défaut de l’appelant. Après une initialisation réussie, les échecs de livraison transitoires conservent la dernière configuration valide.
Remote Configuration ne fonctionne pas
Vérifiez les points suivants pour vous assurer que Remote Configuration fonctionne :
DD_SERVICE et DD_ENV variables d’environnement sont définies
Le SDK peut communiquer avec l’Agent
Erreurs d’évaluation asynchrone
Le SDK OpenFeature .NET utilise des méthodes asynchrones pour toutes les évaluations des flags. Assurez-vous d’utiliser await ou de gérer correctement le Task renvoyé :
// Correct: Using awaitvarenabled=awaitclient.GetBooleanValueAsync("flag-key",false,context);// Incorrect: Not awaiting (will not work as expected)varenabled=client.GetBooleanValueAsync("flag-key",false,context);
Pour aller plus loin
Documentation, liens et articles supplémentaires utiles: