Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion splitio/client/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,8 @@ def get_treatment(self, key, feature_flag_name, attributes=None, evaluation_opti

except:
_LOGGER.error('get_treatment failed')
_LOGGER.error('Error: ', exc_info=True)

treatment, _ = self._get_fallback_treatment_with_config(feature_flag_name)
return treatment

Expand Down Expand Up @@ -759,7 +761,7 @@ def track(self, key, traffic_type, event_type, value=None, properties=None):
except Exception: # pylint: disable=broad-except
self._telemetry_evaluation_producer.record_exception(MethodExceptionsAndLatencies.TRACK)
_LOGGER.error('Error processing track event')
_LOGGER.debug('Error: ', exc_info=True)
_LOGGER.error('Error: ', exc_info=True)
return False


Expand Down
50 changes: 39 additions & 11 deletions splitio/client/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -835,7 +835,7 @@ def _build_push_classes(threading_mode, synchronizer, cfg, telemetry_runtime_pro

return push_manager, push_queue

def _build_recorder(threading_mode, cfg, imp_manager, storages, telemetry_evaluation_producer, telemetry_runtime_producer, sdk_metadata, imp_counter, unique_keys_tracker, redis_adapter=None):
def _build_recorder(threading_mode, synchronizer, cfg, imp_manager, storages, telemetry_evaluation_producer, telemetry_runtime_producer, sdk_metadata, imp_counter, unique_keys_tracker, redis_adapter=None):
if cfg['storageType'] == 'redis':
data_sampling = cfg.get('dataSampling', DEFAULT_DATA_SAMPLING)
if data_sampling < _MIN_DEFAULT_DATA_SAMPLING_ALLOWED:
Expand Down Expand Up @@ -870,6 +870,8 @@ def _build_recorder(threading_mode, cfg, imp_manager, storages, telemetry_evalua

if threading_mode == ThreadingMode.ASYNC:
return StandardRecorderAsync(
synchronizer._harness_synchronizers.impressions_sync.synchronize_impressions,
synchronizer._harness_synchronizers.events_sync.synchronize_events,
imp_manager,
storages['events'],
storages['impressions'],
Expand All @@ -881,6 +883,8 @@ def _build_recorder(threading_mode, cfg, imp_manager, storages, telemetry_evalua
)

return StandardRecorder(
synchronizer._harness_synchronizers.impressions_sync.synchronize_impressions,
synchronizer._harness_synchronizers.events_sync.synchronize_events,
imp_manager,
storages['events'],
storages['impressions'],
Expand Down Expand Up @@ -936,10 +940,8 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
push_manager, push_queue = _build_push_classes(ThreadingMode.THREADED, synchronizer, cfg, telemetry_runtime_producer, apis, sdk_metadata, streaming_api_base_url, api_key)
manager = Manager(sdk_ready_flag, synchronizer, apis['auth'], cfg['streamingEnabled'],
sdk_metadata, telemetry_runtime_producer, streaming_api_base_url, api_key[-4:], push_manager, push_queue)
recorder = _build_recorder(ThreadingMode.THREADED, cfg, imp_manager, storages, telemetry_evaluation_producer, telemetry_runtime_producer, sdk_metadata, imp_counter, unique_keys_tracker)
recorder = _build_recorder(ThreadingMode.THREADED, synchronizer, cfg, imp_manager, storages, telemetry_evaluation_producer, telemetry_runtime_producer, sdk_metadata, imp_counter, unique_keys_tracker)

storages['events'].set_queue_full_hook(tasks.events_task.flush)
storages['impressions'].set_queue_full_hook(tasks.impressions_task.flush)
telemetry_init_producer.record_config(cfg, extra_cfg, total_flag_sets, invalid_flag_sets)
internal_events_task.start()

Expand Down Expand Up @@ -992,9 +994,7 @@ async def _build_in_memory_factory_async(api_key, cfg, sdk_url=None, events_url=
manager = ManagerAsync(synchronizer, apis['auth'], cfg['streamingEnabled'],
sdk_metadata, telemetry_runtime_producer, streaming_api_base_url, api_key[-4:], push_manager, push_queue)

storages['events'].set_queue_full_hook(tasks.events_task.flush)
storages['impressions'].set_queue_full_hook(tasks.impressions_task.flush)
recorder = _build_recorder(ThreadingMode.ASYNC, cfg, imp_manager, storages, telemetry_evaluation_producer, telemetry_runtime_producer, sdk_metadata, imp_counter, unique_keys_tracker)
recorder = _build_recorder(ThreadingMode.ASYNC, synchronizer, cfg, imp_manager, storages, telemetry_evaluation_producer, telemetry_runtime_producer, sdk_metadata, imp_counter, unique_keys_tracker)

await telemetry_init_producer.record_config(cfg, extra_cfg, total_flag_sets, invalid_flag_sets)
internal_events_task.start()
Expand Down Expand Up @@ -1022,7 +1022,7 @@ def _build_redis_factory(api_key, cfg):
tasks = _build_sync_tasks(ThreadingMode.THREADED, synchronizers, cfg, None)
synchronizer = RedisSynchronizer(synchronizers, tasks)

recorder = _build_recorder(ThreadingMode.THREADED, cfg, imp_manager, storages, None, None, sdk_metadata, imp_counter, unique_keys_tracker, redis_adapter)
recorder = _build_recorder(ThreadingMode.THREADED, synchronizer, cfg, imp_manager, storages, None, None, sdk_metadata, imp_counter, unique_keys_tracker, redis_adapter)
manager = RedisManager(synchronizer)
initialization_thread = threading.Thread(target=manager.start, name="SDKInitializer", daemon=True)
initialization_thread.start()
Expand Down Expand Up @@ -1065,7 +1065,7 @@ async def _build_redis_factory_async(api_key, cfg):
tasks = _build_sync_tasks(ThreadingMode.ASYNC, synchronizers, cfg, None)
synchronizer = RedisSynchronizerAsync(synchronizers, tasks)

recorder = _build_recorder(ThreadingMode.ASYNC, cfg, imp_manager, storages, None, None, sdk_metadata, imp_counter, unique_keys_tracker, redis_adapter)
recorder = _build_recorder(ThreadingMode.ASYNC, synchronizer, cfg, imp_manager, storages, None, None, sdk_metadata, imp_counter, unique_keys_tracker, redis_adapter)
manager = RedisManagerAsync(synchronizer)
await telemetry_init_producer.record_config(cfg, {}, 0, 0)
manager.start()
Expand Down Expand Up @@ -1109,7 +1109,19 @@ def _build_pluggable_factory(api_key, cfg):
tasks = _build_sync_tasks(ThreadingMode.THREADED, synchronizers, cfg, None)
synchronizer = RedisSynchronizer(synchronizers, tasks)

recorder = _build_recorder(ThreadingMode.THREADED, cfg, imp_manager, storages, NoOpClass(), NoOpClass(), sdk_metadata, imp_counter, unique_keys_tracker, pluggable_adapter)
recorder = StandardRecorder(
None,
None,
imp_manager,
storages['events'],
storages['impressions'],
NoOpClass(),
NoOpClass(),
_wrap_impression_listener(cfg['impressionListener'], sdk_metadata),
imp_counter=imp_counter,
unique_keys_tracker=unique_keys_tracker
)

# Using same class as redis for consumer mode only
manager = RedisManager(synchronizer)
initialization_thread = threading.Thread(target=manager.start, name="SDKInitializer", daemon=True)
Expand Down Expand Up @@ -1157,7 +1169,19 @@ async def _build_pluggable_factory_async(api_key, cfg):
tasks = _build_sync_tasks(ThreadingMode.ASYNC, synchronizers, cfg, None)
synchronizer = RedisSynchronizerAsync(synchronizers, tasks)

recorder = _build_recorder(ThreadingMode.ASYNC, cfg, imp_manager, storages, NoOpClassAsync(), NoOpClassAsync(), sdk_metadata, imp_counter, unique_keys_tracker, pluggable_adapter)
recorder = StandardRecorderAsync(
None,
None,
imp_manager,
storages['events'],
storages['impressions'],
telemetry_producer.get_telemetry_evaluation_producer(),
telemetry_runtime_producer,
_wrap_impression_listener(cfg['impressionListener'], sdk_metadata),
imp_counter=imp_counter,
unique_keys_tracker=unique_keys_tracker
)

# Using same class as redis for consumer mode only
manager = RedisManagerAsync(synchronizer)
manager.start()
Expand Down Expand Up @@ -1241,6 +1265,8 @@ def _build_localhost_factory(cfg):
manager.start()

recorder = StandardRecorder(
None,
None,
ImpressionsManager(StrategyDebugMode(), StrategyNoneMode(), telemetry_runtime_producer),
storages['events'],
storages['impressions'],
Expand Down Expand Up @@ -1322,6 +1348,8 @@ async def _build_localhost_factory_async(cfg):
await manager.start()

recorder = StandardRecorderAsync(
None,
None,
ImpressionsManager(StrategyDebugMode(), StrategyNoneMode(), telemetry_runtime_producer),
storages['events'],
storages['impressions'],
Expand Down
3 changes: 2 additions & 1 deletion splitio/storage/pluggable.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import logging
import json
import threading
import queue

from splitio.optional.loaders import asyncio
from splitio.models import splits
Expand Down Expand Up @@ -1327,7 +1328,6 @@ def expire_key(self, total_keys, inserted):
if total_keys == inserted:
self._pluggable_adapter.expire(self._impressions_queue_key, self.IMPRESSIONS_KEY_DEFAULT_TTL)


class PluggableImpressionsStorageAsync(PluggableImpressionsStorageBase):
"""Pluggable Impressions storage class."""

Expand Down Expand Up @@ -1473,6 +1473,7 @@ def __init__(self, pluggable_adapter, sdk_metadata, prefix=None):
:type prefix: str
"""
PluggableEventsStorageBase.__init__(self, pluggable_adapter, sdk_metadata, prefix)
self._events = queue.Queue() # adding it to allow hook condition in recorder

def put(self, events):
"""
Expand Down
Loading