Pular para o conteúdo principal

Feature Flags

O Building Block Feature Flags fornece funcionalidades para gerenciamento de feature flags, segmentos de usuários e regras de targeting na Catalisa Platform.

Visão Geral

O Feature Flags é um módulo tenant-scoped, ou seja, requer um token com organizationId. Ele é responsável por:

  • Gerenciamento de Feature Flags (criação, ativação, desativação)
  • Gerenciamento de Segmentos de usuários com regras simples ou DMN
  • Targeting Rules para controle granular de rollout
  • Overrides para usuários específicos
  • Avaliação de flags em tempo real com cache inteligente

Base URL

https://feature-flags.stg.catalisa.app

Recursos

RecursoDescrição
FlagsCRUD de feature flags
SegmentosSegmentos de usuários
Targeting RulesRegras de targeting
OverridesOverrides por usuário
AvaliaçãoEndpoints de avaliação

Permissões

PermissãoDescrição
FEATURE_FLAGS_CREATECriar feature flags
FEATURE_FLAGS_READListar e visualizar feature flags
FEATURE_FLAGS_UPDATEAtualizar feature flags
FEATURE_FLAGS_DELETEExcluir feature flags
FEATURE_FLAGS_TOGGLEAtivar/desativar feature flags
FEATURE_FLAGS_EVALUATEAvaliar feature flags
SEGMENTS_CREATECriar segmentos
SEGMENTS_READListar e visualizar segmentos
SEGMENTS_UPDATEAtualizar segmentos
SEGMENTS_DELETEExcluir segmentos

Exemplo Rápido

Fluxo básico para criar uma feature flag com targeting:

// 1. Criar uma Feature Flag
const flagResponse = await fetch('https://feature-flags.stg.catalisa.app/api/v1/feature-flags', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
key: 'new-checkout-flow',
name: 'New Checkout Flow',
description: 'Novo fluxo de checkout com pagamento PIX',
variations: [
{ key: 'on', value: true },
{ key: 'off', value: false },
],
defaultVariation: 'off',
}),
});

const flag = await flagResponse.json();

// 2. Criar um Segmento para usuários premium
const segmentResponse = await fetch('https://feature-flags.stg.catalisa.app/api/v1/segments', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
key: 'premium-users',
name: 'Premium Users',
ruleType: 'SIMPLE',
ruleContent: JSON.stringify({
operator: 'AND',
conditions: [
{ attribute: 'plan', operator: 'eq', value: 'premium' },
],
}),
}),
});

const segment = await segmentResponse.json();

// 3. Criar uma Targeting Rule
await fetch(`https://feature-flags.stg.catalisa.app/api/v1/feature-flags/${flag.data.id}/targeting-rules`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Premium users rollout',
variationKey: 'on',
rolloutPercentage: 50,
segmentIds: [segment.data.id],
}),
});

// 4. Ativar a flag
await fetch(`https://feature-flags.stg.catalisa.app/api/v1/feature-flags/${flag.data.id}/enable`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
},
});

// 5. Avaliar a flag para um usuário
const evalResponse = await fetch('https://feature-flags.stg.catalisa.app/api/v1/feature-flags/evaluate/new-checkout-flow', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
context: {
userId: 'user-123',
attributes: {
plan: 'premium',
},
},
}),
});

const { data } = await evalResponse.json();
console.log(`Flag value: ${data.value}`);
console.log(`Reason: ${data.reason}`);

Arquitetura

Arquitetura do Feature Flags

O Feature Flags é composto pelos seguintes componentes:

Componentes Principais:

  • Flags (Feature Flags)

    • key: Identificador único da flag
    • status: ENABLED/DISABLED
    • variations: Possíveis valores que a flag pode retornar
    • defaultVariation: Variação padrão quando nenhuma regra faz match
  • Segments (Segmentos de Usuários)

    • Tipos: SIMPLE ou DMN
    • conditions: Regras de matching para segmentação
    • SIMPLE: condições baseadas em atributos (eq, gt, in, etc.)
    • DMN: regras complexas usando tabelas de decisão
  • Targeting Rules (Regras de Ativação)

    • priority: Ordem de avaliação (menor = maior prioridade)
    • rolloutPercentage: Percentual de usuários que recebem a variação
    • segmentIds: Segmentos que devem fazer match
    • variationKey: Variação a ser retornada se houver match

Serviço de Avaliação:

  • Evaluation Service: Orquestra a lógica de avaliação
    • Consulta Override Check para verificar overrides de usuários
    • Consulta Cache (Redis) para resultados previamente calculados
    • Consulta Decision Engine para avaliação de segmentos DMN
    • Aplica targeting rules com rollout percentual
    • Retorna variação + reason (DISABLED, DEFAULT, OVERRIDE, RULE_MATCH)

Fluxo de Avaliação:

  1. Requisição chega ao Evaluation Service
  2. Verifica Override Check (cache de overrides por usuário)
  3. Consulta Cache (Redis) para resultado previamente calculado
  4. Se necessário, consulta Decision Engine para avaliar segmentos DMN
  5. Aplica Targeting Rules por ordem de prioridade
  6. Retorna variação aplicável com reason

Conceitos Importantes

Variations

Variations são os possíveis valores que uma feature flag pode retornar:

CampoDescrição
keyIdentificador único da variação (ex: on, off, variant-a)
valueValor retornado (boolean, string, number, object, array)

Status da Flag

StatusDescrição
ENABLEDFlag ativa - avaliação considera targeting rules
DISABLEDFlag desativada - retorna sempre default variation

Tipos de Segmento

TipoDescrição
SIMPLERegras baseadas em condições simples (atributo, operador, valor)
DMNRegras complexas usando tabelas de decisão DMN

Operadores de Condição (SIMPLE)

OperadorDescrição
eqIgual
neqDiferente
gtMaior que
gteMaior ou igual
ltMenor que
lteMenor ou igual
inEsta na lista
notInNão esta na lista
containsContém (string)
startsWithComeça com (string)
endsWithTermina com (string)

Lógica de Avaliação

A avaliação de uma flag segue esta ordem:

  1. Flag desativada? → Retorna defaultVariation (reason: DISABLED)
  2. Override para o usuário? → Retorna variação do override (reason: OVERRIDE)
  3. Targeting rule match? → Aplica rollout percentage (reason: RULE_MATCH)
  4. Nenhum match? → Retorna defaultVariation (reason: DEFAULT)

Rollout Percentual

O rollout percentual permite liberar uma variação gradualmente:

  • Baseado em hash consistente do userId
  • Mesmo usuário sempre recebe mesmo resultado
  • Incrementar de 10% para 50% inclui usuários anteriores

Cache

  • Resultados de avaliação são cacheados por 5 minutos
  • Membership de segmentos cacheados por 15 minutos
  • Cache invalidado automaticamente em updates