Skip to content

Commit c867c77

Browse files
author
Matias Melograno
committed
renamed and added test
1 parent 474362e commit c867c77

File tree

4 files changed

+47
-17
lines changed

4 files changed

+47
-17
lines changed

splitio/client/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77

88
_LOGGER = logging.getLogger(__name__)
9-
DEFAULT_DATA_THROTTLING = 1
9+
DEFAULT_DATA_SAMPLING = 1
1010

1111

1212
DEFAULT_CONFIG = {
@@ -53,7 +53,7 @@
5353
'machineIp': None,
5454
'splitFile': os.path.join(os.path.expanduser('~'), '.split'),
5555
'preforkedInitialization': False,
56-
'dataThrottling': DEFAULT_DATA_THROTTLING,
56+
'dataSampling': DEFAULT_DATA_SAMPLING,
5757
}
5858

5959

splitio/client/factory.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from splitio.client.client import Client
99
from splitio.client import input_validator
1010
from splitio.client.manager import SplitManager
11-
from splitio.client.config import sanitize as sanitize_config, DEFAULT_DATA_THROTTLING
11+
from splitio.client.config import sanitize as sanitize_config, DEFAULT_DATA_SAMPLING
1212
from splitio.client import util
1313
from splitio.client.listener import ImpressionListenerWrapper
1414
from splitio.engine.impressions import Manager as ImpressionsManager
@@ -57,7 +57,7 @@
5757
_LOGGER = logging.getLogger(__name__)
5858
_INSTANTIATED_FACTORIES = Counter()
5959
_INSTANTIATED_FACTORIES_LOCK = threading.RLock()
60-
_MIN_DEFAULT_DATA_THROTTLING_ALLOWED = 0.1 # 10%
60+
_MIN_DEFAULT_DATA_SAMPLING_ALLOWED = 0.1 # 10%
6161

6262

6363
class Status(Enum):
@@ -402,19 +402,19 @@ def _build_redis_factory(api_key, cfg):
402402
'events': RedisEventsStorage(redis_adapter, sdk_metadata),
403403
'telemetry': RedisTelemetryStorage(redis_adapter, sdk_metadata)
404404
}
405-
data_throttling = cfg.get('dataThrottling', DEFAULT_DATA_THROTTLING)
406-
if data_throttling < _MIN_DEFAULT_DATA_THROTTLING_ALLOWED:
407-
_LOGGER.warning("dataThrottling cannot be less than %f, defaulting to minimum",
408-
_MIN_DEFAULT_DATA_THROTTLING_ALLOWED)
409-
data_throttling = _MIN_DEFAULT_DATA_THROTTLING_ALLOWED
405+
data_sampling = cfg.get('dataSampling', DEFAULT_DATA_SAMPLING)
406+
if data_sampling < _MIN_DEFAULT_DATA_SAMPLING_ALLOWED:
407+
_LOGGER.warning("dataSampling cannot be less than %f, defaulting to minimum",
408+
_MIN_DEFAULT_DATA_SAMPLING_ALLOWED)
409+
data_sampling = _MIN_DEFAULT_DATA_SAMPLING_ALLOWED
410410
recorder = PipelinedRecorder(
411411
redis_adapter.pipeline,
412412
ImpressionsManager(cfg['impressionsMode'], False,
413413
_wrap_impression_listener(cfg['impressionListener'], sdk_metadata)),
414414
storages['telemetry'],
415415
storages['events'],
416416
storages['impressions'],
417-
data_throttling,
417+
data_sampling,
418418
)
419419
return SplitFactory(
420420
api_key,

splitio/recorder/recorder.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import random
55

66

7-
from splitio.client.config import DEFAULT_DATA_THROTTLING
7+
from splitio.client.config import DEFAULT_DATA_SAMPLING
88

99

1010
_LOGGER = logging.getLogger(__name__)
@@ -92,7 +92,7 @@ class PipelinedRecorder(StatsRecorder):
9292
"""PipelinedRecorder class."""
9393

9494
def __init__(self, pipe, impressions_manager, telemetry_storage, event_storage,
95-
impression_storage, data_throttling=DEFAULT_DATA_THROTTLING):
95+
impression_storage, data_sampling=DEFAULT_DATA_SAMPLING):
9696
"""
9797
Class constructor.
9898
@@ -106,15 +106,15 @@ def __init__(self, pipe, impressions_manager, telemetry_storage, event_storage,
106106
:type event_storage: splitio.storage.EventStorage
107107
:param impression_storage: impression storage instance
108108
:type impression_storage: splitio.storage.redis.RedisImpressionsStorage
109-
:param data_throttling: data throttling factor
110-
:type data_throttling: number
109+
:param data_sampling: data sampling factor
110+
:type data_sampling: number
111111
"""
112112
self._make_pipe = pipe
113113
self._impressions_manager = impressions_manager
114114
self._telemetry_storage = telemetry_storage
115115
self._event_sotrage = event_storage
116116
self._impression_storage = impression_storage
117-
self._data_throttling = data_throttling
117+
self._data_sampling = data_sampling
118118

119119
def record_treatment_stats(self, impressions, latency, operation):
120120
"""
@@ -131,9 +131,9 @@ def record_treatment_stats(self, impressions, latency, operation):
131131
# TODO @matias.melograno
132132
# Changing logic until TelemetryV2 released to avoid using pipelined operations
133133
# Deprecated Old Telemetry
134-
if self._data_throttling < DEFAULT_DATA_THROTTLING:
134+
if self._data_sampling < DEFAULT_DATA_SAMPLING:
135135
rnumber = random.uniform(0, 1)
136-
if self._data_throttling > rnumber:
136+
if self._data_sampling < rnumber:
137137
return
138138
impressions = self._impressions_manager.process_impressions(impressions)
139139
self._impression_storage.put(impressions)

tests/recorder/test_recorder.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,33 @@ def test_pipelined_recorder(self, mocker):
4848
# assert recorder._telemetry_storage.add_latency_to_pipe.mock_calls[0][1][0] == 'some'
4949
# assert recorder._telemetry_storage.add_latency_to_pipe.mock_calls[0][1][1] == 1
5050
assert recorder._impression_storage.put.mock_calls[0][1][0] == impressions
51+
52+
def test_sampled_recorder(self, mocker):
53+
impressions = [
54+
Impression('k1', 'f1', 'on', 'l1', 123, None, None),
55+
Impression('k1', 'f2', 'on', 'l1', 123, None, None)
56+
]
57+
redis = mocker.Mock(spec=RedisAdapter)
58+
impmanager = mocker.Mock(spec=ImpressionsManager)
59+
impmanager.process_impressions.return_value = impressions
60+
telemetry = mocker.Mock(spec=TelemetryPipelinedStorage)
61+
event = mocker.Mock(spec=EventStorage)
62+
impression = mocker.Mock(spec=ImpressionStorage)
63+
recorder = PipelinedRecorder(redis, impmanager, telemetry, event, impression, 0.5)
64+
65+
def put(x):
66+
return
67+
68+
recorder._impression_storage.put.side_effect = put
69+
70+
for _ in range(100):
71+
recorder.record_treatment_stats(impressions, 1, 'some')
72+
print(recorder._impression_storage.put.call_count)
73+
assert recorder._impression_storage.put.call_count < 80
74+
75+
76+
# TODO @matias.melograno Commented until we implement TelemetryV2
77+
# assert recorder._impression_storage.add_impressions_to_pipe.mock_calls[0][1][0] == impressions
78+
# assert recorder._telemetry_storage.add_latency_to_pipe.mock_calls[0][1][0] == 'some'
79+
# assert recorder._telemetry_storage.add_latency_to_pipe.mock_calls[0][1][1] == 1
80+
# assert recorder._impression_storage.put.mock_calls[0][1][0] == impressions

0 commit comments

Comments
 (0)