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 ):
@@ -136,7 +136,7 @@ def get_treatment_with_config(self, key, feature, attributes=None):
136136 self ._record_stats (impression , start , self ._METRIC_GET_TREATMENT )
137137 self ._send_impression_to_listener (impression , attributes )
138138 return result ['treatment' ], result ['configurations' ]
139- except Exception : #pylint: disable=broad-except
139+ except Exception : # pylint: disable=broad-except
140140 self ._logger .error ('Error getting treatment for feature' )
141141 self ._logger .debug ('Error: ' , exc_info = True )
142142 try :
@@ -231,7 +231,7 @@ def get_treatments_with_config(self, key, features, attributes=None):
231231 bulk_impressions .append (impression )
232232 treatments [feature ] = (treatment ['treatment' ], treatment ['configurations' ])
233233
234- except Exception : #pylint: disable=broad-except
234+ except Exception : # pylint: disable=broad-except
235235 self ._logger .error ('get_treatments: An exception occured when evaluating '
236236 'feature ' + feature + ' returning CONTROL.' )
237237 treatments [feature ] = CONTROL , None
@@ -244,14 +244,13 @@ def get_treatments_with_config(self, key, features, attributes=None):
244244 self ._record_stats (bulk_impressions , start , self ._METRIC_GET_TREATMENTS )
245245 for impression in bulk_impressions :
246246 self ._send_impression_to_listener (impression , attributes )
247- except Exception : #pylint: disable=broad-except
247+ except Exception : # pylint: disable=broad-except
248248 self ._logger .error ('get_treatments: An exception when trying to store '
249249 'impressions.' )
250250 self ._logger .debug ('Error: ' , exc_info = True )
251251
252252 return treatments
253253
254-
255254 def get_treatments (self , key , features , attributes = None ):
256255 """
257256 Evaluate multiple features and return a dictionary with all the feature/treatments.
@@ -271,7 +270,7 @@ def get_treatments(self, key, features, attributes=None):
271270 with_config = self .get_treatments_with_config (key , features , attributes )
272271 return {feature : result [0 ] for (feature , result ) in six .iteritems (with_config )}
273272
274- def _build_impression ( #pylint: disable=too-many-arguments
273+ def _build_impression ( # pylint: disable=too-many-arguments
275274 self ,
276275 matching_key ,
277276 feature_name ,
@@ -311,11 +310,11 @@ def _record_stats(self, impressions, start, operation):
311310 else :
312311 self ._impressions_storage .put (impressions )
313312 self ._telemetry_storage .inc_latency (operation , get_latency_bucket_index (end - start ))
314- except Exception : #pylint: disable=broad-except
313+ except Exception : # pylint: disable=broad-except
315314 self ._logger .error ('Error recording impressions and metrics' )
316315 self ._logger .debug ('Error: ' , exc_info = True )
317316
318- def track (self , key , traffic_type , event_type , value = None ):
317+ def track (self , key , traffic_type , event_type , value = None , properties = None ):
319318 """
320319 Track an event.
321320
@@ -327,6 +326,8 @@ def track(self, key, traffic_type, event_type, value=None):
327326 :type event_type: str
328327 :param value: (Optional) value associated to the event
329328 :type value: Number
329+ :param properties: (Optional) properties associated to the event
330+ :type properties: dict
330331
331332 :return: Whether the event was created or not.
332333 :rtype: bool
@@ -339,15 +340,21 @@ def track(self, key, traffic_type, event_type, value=None):
339340 event_type = input_validator .validate_event_type (event_type )
340341 traffic_type = input_validator .validate_traffic_type (traffic_type )
341342 value = input_validator .validate_value (value )
343+ valid , properties , size = input_validator .valid_properties (properties )
342344
343- if key is None or event_type is None or traffic_type is None or value is False :
345+ if key is None or event_type is None or traffic_type is None or value is False \
346+ or valid is False :
344347 return False
345348
346349 event = Event (
347350 key = key ,
348351 traffic_type_name = traffic_type ,
349352 event_type_id = event_type ,
350353 value = value ,
351- timestamp = int (time .time ()* 1000 )
354+ timestamp = int (time .time ()* 1000 ),
355+ properties = properties ,
352356 )
353- return self ._events_storage .put ([event ])
357+ return self ._events_storage .put ([EventWrapper (
358+ event = event ,
359+ size = size ,
360+ )])
0 commit comments