33
44from splitio .engine .evaluator import Evaluator , CONTROL , EvaluationDataFactory , AsyncEvaluationDataFactory
55from splitio .engine .splitters import Splitter
6- from splitio .models .impressions import Impression , Label
6+ from splitio .models .impressions import Impression , Label , ImpressionDecorated
77from splitio .models .events import Event , EventWrapper
88from splitio .models .telemetry import get_latency_bucket_index , MethodExceptionsAndLatencies
99from splitio .client import input_validator
@@ -22,7 +22,8 @@ class ClientBase(object): # pylint: disable=too-many-instance-attributes
2222 'impression' : {
2323 'label' : Label .EXCEPTION ,
2424 'change_number' : None ,
25- }
25+ },
26+ 'track' : True
2627 }
2728
2829 _NON_READY_EVAL_RESULT = {
@@ -31,7 +32,8 @@ class ClientBase(object): # pylint: disable=too-many-instance-attributes
3132 'impression' : {
3233 'label' : Label .NOT_READY ,
3334 'change_number' : None
34- }
35+ },
36+ 'track' : True
3537 }
3638
3739 def __init__ (self , factory , recorder , labels_enabled = True ):
@@ -116,14 +118,15 @@ def _validate_treatments_input(key, features, attributes, method):
116118
117119 def _build_impression (self , key , bucketing , feature , result ):
118120 """Build an impression based on evaluation data & it's result."""
119- return Impression (
120- matching_key = key ,
121+ return ImpressionDecorated (
122+ Impression ( matching_key = key ,
121123 feature_name = feature ,
122124 treatment = result ['treatment' ],
123125 label = result ['impression' ]['label' ] if self ._labels_enabled else None ,
124126 change_number = result ['impression' ]['change_number' ],
125127 bucketing_key = bucketing ,
126- time = utctime_ms ())
128+ time = utctime_ms ()),
129+ track = result ['track' ])
127130
128131 def _build_impressions (self , key , bucketing , results ):
129132 """Build an impression based on evaluation data & it's result."""
@@ -228,7 +231,7 @@ def get_treatment(self, key, feature_flag_name, attributes=None):
228231 treatment , _ = self ._get_treatment (MethodExceptionsAndLatencies .TREATMENT , key , feature_flag_name , attributes )
229232 return treatment
230233
231- except :
234+ except Exception as e :
232235 _LOGGER .error ('get_treatment failed' )
233236 return CONTROL
234237
@@ -296,8 +299,8 @@ def _get_treatment(self, method, key, feature, attributes=None):
296299 result = self ._FAILED_EVAL_RESULT
297300
298301 if result ['impression' ]['label' ] != Label .SPLIT_NOT_FOUND :
299- impression = self ._build_impression (key , bucketing , feature , result )
300- self ._record_stats ([(impression , attributes )], start , method )
302+ impression_decorated = self ._build_impression (key , bucketing , feature , result )
303+ self ._record_stats ([(impression_decorated , attributes )], start , method )
301304
302305 return result ['treatment' ], result ['configurations' ]
303306
@@ -571,23 +574,23 @@ def _get_treatments(self, key, features, method, attributes=None):
571574 self ._telemetry_evaluation_producer .record_exception (method )
572575 results = {n : self ._FAILED_EVAL_RESULT for n in features }
573576
574- imp_attrs = [
577+ imp_decorated_attrs = [
575578 (i , attributes ) for i in self ._build_impressions (key , bucketing , results )
576- if i .label != Label .SPLIT_NOT_FOUND
579+ if i .Impression . label != Label .SPLIT_NOT_FOUND
577580 ]
578- self ._record_stats (imp_attrs , start , method )
581+ self ._record_stats (imp_decorated_attrs , start , method )
579582
580583 return {
581584 feature : (results [feature ]['treatment' ], results [feature ]['configurations' ])
582585 for feature in results
583586 }
584587
585- def _record_stats (self , impressions , start , operation ):
588+ def _record_stats (self , impressions_decorated , start , operation ):
586589 """
587590 Record impressions.
588591
589- :param impressions : Generated impressions
590- :type impressions : list[tuple[splitio.models.impression.Impression , dict]]
592+ :param impressions_decorated : Generated impressions
593+ :type impressions_decorated : list[tuple[splitio.models.impression.ImpressionDecorated , dict]]
591594
592595 :param start: timestamp when get_treatment or get_treatments was called
593596 :type start: int
@@ -596,7 +599,7 @@ def _record_stats(self, impressions, start, operation):
596599 :type operation: str
597600 """
598601 end = get_current_epoch_time_ms ()
599- self ._recorder .record_treatment_stats (impressions , get_latency_bucket_index (end - start ),
602+ self ._recorder .record_treatment_stats (impressions_decorated , get_latency_bucket_index (end - start ),
600603 operation , 'get_' + operation .value )
601604
602605 def track (self , key , traffic_type , event_type , value = None , properties = None ):
@@ -695,7 +698,7 @@ async def get_treatment(self, key, feature_flag_name, attributes=None):
695698 treatment , _ = await self ._get_treatment (MethodExceptionsAndLatencies .TREATMENT , key , feature_flag_name , attributes )
696699 return treatment
697700
698- except :
701+ except Exception as e :
699702 _LOGGER .error ('get_treatment failed' )
700703 return CONTROL
701704
@@ -763,8 +766,8 @@ async def _get_treatment(self, method, key, feature, attributes=None):
763766 result = self ._FAILED_EVAL_RESULT
764767
765768 if result ['impression' ]['label' ] != Label .SPLIT_NOT_FOUND :
766- impression = self ._build_impression (key , bucketing , feature , result )
767- await self ._record_stats ([(impression , attributes )], start , method )
769+ impression_decorated = self ._build_impression (key , bucketing , feature , result )
770+ await self ._record_stats ([(impression_decorated , attributes )], start , method )
768771 return result ['treatment' ], result ['configurations' ]
769772
770773 async def get_treatments (self , key , feature_flag_names , attributes = None ):
@@ -960,23 +963,23 @@ async def _get_treatments(self, key, features, method, attributes=None):
960963 await self ._telemetry_evaluation_producer .record_exception (method )
961964 results = {n : self ._FAILED_EVAL_RESULT for n in features }
962965
963- imp_attrs = [
966+ imp_decorated_attrs = [
964967 (i , attributes ) for i in self ._build_impressions (key , bucketing , results )
965- if i .label != Label .SPLIT_NOT_FOUND
968+ if i .Impression . label != Label .SPLIT_NOT_FOUND
966969 ]
967- await self ._record_stats (imp_attrs , start , method )
970+ await self ._record_stats (imp_decorated_attrs , start , method )
968971
969972 return {
970973 feature : (res ['treatment' ], res ['configurations' ])
971974 for feature , res in results .items ()
972975 }
973976
974- async def _record_stats (self , impressions , start , operation ):
977+ async def _record_stats (self , impressions_decorated , start , operation ):
975978 """
976979 Record impressions for async calls
977980
978- :param impressions : Generated impressions
979- :type impressions : list[tuple[splitio.models.impression.Impression, dict]]
981+ :param impressions_decorated : Generated impressions decorated
982+ :type impressions_decorated : list[tuple[splitio.models.impression.Impression, dict]]
980983
981984 :param start: timestamp when get_treatment or get_treatments was called
982985 :type start: int
@@ -985,7 +988,7 @@ async def _record_stats(self, impressions, start, operation):
985988 :type operation: str
986989 """
987990 end = get_current_epoch_time_ms ()
988- await self ._recorder .record_treatment_stats (impressions , get_latency_bucket_index (end - start ),
991+ await self ._recorder .record_treatment_stats (impressions_decorated , get_latency_bucket_index (end - start ),
989992 operation , 'get_' + operation .value )
990993
991994 async def track (self , key , traffic_type , event_type , value = None , properties = None ):
0 commit comments