Skip to content

Commit 3339108

Browse files
committed
Update EvaluationEngine initialization interface
1 parent 4a529b7 commit 3339108

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

lib/datadog/open_feature/evaluation_engine.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ class EvaluationEngine
2020

2121
ALLOWED_TYPES = %i[boolean string number float integer object].freeze
2222

23-
def initialize(telemetry)
23+
def initialize(telemetry, logger: Datadog.logger)
2424
@telemetry = telemetry
25+
@logger = logger
26+
2527
# NOTE: We also could create a no-op evaluator?
2628
@evaluator = nil
2729
@configuration = nil
@@ -49,11 +51,17 @@ def fetch_value(flag_key:, expected_type:, evaluation_context: nil)
4951

5052
# TODO: Put the lock to reconfigure deduplicatoin cache too
5153
def reconfigure!
54+
if @configuration.nil?
55+
@logger.debug("OpenFeature: Configuration is not received, skip reconfiguration")
56+
57+
return
58+
end
59+
5260
@evaluator = Binding::Evaluator.new(@configuration)
5361
rescue => e
5462
error_message = 'OpenFeature: Failed to reconfigure, reverting to the previous configuration'
5563

56-
Datadog.logger.error("#{error_message}, error #{e.inspect}")
64+
@logger.error("#{error_message}, error #{e.inspect}")
5765
@telemetry.report(e, description: error_message)
5866
end
5967
end

spec/datadog/open_feature/evaluator_spec.rb renamed to spec/datadog/open_feature/evaluation_engine_spec.rb

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# frozen_string_literal: true
22

33
require 'spec_helper'
4-
require 'datadog/open_feature/evaluator'
4+
require 'datadog/open_feature/evaluation_engine'
55

6-
RSpec.describe Datadog::OpenFeature::Evaluator do
6+
RSpec.describe Datadog::OpenFeature::EvaluationEngine do
7+
let(:evaluator) { described_class.new(telemetry, logger: logger) }
78
let(:telemetry) { instance_double(Datadog::Core::Telemetry::Component) }
8-
let(:evaluator) { described_class.new(telemetry) }
99
let(:logger) { instance_double(Datadog::Core::Logger) }
1010
let(:ufc) do
1111
<<~JSON
@@ -40,8 +40,6 @@
4040
JSON
4141
end
4242

43-
before { allow(Datadog).to receive(:logger).and_return(logger) }
44-
4543
describe '#fetch_value' do
4644
let(:result) { evaluator.fetch_value(flag_key: 'test', expected_type: :string) }
4745

@@ -55,10 +53,10 @@
5553

5654
context 'when binding evaluator returns error' do
5755
before do
58-
evaluator.ufc_json = ufc
56+
evaluator.configuration = ufc
5957
evaluator.reconfigure!
6058

61-
allow_any_instance_of(described_class::Binding::Evaluator).to receive(:get_assignment)
59+
allow_any_instance_of(Datadog::OpenFeature::Binding::Evaluator).to receive(:get_assignment)
6260
.and_return(error)
6361
end
6462

@@ -73,11 +71,11 @@
7371

7472
context 'when binding evaluator raises error' do
7573
before do
76-
evaluator.ufc_json = ufc
74+
evaluator.configuration = ufc
7775
evaluator.reconfigure!
7876

7977
allow(telemetry).to receive(:report)
80-
allow_any_instance_of(described_class::Binding::Evaluator).to receive(:get_assignment)
78+
allow_any_instance_of(Datadog::OpenFeature::Binding::Evaluator).to receive(:get_assignment)
8179
.and_raise(error)
8280
end
8381

@@ -92,7 +90,7 @@
9290

9391
context 'when expected type not in the allowed list' do
9492
before do
95-
evaluator.ufc_json = ufc
93+
evaluator.configuration = ufc
9694
evaluator.reconfigure!
9795
end
9896

@@ -107,7 +105,7 @@
107105

108106
context 'when binding evaluator returns resolution details' do
109107
before do
110-
evaluator.ufc_json = ufc
108+
evaluator.configuration = ufc
111109
evaluator.reconfigure!
112110
end
113111

@@ -118,30 +116,38 @@
118116
end
119117

120118
describe '#reconfigure!' do
119+
context 'when configuration is not yet present' do
120+
it 'does nothing and logs the issue' do
121+
expect(logger).to receive(:debug).with(/OpenFeature: Configuration is not received, skip reconfiguration/)
122+
123+
evaluator.reconfigure!
124+
end
125+
end
126+
121127
context 'when binding initialization fails with exception' do
122128
before do
123-
evaluator.ufc_json = ufc
129+
evaluator.configuration = ufc
124130
evaluator.reconfigure!
125131

126-
allow(described_class::Binding::Evaluator).to receive(:new).and_raise(error)
132+
allow(Datadog::OpenFeature::Binding::Evaluator).to receive(:new).and_raise(error)
127133
end
128134

129135
let(:error) { StandardError.new('Ooops') }
130136

131137
it 'reports error to telemetry and logs it' do
132138
expect(logger).to receive(:error).with(/Ooops/)
133139
expect(telemetry).to receive(:report)
134-
.with(error, description: match(/OpenFeature failed to reconfigure/))
140+
.with(error, description: match(/OpenFeature: Failed to reconfigure/))
135141

136-
evaluator.ufc_json = '{}'
142+
evaluator.configuration = '{}'
137143
expect { evaluator.reconfigure! }.not_to raise_error
138144
end
139145

140146
it 'persists previouly configured evaluator' do
141147
allow(logger).to receive(:error)
142148
allow(telemetry).to receive(:report)
143149

144-
evaluator.ufc_json = '{}'
150+
evaluator.configuration = '{}'
145151
expect { evaluator.reconfigure! }.not_to change {
146152
evaluator.fetch_value(flag_key: 'test', expected_type: :string).value
147153
}.from('hello')
@@ -150,7 +156,7 @@
150156

151157
context 'when binding initialization succeeds' do
152158
before do
153-
evaluator.ufc_json = ufc
159+
evaluator.configuration = ufc
154160
evaluator.reconfigure!
155161
end
156162

@@ -188,7 +194,7 @@
188194
end
189195

190196
xit 'reconfigures binding evaluator with new flags configuration' do
191-
expect { evaluator.ufc_json = new_ufc; evaluator.reconfigure!}
197+
expect { evaluator.configuration = new_ufc; evaluator.reconfigure!}
192198
.to change { evaluator.fetch_value(flag_key: 'test', expected_type: :string).value }
193199
.from('hello').to('goodbye')
194200
end

0 commit comments

Comments
 (0)