Skip to content

Commit 0671393

Browse files
committed
update telemetry calls
1 parent ffa2eec commit 0671393

File tree

2 files changed

+57
-30
lines changed

2 files changed

+57
-30
lines changed

splitio/storage/redis.py

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from splitio.models.impressions import Impression
77
from splitio.models import splits, segments
8-
from splitio.models.telemetry import MethodExceptions, MethodLatencies, TelemetryConfig, get_latency_bucket_index
8+
from splitio.models.telemetry import TelemetryConfig, get_latency_bucket_index, TelemetryConfigAsync
99
from splitio.storage import SplitStorage, SegmentStorage, ImpressionStorage, EventStorage, \
1010
ImpressionPipelinedStorage, TelemetryStorage
1111
from splitio.storage.adapters.redis import RedisAdapterException
@@ -623,7 +623,7 @@ def record_config(self, config, extra_config):
623623
:param congif: factory configuration parameters
624624
:type config: splitio.client.config
625625
"""
626-
self._tel_config.record_config(config, extra_config)
626+
pass
627627

628628
def pop_config_tags(self):
629629
"""Get and reset tags."""
@@ -633,9 +633,8 @@ def push_config_stats(self):
633633
"""push config stats to redis."""
634634
pass
635635

636-
def _format_config_stats(self, tags):
636+
def _format_config_stats(self, config_stats, tags):
637637
"""format only selected config stats to json"""
638-
config_stats = self._tel_config.get_stats()
639638
return json.dumps({
640639
'aF': config_stats['aF'],
641640
'rF': config_stats['rF'],
@@ -646,7 +645,7 @@ def _format_config_stats(self, tags):
646645

647646
def record_active_and_redundant_factories(self, active_factory_count, redundant_factory_count):
648647
"""Record active and redundant factories."""
649-
self._tel_config.record_active_and_redundant_factories(active_factory_count, redundant_factory_count)
648+
pass
650649

651650
def add_latency_to_pipe(self, method, bucket, pipe):
652651
"""
@@ -728,8 +727,6 @@ def __init__(self, redis_client, sdk_metadata):
728727
self._reset_config_tags()
729728
self._redis_client = redis_client
730729
self._sdk_metadata = sdk_metadata
731-
self._method_latencies = MethodLatencies()
732-
self._method_exceptions = MethodExceptions()
733730
self._tel_config = TelemetryConfig()
734731
self._make_pipe = redis_client.pipeline
735732

@@ -744,6 +741,15 @@ def add_config_tag(self, tag):
744741
if len(self._config_tags) < MAX_TAGS:
745742
self._config_tags.append(tag)
746743

744+
def record_config(self, config, extra_config):
745+
"""
746+
initilize telemetry objects
747+
748+
:param congif: factory configuration parameters
749+
:type config: splitio.client.config
750+
"""
751+
self._tel_config.record_config(config, extra_config)
752+
747753
def pop_config_tags(self):
748754
"""Get and reset tags."""
749755
with self._lock:
@@ -754,8 +760,8 @@ def pop_config_tags(self):
754760
def push_config_stats(self):
755761
"""push config stats to redis."""
756762
_LOGGER.debug("Adding Config stats to redis key %s" % (self._TELEMETRY_CONFIG_KEY))
757-
_LOGGER.debug(str(self._format_config_stats(self.pop_config_tags())))
758-
self._redis_client.hset(self._TELEMETRY_CONFIG_KEY, self._sdk_metadata.sdk_version + '/' + self._sdk_metadata.instance_name + '/' + self._sdk_metadata.instance_ip, str(self._format_config_stats(self.pop_config_tags())))
763+
_LOGGER.debug(str(self._format_config_stats(self._tel_config.get_stats(), self.pop_config_tags())))
764+
self._redis_client.hset(self._TELEMETRY_CONFIG_KEY, self._sdk_metadata.sdk_version + '/' + self._sdk_metadata.instance_name + '/' + self._sdk_metadata.instance_ip, str(self._format_config_stats(self._tel_config.get_stats(), self.pop_config_tags())))
759765

760766
def record_active_and_redundant_factories(self, active_factory_count, redundant_factory_count):
761767
"""Record active and redundant factories."""
@@ -777,6 +783,10 @@ def record_exception(self, method):
777783
result = pipe.execute()
778784
self.expire_keys(self._TELEMETRY_EXCEPTIONS_KEY, self._TELEMETRY_KEY_DEFAULT_TTL, 1, result[0])
779785

786+
def record_active_and_redundant_factories(self, active_factory_count, redundant_factory_count):
787+
"""Record active and redundant factories."""
788+
self._tel_config.record_active_and_redundant_factories(active_factory_count, redundant_factory_count)
789+
780790
def expire_latency_keys(self, total_keys, inserted):
781791
"""
782792
Expire lstency keys
@@ -820,9 +830,7 @@ async def create(redis_client, sdk_metadata):
820830
await self._reset_config_tags()
821831
self._redis_client = redis_client
822832
self._sdk_metadata = sdk_metadata
823-
self._method_latencies = MethodLatencies() # to be changed to async version class
824-
self._method_exceptions = MethodExceptions() # to be changed to async version class
825-
self._tel_config = TelemetryConfig() # to be changed to async version class
833+
self._tel_config = await TelemetryConfigAsync.create()
826834
self._make_pipe = redis_client.pipeline
827835
return self
828836

@@ -835,6 +843,15 @@ async def add_config_tag(self, tag):
835843
if len(self._config_tags) < MAX_TAGS:
836844
self._config_tags.append(tag)
837845

846+
async def record_config(self, config, extra_config):
847+
"""
848+
initilize telemetry objects
849+
850+
:param congif: factory configuration parameters
851+
:type config: splitio.client.config
852+
"""
853+
await self._tel_config.record_config(config, extra_config)
854+
838855
async def pop_config_tags(self):
839856
"""Get and reset tags."""
840857
tags = self._config_tags
@@ -844,8 +861,8 @@ async def pop_config_tags(self):
844861
async def push_config_stats(self):
845862
"""push config stats to redis."""
846863
_LOGGER.debug("Adding Config stats to redis key %s" % (self._TELEMETRY_CONFIG_KEY))
847-
_LOGGER.debug(str(await self._format_config_stats(await self.pop_config_tags())))
848-
await self._redis_client.hset(self._TELEMETRY_CONFIG_KEY, self._sdk_metadata.sdk_version + '/' + self._sdk_metadata.instance_name + '/' + self._sdk_metadata.instance_ip, str(await self._format_config_stats(await self.pop_config_tags())))
864+
_LOGGER.debug(str(await self._format_config_stats(await self._tel_config.get_stats(), await self.pop_config_tags())))
865+
await self._redis_client.hset(self._TELEMETRY_CONFIG_KEY, self._sdk_metadata.sdk_version + '/' + self._sdk_metadata.instance_name + '/' + self._sdk_metadata.instance_ip, str(await self._format_config_stats(await self._tel_config.get_stats(), await self.pop_config_tags())))
849866

850867
async def record_exception(self, method):
851868
"""
@@ -863,6 +880,10 @@ async def record_exception(self, method):
863880
result = await pipe.execute()
864881
await self.expire_keys(self._TELEMETRY_EXCEPTIONS_KEY, self._TELEMETRY_KEY_DEFAULT_TTL, 1, result[0])
865882

883+
async def record_active_and_redundant_factories(self, active_factory_count, redundant_factory_count):
884+
"""Record active and redundant factories."""
885+
await self._tel_config.record_active_and_redundant_factories(active_factory_count, redundant_factory_count)
886+
866887
async def expire_latency_keys(self, total_keys, inserted):
867888
"""
868889
Expire lstency keys

tests/storage/test_redis.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from splitio.models.segments import Segment
1515
from splitio.models.impressions import Impression
1616
from splitio.models.events import Event, EventWrapper
17-
from splitio.models.telemetry import MethodExceptions, MethodLatencies, TelemetryConfig, MethodExceptionsAndLatencies
17+
from splitio.models.telemetry import MethodExceptions, MethodLatencies, TelemetryConfig, MethodExceptionsAndLatencies, TelemetryConfigAsync
1818

1919

2020
class RedisSplitStorageTests(object):
@@ -496,20 +496,18 @@ async def test_init(self, mocker):
496496
redis_telemetry = await RedisTelemetryStorageAsync.create(mocker.Mock(), mocker.Mock())
497497
assert(redis_telemetry._redis_client is not None)
498498
assert(redis_telemetry._sdk_metadata is not None)
499-
assert(isinstance(redis_telemetry._method_latencies, MethodLatencies))
500-
assert(isinstance(redis_telemetry._method_exceptions, MethodExceptions))
501-
assert(isinstance(redis_telemetry._tel_config, TelemetryConfig))
499+
assert(isinstance(redis_telemetry._tel_config, TelemetryConfigAsync))
502500
assert(redis_telemetry._make_pipe is not None)
503501

504502
@pytest.mark.asyncio
505503
async def test_record_config(self, mocker):
506504
redis_telemetry = await RedisTelemetryStorageAsync.create(mocker.Mock(), mocker.Mock())
507505
self.called = False
508-
def record_config(*args):
506+
async def record_config(*args):
509507
self.called = True
510508
redis_telemetry._tel_config.record_config = record_config
511509

512-
redis_telemetry.record_config(mocker.Mock(), mocker.Mock())
510+
await redis_telemetry.record_config(mocker.Mock(), mocker.Mock())
513511
assert(self.called)
514512

515513
@pytest.mark.asyncio
@@ -523,7 +521,7 @@ async def hset(key, hash, val):
523521
self.hash = hash
524522

525523
adapter.hset = hset
526-
async def format_config_stats(tags):
524+
async def format_config_stats(stats, tags):
527525
return ""
528526
redis_telemetry._format_config_stats = format_config_stats
529527
await redis_telemetry.push_config_stats()
@@ -533,8 +531,8 @@ async def format_config_stats(tags):
533531
@pytest.mark.asyncio
534532
async def test_format_config_stats(self, mocker):
535533
redis_telemetry = await RedisTelemetryStorageAsync.create(mocker.Mock(), mocker.Mock())
536-
json_value = redis_telemetry._format_config_stats([])
537-
stats = redis_telemetry._tel_config.get_stats()
534+
json_value = redis_telemetry._format_config_stats({'aF': 0, 'rF': 0, 'sT': None, 'oM': None}, [])
535+
stats = await redis_telemetry._tel_config.get_stats()
538536
assert(json_value == json.dumps({
539537
'aF': stats['aF'],
540538
'rF': stats['rF'],
@@ -548,7 +546,7 @@ async def test_record_active_and_redundant_factories(self, mocker):
548546
redis_telemetry = await RedisTelemetryStorageAsync.create(mocker.Mock(), mocker.Mock())
549547
active_factory_count = 1
550548
redundant_factory_count = 2
551-
redis_telemetry.record_active_and_redundant_factories(1, 2)
549+
await redis_telemetry.record_active_and_redundant_factories(1, 2)
552550
assert (redis_telemetry._tel_config._active_factory_count == active_factory_count)
553551
assert (redis_telemetry._tel_config._redundant_factory_count == redundant_factory_count)
554552

@@ -577,18 +575,26 @@ def _mocked_hincrby2(*args, **kwargs):
577575

578576
@pytest.mark.asyncio
579577
async def test_record_exception(self, mocker):
580-
async def _mocked_hincrby(*args, **kwargs):
578+
self.called = False
579+
def _mocked_hincrby(*args, **kwargs):
580+
self.called = True
581581
assert(args[1] == RedisTelemetryStorageAsync._TELEMETRY_EXCEPTIONS_KEY)
582582
assert(args[2] == 'python-1.1.1/hostname/ip/treatment')
583583
assert(args[3] == 1)
584584

585-
adapter = build({})
585+
self.called2 = False
586+
async def _mocked_execute(*args):
587+
self.called2 = True
588+
return [1]
589+
590+
adapter = await aioredis.from_url("redis://localhost")
586591
metadata = SdkMetadata('python-1.1.1', 'hostname', 'ip')
587592
redis_telemetry = await RedisTelemetryStorageAsync.create(adapter, metadata)
588-
with mock.patch('redis.client.Pipeline.hincrby', _mocked_hincrby):
589-
with mock.patch('redis.client.Pipeline.execute') as mock_method:
590-
mock_method.return_value = [1]
591-
redis_telemetry.record_exception(MethodExceptionsAndLatencies.TREATMENT)
593+
with mock.patch('redis.asyncio.client.Pipeline.hincrby', _mocked_hincrby):
594+
with mock.patch('redis.asyncio.client.Pipeline.execute', _mocked_execute):
595+
await redis_telemetry.record_exception(MethodExceptionsAndLatencies.TREATMENT)
596+
assert self.called
597+
assert self.called2
592598

593599
@pytest.mark.asyncio
594600
async def test_expire_latency_keys(self, mocker):

0 commit comments

Comments
 (0)