You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Christoph Deppisch (Jira)" <ji...@apache.org> on 2026/10/05 07:27:00 UTC
[jira] [Created] (CAMEL-25333) Add component for feature flag evaluation using OpenFeature specification
Christoph Deppisch created CAMEL-25333:
------------------------------------------
Summary: 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
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)