1111from splitio .client .config import sanitize as sanitize_config , DEFAULT_DATA_SAMPLING
1212from splitio .client import util
1313from splitio .client .listener import ImpressionListenerWrapper
14- from splitio .engine .impressions import Manager as ImpressionsManager
14+ from splitio .engine .impressions . impressions import Manager as ImpressionsManager
1515from splitio .engine .impressions import ImpressionsMode
16- from splitio .engine .manager import Counter as ImpressionsCounter
17- from splitio .engine .strategies import StrategyNoneMode , StrategyDebugMode , StrategyOptimizedMode
18- from splitio .engine .adapters import InMemorySenderAdapter , RedisSenderAdapter
16+ from splitio .engine .impressions .manager import Counter as ImpressionsCounter
17+ from splitio .engine .impressions .strategies import StrategyNoneMode , StrategyDebugMode , StrategyOptimizedMode
18+ from splitio .engine .impressions .adapters import InMemorySenderAdapter , RedisSenderAdapter
19+ from splitio .engine .impressions import set_classes
1920
2021# Storage
2122from splitio .storage .inmemmory import InMemorySplitStorage , InMemorySegmentStorage , \
@@ -291,17 +292,17 @@ def _wrap_impression_listener(listener, metadata):
291292 return None
292293
293294
294- def _build_in_memory_factory (api_key , cfg , sdk_url = None , events_url = None , # pylint:disable=too-many-arguments,too-many-locals
295+ def _build_in_memory_factory (api_key , cfg , extra_cfg , sdk_url = None , events_url = None , # pylint:disable=too-many-arguments,too-many-locals
295296 auth_api_base_url = None , streaming_api_base_url = None , telemetry_api_base_url = None ):
296297 """Build and return a split factory tailored to the supplied config."""
297298 if not input_validator .validate_factory_instantiation (api_key ):
298299 return None
299300
300- cfg ['sdk_url' ] = sdk_url
301- cfg ['events_url' ] = events_url
302- cfg ['auth_url' ] = auth_api_base_url
303- cfg ['streaming_url' ] = streaming_api_base_url
304- cfg ['telemetry_api_url' ] = telemetry_api_base_url
301+ extra_cfg ['sdk_url' ] = sdk_url
302+ extra_cfg ['events_url' ] = events_url
303+ extra_cfg ['auth_url' ] = auth_api_base_url
304+ extra_cfg ['streaming_url' ] = streaming_api_base_url
305+ extra_cfg ['telemetry_api_url' ] = telemetry_api_base_url
305306
306307 http_client = HttpClient (
307308 sdk_url = sdk_url ,
@@ -330,30 +331,10 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
330331 'impressions' : InMemoryImpressionStorage (cfg ['impressionsQueueSize' ]),
331332 'events' : InMemoryEventStorage (cfg ['eventsQueueSize' ]),
332333 }
333- imp_counter = ImpressionsCounter () if cfg ['impressionsMode' ] != ImpressionsMode .DEBUG else None
334-
335- unique_keys_synchronizer = None
336- clear_filter_sync = None
337- unique_keys_task = None
338- clear_filter_task = None
339- impressions_count_sync = None
340- impressions_count_task = None
341-
342- if cfg ['impressionsMode' ] == ImpressionsMode .NONE :
343- imp_strategy = StrategyNoneMode (imp_counter )
344- clear_filter_sync = ClearFilterSynchronizer (imp_strategy .get_unique_keys_tracker ())
345- unique_keys_synchronizer = UniqueKeysSynchronizer (InMemorySenderAdapter (apis ['telemetry' ]), imp_strategy .get_unique_keys_tracker ())
346- unique_keys_task = UniqueKeysSyncTask (unique_keys_synchronizer .send_all )
347- clear_filter_task = ClearFilterSyncTask (clear_filter_sync .clear_all )
348- imp_strategy .get_unique_keys_tracker ().set_queue_full_hook (unique_keys_task .flush )
349- impressions_count_sync = ImpressionsCountSynchronizer (apis ['impressions' ], imp_counter )
350- impressions_count_task = ImpressionsCountSyncTask (impressions_count_sync .synchronize_counters )
351- elif cfg ['impressionsMode' ] == ImpressionsMode .DEBUG :
352- imp_strategy = StrategyDebugMode ()
353- else :
354- imp_strategy = StrategyOptimizedMode (imp_counter )
355- impressions_count_sync = ImpressionsCountSynchronizer (apis ['impressions' ], imp_counter )
356- impressions_count_task = ImpressionsCountSyncTask (impressions_count_sync .synchronize_counters )
334+
335+ unique_keys_synchronizer , clear_filter_sync , unique_keys_task , \
336+ clear_filter_task , impressions_count_sync , impressions_count_task , \
337+ imp_strategy = set_classes ('MEMORY' , cfg ['impressionsMode' ], apis )
357338
358339 imp_manager = ImpressionsManager (
359340 _wrap_impression_listener (cfg ['impressionListener' ], sdk_metadata ),
@@ -438,31 +419,9 @@ def _build_redis_factory(api_key, cfg):
438419 _MIN_DEFAULT_DATA_SAMPLING_ALLOWED )
439420 data_sampling = _MIN_DEFAULT_DATA_SAMPLING_ALLOWED
440421
441- unique_keys_synchronizer = None
442- clear_filter_sync = None
443- unique_keys_task = None
444- clear_filter_task = None
445- impressions_count_sync = None
446- impressions_count_task = None
447- redis_sender_adapter = RedisSenderAdapter (redis_adapter )
448-
449- if cfg ['impressionsMode' ] == ImpressionsMode .NONE :
450- imp_counter = ImpressionsCounter ()
451- imp_strategy = StrategyNoneMode (imp_counter )
452- clear_filter_sync = ClearFilterSynchronizer (imp_strategy .get_unique_keys_tracker ())
453- unique_keys_synchronizer = UniqueKeysSynchronizer (redis_sender_adapter , imp_strategy .get_unique_keys_tracker ())
454- unique_keys_task = UniqueKeysSyncTask (unique_keys_synchronizer .send_all )
455- clear_filter_task = ClearFilterSyncTask (clear_filter_sync .clear_all )
456- imp_strategy .get_unique_keys_tracker ().set_queue_full_hook (unique_keys_task .flush )
457- impressions_count_sync = ImpressionsCountSynchronizer (redis_sender_adapter , imp_counter )
458- impressions_count_task = ImpressionsCountSyncTask (impressions_count_sync .synchronize_counters )
459- elif cfg ['impressionsMode' ] == ImpressionsMode .DEBUG :
460- imp_strategy = StrategyDebugMode ()
461- else :
462- imp_counter = ImpressionsCounter ()
463- imp_strategy = StrategyOptimizedMode (imp_counter )
464- impressions_count_sync = ImpressionsCountSynchronizer (redis_sender_adapter , imp_counter )
465- impressions_count_task = ImpressionsCountSyncTask (impressions_count_sync .synchronize_counters )
422+ unique_keys_synchronizer , clear_filter_sync , unique_keys_task , \
423+ clear_filter_task , impressions_count_sync , impressions_count_task , \
424+ imp_strategy = set_classes ('REDIS' , cfg ['impressionsMode' ], redis_adapter )
466425
467426 imp_manager = ImpressionsManager (
468427 _wrap_impression_listener (cfg ['impressionListener' ], sdk_metadata ),
@@ -543,17 +502,12 @@ def _build_localhost_factory(cfg):
543502 ready_event
544503 )
545504
546-
547505def get_factory (api_key , ** kwargs ):
548506 """Build and return the appropriate factory."""
549507 try :
550- active_factory_count = 0
551- redundant_factory_count = 0
552508 _INSTANTIATED_FACTORIES_LOCK .acquire ()
553509 if _INSTANTIATED_FACTORIES :
554- active_factory_count = active_factory_count + 1
555510 if api_key in _INSTANTIATED_FACTORIES :
556- redundant_factory_count = redundant_factory_count + 1
557511 _LOGGER .warning (
558512 "factory instantiation: You already have %d %s with this API Key. "
559513 "We recommend keeping only one instance of the factory at all times "
@@ -570,8 +524,7 @@ def get_factory(api_key, **kwargs):
570524 )
571525
572526 config = sanitize_config (api_key , kwargs .get ('config' , {}))
573- config ['redundantFactoryCount' ] = redundant_factory_count
574- config ['activeFactoryCount' ] = active_factory_count
527+ extra_config = {}
575528
576529 if config ['operationMode' ] == 'localhost-standalone' :
577530 return _build_localhost_factory (config )
@@ -582,12 +535,20 @@ def get_factory(api_key, **kwargs):
582535 return _build_in_memory_factory (
583536 api_key ,
584537 config ,
538+ extra_config ,
585539 kwargs .get ('sdk_api_base_url' ),
586540 kwargs .get ('events_api_base_url' ),
587541 kwargs .get ('auth_api_base_url' ),
588542 kwargs .get ('streaming_api_base_url' ),
589543 kwargs .get ('telemetry_api_base_url' )
590544 )
591545 finally :
546+ redundant_factory_count = 0
547+ active_factory_count = 0
592548 _INSTANTIATED_FACTORIES .update ([api_key ])
549+ for item in _INSTANTIATED_FACTORIES :
550+ redundant_factory_count = redundant_factory_count + _INSTANTIATED_FACTORIES [item ] - 1
551+ active_factory_count = active_factory_count + _INSTANTIATED_FACTORIES [item ]
552+ extra_config ['redundant_factory_count' ] = redundant_factory_count
553+ extra_config ['active_factory_count' ] = active_factory_count
593554 _INSTANTIATED_FACTORIES_LOCK .release ()
0 commit comments