Skip to content

Commit ec814eb

Browse files
author
Bilal Al
committed
updated models and recorder
1 parent ac54e59 commit ec814eb

File tree

4 files changed

+38
-14
lines changed

4 files changed

+38
-14
lines changed

splitio/models/impressions.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@
1616
]
1717
)
1818

19+
ImpressionDecorated = namedtuple(
20+
'ImpressionDecorated',
21+
[
22+
'Impression',
23+
'track'
24+
]
25+
)
26+
1927
# pre-python3.7 hack to make previous_time optional
2028
Impression.__new__.__defaults__ = (None,)
2129

splitio/models/splits.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
SplitView = namedtuple(
1212
'SplitView',
13-
['name', 'traffic_type', 'killed', 'treatments', 'change_number', 'configs', 'default_treatment', 'sets']
13+
['name', 'traffic_type', 'killed', 'treatments', 'change_number', 'configs', 'default_treatment', 'sets', 'trackImpressions']
1414
)
1515

1616
_DEFAULT_CONDITIONS_TEMPLATE = {
@@ -73,7 +73,8 @@ def __init__( # pylint: disable=too-many-arguments
7373
traffic_allocation=None,
7474
traffic_allocation_seed=None,
7575
configurations=None,
76-
sets=None
76+
sets=None,
77+
trackImpressions=None
7778
):
7879
"""
7980
Class constructor.
@@ -96,6 +97,8 @@ def __init__( # pylint: disable=too-many-arguments
9697
:type traffic_allocation_seed: int
9798
:pram sets: list of flag sets
9899
:type sets: list
100+
:pram trackImpressions: track impressions flag
101+
:type trackImpressions: boolean
99102
"""
100103
self._name = name
101104
self._seed = seed
@@ -125,6 +128,7 @@ def __init__( # pylint: disable=too-many-arguments
125128

126129
self._configurations = configurations
127130
self._sets = set(sets) if sets is not None else set()
131+
self._trackImpressions = trackImpressions if trackImpressions is not None else True
128132

129133
@property
130134
def name(self):
@@ -186,6 +190,11 @@ def sets(self):
186190
"""Return the flag sets of the split."""
187191
return self._sets
188192

193+
@property
194+
def trackImpressions(self):
195+
"""Return trackImpressions of the split."""
196+
return self._trackImpressions
197+
189198
def get_configurations_for(self, treatment):
190199
"""Return the mapping of treatments to configurations."""
191200
return self._configurations.get(treatment) if self._configurations else None
@@ -214,7 +223,8 @@ def to_json(self):
214223
'algo': self.algo.value,
215224
'conditions': [c.to_json() for c in self.conditions],
216225
'configurations': self._configurations,
217-
'sets': list(self._sets)
226+
'sets': list(self._sets),
227+
'trackImpressions': self._trackImpressions
218228
}
219229

220230
def to_split_view(self):
@@ -232,7 +242,8 @@ def to_split_view(self):
232242
self.change_number,
233243
self._configurations if self._configurations is not None else {},
234244
self._default_treatment,
235-
list(self._sets) if self._sets is not None else []
245+
list(self._sets) if self._sets is not None else [],
246+
self._trackImpressions
236247
)
237248

238249
def local_kill(self, default_treatment, change_number):
@@ -288,5 +299,6 @@ def from_raw(raw_split):
288299
traffic_allocation=raw_split.get('trafficAllocation'),
289300
traffic_allocation_seed=raw_split.get('trafficAllocationSeed'),
290301
configurations=raw_split.get('configurations'),
291-
sets=set(raw_split.get('sets')) if raw_split.get('sets') is not None else []
302+
sets=set(raw_split.get('sets')) if raw_split.get('sets') is not None else [],
303+
trackImpressions=raw_split.get('trackImpressions') if raw_split.get('trackImpressions') is not None else True
292304
)

splitio/recorder/recorder.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def __init__(self, impressions_manager, event_storage, impression_storage, telem
151151
self._telemetry_evaluation_producer = telemetry_evaluation_producer
152152
self._telemetry_runtime_producer = telemetry_runtime_producer
153153

154-
def record_treatment_stats(self, impressions, latency, operation, method_name):
154+
def record_treatment_stats(self, impressions_decorated, latency, operation, method_name):
155155
"""
156156
Record stats for treatment evaluation.
157157
@@ -165,7 +165,7 @@ def record_treatment_stats(self, impressions, latency, operation, method_name):
165165
try:
166166
if method_name is not None:
167167
self._telemetry_evaluation_producer.record_latency(operation, latency)
168-
impressions, deduped, for_listener, for_counter, for_unique_keys_tracker = self._impressions_manager.process_impressions(impressions)
168+
impressions, deduped, for_listener, for_counter, for_unique_keys_tracker = self._impressions_manager.process_impressions(impressions_decorated)
169169
if deduped > 0:
170170
self._telemetry_runtime_producer.record_impression_stats(telemetry.CounterConstants.IMPRESSIONS_DEDUPED, deduped)
171171
self._impression_storage.put(impressions)
@@ -210,7 +210,7 @@ def __init__(self, impressions_manager, event_storage, impression_storage, telem
210210
self._telemetry_evaluation_producer = telemetry_evaluation_producer
211211
self._telemetry_runtime_producer = telemetry_runtime_producer
212212

213-
async def record_treatment_stats(self, impressions, latency, operation, method_name):
213+
async def record_treatment_stats(self, impressions_decorated, latency, operation, method_name):
214214
"""
215215
Record stats for treatment evaluation.
216216
@@ -224,7 +224,7 @@ async def record_treatment_stats(self, impressions, latency, operation, method_n
224224
try:
225225
if method_name is not None:
226226
await self._telemetry_evaluation_producer.record_latency(operation, latency)
227-
impressions, deduped, for_listener, for_counter, for_unique_keys_tracker = self._impressions_manager.process_impressions(impressions)
227+
impressions, deduped, for_listener, for_counter, for_unique_keys_tracker = self._impressions_manager.process_impressions(impressions_decorated)
228228
if deduped > 0:
229229
await self._telemetry_runtime_producer.record_impression_stats(telemetry.CounterConstants.IMPRESSIONS_DEDUPED, deduped)
230230

@@ -277,7 +277,7 @@ def __init__(self, pipe, impressions_manager, event_storage,
277277
self._data_sampling = data_sampling
278278
self._telemetry_redis_storage = telemetry_redis_storage
279279

280-
def record_treatment_stats(self, impressions, latency, operation, method_name):
280+
def record_treatment_stats(self, impressions_decorated, latency, operation, method_name):
281281
"""
282282
Record stats for treatment evaluation.
283283
@@ -294,7 +294,7 @@ def record_treatment_stats(self, impressions, latency, operation, method_name):
294294
if self._data_sampling < rnumber:
295295
return
296296

297-
impressions, deduped, for_listener, for_counter, for_unique_keys_tracker = self._impressions_manager.process_impressions(impressions)
297+
impressions, deduped, for_listener, for_counter, for_unique_keys_tracker = self._impressions_manager.process_impressions(impressions_decorated)
298298
if impressions:
299299
pipe = self._make_pipe()
300300
self._impression_storage.add_impressions_to_pipe(impressions, pipe)
@@ -367,7 +367,7 @@ def __init__(self, pipe, impressions_manager, event_storage,
367367
self._data_sampling = data_sampling
368368
self._telemetry_redis_storage = telemetry_redis_storage
369369

370-
async def record_treatment_stats(self, impressions, latency, operation, method_name):
370+
async def record_treatment_stats(self, impressions_decorated, latency, operation, method_name):
371371
"""
372372
Record stats for treatment evaluation.
373373
@@ -384,7 +384,7 @@ async def record_treatment_stats(self, impressions, latency, operation, method_n
384384
if self._data_sampling < rnumber:
385385
return
386386

387-
impressions, deduped, for_listener, for_counter, for_unique_keys_tracker = self._impressions_manager.process_impressions(impressions)
387+
impressions, deduped, for_listener, for_counter, for_unique_keys_tracker = self._impressions_manager.process_impressions(impressions_decorated)
388388
if impressions:
389389
pipe = self._make_pipe()
390390
self._impression_storage.add_impressions_to_pipe(impressions, pipe)

tests/models/test_splits.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ class SplitTests(object):
6060
'configurations': {
6161
'on': '{"color": "blue", "size": 13}'
6262
},
63-
'sets': ['set1', 'set2']
63+
'sets': ['set1', 'set2'],
64+
'trackImpressions': True
6465
}
6566

6667
def test_from_raw(self):
@@ -81,6 +82,7 @@ def test_from_raw(self):
8182
assert parsed.get_configurations_for('on') == '{"color": "blue", "size": 13}'
8283
assert parsed._configurations == {'on': '{"color": "blue", "size": 13}'}
8384
assert parsed.sets == {'set1', 'set2'}
85+
assert parsed.trackImpressions == True
8486

8587
def test_get_segment_names(self, mocker):
8688
"""Test fetching segment names."""
@@ -107,6 +109,7 @@ def test_to_json(self):
107109
assert as_json['algo'] == 2
108110
assert len(as_json['conditions']) == 2
109111
assert sorted(as_json['sets']) == ['set1', 'set2']
112+
assert as_json['trackImpressions'] is True
110113

111114
def test_to_split_view(self):
112115
"""Test SplitView creation."""
@@ -118,6 +121,7 @@ def test_to_split_view(self):
118121
assert as_split_view.traffic_type == self.raw['trafficTypeName']
119122
assert set(as_split_view.treatments) == set(['on', 'off'])
120123
assert sorted(as_split_view.sets) == sorted(list(self.raw['sets']))
124+
assert as_split_view.trackImpressions == self.raw['trackImpressions']
121125

122126
def test_incorrect_matcher(self):
123127
"""Test incorrect matcher in split model parsing."""

0 commit comments

Comments
 (0)