Contexte : pourquoi nous avons adopté OpenFeature
Chez AB Tasty, nous sommes convaincus qu’une expérience produit de qualité passe par une intégration fluide de la personnalisation et du feature flagging. Notre SDK AB Tasty Feature Experimentation permet aux équipes tech de contrôler finement l’activation de leurs fonctionnalités et d’adapter leurs interfaces à chaque visiteur.Mais dans un contexte où les écosystèmes techniques se complexifient, il devient crucial de favoriser l’interopérabilité et la flexibilité. C’est là que l’adoption d’OpenFeature prend tout son sens.
OpenFeature : un standard ouvert pour le feature flagging
OpenFeature est une spécification open-source qui fournit une API agnostique pour gérer des feature flags. Elle permet aux développeurs d’intégrer des fonctionnalités de feature flagging de manière cohérente, quel que soit l’outil ou la plateforme utilisée.
Pourquoi c’est utile ?
- Interopérabilité : une interface de développement (API) unique pour tous les fournisseurs.
- Évitement du verrouillage fournisseur : changez d’outil sans réécrire votre logique métier.
- Communauté active : incubé par la CNCF, au cœur des pratiques modernes cloud-native.
Comment ça marche ?
OpenFeature fonctionne avec des providers, qui traduisent ses appels standardisés en appels spécifiques à chaque fournisseur.
👉 C’est exactement ce que nous avons développé pour AB Tasty Feature Experimentation.
Ce que nous avons fait : un provider OpenFeature pour AB Tasty Feature Experimentation
Notre objectif : rendre notre SDK compatible OpenFeature tout en conservant nos fonctionnalités avancées.Nous avons donc développé un provider officiel :
@flagship.io/openfeature-provider-js
Exemple d’intégration (Node.js)
JavaScript
const express = require("express");
const { ABTastyProvider } = require("@flagship.io/openfeature-provider-js");
const { OpenFeature } = require("@openfeature/server-sdk");
const app = express();
app.use(express.json());
const provider = new ABTastyProvider("<ENV_ID>", "<API_KEY>");
await OpenFeature.setProviderAndWait(provider);
app.get("/item", async (req, res) => {
const evaluationContext = {
targetingKey: "visitor-id",
fs_is_vip: true,
};
OpenFeature.setContext(evaluationContext);
const client = OpenFeature.getClient();
const fsEnableDiscount = await client.getBooleanValue("fs_enable_discount", false, evaluationContext);
const fsAddToCartBtnColor = await client.getStringValue("fs_add_to_cart_btn_color", "blue", evaluationContext);
res.json({
product: {
name: "AB Tasty Feature Experimentation T-shirt",
price: 20,
discountEnabled: fsEnableDiscount,
btnColor: fsAddToCartBtnColor,
},
});
});
app.listen(3000, () => console.log("Server running on port 3000"));
Zoom technique : intégrer Flagship via OpenFeature
1. Installation des dépendances
Shell
npm install @openfeature/server-sdk
npm install @flagship.io/openfeature-provider-js
2. Initialisation du provider
JavaScript
const { ABTastyProvider } = require("@flagship.io/openfeature-provider-js");
const { OpenFeature } = require("@openfeature/server-sdk");
const provider = new ABTastyProvider("<ENV_ID>", "<API_KEY>");
await OpenFeature.setProviderAndWait(provider);
3. Définition du contexte d’évaluation
JavaScript
const evaluationContext = {
targetingKey: "visitor-id",
fs_is_vip: true,
};
OpenFeature.setContext(evaluationContext);
4. Évaluation des flags
JavaScript
const client = OpenFeature.getClient();
const fsEnableDiscount = await client.getBooleanValue(
"fs_enable_discount",
false,
evaluationContext
);
const fsAddToCartBtnColor = await client.getStringValue(
"fs_add_to_cart_btn_color",
"blue",
evaluationContext
);
5. Exemple complet avec Express.js
JavaScript
const express = require("express");
const { ABTastyProvider } = require("@flagship.io/openfeature-provider-js");
const { OpenFeature } = require("@openfeature/server-sdk");
const app = express();
app.use(express.json());
const provider = new ABTastyProvider("<ENV_ID>", "<API_KEY>");
await OpenFeature.setProviderAndWait(provider);
app.get("/item", async (req, res) => {
const evaluationContext = {
targetingKey: "visitor-id",
fs_is_vip: true,
};
OpenFeature.setContext(evaluationContext);
const client = OpenFeature.getClient();
const fsEnableDiscountValue = await client.getBooleanValue(
"fs_enable_discount",
false,
evaluationContext
);
const fsAddToCartBtnColorValue = await client.getStringValue(
"fs_add_to_cart_btn_color",
"blue",
evaluationContext
);
res.json({
item: {
name: "Flagship T-shirt",
price: 20,
},
fsEnableDiscount: fsEnableDiscountValue,
fsAddToCartBtnColor: fsAddToCartBtnColorValue,
});
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
Bonus : détection automatique des flags grâce à notre codebase analyser
Pour encore plus de rapidité, nous mettons à disposition un codebase analyser directement intégré dans notre CLI (incluse dans notre extension VSCode).
Ce qu’il fait :
- Il scanne la codebase du client.
- Il détecte automatiquement l’utilisation de solutions concurrentes (comme Optimizely, Kameleoon…).
- Il repère les flags déjà implémentés via OpenFeature.
- Il propose une création automatique de ces flags dans notre plateforme Flagship.
Résultat ?
➡️ Vous migrez en quelques clics, sans ressaisie.
➡️ Vous testez notre outil Feature Experimentation sans effort.
➡️ Vous gagnez un temps précieux.
Pourquoi c’est important pour nos clients
En adoptant OpenFeature, nous offrons à nos clients :
- Une intégration plus rapide dans leurs architectures existantes.
- Une portabilité accrue de leurs déploiements cloud.
- Une flexibilité totale dans leurs choix technologiques.
Et surtout, nous réaffirmons notre engagement vers un écosystème ouvert et interopérable.