Skip to main content

Feature Flags

Control feature rollout with a pluggable feature flag system. Enable gradual rollouts, A/B testing, and environment-specific configurations.

Overview

AgentArea uses a flexible feature flag system for:
  • Gradual Rollouts: Enable features for subsets of users
  • Environment Configuration: Different features per environment
  • A/B Testing: Test new features with control groups
  • Emergency Toggles: Quickly disable problematic features

Available Features

FeatureDescriptionDefault
warm_poolEnable warm pool fast activationfalse
gateway_apiUse Gateway API HTTPRoutefalse
state_reconcilerBackground state reconciliationfalse

Configuration

Environment Variables

# Enable features via environment variable
MCP_FEATURES_ENABLED=warm_pool,gateway_api,state_reconciler

Configuration File

# config/features.yaml
features:
  warm_pool:
    enabled: true
    description: "Enable warm pool for fast MCP activation"
    
  gateway_api:
    enabled: false
    description: "Use Gateway API instead of Ingress"
    
  state_reconciler:
    enabled: true
    description: "Background reconciliation of MCP state"

Implementation

Feature Flag Provider

// internal/features/features.go
type Provider interface {
    IsEnabled(feature string) bool
    GetConfig(feature string) (map[string]interface{}, error)
    GetAll() map[string]bool
}

// Environment-based provider
type EnvProvider struct {
    enabled map[string]bool
}

func NewEnvProvider() *EnvProvider {
    enabledStr := os.Getenv("MCP_FEATURES_ENABLED")
    enabled := make(map[string]bool)
    
    for _, feature := range strings.Split(enabledStr, ",") {
        feature = strings.TrimSpace(feature)
        if feature != "" {
            enabled[feature] = true
        }
    }
    
    return &EnvProvider{enabled: enabled}
}

func (p *EnvProvider) IsEnabled(feature string) bool {
    return p.enabled[feature]
}

Usage in Code

// Check if feature is enabled
if features.IsEnabled("warm_pool") {
    // Use warm pool activation
    err := m.warmPoolClient.Activate(instance)
} else {
    // Standard container creation
    err := m.backend.CreateInstance(instance)
}

Feature-Gated Routes

// Conditional route registration
if features.IsEnabled("gateway_api") {
    router.HandleFunc("/instances", handlers.CreateInstance).Methods("POST")
} else {
    router.HandleFunc("/instances", handlers.CreateInstanceLegacy).Methods("POST")
}

Provider Types

Environment Provider

Simple on/off based on environment variables:
provider := NewEnvProvider()
// MCP_FEATURES_ENABLED=warm_pool,gateway_api

Config Provider

Load from configuration file:
provider := NewConfigProvider("config/features.yaml")

Hybrid Provider

Combine multiple sources with precedence:
provider := NewHybridProvider(
    NewEnvProvider(),      // Highest priority
    NewConfigProvider(),   // Fallback
)

Best Practices


Monitoring

Feature Metrics

# Prometheus metrics
feature_flag_enabled{feature="warm_pool"} 1
feature_flag_enabled{feature="gateway_api"} 0
feature_flag_check_total{feature="warm_pool", result="enabled"} 1523
feature_flag_check_total{feature="warm_pool", result="disabled"} 42

Next Steps