Skip to content

Commit a597d0b

Browse files
author
Matias Melograno
committed
Merge branch 'development' of github.com:splitio/python-client into development
2 parents 70d3bd0 + 2bb157a commit a597d0b

29 files changed

+122
-1318
lines changed

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
9.1.1 (Dec 16, 2021)
2+
- Deprecated old telemetry.
3+
14
9.1.0 (Jul 15, 2021)
25
- Added Cache-Control header for on-demand requests to sdk-server.
36
- Updated the synchronization flow to be more reliable in the event of an edge case generating delay in cache purge propagation, keeping the SDK cache properly synced.

splitio/api/telemetry.py

Lines changed: 0 additions & 142 deletions
This file was deleted.

splitio/client/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ def _build_impression( # pylint: disable=too-many-arguments
329329

330330
def _record_stats(self, impressions, start, operation):
331331
"""
332-
Record impressions and metrics.
332+
Record impressions.
333333
334334
:param impressions: Generated impressions
335335
:type impressions: list[tuple[splitio.models.impression.Impression, dict]]

splitio/client/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77

88
_LOGGER = logging.getLogger(__name__)
9+
DEFAULT_DATA_SAMPLING = 1
910

1011

1112
DEFAULT_CONFIG = {
@@ -52,6 +53,7 @@
5253
'machineIp': None,
5354
'splitFile': os.path.join(os.path.expanduser('~'), '.split'),
5455
'preforkedInitialization': False,
56+
'dataSampling': DEFAULT_DATA_SAMPLING,
5557
}
5658

5759

splitio/client/factory.py

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,31 @@
88
from splitio.client.client import Client
99
from splitio.client import input_validator
1010
from splitio.client.manager import SplitManager
11-
from splitio.client.config import sanitize as sanitize_config
11+
from splitio.client.config import sanitize as sanitize_config, DEFAULT_DATA_SAMPLING
1212
from splitio.client import util
1313
from splitio.client.listener import ImpressionListenerWrapper
1414
from splitio.engine.impressions import Manager as ImpressionsManager
1515

1616
# Storage
1717
from splitio.storage.inmemmory import InMemorySplitStorage, InMemorySegmentStorage, \
18-
InMemoryImpressionStorage, InMemoryEventStorage, InMemoryTelemetryStorage
18+
InMemoryImpressionStorage, InMemoryEventStorage
1919
from splitio.storage.adapters import redis
2020
from splitio.storage.redis import RedisSplitStorage, RedisSegmentStorage, RedisImpressionsStorage, \
21-
RedisEventsStorage, RedisTelemetryStorage
21+
RedisEventsStorage
2222

2323
# APIs
2424
from splitio.api.client import HttpClient
2525
from splitio.api.splits import SplitsAPI
2626
from splitio.api.segments import SegmentsAPI
2727
from splitio.api.impressions import ImpressionsAPI
2828
from splitio.api.events import EventsAPI
29-
from splitio.api.telemetry import TelemetryAPI
3029
from splitio.api.auth import AuthAPI
3130

3231
# Tasks
3332
from splitio.tasks.split_sync import SplitSynchronizationTask
3433
from splitio.tasks.segment_sync import SegmentSynchronizationTask
3534
from splitio.tasks.impressions_sync import ImpressionsSyncTask, ImpressionsCountSyncTask
3635
from splitio.tasks.events_sync import EventsSyncTask
37-
from splitio.tasks.telemetry_sync import TelemetrySynchronizationTask
3836

3937
# Synchronizer
4038
from splitio.sync.synchronizer import SplitTasks, SplitSynchronizers, Synchronizer, \
@@ -44,19 +42,18 @@
4442
from splitio.sync.segment import SegmentSynchronizer
4543
from splitio.sync.impression import ImpressionSynchronizer, ImpressionsCountSynchronizer
4644
from splitio.sync.event import EventSynchronizer
47-
from splitio.sync.telemetry import TelemetrySynchronizer
4845

4946
# Recorder
5047
from splitio.recorder.recorder import StandardRecorder, PipelinedRecorder
5148

5249
# Localhost stuff
53-
from splitio.client.localhost import LocalhostEventsStorage, LocalhostImpressionsStorage, \
54-
LocalhostTelemetryStorage
50+
from splitio.client.localhost import LocalhostEventsStorage, LocalhostImpressionsStorage
5551

5652

5753
_LOGGER = logging.getLogger(__name__)
5854
_INSTANTIATED_FACTORIES = Counter()
5955
_INSTANTIATED_FACTORIES_LOCK = threading.RLock()
56+
_MIN_DEFAULT_DATA_SAMPLING_ALLOWED = 0.1 # 10%
6057

6158

6259
class Status(Enum):
@@ -259,7 +256,6 @@ def resume(self):
259256
sdk_ready_flag = threading.Event()
260257
self._sdk_internal_ready_flag = sdk_ready_flag
261258
self._sync_manager._ready_flag = sdk_ready_flag
262-
self._get_storage('telemetry').clear()
263259
self._get_storage('impressions').clear()
264260
self._get_storage('events').clear()
265261
initialization_thread = threading.Thread(
@@ -306,7 +302,6 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
306302
'segments': SegmentsAPI(http_client, api_key, sdk_metadata),
307303
'impressions': ImpressionsAPI(http_client, api_key, sdk_metadata, cfg['impressionsMode']),
308304
'events': EventsAPI(http_client, api_key, sdk_metadata),
309-
'telemetry': TelemetryAPI(http_client, api_key, sdk_metadata)
310305
}
311306

312307
if not input_validator.validate_apikey_type(apis['segments']):
@@ -317,7 +312,6 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
317312
'segments': InMemorySegmentStorage(),
318313
'impressions': InMemoryImpressionStorage(cfg['impressionsQueueSize']),
319314
'events': InMemoryEventStorage(cfg['eventsQueueSize']),
320-
'telemetry': InMemoryTelemetryStorage()
321315
}
322316

323317
imp_manager = ImpressionsManager(
@@ -331,7 +325,6 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
331325
ImpressionSynchronizer(apis['impressions'], storages['impressions'],
332326
cfg['impressionsBulkSize']),
333327
EventSynchronizer(apis['events'], storages['events'], cfg['eventsBulkSize']),
334-
TelemetrySynchronizer(apis['telemetry'], storages['telemetry']),
335328
ImpressionsCountSynchronizer(apis['impressions'], imp_manager),
336329
)
337330

@@ -349,10 +342,6 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
349342
cfg['impressionsRefreshRate'],
350343
),
351344
EventsSyncTask(synchronizers.events_sync.synchronize_events, cfg['eventsPushRate']),
352-
TelemetrySynchronizationTask(
353-
synchronizers.telemetry_sync.synchronize_telemetry,
354-
cfg['metricsRefreshRate'],
355-
),
356345
ImpressionsCountSyncTask(synchronizers.impressions_count_sync.synchronize_counters)
357346
)
358347

@@ -369,7 +358,6 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
369358

370359
recorder = StandardRecorder(
371360
imp_manager,
372-
storages['telemetry'],
373361
storages['events'],
374362
storages['impressions'],
375363
)
@@ -399,15 +387,19 @@ def _build_redis_factory(api_key, cfg):
399387
'segments': RedisSegmentStorage(redis_adapter),
400388
'impressions': RedisImpressionsStorage(redis_adapter, sdk_metadata),
401389
'events': RedisEventsStorage(redis_adapter, sdk_metadata),
402-
'telemetry': RedisTelemetryStorage(redis_adapter, sdk_metadata)
403390
}
391+
data_sampling = cfg.get('dataSampling', DEFAULT_DATA_SAMPLING)
392+
if data_sampling < _MIN_DEFAULT_DATA_SAMPLING_ALLOWED:
393+
_LOGGER.warning("dataSampling cannot be less than %f, defaulting to minimum",
394+
_MIN_DEFAULT_DATA_SAMPLING_ALLOWED)
395+
data_sampling = _MIN_DEFAULT_DATA_SAMPLING_ALLOWED
404396
recorder = PipelinedRecorder(
405397
redis_adapter.pipeline,
406398
ImpressionsManager(cfg['impressionsMode'], False,
407399
_wrap_impression_listener(cfg['impressionListener'], sdk_metadata)),
408-
storages['telemetry'],
409400
storages['events'],
410401
storages['impressions'],
402+
data_sampling,
411403
)
412404
return SplitFactory(
413405
api_key,
@@ -424,19 +416,18 @@ def _build_localhost_factory(cfg):
424416
'segments': InMemorySegmentStorage(), # not used, just to avoid possible future errors.
425417
'impressions': LocalhostImpressionsStorage(),
426418
'events': LocalhostEventsStorage(),
427-
'telemetry': LocalhostTelemetryStorage()
428419
}
429420

430421
synchronizers = SplitSynchronizers(
431422
LocalSplitSynchronizer(cfg['splitFile'], storages['splits']),
432-
None, None, None, None, None,
423+
None, None, None, None,
433424
)
434425

435426
tasks = SplitTasks(
436427
SplitSynchronizationTask(
437428
synchronizers.split_sync.synchronize_splits,
438429
cfg['featuresRefreshRate'],
439-
), None, None, None, None, None,
430+
), None, None, None, None,
440431
)
441432

442433
sdk_metadata = util.get_metadata(cfg)
@@ -446,7 +437,6 @@ def _build_localhost_factory(cfg):
446437
manager.start()
447438
recorder = StandardRecorder(
448439
ImpressionsManager(cfg['impressionsMode'], True, None),
449-
storages['telemetry'],
450440
storages['events'],
451441
storages['impressions'],
452442
)

splitio/client/localhost.py

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import logging
33
import re
44

5-
from splitio.storage import ImpressionStorage, EventStorage, TelemetryStorage
5+
from splitio.storage import ImpressionStorage, EventStorage
66

77
_LEGACY_COMMENT_LINE_RE = re.compile(r'^#.*$')
88
_LEGACY_DEFINITION_LINE_RE = re.compile(r'^(?<![^#])(?P<feature>[\w_-]+)\s+(?P<treatment>[\w_-]+)$')
@@ -41,35 +41,3 @@ def pop_many(self, *_, **__): # pylint: disable=arguments-differ
4141
def clear(self, *_, **__): # pylint: disable=arguments-differ
4242
"""Accept any arguments and do nothing."""
4343
pass
44-
45-
46-
class LocalhostTelemetryStorage(TelemetryStorage):
47-
"""Impression storage that doesn't cache anything."""
48-
49-
def inc_latency(self, *_, **__): # pylint: disable=arguments-differ
50-
"""Accept any arguments and do nothing."""
51-
pass
52-
53-
def inc_counter(self, *_, **__): # pylint: disable=arguments-differ
54-
"""Accept any arguments and do nothing."""
55-
pass
56-
57-
def put_gauge(self, *_, **__): # pylint: disable=arguments-differ
58-
"""Accept any arguments and do nothing."""
59-
pass
60-
61-
def pop_latencies(self, *_, **__): # pylint: disable=arguments-differ
62-
"""Accept any arguments and do nothing."""
63-
pass
64-
65-
def pop_counters(self, *_, **__): # pylint: disable=arguments-differ
66-
"""Accept any arguments and do nothing."""
67-
pass
68-
69-
def pop_gauges(self, *_, **__): # pylint: disable=arguments-differ
70-
"""Accept any arguments and do nothing."""
71-
pass
72-
73-
def clear(self, *_, **__): # pylint: disable=arguments-differ
74-
"""Accept any arguments and do nothing."""
75-
pass

0 commit comments

Comments
 (0)