88from splitio .engine .evaluator import Evaluator , CONTROL
99from splitio .engine .splitters import Splitter
1010from splitio .models .impressions import Impression , Label
11- from splitio .models .events import Event
11+ from splitio .models .events import Event , EventWrapper
1212from splitio .models .telemetry import get_latency_bucket_index
1313from splitio .client import input_validator
1414from splitio .client .listener import ImpressionListenerException
1515
1616
17- class Client (object ): #pylint: disable=too-many-instance-attributes
17+ class Client (object ): # pylint: disable=too-many-instance-attributes
1818 """Entry point for the split sdk."""
1919
2020 _METRIC_GET_TREATMENT = 'sdk.getTreatment'
@@ -41,11 +41,11 @@ def __init__(self, factory, labels_enabled=True, impression_listener=None):
4141 self ._impression_listener = impression_listener
4242
4343 self ._splitter = Splitter ()
44- self ._split_storage = factory ._get_storage ('splits' ) #pylint: disable=protected-access
45- self ._segment_storage = factory ._get_storage ('segments' ) #pylint: disable=protected-access
46- self ._impressions_storage = factory ._get_storage ('impressions' ) #pylint: disable=protected-access
47- self ._events_storage = factory ._get_storage ('events' ) #pylint: disable=protected-access
48- self ._telemetry_storage = factory ._get_storage ('telemetry' ) #pylint: disable=protected-access
44+ self ._split_storage = factory ._get_storage ('splits' ) # pylint: disable=protected-access
45+ self ._segment_storage = factory ._get_storage ('segments' ) # pylint: disable=protected-access
46+ self ._impressions_storage = factory ._get_storage ('impressions' ) # pylint: disable=protected-access
47+ self ._events_storage = factory ._get_storage ('events' ) # pylint: disable=protected-access
48+ self ._telemetry_storage = factory ._get_storage ('telemetry' ) # pylint: disable=protected-access
4949 self ._evaluator = Evaluator (self ._split_storage , self ._segment_storage , self ._splitter )
5050
5151 def destroy (self ):
@@ -154,7 +154,7 @@ def get_treatment_with_config(self, key, feature, attributes=None):
154154 self ._record_stats (impression , start , self ._METRIC_GET_TREATMENT )
155155 self ._send_impression_to_listener (impression , attributes )
156156 return result ['treatment' ], result ['configurations' ]
157- except Exception : #pylint: disable=broad-except
157+ except Exception : # pylint: disable=broad-except
158158 self ._logger .error ('Error getting treatment for feature' )
159159 self ._logger .debug ('Error: ' , exc_info = True )
160160 try :
@@ -247,7 +247,7 @@ def get_treatments_with_config(self, key, features, attributes=None):
247247 bulk_impressions .append (impression )
248248 treatments [feature ] = (result ['treatment' ], result ['configurations' ])
249249
250- except Exception : #pylint: disable=broad-except
250+ except Exception : # pylint: disable=broad-except
251251 self ._logger .error ('get_treatments: An exception occured when evaluating '
252252 'feature ' + feature + ' returning CONTROL.' )
253253 treatments [feature ] = CONTROL , None
@@ -260,14 +260,13 @@ def get_treatments_with_config(self, key, features, attributes=None):
260260 self ._record_stats (bulk_impressions , start , self ._METRIC_GET_TREATMENTS )
261261 for impression in bulk_impressions :
262262 self ._send_impression_to_listener (impression , attributes )
263- except Exception : #pylint: disable=broad-except
263+ except Exception : # pylint: disable=broad-except
264264 self ._logger .error ('get_treatments: An exception when trying to store '
265265 'impressions.' )
266266 self ._logger .debug ('Error: ' , exc_info = True )
267267
268268 return treatments
269269
270-
271270 def get_treatments (self , key , features , attributes = None ):
272271 """
273272 Evaluate multiple features and return a dictionary with all the feature/treatments.
@@ -287,7 +286,7 @@ def get_treatments(self, key, features, attributes=None):
287286 with_config = self .get_treatments_with_config (key , features , attributes )
288287 return {feature : result [0 ] for (feature , result ) in six .iteritems (with_config )}
289288
290- def _build_impression ( #pylint: disable=too-many-arguments
289+ def _build_impression ( # pylint: disable=too-many-arguments
291290 self ,
292291 matching_key ,
293292 feature_name ,
@@ -327,11 +326,11 @@ def _record_stats(self, impressions, start, operation):
327326 else :
328327 self ._impressions_storage .put (impressions )
329328 self ._telemetry_storage .inc_latency (operation , get_latency_bucket_index (end - start ))
330- except Exception : #pylint: disable=broad-except
329+ except Exception : # pylint: disable=broad-except
331330 self ._logger .error ('Error recording impressions and metrics' )
332331 self ._logger .debug ('Error: ' , exc_info = True )
333332
334- def track (self , key , traffic_type , event_type , value = None ):
333+ def track (self , key , traffic_type , event_type , value = None , properties = None ):
335334 """
336335 Track an event.
337336
@@ -343,6 +342,8 @@ def track(self, key, traffic_type, event_type, value=None):
343342 :type event_type: str
344343 :param value: (Optional) value associated to the event
345344 :type value: Number
345+ :param properties: (Optional) properties associated to the event
346+ :type properties: dict
346347
347348 :return: Whether the event was created or not.
348349 :rtype: bool
@@ -361,15 +362,21 @@ def track(self, key, traffic_type, event_type, value=None):
361362 )
362363
363364 value = input_validator .validate_value (value )
365+ valid , properties , size = input_validator .valid_properties (properties )
364366
365- if key is None or event_type is None or traffic_type is None or value is False :
367+ if key is None or event_type is None or traffic_type is None or value is False \
368+ or valid is False :
366369 return False
367370
368371 event = Event (
369372 key = key ,
370373 traffic_type_name = traffic_type ,
371374 event_type_id = event_type ,
372375 value = value ,
373- timestamp = int (time .time ()* 1000 )
376+ timestamp = int (time .time ()* 1000 ),
377+ properties = properties ,
374378 )
375- return self ._events_storage .put ([event ])
379+ return self ._events_storage .put ([EventWrapper (
380+ event = event ,
381+ size = size ,
382+ )])
0 commit comments