Class: Datadog::OpenFeature::Provider

Inherits:
Object
  • Object
show all
Defined in:
lib/datadog/open_feature/provider.rb

Overview

OpenFeature feature flagging provider backed by Datadog Remote Configuration.

Requires openfeature-sdk >= 0.5.1 for flag evaluation metrics and EVP hook support.

Hook lifecycle note: FlagEvalEVPHook is returned from #hooks so EVP uses the SDK-final EvaluationDetails. This matches FlagEvalMetricsHook and records defaults/errors produced by OpenFeature hook failures or post-provider type validation.

Implementation follows the OpenFeature contract of Provider SDK. For details see:

- https://github.com/open-feature/ruby-sdk/blob/v0.4.1/README.md#develop-a-provider
- https://github.com/open-feature/ruby-sdk/blob/v0.4.1/lib/open_feature/sdk/provider/no_op_provider.rb

In the example below you can see how to configure the OpenFeature SDK https://github.com/open-feature/ruby-sdk to use the Datadog feature flags provider.

Example:

Make sure to enable Remote Configuration and OpenFeature in the Datadog configuration.

```ruby
# FILE: initializers/datadog.rb
Datadog.configure do |config|
config.remote.enabled = true
config.open_feature.enabled = true
end
```

And configure the OpenFeature SDK to use the Datadog feature flagging provider.

```ruby
# FILE: initializers/open_feature.rb
require 'open_feature/sdk'
require 'datadog/open_feature/provider'

OpenFeature::SDK.configure do |config|
config.set_provider(Datadog::OpenFeature::Provider.new)
end
```

Now you can create OpenFeature SDK client and use it to fetch feature flag values.

```ruby
client = OpenFeature::SDK.build_client
context = OpenFeature::SDK::EvaluationContext.new('email' => '[email protected]')

client.fetch_string_value(
flag_key: 'banner', default_value: 'Greetings!', evaluation_context: context
)
# => 'Welcome back!'
```

Constant Summary collapse

NAME =
"Datadog Feature Flagging Provider"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize ⇒ Provider

Returns a new instance of Provider.



65
66
67
# File 'lib/datadog/open_feature/provider.rb', line 65

def initialize
  @metadata = ::OpenFeature::SDK::Provider::ProviderMetadata.new(name: NAME).freeze
end

Instance Attribute Details

#metadata ⇒ Object (readonly)

Returns the value of attribute metadata.



63
64
65
# File 'lib/datadog/open_feature/provider.rb', line 63

def 
  @metadata
end

Instance Method Details

#fetch_boolean_value(flag_key:, default_value:, evaluation_context: nil) ⇒ Object



85
86
87
# File 'lib/datadog/open_feature/provider.rb', line 85

def fetch_boolean_value(flag_key:, default_value:, evaluation_context: nil)
  evaluate(flag_key, default_value: default_value, expected_type: :boolean, evaluation_context: evaluation_context)
end

#fetch_float_value(flag_key:, default_value:, evaluation_context: nil) ⇒ Object



101
102
103
# File 'lib/datadog/open_feature/provider.rb', line 101

def fetch_float_value(flag_key:, default_value:, evaluation_context: nil)
  evaluate(flag_key, default_value: default_value, expected_type: :float, evaluation_context: evaluation_context)
end

#fetch_integer_value(flag_key:, default_value:, evaluation_context: nil) ⇒ Object



97
98
99
# File 'lib/datadog/open_feature/provider.rb', line 97

def fetch_integer_value(flag_key:, default_value:, evaluation_context: nil)
  evaluate(flag_key, default_value: default_value, expected_type: :integer, evaluation_context: evaluation_context)
end

#fetch_number_value(flag_key:, default_value:, evaluation_context: nil) ⇒ Object



93
94
95
# File 'lib/datadog/open_feature/provider.rb', line 93

def fetch_number_value(flag_key:, default_value:, evaluation_context: nil)
  evaluate(flag_key, default_value: default_value, expected_type: :number, evaluation_context: evaluation_context)
end

#fetch_object_value(flag_key:, default_value:, evaluation_context: nil) ⇒ Object



105
106
107
# File 'lib/datadog/open_feature/provider.rb', line 105

def fetch_object_value(flag_key:, default_value:, evaluation_context: nil)
  evaluate(flag_key, default_value: default_value, expected_type: :object, evaluation_context: evaluation_context)
end

#fetch_string_value(flag_key:, default_value:, evaluation_context: nil) ⇒ Object



89
90
91
# File 'lib/datadog/open_feature/provider.rb', line 89

def fetch_string_value(flag_key:, default_value:, evaluation_context: nil)
  evaluate(flag_key, default_value: default_value, expected_type: :string, evaluation_context: evaluation_context)
end

#hooks ⇒ Object



77
78
79
80
81
82
83
# File 'lib/datadog/open_feature/provider.rb', line 77

def hooks
  component = Datadog.send(:components).open_feature
  [
    component&.flag_eval_metrics_hook,
    component&.flag_eval_evp_hook,
  ].compact
end

#init ⇒ Object



69
70
71
# File 'lib/datadog/open_feature/provider.rb', line 69

def init
  # no-op
end

#shutdown ⇒ Object



73
74
75
# File 'lib/datadog/open_feature/provider.rb', line 73

def shutdown
  # no-op
end