Skip to content

Commit 488f0cf

Browse files
authored
Merge pull request #245 from splitio/development
Development
2 parents 4792ad1 + f1ad45e commit 488f0cf

34 files changed

+136
-1331
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ on:
66
pull_request:
77
branches:
88
- master
9+
- development
910

1011
jobs:
1112
test:

CHANGES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
9.1.1 (March 9, 2022)
2+
- Updated default auth service url to https://auth.split.io/api/v2/auth.
3+
- Deprecated old telemetry.
4+
15
9.1.0 (Jul 15, 2021)
26
- Added Cache-Control header for on-demand requests to sdk-server.
37
- 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.

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
'pytest-mock>=3.5.1',
1111
'coverage',
1212
'pytest-cov',
13+
'importlib-metadata==4.2',
1314
'tomli==1.2.3',
1415
]
1516

splitio/api/auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def authenticate(self):
4040
try:
4141
response = self._client.get(
4242
'auth',
43-
'/auth',
43+
'/v2/auth',
4444
self._apikey,
4545
extra_headers=self._metadata
4646
)

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 %.2f, 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
)

0 commit comments

Comments
 (0)