Skip to content

Commit f52756f

Browse files
authored
Merge pull request #475 from splitio/flagsets-client-fix-warning
added warning when not ready
2 parents f55128c + c6c0f11 commit f52756f

File tree

4 files changed

+20
-7
lines changed

4 files changed

+20
-7
lines changed

splitio/client/client.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ def destroyed(self):
5959
"""Return whether the factory holding this client has been destroyed."""
6060
return self._factory.destroyed
6161

62-
def _evaluate_if_ready(self, matching_key, bucketing_key, feature, attributes=None):
62+
def _evaluate_if_ready(self, matching_key, bucketing_key, feature, method, attributes=None):
6363
if not self.ready:
64+
_LOGGER.warning("%s: The SDK is not ready, results may be incorrect for feature flag %s. Make sure to wait for SDK readiness before using this method", method, feature)
6465
self._telemetry_init_producer.record_not_ready_usage()
6566
return {
6667
'treatment': CONTROL,
@@ -102,7 +103,7 @@ def _make_evaluation(self, key, feature_flag, attributes, method_name, metric_na
102103
or not input_validator.validate_attributes(attributes, method_name):
103104
return CONTROL, None
104105

105-
result = self._evaluate_if_ready(matching_key, bucketing_key, feature_flag, attributes)
106+
result = self._evaluate_if_ready(matching_key, bucketing_key, feature_flag, method_name, attributes)
106107

107108
impression = self._build_impression(
108109
matching_key,
@@ -167,7 +168,7 @@ def _make_evaluations(self, key, feature_flags, attributes, method_name, metric_
167168

168169
try:
169170
evaluations = self._evaluate_features_if_ready(matching_key, bucketing_key,
170-
list(feature_flags), attributes)
171+
list(feature_flags), method_name, attributes)
171172

172173
for feature_flag in feature_flags:
173174
try:
@@ -212,8 +213,9 @@ def _make_evaluations(self, key, feature_flags, attributes, method_name, metric_
212213
_LOGGER.debug('Error: ', exc_info=True)
213214
return input_validator.generate_control_treatments(list(feature_flags), method_name)
214215

215-
def _evaluate_features_if_ready(self, matching_key, bucketing_key, feature_flags, attributes=None):
216+
def _evaluate_features_if_ready(self, matching_key, bucketing_key, feature_flags, method, attributes=None):
216217
if not self.ready:
218+
_LOGGER.warning("%s: The SDK is not ready, results may be incorrect for feature flags %s. Make sure to wait for SDK readiness before using this method", method, ', '.join([feature for feature in feature_flags]))
217219
self._telemetry_init_producer.record_not_ready_usage()
218220
return {
219221
feature_flag: {

splitio/models/splits.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
SplitView = namedtuple(
99
'SplitView',
10-
['name', 'traffic_type', 'killed', 'treatments', 'change_number', 'configs', 'sets']
10+
['name', 'traffic_type', 'killed', 'treatments', 'change_number', 'configs', 'default_treatment', 'sets']
1111
)
1212

1313

@@ -200,6 +200,7 @@ def to_split_view(self):
200200
list(set(part.treatment for cond in self.conditions for part in cond.partitions)),
201201
self.change_number,
202202
self._configurations if self._configurations is not None else {},
203+
self._default_treatment,
203204
list(self._sets) if self._sets is not None else []
204205
)
205206

tests/client/test_client.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def test_get_treatment(self, mocker):
8383
assert mocker.call(
8484
[(Impression('some_key', 'some_feature', 'control', Label.NOT_READY, mocker.ANY, mocker.ANY, mocker.ANY), {'some_attribute': 1})]
8585
) in impmanager.process_impressions.mock_calls
86+
assert _logger.call(["The SDK is not ready, results may be incorrect for feature flag %s. Make sure to wait for SDK readiness before using this method", 'some_feature'])
8687

8788
# Test with exception:
8889
ready_property.return_value = True
@@ -159,6 +160,7 @@ def test_get_treatment_with_config(self, mocker):
159160
[(Impression('some_key', 'some_feature', 'control', Label.NOT_READY, mocker.ANY, mocker.ANY, mocker.ANY),
160161
{'some_attribute': 1})]
161162
) in impmanager.process_impressions.mock_calls
163+
assert _logger.call(["The SDK is not ready, results may be incorrect for feature flag %s. Make sure to wait for SDK readiness before using this method", 'some_feature'])
162164

163165
# Test with exception:
164166
ready_property.return_value = True
@@ -236,6 +238,7 @@ def test_get_treatments(self, mocker):
236238
assert mocker.call(
237239
[(Impression('some_key', 'some_feature', 'control', Label.NOT_READY, mocker.ANY, mocker.ANY, mocker.ANY), {'some_attribute': 1})]
238240
) in impmanager.process_impressions.mock_calls
241+
assert _logger.call(["The SDK is not ready, results may be incorrect for feature flags %s. Make sure to wait for SDK readiness before using this method", 'some_feature'])
239242

240243
# Test with exception:
241244
ready_property.return_value = True
@@ -310,6 +313,7 @@ def test_get_treatments_with_config(self, mocker):
310313
assert mocker.call(
311314
[(Impression('some_key', 'some_feature', 'control', Label.NOT_READY, mocker.ANY, mocker.ANY, mocker.ANY), {'some_attribute': 1})]
312315
) in impmanager.process_impressions.mock_calls
316+
assert _logger.call(["The SDK is not ready, results may be incorrect for feature flags %s. Make sure to wait for SDK readiness before using this method", 'some_feature'])
313317

314318
# Test with exception:
315319
ready_property.return_value = True
@@ -400,6 +404,7 @@ def evaluate_features(feature_flag_names, matching_key, bucketing_key, attribute
400404
assert mocker.call(
401405
[(Impression('some_key', 'some_feature', 'control', Label.NOT_READY, mocker.ANY, mocker.ANY, mocker.ANY), {'some_attribute': 1})]
402406
) in impmanager.process_impressions.mock_calls
407+
assert _logger.call(["The SDK is not ready, results may be incorrect for feature flags %s. Make sure to wait for SDK readiness before using this method", 'some_feature'])
403408

404409
# Test with exception:
405410
ready_property.return_value = True
@@ -465,7 +470,6 @@ def evaluate_features(feature_flag_names, matching_key, bucketing_key, attribute
465470
client._evaluator.evaluate_features = evaluate_features
466471
_logger = mocker.Mock()
467472
client._send_impression_to_listener = mocker.Mock()
468-
# pytest.set_trace()
469473
assert client.get_treatments_by_flag_sets('key', ['set1', 'set2']) == {'f1': 'on', 'f2': 'on'}
470474

471475
impressions_called = impmanager.process_impressions.mock_calls[0][1][0]
@@ -488,6 +492,7 @@ def evaluate_features(feature_flag_names, matching_key, bucketing_key, attribute
488492
assert mocker.call(
489493
[(Impression('some_key', 'some_feature', 'control', Label.NOT_READY, mocker.ANY, mocker.ANY, mocker.ANY), {'some_attribute': 1})]
490494
) in impmanager.process_impressions.mock_calls
495+
assert _logger.call(["The SDK is not ready, results may be incorrect for feature flags %s. Make sure to wait for SDK readiness before using this method", 'some_feature'])
491496

492497
# Test with exception:
493498
ready_property.return_value = True
@@ -581,6 +586,7 @@ def evaluate_features(feature_flag_names, matching_key, bucketing_key, attribute
581586
assert mocker.call(
582587
[(Impression('some_key', 'some_feature', 'control', Label.NOT_READY, mocker.ANY, mocker.ANY, mocker.ANY), {'some_attribute': 1})]
583588
) in impmanager.process_impressions.mock_calls
589+
assert _logger.call(["The SDK is not ready, results may be incorrect for feature flags %s. Make sure to wait for SDK readiness before using this method", 'some_feature'])
584590

585591
# Test with exception:
586592
ready_property.return_value = True
@@ -677,6 +683,7 @@ def evaluate_features(feature_flag_names, matching_key, bucketing_key, attribute
677683
assert mocker.call(
678684
[(Impression('some_key', 'some_feature', 'control', Label.NOT_READY, mocker.ANY, mocker.ANY, mocker.ANY), {'some_attribute': 1})]
679685
) in impmanager.process_impressions.mock_calls
686+
assert _logger.call(["The SDK is not ready, results may be incorrect for feature flags %s. Make sure to wait for SDK readiness before using this method", 'some_feature'])
680687

681688
# Test with exception:
682689
ready_property.return_value = True
@@ -748,6 +755,7 @@ def test_track(self, mocker):
748755
telemetry_producer.get_telemetry_init_producer(),
749756
mocker.Mock()
750757
)
758+
_logger = mocker.Mock()
751759

752760
destroyed_mock = mocker.PropertyMock()
753761
destroyed_mock.return_value = False
@@ -762,6 +770,7 @@ def test_track(self, mocker):
762770
size=1024
763771
)
764772
]) in event_storage.put.mock_calls
773+
assert _logger.call("track: the SDK is not ready, results may be incorrect. Make sure to wait for SDK readiness before using this method")
765774

766775
def test_evaluations_before_running_post_fork(self, mocker):
767776
destroyed_property = mocker.PropertyMock()
@@ -837,7 +846,7 @@ def test_telemetry_not_ready(self, mocker):
837846
)
838847
client = Client(factory, mocker.Mock())
839848
client.ready = False
840-
client._evaluate_if_ready('matching_key','matching_key', 'feature')
849+
client._evaluate_if_ready('matching_key','matching_key', 'method', 'feature')
841850
assert(telemetry_storage._tel_config._not_ready == 1)
842851
client.track('key', 'tt', 'ev')
843852
assert(telemetry_storage._tel_config._not_ready == 2)

tests/models/test_splits.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,5 @@ def test_to_split_view(self):
117117
assert as_split_view.killed == self.raw['killed']
118118
assert as_split_view.traffic_type == self.raw['trafficTypeName']
119119
assert set(as_split_view.treatments) == set(['on', 'off'])
120+
assert as_split_view.default_treatment == self.raw['defaultTreatment']
120121
assert sorted(as_split_view.sets) == sorted(list(self.raw['sets']))

0 commit comments

Comments
 (0)