Skip to content

Commit b0bfba4

Browse files
committed
polish and tests
1 parent e3d129f commit b0bfba4

File tree

8 files changed

+512
-48
lines changed

8 files changed

+512
-48
lines changed

splitio/client/factory.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -297,11 +297,11 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
297297
if not input_validator.validate_factory_instantiation(api_key):
298298
return None
299299

300-
cfg['sdk_url'] = sdk_url if sdk_url is not None else None
301-
cfg['events_url'] = events_url if events_url is not None else None
302-
cfg['auth_url'] = auth_api_base_url if auth_api_base_url is not None else None
303-
cfg['streaming_url'] = streaming_api_base_url if streaming_api_base_url is not None else None
304-
cfg['telemetry_api_url'] = telemetry_api_base_url if telemetry_api_base_url is not None else None
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
305305

306306
http_client = HttpClient(
307307
sdk_url=sdk_url,
@@ -551,9 +551,9 @@ def get_factory(api_key, **kwargs):
551551
redundant_factory_count = 0
552552
_INSTANTIATED_FACTORIES_LOCK.acquire()
553553
if _INSTANTIATED_FACTORIES:
554+
active_factory_count = active_factory_count + 1
554555
if api_key in _INSTANTIATED_FACTORIES:
555556
redundant_factory_count = redundant_factory_count + 1
556-
active_factory_count = active_factory_count + 1
557557
_LOGGER.warning(
558558
"factory instantiation: You already have %d %s with this API Key. "
559559
"We recommend keeping only one instance of the factory at all times "
@@ -562,7 +562,6 @@ def get_factory(api_key, **kwargs):
562562
'factory' if _INSTANTIATED_FACTORIES[api_key] == 1 else 'factories'
563563
)
564564
else:
565-
active_factory_count = active_factory_count + 1
566565
_LOGGER.warning(
567566
"factory instantiation: You already have an instance of the Split factory. "
568567
"Make sure you definitely want this additional instance. "
@@ -572,7 +571,7 @@ def get_factory(api_key, **kwargs):
572571

573572
config = sanitize_config(api_key, kwargs.get('config', {}))
574573
config['redundantFactoryCount'] = redundant_factory_count
575-
config['activeFactoryCount'] = active_factory_count + 1
574+
config['activeFactoryCount'] = active_factory_count
576575

577576
if config['operationMode'] == 'localhost-standalone':
578577
return _build_localhost_factory(config)

splitio/engine/telemetry.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ def record_ready_time(self, ready_time):
3737
"""Record ready time."""
3838
self._telemetry_storage.record_ready_time(ready_time)
3939

40-
def record_bur_timeout(self):
40+
def record_bur_time_out(self):
4141
"""Record block until ready timeout."""
42-
self._telemetry_storage.record_bur_timeout()
42+
self._telemetry_storage.record_bur_time_out()
4343

44-
def record_non_ready_usage(self):
44+
def record_not_ready_usage(self):
4545
"""record non-ready usage."""
46-
self._telemetry_storage.record_non_ready_usage()
46+
self._telemetry_storage.record_not_ready_usage()
4747

4848
class TelemetryEvaluationProducer(object):
4949
"""Telemetry evaluation producer class."""
@@ -135,13 +135,13 @@ def __init__(self, telemetry_storage):
135135
"""Constructor."""
136136
self._telemetry_storage = telemetry_storage
137137

138-
def get_bur_timeouts(self):
138+
def get_bur_time_outs(self):
139139
"""Get block until ready timeout."""
140-
return self._telemetry_storage.get_bur_timeouts()
140+
return self._telemetry_storage.get_bur_time_outs()
141141

142-
def get_non_ready_usage(self):
142+
def get_not_ready_usage(self):
143143
"""Get none-ready usage."""
144-
return self._telemetry_storage.get_non_ready_usage()
144+
return self._telemetry_storage.get_not_ready_usage()
145145

146146
def get_config_stats(self):
147147
"""Get none-ready usage."""

splitio/storage/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ class TelemetryStorage(object, metaclass=abc.ABCMeta):
288288
"""Telemetry storage interface."""
289289

290290
@abc.abstractmethod
291-
def record_init(self, config):
291+
def record_config(self, config):
292292
"""
293293
initilize telemetry objects
294294

splitio/storage/inmemmory.py

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -458,20 +458,27 @@ class InMemoryTelemetryStorage(TelemetryStorage):
458458

459459
def __init__(self):
460460
"""Constructor"""
461+
self._reset_counters()
462+
self._reset_latencies()
463+
self._lock = threading.RLock()
464+
465+
def _reset_counters(self):
461466
self._counters = {'iQ': 0, 'iDe': 0, 'iDr': 0, 'eQ': 0, 'eD': 0, 'sL': 0,
462467
'aR': 0, 'tR': 0}
463-
self._latencies = {'mL': {'t': [], 'ts': [], 'tc': [], 'tcs': [], 'tr': []},
464-
'hL': {'sp': [], 'se': [], 'ms': [], 'im': [], 'ic': [], 'ev': [], 'te': [], 'to': []}}
465468
self._exceptions = {'mE': {'t': 0, 'ts': 0, 'tc': 0, 'tcs': 0, 'tr': 0}}
466469
self._records = {'IS': {'sp': 0, 'se': 0, 'ms': 0, 'im': 0, 'ic': 0, 'ev': 0, 'te': 0, 'to': 0},
467470
'sL': 0}
468471
self._http_errors = {'sp': {}, 'se': {}, 'ms': {}, 'im': {}, 'ic': {}, 'ev': {}, 'te': {}, 'to': {}}
472+
self._config = {'bT':0, 'nR':0, 'uC': 0}
469473
self._streaming_events = []
470474
self._tags = []
471475
self._integrations = {}
472-
self._config = {'bT':0, 'nR':0, 'uC': 0}
476+
477+
def _reset_latencies(self):
478+
self._latencies = {'mL': {'t': [], 'ts': [], 'tc': [], 'tcs': [], 'tr': []},
479+
'hL': {'sp': [], 'se': [], 'ms': [], 'im': [], 'ic': [], 'ev': [], 'te': [], 'to': []}}
473480
self._map_latencies = {'Treatment': 't', 'Treatments': 'ts', 'TreatmentWithConfig': 'tc', 'TreatmentsWithConfig': 'tcs', 'Track': 'tr'}
474-
self._lock = threading.RLock()
481+
475482

476483
def record_config(self, config):
477484
"""Record configurations."""
@@ -497,26 +504,26 @@ def record_ready_time(self, ready_time):
497504
def add_tag(self, tag):
498505
"""Record tag string."""
499506
with self._lock:
500-
if len(self._tags) <= MAX_TAGS:
507+
if len(self._tags) < MAX_TAGS:
501508
self._tags.append(tag)
502509

503-
def record_bur_timeout(self):
510+
def record_bur_time_out(self):
504511
"""Record block until ready timeout."""
505512
with self._lock:
506513
self._config['bT'] = self._config['bT'] + 1
507514

508-
def record_non_ready_usage(self):
515+
def record_not_ready_usage(self):
509516
"""record non-ready usage."""
510517
with self._lock:
511518
self._config['nR'] = self._config['nR'] + 1
512519

513520
def record_latency(self, method, latency):
514521
"""Record method latency time."""
515522
with self._lock:
516-
if self._latencies['mL'][self._map_latencies[method]] < MAX_LATENCY_BUCKET_COUNT:
523+
if len(self._latencies['mL'][self._map_latencies[method]]) < MAX_LATENCY_BUCKET_COUNT:
517524
self._latencies['mL'][self._map_latencies[method]].append(latency)
518525

519-
def record_exceptions(self, method):
526+
def record_exception(self, method):
520527
"""Record method exception."""
521528
with self._lock:
522529
self._exceptions['mE'][self._map_latencies[method]] = self._exceptions['mE'][self._map_latencies[method]] + 1
@@ -539,13 +546,15 @@ def record_suceessful_sync(self, resource, time):
539546
def record_sync_error(self, resource, status):
540547
"""Record sync http error."""
541548
with self._lock:
549+
if status not in self._http_errors[resource]:
550+
self._http_errors[resource][status] = 0
542551
self._http_errors[resource][status] = self._http_errors[resource][status] + 1
543552

544553
def record_sync_latency(self, resource, latency):
545554
"""Record latency time."""
546555
with self._lock:
547-
if self._latencies['hL'][self._map_latencies[resource]] < MAX_LATENCY_BUCKET_COUNT:
548-
self._latencies['hL'][self._map_latencies[resource]].append(latency)
556+
if len(self._latencies['hL'][resource]) < MAX_LATENCY_BUCKET_COUNT:
557+
self._latencies['hL'][resource].append(latency)
549558

550559
def record_auth_rejections(self):
551560
"""Record auth rejection."""
@@ -561,14 +570,14 @@ def record_streaming_event(self, streaming_event):
561570
"""Record incoming streaming event."""
562571
with self._lock:
563572
if len(self._streaming_events) < MAX_STREAMING_EVENTS:
564-
self._streaming_events.append({'e': streaming_event.type, 'd': streaming_event.data, 't': streaming_event.time})
573+
self._streaming_events.append({'e': streaming_event['type'], 'd': streaming_event['data'], 't': streaming_event['time']})
565574

566575
def record_session_length(self, session):
567576
"""Record session length."""
568577
with self._lock:
569578
self._records['sL'] = session
570579

571-
def get_bur_timeouts(self):
580+
def get_bur_time_outs(self):
572581
"""Get block until ready timeout."""
573582
with self._lock:
574583
return self._config['bT']
@@ -680,21 +689,21 @@ def _get_storage_type(self, op_mode):
680689
def _get_refresh_rates(self, config):
681690
with self._lock:
682691
rr = {}
683-
rr['sp'] == config['featuresRefreshRate']
684-
rr['se'] == config['segmentsRefreshRate']
685-
rr['im'] == config['impressionsRefreshRate']
686-
rr['ev'] == config['eventsPushRate']
687-
rr['te'] == config['metrcsRefreshRate']
692+
rr['sp'] = config['featuresRefreshRate']
693+
rr['se'] = config['segmentsRefreshRate']
694+
rr['im'] = config['impressionsRefreshRate']
695+
rr['ev'] = config['eventsPushRate']
696+
rr['te'] = config['metrcsRefreshRate']
688697
return rr
689698

690699
def _get_url_overrides(self, config):
691700
with self._lock:
692701
rr = {}
693-
rr['s'] == True if config['sdk_url'] is not None else False
694-
rr['e'] == True if config['events_url'] is not None else False
695-
rr['a'] == True if config['auth_url'] is not None else False
696-
rr['st'] == True if config['streaming_url'] is not None else False
697-
rr['t'] == True if config['telemetry_url'] is not None else False
702+
rr['s'] == True if 'sdk_url' in config else False
703+
rr['e'] == True if 'events_url' in config else False
704+
rr['a'] == True if 'auth_url' in config else False
705+
rr['st'] == True if 'streaming_url' in config else False
706+
rr['t'] == True if 'telemetry_url' in config else False
698707
return rr
699708

700709
def _get_impressions_mode(self, imp_mode):

splitio/sync/telemetry.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
class TelemetrySynchronizer(object):
77
"""Telemetry synchronizer class."""
88

9-
def __init__(self, telemetry_consumer, telemetry_api):
9+
def __init__(self, telemetry_consumer, split_storage, segment_storage, telemetry_api):
1010
"""Initialize Telemetry sync class."""
11-
self._telemetry_submitter = TelemetrySubmitter(telemetry_consumer, telemetry_api)
11+
self._telemetry_submitter = TelemetrySubmitter(telemetry_consumer, split_storage, segment_storage, telemetry_api)
1212

1313
def synchronize_config(self):
1414
"""synchronize initial config data class."""
15-
self._telemetry_submitter.Synchronize_config()
15+
self._telemetry_submitter.synchronize_config()
1616

1717
def synchronize_stats(self):
1818
"""synchronize runtime stats class."""
19-
self._telemetry_submitter.Synchronize_stats()
19+
self._telemetry_submitter.synchronize_stats()
2020

2121
class TelemetrySubmitter(object):
2222
"""Telemetry sumbitter class."""
@@ -30,13 +30,13 @@ def __init__(self, telemetry_consumer, split_storage, segment_storage, telemetry
3030
self._split_storage = split_storage
3131
self._segment_storage = segment_storage
3232

33-
def Synchronize_config(self):
33+
def synchronize_config(self):
3434
"""synchronize initial config data classe."""
3535
self._telemetry_api.record_init(json.dumps(self._telemetry_init_consumer.get_config_stats()))
3636

3737
def synchronize_stats(self):
3838
"""synchronize runtime stats class."""
39-
self._telemetry_api.record_stats(json.dumps(
39+
self._telemetry_api.record_stats(json.dumps({
4040
**{'iQ': self._telemetry_runtime_consumer.get_impressions_stats('iQ')},
4141
**{'iDe': self._telemetry_runtime_consumer.get_impressions_stats('iDe')},
4242
**{'iDr': self._telemetry_runtime_consumer.get_impressions_stats('iDr')},
@@ -55,4 +55,4 @@ def synchronize_stats(self):
5555
**{'spC': self._split_storage.get_splits_count()},
5656
**{'seC': self._segment_storage.get_segments_count()},
5757
**{'skC': self._segment_storage.get_segments_keys_count()},
58-
))
58+
}))

0 commit comments

Comments
 (0)