[
https://issues.apache.org/jira/browse/CAMEL-25333?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on CAMEL-25333 started by Christoph Deppisch.
--------------------------------------------------
> Add component for feature flag evaluation using OpenFeature specification
> -------------------------------------------------------------------------
>
> Key: CAMEL-25333
> URL: https://issues.apache.org/jira/browse/CAMEL-25333
> Project: Camel
> Issue Type: New Feature
> Reporter: Christoph Deppisch
> Assignee: Christoph Deppisch
> Priority: Major
>
> Add a new {{camel-openfeature}} component that provides feature flag
> evaluation capabilities using the [OpenFeature
> specification|https://openfeature.dev/]
> ([spec|https://github.com/open-feature/spec]).
> The component provides both an endpoint and a language implementation for
> Camel (similar to the pattern used by {{{}camel-typesafe-ai{}}}), enabling
> feature flag evaluation in EIPs such as choice, message-dispatcher,
> content-based-router, and filter.
> *Endpoint URI*
> {noformat}
> openfeature:name[?options]{noformat}
> The mandatory {{name}} is a logical name that resolves to a feature flag
> provider configuration and its feature flag specification.
> *Endpoint Parameters*
> * {{flagKey}} | The name of the feature flag definition to evaluate
> * {{resultProperty}} | Stores the evaluation result as an Exchange property
> with the given name. When set, the original message body is preserved.
> Otherwise the evaluation result is set as the new message body
> * {{configuration}} | Default provider configuration shared by OpenFeature
> endpoints
> * {{host}} | Optional remote flagd service host
> * {{port}} | Optional remote flagd service port
> * {{flags}} | A JSON object defining feature flags (inline)
> * {{flagsResource}} | Camel resource URI pointing to a feature flag
> definition resource
> *Core Capabilities*
> The OpenFeature endpoint/language evaluates feature flags using a configured
> provider and stores the result as:
> * An Exchange property (when {{resultProperty}} is set), or
> * The Exchange body (default)
> Each evaluation requires a mandatory {{flagKey}} identifying the feature flag
> definition. An optional evaluation context (key-value pairs) can be provided
> as input.
> *Evaluation Types*
> * *Boolean evaluation* ({{{}getBooleanValue(){}}}): Returns a boolean for
> isEnabled checks, with an optional default value. Used for detour/toggle
> patterns.
> * *String evaluation* ({{{}getStringValue(){}}}): Returns a string variant
> (e.g., "v1", "v2") based on the evaluation context. Used for A/B testing,
> fractional targeting, and targeted rollouts.
> *Language Expression*
> The OpenFeature language can be used directly in EIPs for concise flag
> evaluation:
> {code:java}
> from("direct:start")
> .filter().language("openfeature", "enrichment-enabled")
> .to("direct:enrich-order")
> .end()
> .to("direct:process-order");{code}
> *Supported Providers*
> The component should support the following OpenFeature providers out of the
> box:
> * {*}InMemory provider{*}: Feature flag definitions are provided
> programmatically as part of the route setup. Useful for testing and simple
> configurations.
> * {*}Flagd provider{*}: Evaluates flags using [flagd|https://flagd.dev/].
> Supports both:
> ** Local file-based flag definitions
> ** gRPC connection to a remote flagd service
> *Use Cases*
> * {*}Detour pattern{*}: Boolean flag controls whether a processing step is
> enabled or skipped (e.g., {{{}enrichment-enabled{}}}).
> * {*}Fractional A/B routing{*}: Traffic is split between variants based on a
> stable hash of the targeting key (e.g., 90/10 split between legacy and new
> routing algorithms).
> * {*}Targeted rollout{*}: Different flag values based on evaluation context
> attributes (e.g., enterprise/VIP customers get v2, others get v1).
> *Example Flag Definitions (flagd)*
> {code:json}
> {
> "flags": {
> "enrichment-enabled": {
> "state": "ENABLED",
> "variants": { "on": true, "off": false },
> "defaultVariant": "on"
> },
> "new-routing-algorithm": {
> "state": "ENABLED",
> "variants": {
> "legacy": "content-based-router",
> "new": "dynamic-router"
> },
> "defaultVariant": "legacy",
> "targeting": {
> "fractional": [["legacy", 90], ["new", 10]]
> }
> },
> "hazmat-compliance-v2": {
> "state": "ENABLED",
> "variants": { "v1": "v1", "v2": "v2" },
> "defaultVariant": "v1",
> "targeting": {
> "if": [
> { "in": [{ "var": "customer_tier" }, ["ENTERPRISE", "VIP"]] },
> "v2",
> "v1"
> ]
> }
> }
> }
> }{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)