Skip to content

Commit 628685b

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

File tree

2 files changed

+36
-20
lines changed

2 files changed

+36
-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: 26 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,40 @@
118116
end
119117

120118
describe '#reconfigure!' do
119+
context 'when configuration is not yet present' do
120+
before { allow(logger).to receive(:debug) }
121+
122+
it 'does nothing and logs the issue' do
123+
evaluator.reconfigure!
124+
125+
expect(logger).to have_received(:debug).with(/OpenFeature: Configuration is not received, skip reconfiguration/)
126+
end
127+
end
128+
121129
context 'when binding initialization fails with exception' do
122130
before do
123-
evaluator.ufc_json = ufc
131+
evaluator.configuration = ufc
124132
evaluator.reconfigure!
125133

126-
allow(described_class::Binding::Evaluator).to receive(:new).and_raise(error)
134+
allow(Datadog::OpenFeature::Binding::Evaluator).to receive(:new).and_raise(error)
127135
end
128136

129137
let(:error) { StandardError.new('Ooops') }
130138

131139
it 'reports error to telemetry and logs it' do
132140
expect(logger).to receive(:error).with(/Ooops/)
133141
expect(telemetry).to receive(:report)
134-
.with(error, description: match(/OpenFeature failed to reconfigure/))
142+
.with(error, description: match(/OpenFeature: Failed to reconfigure/))
135143

136-
evaluator.ufc_json = '{}'
144+
evaluator.configuration = '{}'
137145
expect { evaluator.reconfigure! }.not_to raise_error
138146
end
139147

140148
it 'persists previouly configured evaluator' do
141149
allow(logger).to receive(:error)
142150
allow(telemetry).to receive(:report)
143151

144-
evaluator.ufc_json = '{}'
152+
evaluator.configuration = '{}'
145153
expect { evaluator.reconfigure! }.not_to change {
146154
evaluator.fetch_value(flag_key: 'test', expected_type: :string).value
147155
}.from('hello')
@@ -150,7 +158,7 @@
150158

151159
context 'when binding initialization succeeds' do
152160
before do
153-
evaluator.ufc_json = ufc
161+
evaluator.configuration = ufc
154162
evaluator.reconfigure!
155163
end
156164

@@ -188,7 +196,7 @@
188196
end
189197

190198
xit 'reconfigures binding evaluator with new flags configuration' do
191-
expect { evaluator.ufc_json = new_ufc; evaluator.reconfigure!}
199+
expect { evaluator.configuration = new_ufc; evaluator.reconfigure!}
192200
.to change { evaluator.fetch_value(flag_key: 'test', expected_type: :string).value }
193201
.from('hello').to('goodbye')
194202
end

0 commit comments

Comments
 (0)