Skip to content

Commit fefe620

Browse files
committed
polishing
1 parent ff52ac5 commit fefe620

File tree

23 files changed

+234
-213
lines changed

23 files changed

+234
-213
lines changed

splitio/api/auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def authenticate(self):
4646
self._apikey,
4747
extra_headers=self._metadata,
4848
)
49-
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.TOKEN, self._telemetry_runtime_producer)
49+
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.TOKEN.value, self._telemetry_runtime_producer)
5050
if 200 <= response.status_code < 300:
5151
payload = json.loads(response.body)
5252
return from_raw(payload)

splitio/api/client.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
_LOGGER = logging.getLogger(__name__)
77

88
HttpResponse = namedtuple('HttpResponse', ['status_code', 'body'])
9-
HTTP_TIMEOUT = 1500
109

1110
class HttpClientException(Exception):
1211
"""HTTP Client exception."""
@@ -44,7 +43,7 @@ def __init__(self, timeout=None, sdk_url=None, events_url=None, auth_url=None, t
4443
:param telemetry_url: Optional alternative telemetry URL.
4544
:type telemetry_url: str
4645
"""
47-
self._timeout = timeout/1000 if timeout else HTTP_TIMEOUT # Convert ms to seconds.
46+
self._timeout = timeout/1000 if timeout else None # Convert ms to seconds.
4847
self._urls = {
4948
'sdk': sdk_url if sdk_url is not None else self.SDK_URL,
5049
'events': events_url if events_url is not None else self.EVENTS_URL,

splitio/api/events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def flush_events(self, events):
7373
body=bulk,
7474
extra_headers=self._metadata,
7575
)
76-
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.EVENT, self._telemetry_runtime_producer)
76+
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.EVENT.value, self._telemetry_runtime_producer)
7777
if not 200 <= response.status_code < 300:
7878
raise APIException(response.body, response.status_code)
7979
except HttpClientException as exc:

splitio/api/impressions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def flush_impressions(self, impressions):
102102
body=bulk,
103103
extra_headers=self._metadata,
104104
)
105-
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.IMPRESSION, self._telemetry_runtime_producer)
105+
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.IMPRESSION.value, self._telemetry_runtime_producer)
106106
if not 200 <= response.status_code < 300:
107107
raise APIException(response.body, response.status_code)
108108
except HttpClientException as exc:
@@ -129,7 +129,7 @@ def flush_counters(self, counters):
129129
body=bulk,
130130
extra_headers=self._metadata,
131131
)
132-
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.IMPRESSION_COUNT, self._telemetry_runtime_producer)
132+
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.IMPRESSION_COUNT.value, self._telemetry_runtime_producer)
133133
if not 200 <= response.status_code < 300:
134134
raise APIException(response.body, response.status_code)
135135
except HttpClientException as exc:

splitio/api/segments.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def fetch_segment(self, segment_name, change_number, fetch_options):
5959
extra_headers=extra_headers,
6060
query=query,
6161
)
62-
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.SEGMENT, self._telemetry_runtime_producer)
62+
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.SEGMENT.value, self._telemetry_runtime_producer)
6363
if 200 <= response.status_code < 300:
6464
return json.loads(response.body)
6565
else:

splitio/api/splits.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def fetch_splits(self, change_number, fetch_options):
5454
extra_headers=extra_headers,
5555
query=query,
5656
)
57-
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.SPLIT, self._telemetry_runtime_producer)
57+
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.SPLIT.value, self._telemetry_runtime_producer)
5858
if 200 <= response.status_code < 300:
5959
return json.loads(response.body)
6060
else:

splitio/api/telemetry.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def record_unique_keys(self, uniques):
4242
body=uniques,
4343
extra_headers=self._metadata
4444
)
45-
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.TELEMETRY, self._telemetry_runtime_producer)
45+
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.TELEMETRY.value, self._telemetry_runtime_producer)
4646
if not 200 <= response.status_code < 300:
4747
raise APIException(response.body, response.status_code)
4848
except HttpClientException as exc:
@@ -68,7 +68,7 @@ def record_init(self, configs):
6868
body=configs,
6969
extra_headers=self._metadata,
7070
)
71-
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.TELEMETRY, self._telemetry_runtime_producer)
71+
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.TELEMETRY.value, self._telemetry_runtime_producer)
7272
if not 200 <= response.status_code < 300:
7373
raise APIException(response.body, response.status_code)
7474
except HttpClientException as exc:
@@ -94,7 +94,7 @@ def record_stats(self, stats):
9494
body=stats,
9595
extra_headers=self._metadata,
9696
)
97-
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.TELEMETRY, self._telemetry_runtime_producer)
97+
record_telemetry(response.status_code, get_current_epoch_time() - start, HTTPExceptionsAndLatencies.TELEMETRY.value, self._telemetry_runtime_producer)
9898
if not 200 <= response.status_code < 300:
9999
raise APIException(response.body, response.status_code)
100100
except HttpClientException as exc:
@@ -103,3 +103,11 @@ def record_stats(self, stats):
103103
)
104104
_LOGGER.debug('Error: ', exc_info=True)
105105
raise APIException('Runtime stats not flushed properly.') from exc
106+
107+
class LocalhostTelemetryAPI(object): # pylint: disable=too-few-public-methods
108+
"""Mock class for Localhost."""
109+
def do_nothing(*_, **__):
110+
pass
111+
112+
def __getattr__(self, _):
113+
return self.do_nothing

splitio/client/client.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,7 @@ def _make_evaluation(self, key, feature, attributes, method_name, metric_name):
124124
except Exception: # pylint: disable=broad-except
125125
_LOGGER.error('Error getting treatment for feature')
126126
_LOGGER.debug('Error: ', exc_info=True)
127-
if not self._telemetry_evaluation_producer == None:
128-
self._telemetry_evaluation_producer.record_exception(method_name[4:])
127+
self._telemetry_evaluation_producer.record_exception(method_name[4:])
129128
try:
130129
impression = self._build_impression(
131130
matching_key,
@@ -208,15 +207,12 @@ def _make_evaluations(self, key, features, attributes, method_name, metric_name)
208207
_LOGGER.error('%s: An exception when trying to store '
209208
'impressions.' % method_name)
210209
_LOGGER.debug('Error: ', exc_info=True)
211-
if not self._telemetry_evaluation_producer == None:
212-
self._telemetry_evaluation_producer.record_exception(method_name[4:])
210+
self._telemetry_evaluation_producer.record_exception(method_name[4:])
213211

214-
if not self._telemetry_evaluation_producer == None:
215-
self._telemetry_evaluation_producer.record_latency(method_name[4:], get_current_epoch_time() - start)
212+
self._telemetry_evaluation_producer.record_latency(method_name[4:], get_current_epoch_time() - start)
216213
return treatments
217214
except Exception: # pylint: disable=broad-except
218-
if not self._telemetry_evaluation_producer == None:
219-
self._telemetry_evaluation_producer.record_exception(method_name[4:])
215+
self._telemetry_evaluation_producer.record_exception(method_name[4:])
220216
_LOGGER.error('Error getting treatment for features')
221217
_LOGGER.debug('Error: ', exc_info=True)
222218
return input_validator.generate_control_treatments(list(features), method_name)
@@ -354,7 +350,7 @@ def _record_stats(self, impressions, start, operation, method_name=None):
354350
end = get_current_epoch_time()
355351
self._recorder.record_treatment_stats(impressions, get_latency_bucket_index(end - start),
356352
operation)
357-
if not method_name == None and not self._telemetry_evaluation_producer == None:
353+
if not method_name == None:
358354
self._telemetry_evaluation_producer.record_latency(method_name[4:], end - start)
359355

360356

@@ -417,11 +413,9 @@ def track(self, key, traffic_type, event_type, value=None, properties=None):
417413
event=event,
418414
size=size,
419415
)])
420-
if not self._telemetry_evaluation_producer == None:
421-
self._telemetry_evaluation_producer.record_latency(MethodExceptionsAndLatencies.TRACK, get_current_epoch_time() - start)
416+
self._telemetry_evaluation_producer.record_latency(MethodExceptionsAndLatencies.TRACK.value, get_current_epoch_time() - start)
422417
except Exception: # pylint: disable=broad-except
423-
if not self._telemetry_evaluation_producer == None:
424-
self._telemetry_evaluation_producer.record_exception(MethodExceptionsAndLatencies.TRACK)
418+
self._telemetry_evaluation_producer.record_exception(MethodExceptionsAndLatencies.TRACK.value)
425419
_LOGGER.error('Error processing track event')
426420
_LOGGER.debug('Error: ', exc_info=True)
427421

splitio/client/factory.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
# Storage
2222
from splitio.storage.inmemmory import InMemorySplitStorage, InMemorySegmentStorage, \
23-
InMemoryImpressionStorage, InMemoryEventStorage, InMemoryTelemetryStorage
23+
InMemoryImpressionStorage, InMemoryEventStorage, InMemoryTelemetryStorage, LocalhostTelemetryStorage
2424
from splitio.storage.adapters import redis
2525
from splitio.storage.redis import RedisSplitStorage, RedisSegmentStorage, RedisImpressionsStorage, \
2626
RedisEventsStorage
@@ -32,7 +32,7 @@
3232
from splitio.api.impressions import ImpressionsAPI
3333
from splitio.api.events import EventsAPI
3434
from splitio.api.auth import AuthAPI
35-
from splitio.api.telemetry import TelemetryAPI
35+
from splitio.api.telemetry import TelemetryAPI, LocalhostTelemetryAPI
3636
from splitio.api.commons import get_current_epoch_time
3737

3838
# Tasks
@@ -126,9 +126,8 @@ def __init__( # pylint: disable=too-many-arguments
126126
self._preforked_initialization = preforked_initialization
127127
self._telemetry_evaluation_producer = None
128128
self._telemetry_init_producer = None
129-
if not telemetry_producer == None:
130-
self._telemetry_evaluation_producer = telemetry_producer.get_telemetry_evaluation_producer()
131-
self._telemetry_init_producer = telemetry_producer.get_telemetry_init_producer()
129+
self._telemetry_evaluation_producer = telemetry_producer.get_telemetry_evaluation_producer()
130+
self._telemetry_init_producer = telemetry_producer.get_telemetry_init_producer()
132131
self._telemetry_init_consumer = telemetry_init_consumer
133132
self._telemetry_api = telemetry_api
134133
self._ready_time = get_current_epoch_time()
@@ -159,14 +158,13 @@ def _update_status_when_ready(self):
159158
self._sdk_internal_ready_flag.wait()
160159
self._status = Status.READY
161160
self._sdk_ready_flag.set()
162-
if not self._telemetry_init_producer == None:
163-
self._telemetry_init_producer.record_ready_time(get_current_epoch_time() - self._ready_time)
164-
redundant_factory_count, active_factory_count = _get_active_and_redundant_count()
165-
self._telemetry_init_producer.record_active_and_redundant_factories(active_factory_count, redundant_factory_count)
161+
self._telemetry_init_producer.record_ready_time(get_current_epoch_time() - self._ready_time)
162+
redundant_factory_count, active_factory_count = _get_active_and_redundant_count()
163+
self._telemetry_init_producer.record_active_and_redundant_factories(active_factory_count, redundant_factory_count)
166164

167-
config_post_thread = threading.Thread(target=self._telemetry_api.record_init(self._telemetry_init_consumer.get_config_stats()), name="PostConfigData")
168-
config_post_thread.setDaemon(True)
169-
config_post_thread.start()
165+
config_post_thread = threading.Thread(target=self._telemetry_api.record_init(self._telemetry_init_consumer.get_config_stats()), name="PostConfigData")
166+
config_post_thread.setDaemon(True)
167+
config_post_thread.start()
170168

171169

172170
def _get_storage(self, name):
@@ -510,6 +508,11 @@ def _build_redis_factory(api_key, cfg):
510508

511509
def _build_localhost_factory(cfg):
512510
"""Build and return a localhost factory for testing/development purposes."""
511+
telemetry_storage = LocalhostTelemetryStorage()
512+
telemetry_producer = TelemetryStorageProducer(telemetry_storage)
513+
telemetry_consumer = TelemetryStorageConsumer(telemetry_storage)
514+
telemetry_runtime_producer=telemetry_producer.get_telemetry_runtime_producer()
515+
513516
storages = {
514517
'splits': InMemorySplitStorage(),
515518
'segments': InMemorySegmentStorage(), # not used, just to avoid possible future errors.
@@ -535,7 +538,7 @@ def _build_localhost_factory(cfg):
535538
manager = Manager(ready_event, synchronizer, None, False, sdk_metadata)
536539
manager.start()
537540
recorder = StandardRecorder(
538-
ImpressionsManager(StrategyDebugMode()),
541+
ImpressionsManager(StrategyDebugMode(), telemetry_runtime_producer),
539542
storages['events'],
540543
storages['impressions'],
541544
)
@@ -546,6 +549,9 @@ def _build_localhost_factory(cfg):
546549
recorder,
547550
manager,
548551
ready_event,
552+
telemetry_producer=telemetry_producer,
553+
telemetry_init_consumer=telemetry_consumer.get_telemetry_init_consumer(),
554+
telemetry_api=LocalhostTelemetryAPI()
549555
)
550556

551557
def get_factory(api_key, **kwargs):

splitio/engine/impressions/impressions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def process_impressions(self, impressions):
3838
:type impressions: list[tuple[splitio.models.impression.Impression, dict]]
3939
"""
4040
for_log, for_listener = self._strategy.process_impressions(impressions)
41-
if len(impressions) > len(for_log) and not self._telemetry_runtime_producer == None:
41+
if len(impressions) > len(for_log):
4242
self._telemetry_runtime_producer.record_impression_stats('impressionsDeduped', len(impressions) - len(for_log))
4343
self._send_impressions_to_listener(for_listener)
4444
return for_log

0 commit comments

Comments
 (0)