1111from splitio .models .events import Event , EventWrapper
1212from splitio .models .telemetry import get_latency_bucket_index
1313from splitio .client import input_validator
14- from splitio .client . listener import ImpressionListenerException
14+ from splitio .util import utctime_ms
1515
1616
1717class Client (object ): # pylint: disable=too-many-instance-attributes
@@ -22,7 +22,7 @@ class Client(object): # pylint: disable=too-many-instance-attributes
2222 _METRIC_GET_TREATMENT_WITH_CONFIG = 'sdk.getTreatmentWithConfig'
2323 _METRIC_GET_TREATMENTS_WITH_CONFIG = 'sdk.getTreatmentsWithConfig'
2424
25- def __init__ (self , factory , labels_enabled = True , impression_listener = None ):
25+ def __init__ (self , factory , impressions_manager , labels_enabled = True ):
2626 """
2727 Construct a Client instance.
2828
@@ -32,15 +32,15 @@ def __init__(self, factory, labels_enabled=True, impression_listener=None):
3232 :param labels_enabled: Whether to store labels on impressions
3333 :type labels_enabled: bool
3434
35- :param impression_listener : impression listener implementation
36- :type impression_listener: ImpressionListener
35+ :param impressions_manager : impression manager instance
36+ :type impressions_manager: splitio.engine.impressions.Manager
3737
3838 :rtype: Client
3939 """
4040 self ._logger = logging .getLogger (self .__class__ .__name__ )
4141 self ._factory = factory
4242 self ._labels_enabled = labels_enabled
43- self ._impression_listener = impression_listener
43+ self ._impressions_manager = impressions_manager
4444
4545 self ._splitter = Splitter ()
4646 self ._split_storage = factory ._get_storage ('splits' ) # pylint: disable=protected-access
@@ -68,25 +68,6 @@ def destroyed(self):
6868 """Return whether the factory holding this client has been destroyed."""
6969 return self ._factory .destroyed
7070
71- def _send_impression_to_listener (self , impression , attributes ):
72- """
73- Send impression result to custom listener.
74-
75- :param impression: Generated impression
76- :type impression: Impression
77-
78- :param attributes: An optional dictionary of attributes
79- :type attributes: dict
80- """
81- if self ._impression_listener is not None :
82- try :
83- self ._impression_listener .log_impression (impression , attributes )
84- except ImpressionListenerException :
85- self ._logger .error (
86- 'An exception was raised while calling user-custom impression listener'
87- )
88- self ._logger .debug ('Error' , exc_info = True )
89-
9071 def _evaluate_if_ready (self , matching_key , bucketing_key , feature , attributes = None ):
9172 if not self .ready :
9273 return {
@@ -135,11 +116,10 @@ def _make_evaluation(self, key, feature, attributes, method_name, metric_name):
135116 result ['impression' ]['label' ],
136117 result ['impression' ]['change_number' ],
137118 bucketing_key ,
138- start
119+ utctime_ms (),
139120 )
140121
141- self ._record_stats ([impression ], start , metric_name )
142- self ._send_impression_to_listener (impression , attributes )
122+ self ._record_stats ([(impression , attributes )], start , metric_name )
143123 return result ['treatment' ], result ['configurations' ]
144124 except Exception : # pylint: disable=broad-except
145125 self ._logger .error ('Error getting treatment for feature' )
@@ -152,10 +132,9 @@ def _make_evaluation(self, key, feature, attributes, method_name, metric_name):
152132 Label .EXCEPTION ,
153133 self ._split_storage .get_change_number (),
154134 bucketing_key ,
155- start
135+ utctime_ms (),
156136 )
157- self ._record_stats ([impression ], start , metric_name )
158- self ._send_impression_to_listener (impression , attributes )
137+ self ._record_stats ([(impression , attributes )], start , metric_name )
159138 except Exception : # pylint: disable=broad-except
160139 self ._logger .error ('Error reporting impression into get_treatment exception block' )
161140 self ._logger .debug ('Error: ' , exc_info = True )
@@ -200,7 +179,7 @@ def _make_evaluations(self, key, features, attributes, method_name, metric_name)
200179 result ['impression' ]['label' ],
201180 result ['impression' ]['change_number' ],
202181 bucketing_key ,
203- start )
182+ utctime_ms () )
204183
205184 bulk_impressions .append (impression )
206185 treatments [feature ] = (result ['treatment' ], result ['configurations' ])
@@ -215,9 +194,11 @@ def _make_evaluations(self, key, features, attributes, method_name, metric_name)
215194 # Register impressions
216195 try :
217196 if bulk_impressions :
218- self ._record_stats (bulk_impressions , start , self ._METRIC_GET_TREATMENTS )
219- for impression in bulk_impressions :
220- self ._send_impression_to_listener (impression , attributes )
197+ self ._record_stats (
198+ [(i , attributes ) for i in bulk_impressions ],
199+ start ,
200+ metric_name
201+ )
221202 except Exception : # pylint: disable=broad-except
222203 self ._logger .error ('%s: An exception when trying to store '
223204 'impressions.' % method_name )
@@ -350,7 +331,7 @@ def _record_stats(self, impressions, start, operation):
350331 Record impressions and metrics.
351332
352333 :param impressions: Generated impressions
353- :type impressions: list|| Impression
334+ :type impressions: list[tuple[splitio.models.impression. Impression, dict]]
354335
355336 :param start: timestamp when get_treatment or get_treatments was called
356337 :type start: int
@@ -360,7 +341,7 @@ def _record_stats(self, impressions, start, operation):
360341 """
361342 try :
362343 end = int (round (time .time () * 1000 ))
363- self ._impressions_storage . put (impressions )
344+ self ._impressions_manager . track (impressions )
364345 self ._telemetry_storage .inc_latency (operation , get_latency_bucket_index (end - start ))
365346 except Exception : # pylint: disable=broad-except
366347 self ._logger .error ('Error recording impressions and metrics' )
@@ -409,7 +390,7 @@ def track(self, key, traffic_type, event_type, value=None, properties=None):
409390 traffic_type_name = traffic_type ,
410391 event_type_id = event_type ,
411392 value = value ,
412- timestamp = int ( time . time () * 1000 ),
393+ timestamp = utctime_ms ( ),
413394 properties = properties ,
414395 )
415396 return self ._events_storage .put ([EventWrapper (
0 commit comments