2323 InMemoryImpressionStorage , InMemoryEventStorage , InMemoryTelemetryStorage , LocalhostTelemetryStorage
2424from splitio .storage .adapters import redis
2525from splitio .storage .redis import RedisSplitStorage , RedisSegmentStorage , RedisImpressionsStorage , \
26- RedisEventsStorage
26+ RedisEventsStorage , RedisTelemetryStorage
2727
2828# APIs
2929from splitio .api .client import HttpClient
6666_INSTANTIATED_FACTORIES = Counter ()
6767_INSTANTIATED_FACTORIES_LOCK = threading .RLock ()
6868_MIN_DEFAULT_DATA_SAMPLING_ALLOWED = 0.1 # 10%
69-
69+ _MAX_RETRY_SYNC_ALL = 3
7070
7171class Status (Enum ):
7272 """Factory Status."""
@@ -152,6 +152,9 @@ def _start_status_updater(self):
152152 ready_updater .start ()
153153 else :
154154 self ._status = Status .READY
155+ #Push Config Telemetry into redis storage
156+ redundant_factory_count , active_factory_count = _get_active_and_redundant_count ()
157+ self ._telemetry_init_producer .record_active_and_redundant_factories (active_factory_count , redundant_factory_count )
155158
156159 def _update_status_when_ready (self ):
157160 """Wait until the sdk is ready and update the status."""
@@ -330,8 +333,8 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
330333 telemetry_storage = InMemoryTelemetryStorage ()
331334 telemetry_producer = TelemetryStorageProducer (telemetry_storage )
332335 telemetry_consumer = TelemetryStorageConsumer (telemetry_storage )
333- telemetry_runtime_producer = telemetry_producer .get_telemetry_runtime_producer ()
334- # telemetry_evaluation_producer= telemetry_producer.get_telemetry_evaluation_producer()
336+ telemetry_runtime_producer = telemetry_producer .get_telemetry_runtime_producer ()
337+ telemetry_evaluation_producer = telemetry_producer .get_telemetry_evaluation_producer ()
335338
336339
337340 http_client = HttpClient (
@@ -352,9 +355,6 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
352355 'telemetry' : TelemetryAPI (http_client , api_key , sdk_metadata , telemetry_runtime_producer ),
353356 }
354357
355- if not input_validator .validate_apikey_type (apis ['segments' ]):
356- return None
357-
358358 storages = {
359359 'splits' : InMemorySplitStorage (),
360360 'segments' : InMemorySegmentStorage (),
@@ -417,10 +417,11 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
417417 imp_manager ,
418418 storages ['events' ],
419419 storages ['impressions' ],
420+ telemetry_evaluation_producer
420421 )
421422
422423 if preforked_initialization :
423- synchronizer .sync_all ()
424+ synchronizer .sync_all (max_retry_attempts = _MAX_RETRY_SYNC_ALL )
424425 synchronizer ._split_synchronizers ._segment_sync .shutdown ()
425426 return SplitFactory (api_key , storages , cfg ['labelsEnabled' ],
426427 recorder , manager , None , telemetry_producer , telemetry_consumer .get_telemetry_init_consumer (), apis ['telemetry' ], preforked_initialization = preforked_initialization )
@@ -440,16 +441,16 @@ def _build_redis_factory(api_key, cfg):
440441 redis_adapter = redis .build (cfg )
441442 cache_enabled = cfg .get ('redisLocalCacheEnabled' , False )
442443 cache_ttl = cfg .get ('redisLocalCacheTTL' , 5 )
444+ telemetry_storage = RedisTelemetryStorage (redis_adapter , sdk_metadata )
445+ telemetry_producer = TelemetryStorageProducer (telemetry_storage )
446+ telemetry_consumer = TelemetryStorageConsumer (telemetry_storage )
447+ telemetry_runtime_producer = telemetry_producer .get_telemetry_runtime_producer ()
443448 storages = {
444449 'splits' : RedisSplitStorage (redis_adapter , cache_enabled , cache_ttl ),
445450 'segments' : RedisSegmentStorage (redis_adapter ),
446451 'impressions' : RedisImpressionsStorage (redis_adapter , sdk_metadata ),
447- 'events' : RedisEventsStorage (redis_adapter , sdk_metadata ),
452+ 'events' : RedisEventsStorage (redis_adapter , sdk_metadata )
448453 }
449- telemetry_storage = InMemoryTelemetryStorage ()
450- telemetry_producer = TelemetryStorageProducer (telemetry_storage )
451- telemetry_consumer = TelemetryStorageConsumer (telemetry_storage )
452- telemetry_runtime_producer = telemetry_producer .get_telemetry_runtime_producer ()
453454
454455 data_sampling = cfg .get ('dataSampling' , DEFAULT_DATA_SAMPLING )
455456 if data_sampling < _MIN_DEFAULT_DATA_SAMPLING_ALLOWED :
@@ -487,6 +488,7 @@ def _build_redis_factory(api_key, cfg):
487488 imp_manager ,
488489 storages ['events' ],
489490 storages ['impressions' ],
491+ telemetry_storage ,
490492 data_sampling ,
491493 )
492494
@@ -495,13 +497,16 @@ def _build_redis_factory(api_key, cfg):
495497 initialization_thread .setDaemon (True )
496498 initialization_thread .start ()
497499
500+ telemetry_producer .get_telemetry_init_producer ().record_config (cfg , {})
501+
498502 return SplitFactory (
499503 api_key ,
500504 storages ,
501505 cfg ['labelsEnabled' ],
502506 recorder ,
503507 manager ,
504508 sdk_ready_flag = None ,
509+ telemetry_api = redis_adapter ,
505510 telemetry_producer = telemetry_producer ,
506511 telemetry_init_consumer = telemetry_consumer .get_telemetry_init_consumer ()
507512 )
@@ -512,6 +517,7 @@ def _build_localhost_factory(cfg):
512517 telemetry_producer = TelemetryStorageProducer (telemetry_storage )
513518 telemetry_consumer = TelemetryStorageConsumer (telemetry_storage )
514519 telemetry_runtime_producer = telemetry_producer .get_telemetry_runtime_producer ()
520+ telemetry_evaluation_producer = telemetry_producer .get_telemetry_evaluation_producer ()
515521
516522 storages = {
517523 'splits' : InMemorySplitStorage (),
@@ -541,6 +547,7 @@ def _build_localhost_factory(cfg):
541547 ImpressionsManager (StrategyDebugMode (), telemetry_runtime_producer ),
542548 storages ['events' ],
543549 storages ['impressions' ],
550+ telemetry_evaluation_producer
544551 )
545552 return SplitFactory (
546553 'localhost' ,
0 commit comments