def uwsgi_report_impressions(user_config): """ Flush impressions task. :param user_config: User-provided configuration. :type user_config: dict """ config = _get_config(user_config) metadata = get_metadata(config) seconds = config['impressionsRefreshRate'] storage = UWSGIImpressionStorage(get_uwsgi()) impressions_sync = ImpressionSynchronizer( ImpressionsAPI( HttpClient(1500, config.get('sdk_url'), config.get('events_url')), config['apikey'], metadata, config['impressionsMode']), storage, config['impressionsBulkSize']) while True: try: impressions_sync.synchronize_impressions() # pylint: disable=protected-access for _ in range(0, seconds): if storage.should_flush(): storage.acknowledge_flush() break time.sleep(1) except Exception: # pylint: disable=broad-except _LOGGER.error('Error posting impressions') _LOGGER.debug('Error: ', exc_info=True)
def test_flush(self): """Test requesting, querying and acknowledging a flush.""" uwsgi = get_uwsgi(True) storage = UWSGIImpressionStorage(uwsgi) assert storage.should_flush() is False storage.request_flush() assert storage.should_flush() is True storage.acknowledge_flush() assert storage.should_flush() is False
def test_put_pop_impressions(self, mocker): """Test storing and fetching impressions.""" uwsgi = get_uwsgi(True) storage = UWSGIImpressionStorage(uwsgi) impressions = [ Impression('key1', 'feature1', 'on', 'some_label', 123456, 'buck1', 321654), Impression('key2', 'feature2', 'on', 'some_label', 123456, 'buck1', 321654), Impression('key3', 'feature2', 'on', 'some_label', 123456, 'buck1', 321654), Impression('key4', 'feature1', 'on', 'some_label', 123456, 'buck1', 321654) ] storage.put(impressions) res = storage.pop_many(10) assert res == impressions
def _build_uwsgi_factory(config): """Build and return a split factory with redis-based storage.""" cfg = DEFAULT_CONFIG.copy() cfg.update(config) sdk_metadata = util.get_metadata(cfg) uwsgi_adapter = get_uwsgi() storages = { 'splits': UWSGISplitStorage(uwsgi_adapter), 'segments': UWSGISegmentStorage(uwsgi_adapter), 'impressions': UWSGIImpressionStorage(uwsgi_adapter), 'events': UWSGIEventStorage(uwsgi_adapter), 'telemetry': UWSGITelemetryStorage(uwsgi_adapter) } return SplitFactory(storages, cfg['labelsEnabled'], impression_listener=_wrap_impression_listener( cfg['impressionListener'], sdk_metadata))
def _build_uwsgi_factory(api_key, cfg): """Build and return a split factory with redis-based storage.""" sdk_metadata = util.get_metadata(cfg) uwsgi_adapter = get_uwsgi() storages = { 'splits': UWSGISplitStorage(uwsgi_adapter), 'segments': UWSGISegmentStorage(uwsgi_adapter), 'impressions': UWSGIImpressionStorage(uwsgi_adapter), 'events': UWSGIEventStorage(uwsgi_adapter), 'telemetry': UWSGITelemetryStorage(uwsgi_adapter) } return SplitFactory( api_key, storages, cfg['labelsEnabled'], ImpressionsManager(storages['impressions'].put, cfg['impressionsMode'], True, _wrap_impression_listener(cfg['impressionListener'], sdk_metadata)) )