CNCF · Open Specification

OpenFeature

Otevřený standard nezávislý na poskytovateli pro feature flagging, který funguje s libovolným nástrojem pro správu feature flagů.

Nezávislé na poskytovateli Community-driven CNCF incubating 10+ jazyků
Základ

Co je feature flag?

V nejjednodušším případě je to if/else, který lze ovládat za běhu aplikace. Umožňuje měnit chování aplikace bez nasazení nového kódu.

Java · server-side
if (client.getBooleanValue("new-checkout", false)) {
    renderNewCheckout();   // zapnuto za běhu, bez redeploye
} else {
    renderLegacyCheckout();
}

Flagy jsou dynamické (vyhodnocují se za běhu) a context-aware (rozhodnutí závisí např. na konkrétním uživateli).

Ilustrace: co je feature flag
Motivace

K čemu jsou dobré?

Canary release

Postupné zpřístupnění nové funkce malé skupině uživatelů.

A/B testing

Měření dopadu varianty na chování a engagement uživatelů.

Skrytí WIP

Rozpracovaná funkcionalita skrytá před uživateli, dostupná pro interní testy.

Kill switch

Bezpečné vypnutí části systému během výpadku.

Cílení

Omezení funkcí podle geografie, IP, licence či compliance.

Kratší branche

Méně dlouhožijících feature branchí — trunk-based development.

Ilustrace: k čemu jsou feature flagy dobré
Problém

Proč vznikl OpenFeature?

Plné využití flagů vyžaduje flagging systém — samostatnou službu plus klientskou knihovnu.

  • Každý poskytovatel má vlastní, nekompatibilní SDK LaunchDarkly, Flagsmith, Unleash, Split…
  • Závislost na poskytovateli migrace znamená přepsat všechna volání v kódu
  • Roztříštěné znalosti napříč týmy a jazyky

Řešení

OpenFeature poskytuje jednotné, standardizované SDK, do kterého se zapojují různí poskytovatelé (providers). Aplikační kód zůstává stejný — měníte jen provider.

Ilustrace: proč vznikl OpenFeature
Architektura

Jak to funguje

Aplikaceváš kód
Evaluation APIOpenFeature SDK
Providerpřekladová vrstva
Flag systémLaunchDarkly, flagd…

Vývojář pracuje pouze s Evaluation API. Provider mapuje volání na konkrétní flagging systém — vyměnitelný bez zásahu do aplikační logiky.

Ilustrace: jak OpenFeature funguje
Klíčové abstrakce · 1/5

Evaluation API

Rozhraní, se kterým pracuje autor aplikace. Vyhodnocuje flagy a vrací typované hodnoty (boolean, string, number, object).

Java · server-side
OpenFeatureAPI api = OpenFeatureAPI.getInstance();

// registrace poskytovatele (blokující, počká na READY)
api.setProviderAndWait(new YourProvider());

// získání klienta a vyhodnocení flagu
Client client = api.getClient();
boolean v2 = client.getBooleanValue("v2_enabled", false);

Druhý argument je default — hodnota při nedostupnosti provideru. Flag tedy nikdy „nespadne".

Ilustrace: Evaluation API
Klíčové abstrakce · 2/5

Providers

„Překladová vrstva" mezi Evaluation API a konkrétním flagging systémem. Mapuje argumenty na ekvivalent v daném systému.

Java · server-side
// migrace mezi providery bez zásahu do volání flagů
MultiProvider multi = new MultiProvider(
    List.of(newProvider, oldProvider)   // nový se ptá první
);
api.setProviderAndWait(multi);
Ilustrace: Providers
Klíčové abstrakce · 3/5

Evaluation Context — vrstvení

Kontejner dat, na jejichž základě probíhá cílení. Skládá se ze čtyř vrstev, každá s jiným životním cyklem — od statických faktů o aplikaci po data jednoho requestu.

Java · server-side
// 1) GLOBAL — statické, jednou při startu
api.setEvaluationContext(new ImmutableContext(Map.of(
    "region", new Value("eu-central-1"),
    "tier",   new Value("standard"))));  // výchozí

// 2) CLIENT — společné pro modul/doménu
Client checkout = api.getClient("checkout");
checkout.setEvaluationContext(new ImmutableContext(
    Map.of("module", new Value("checkout"))));

// 3) INVOCATION — data jednoho requestu
EvaluationContext req = new ImmutableContext(
    session.getId(),            // targetingKey
    Map.of("email",   new Value(email),
           "country", new Value("CZ")));
checkout.getBooleanValue("new-payment", false, req);
Kdo to ví a kdy

Global

Fakta o prostředí — region, verze, prod/staging. Nastavíš jednou.

Client

Společné pro modul/doménu — checkout vs. billing mají jiný module.

Invocation

Data requestu/uživatele — targetingKey, e-mail, země, IP. Mění se při každém volání.

Before-hook

Automatické obohacení odvozenými daty — viz další slide.

Ilustrace: Evaluation Context a vrstvení
Klíčové abstrakce · 4/5

Hooks

Kód zapojený do životního cyklu vyhodnocení flagu. Registruje se ve třech úrovních (scope) — pozor, „client" = OpenFeature Client objekt, ne frontend.

Java · server-side
// globálně — všechny klienty v procesu
api.addHooks(new LoggingHook());

// na klientovi — jeden Client (modul/doména)
Client checkout = api.getClient("checkout");
Client billing  = api.getClient("billing");
checkout.addHooks(new AuditHook());  // jen checkout

// jen pro jedno vyhodnocení
checkout.getBooleanValue("v2", false, ctx,
    FlagEvaluationOptions.builder()
        .hook(new ExampleHook()).build());
Body životního cyklu

before

Před vyhodnocením — např. doplní či upraví evaluation context.

after

Po úspěšném vyhodnocení — validace hodnoty, telemetrie, tracking.

error

Při chybě během vyhodnocení — fallback, alerting.

finally

Vždy na konci, bez ohledu na úspěch či chybu — úklid.

Ilustrace: Hooks
Evaluation Context · slučování

Slučování & obohacení

SDK vrstvy před vyhodnocením sloučí. Before hook doplní data, která nechceš tahat ručně u každého volání — typicky dotažená z jiné služby.

Java · before hook
class EnrichmentHook implements Hook {
  public Optional<EvaluationContext> before(
      HookContext ctx, Map hints) {
    String userId = ctx.getCtx().getTargetingKey();
    String plan = subscriptions.lookupPlan(userId);
    return Optional.of(new ImmutableContext(
        Map.of("tier", new Value(plan))));  // "premium"
  }
}
api.addHooks(new EnrichmentHook());
Výsledný kontext
{
  targetingKey: "<session-id>", // invocation
  region:       "eu-central-1", // global
  module:       "checkout",     // client
  email:        "...",          // invocation
  country:      "CZ",           // invocation
  tier:         "premium"       // hook přepsal
}

Priorita (pozdější přebíjí): global → client → invocation → before-hook. Proto tier = "premium".

Pointa: statická data nastavíš jednou, proměnná předáš per request, odvozená zařídí hook — místo kopírování do každého volání. Flag pak cílí na kteroukoli vlastnost, např. tier=premium v region=eu-central-1.

Ilustrace: slučování a obohacení kontextu
Klíčové abstrakce · 5/5

Events

Reakce na změny stavu provideru nebo flagging systému — připravenost, chyby, nebo (nejzajímavěji) změna konfigurace flagů.

Java · server-side
Client client = api.getClient();

// reakce na změnu konfigurace flagů
client.onProviderConfigurationChanged(e -> {
    // flagy se změnily v systému správy
});

// globální handler na zastarání cache provideru
api.onProviderStale(e -> { /* … */ });

Standardní události: PROVIDER_READY, PROVIDER_ERROR, PROVIDER_CONFIGURATION_CHANGED.

Ilustrace: Events
Testování

Flagy v testech

Pro testy nepotřebujete běžící flagging systém. SDK obsahuje In-Memory Provider — flagy definujete přímo v kódu a vyhodnocení běží lokálně, bez sítě.

Java · server-side
Map<String, Flag<?>> flags = new HashMap<>();
flags.put("v2_enabled", Flag.builder()
    .variant("on", true)
    .variant("off", false)
    .defaultVariant("on").build());

api.setProviderAndWait(new InMemoryProvider(flags));
TypeScript · client-side
const flags = {
  v2_enabled: {
    variants: { on: true, off: false },
    disabled: false,
    defaultVariant: 'on',
  },
} as const;

OpenFeature.setProvider(new TypedInMemoryProvider(flags));

Varianty jsou pojmenované možné hodnoty flagu (on → true, off → false); defaultVariant určuje, která se vrátí bez targetingu. Jména jsou libovolná a flag nemusí být jen boolean — varianty mohou nést stringy či čísla.

Hodnoty lze měnit za běhu — ideální pro unit testy obou větví if/else. Pro jeden test stačí vyměnit provider, aplikační kód zůstává beze změny.

Ilustrace: flagy v testech
Paradigmata

Server vs. client SDK

SDK přicházejí ve dvou variantách. Liší se hlavně v tom, jak modelují evaluation context.

Dynamic context — server-side

Kontext se mění často, klidně při každém vyhodnocení (IP, session, e-mail). Předává se jako parametr volání.

Java
// kontext při každém vyhodnocení
boolean v = client.getBooleanValue(
    "beta", false, reqCtx);

Static context — client-side

Kontext odpovídá jednomu uživateli a mění se zřídka. Při změně probíhá context reconciliation — provider přepočítá cache flagů.

TypeScript
// kontext globálně (async), mění se zřídka
await OpenFeature.setContext({ targetingKey: userId });
// vyhodnocení je synchronní (z cache)
const v = client.getBooleanValue("beta", false);
Server: Go · Java · Python · Node.js · .NET · Rust · PHP · Ruby Client: Web · React · Angular · iOS · Kotlin
Ilustrace: server vs. client SDK
Příklad · Flagsmith

Flagsmith na backendu

Local evaluation — stáhne definice flagů i segmenty a vyhodnocuje lokálně v procesu, bez sítě na každý flag.

Backend local evaluation s Flagsmith BE APLIKACE — jeden proces Aplikační kód Flagsmith providerlokální engine Lokální cachedefinice flagů + segmenty(bez traitů — ty za běhu) Flagsmith cloudzdroj pravdy:flagy + segmenty isEnabled(flag, ctx) 2 vyhodnocení LOKÁLNĚ — bez sítě 1 stáhni definice + SEGMENTY environment document 3 SSE: timestamp změny → re-fetch definic real-time = Enterprise · jinak polling à 60 s Ilustrace: Flagsmith na backendu
Příklad · Flagsmith

Flagsmith na frontendu

Remote evaluation — stáhne jen vyhodnocené flagy pro klienta do cache (bez pravidel segmentů) a čte z ní synchronně.

Frontend cache tok s Flagsmith FE APLIKACE — prohlížeč UI kód Flagsmith SDKpaměť / localStorage Cachejen flagy pro klienta(žádná pravidla segmentů) Flagsmith cloudvyhodnocuje naserveru (segmenty) getValue(flag) 2 čti z cache — synchronně, bez sítě 1 dej flagy PRO KLIENTA vyhodnocené flagy 3 SSE: timestamp změny → přenačti flagy do cache real-time = Enterprise · jinak polling / re-fetch Ilustrace: Flagsmith na frontendu
Shrnutí

Proč OpenFeature

Jinými slovy: je to garance, že OpenFeature není marketingový nástroj jednoho poskytovatele, ale férový oborový standard se stabilním zázemím.

Dokumentace

openfeature.dev/docs

Ekosystém

openfeature.dev/ecosystem

GitHub

github.com/open-feature

Děkuji za pozornost — dotazy?

Ilustrace: shrnutí
OpenFeature · standardizovaný feature flagging
← → mezerník · F fullscreen