Skip to content

Commit 9f22a20

Browse files
committed
Added flagsets total and invalid count for telemetry config
1 parent d783365 commit 9f22a20

File tree

12 files changed

+126
-11
lines changed

12 files changed

+126
-11
lines changed

splitio/client/factory.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@
6969
_INSTANTIATED_FACTORIES_LOCK = threading.RLock()
7070
_MIN_DEFAULT_DATA_SAMPLING_ALLOWED = 0.1 # 10%
7171
_MAX_RETRY_SYNC_ALL = 3
72+
_FLAG_SETS_LOCK = threading.RLock()
73+
_TOTAL_FLAG_SETS = 0
74+
_INVALID_FLAG_SETS = 0
7275

7376

7477
class Status(Enum):
@@ -417,6 +420,9 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
417420
)
418421

419422
telemetry_init_producer.record_config(cfg, extra_cfg)
423+
total_flag_sets, invalid_flag_sets = _get_total_and_invalid_flag_sets()
424+
telemetry_init_producer.record_flag_sets(total_flag_sets)
425+
telemetry_init_producer.record_invalid_flag_sets(invalid_flag_sets)
420426

421427
if preforked_initialization:
422428
synchronizer.sync_all(max_retry_attempts=_MAX_RETRY_SYNC_ALL)
@@ -508,7 +514,10 @@ def _build_redis_factory(api_key, cfg):
508514
telemetry_init_producer=telemetry_init_producer
509515
)
510516
redundant_factory_count, active_factory_count = _get_active_and_redundant_count()
517+
total_flag_sets, invalid_flag_sets = _get_total_and_invalid_flag_sets()
511518
storages['telemetry'].record_active_and_redundant_factories(active_factory_count, redundant_factory_count)
519+
storages['telemetry'].record_flag_sets(total_flag_sets)
520+
storages['telemetry'].record_invalid_flag_sets(invalid_flag_sets)
512521
telemetry_submitter.synchronize_config()
513522

514523
return split_factory
@@ -586,7 +595,10 @@ def _build_pluggable_factory(api_key, cfg):
586595
telemetry_init_producer=telemetry_init_producer
587596
)
588597
redundant_factory_count, active_factory_count = _get_active_and_redundant_count()
598+
total_flag_sets, invalid_flag_sets = _get_total_and_invalid_flag_sets()
589599
storages['telemetry'].record_active_and_redundant_factories(active_factory_count, redundant_factory_count)
600+
storages['telemetry'].record_flag_sets(total_flag_sets)
601+
storages['telemetry'].record_invalid_flag_sets(invalid_flag_sets)
590602
telemetry_submitter.synchronize_config()
591603

592604
return split_factory
@@ -684,7 +696,16 @@ def get_factory(api_key, **kwargs):
684696
_INSTANTIATED_FACTORIES.update([api_key])
685697
_INSTANTIATED_FACTORIES_LOCK.release()
686698

687-
config = sanitize_config(api_key, kwargs.get('config', {}))
699+
config_raw = kwargs.get('config', {})
700+
if config_raw.get('flagSetsFilter') is not None and isinstance(config_raw.get('flagSetsFilter'), list):
701+
global _TOTAL_FLAG_SETS
702+
global _INVALID_FLAG_SETS
703+
_FLAG_SETS_LOCK.acquire()
704+
_TOTAL_FLAG_SETS = len(config_raw.get('flagSetsFilter'))
705+
_INVALID_FLAG_SETS = _TOTAL_FLAG_SETS - len(input_validator.validate_flag_sets(config_raw.get('flagSetsFilter'), 'Telemetry Init'))
706+
_FLAG_SETS_LOCK.release()
707+
708+
config = sanitize_config(api_key, config_raw)
688709

689710
if config['operationMode'] == 'localhost':
690711
split_factory = _build_localhost_factory(config)
@@ -712,4 +733,13 @@ def _get_active_and_redundant_count():
712733
redundant_factory_count += _INSTANTIATED_FACTORIES[item] - 1
713734
active_factory_count += _INSTANTIATED_FACTORIES[item]
714735
_INSTANTIATED_FACTORIES_LOCK.release()
715-
return redundant_factory_count, active_factory_count
736+
return redundant_factory_count, active_factory_count
737+
738+
def _get_total_and_invalid_flag_sets():
739+
total_flag_sets = 0
740+
invalid_flag_sets = 0
741+
_FLAG_SETS_LOCK.acquire()
742+
total_flag_sets = _TOTAL_FLAG_SETS
743+
invalid_flag_sets = _INVALID_FLAG_SETS
744+
_FLAG_SETS_LOCK.release()
745+
return total_flag_sets, invalid_flag_sets

splitio/engine/telemetry.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ def record_flag_sets(self, flag_sets):
5252
"""Record flag sets."""
5353
self._telemetry_storage.record_flag_sets(flag_sets)
5454

55+
def record_invalid_flag_sets(self, flag_sets):
56+
"""Record invalid flag sets."""
57+
self._telemetry_storage.record_invalid_flag_sets(flag_sets)
58+
5559
def record_bur_time_out(self):
5660
"""Record block until ready timeout."""
5761
self._telemetry_storage.record_bur_time_out()

splitio/models/telemetry.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,7 @@ def _reset_all(self):
794794
self._active_factory_count = 0
795795
self._redundant_factory_count = 0
796796
self._flag_sets = 0
797+
self._flag_sets_invalid = 0
797798

798799
def record_config(self, config, extra_config):
799800
"""
@@ -844,6 +845,16 @@ def record_flag_sets(self, flag_sets):
844845
with self._lock:
845846
self._flag_sets = flag_sets
846847

848+
def record_invalid_flag_sets(self, flag_sets):
849+
"""
850+
Record invalid flag sets
851+
852+
:param flag_sets: flag sets count
853+
:type flag_sets: int
854+
"""
855+
with self._lock:
856+
self._flag_sets_invalid = flag_sets
857+
847858
def record_ready_time(self, ready_time):
848859
"""
849860
Record ready time.
@@ -878,6 +889,14 @@ def get_flag_sets(self):
878889
with self._lock:
879890
return self._flag_sets
880891

892+
def get_invalid_flag_sets(self):
893+
"""
894+
Get invalid flag sets
895+
896+
"""
897+
with self._lock:
898+
return self._flag_sets_invalid
899+
881900
def get_bur_time_outs(self):
882901
"""
883902
Get block until ready timeout.
@@ -930,7 +949,8 @@ def get_stats(self):
930949
'hp': self._http_proxy,
931950
'aF': self._active_factory_count,
932951
'rF': self._redundant_factory_count,
933-
'fS': self._flag_sets
952+
'fsT': self._flag_sets,
953+
'fsI': self._flag_sets_invalid
934954
}
935955

936956
def _get_operation_mode(self, op_mode):

splitio/storage/inmemmory.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,10 @@ def record_flag_sets(self, flag_sets):
658658
"""Record flag sets."""
659659
self._tel_config.record_flag_sets(flag_sets)
660660

661+
def record_invalid_flag_sets(self, flag_sets):
662+
"""Record invalid flag sets."""
663+
self._tel_config.record_invalid_flag_sets(flag_sets)
664+
661665
def add_tag(self, tag):
662666
"""Record tag string."""
663667
with self._lock:
@@ -730,6 +734,10 @@ def get_flag_sets(self):
730734
"""Get flag sets."""
731735
self._tel_config.get_flag_sets()
732736

737+
def get_invalid_flag_sets(self):
738+
"""Get invalid flag sets."""
739+
self._tel_config.get_invalid_flag_sets()
740+
733741
def get_bur_time_outs(self):
734742
"""Get block until ready timeout."""
735743
return self._tel_config.get_bur_time_outs()

splitio/storage/pluggable.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,14 @@ def record_config(self, config, extra_config):
806806
"""
807807
self._tel_config.record_config(config, extra_config)
808808

809+
def record_flag_sets(self, flag_sets):
810+
"""Record flag sets."""
811+
self._tel_config.record_flag_sets(flag_sets)
812+
813+
def record_invalid_flag_sets(self, flag_sets):
814+
"""Record invalid flag sets."""
815+
self._tel_config.record_invalid_flag_sets(flag_sets)
816+
809817
def pop_config_tags(self):
810818
"""Get and reset configs."""
811819
with self._lock:
@@ -825,7 +833,9 @@ def _format_config_stats(self):
825833
'rF': config_stats['rF'],
826834
'sT': config_stats['sT'],
827835
'oM': config_stats['oM'],
828-
't': self.pop_config_tags()
836+
't': self.pop_config_tags(),
837+
'fsT': self._tel_config.get_flag_sets(),
838+
'fsI': self._tel_config.get_invalid_flag_sets()
829839
})
830840

831841
def record_active_and_redundant_factories(self, active_factory_count, redundant_factory_count):

splitio/storage/redis.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,14 @@ def record_config(self, config, extra_config):
671671
"""
672672
self._tel_config.record_config(config, extra_config)
673673

674+
def record_flag_sets(self, flag_sets):
675+
"""Record flag sets."""
676+
self._tel_config.record_flag_sets(flag_sets)
677+
678+
def record_invalid_flag_sets(self, flag_sets):
679+
"""Record invalid flag sets."""
680+
self._tel_config.record_invalid_flag_sets(flag_sets)
681+
674682
def pop_config_tags(self):
675683
"""Get and reset tags."""
676684
with self._lock:
@@ -692,6 +700,8 @@ def _format_config_stats(self):
692700
'rF': config_stats['rF'],
693701
'sT': config_stats['sT'],
694702
'oM': config_stats['oM'],
703+
'fsT': self._tel_config.get_flag_sets(),
704+
'fsI': self._tel_config.get_invalid_flag_sets(),
695705
't': self.pop_config_tags()
696706
})
697707

tests/client/test_factory.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,26 @@
2929
class SplitFactoryTests(object):
3030
"""Split factory test cases."""
3131

32+
def test_flag_sets_counts(self):
33+
factory = get_factory("none", config={
34+
'flagSetsFilter': ['set1', 'set2', 'set3']
35+
})
36+
37+
assert factory._telemetry_init_producer._telemetry_storage._tel_config._flag_sets == 3
38+
assert factory._telemetry_init_producer._telemetry_storage._tel_config._flag_sets_invalid == 0
39+
40+
factory = get_factory("none", config={
41+
'flagSetsFilter': ['s#et1', 'set2', 'set3']
42+
})
43+
assert factory._telemetry_init_producer._telemetry_storage._tel_config._flag_sets == 3
44+
assert factory._telemetry_init_producer._telemetry_storage._tel_config._flag_sets_invalid == 1
45+
46+
factory = get_factory("none", config={
47+
'flagSetsFilter': ['s#et1', 22, 'set3']
48+
})
49+
assert factory._telemetry_init_producer._telemetry_storage._tel_config._flag_sets == 3
50+
assert factory._telemetry_init_producer._telemetry_storage._tel_config._flag_sets_invalid == 2
51+
3252
def test_inmemory_client_creation_streaming_false(self, mocker):
3353
"""Test that a client with in-memory storage is created correctly."""
3454

tests/engine/test_telemetry.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ def test_record_config(self, mocker):
3737
}
3838
telemetry_init_producer.record_config(config, {})
3939
telemetry_init_producer.record_active_and_redundant_factories(1, 0)
40-
telemetry_init_producer.record_flag_sets(2)
40+
telemetry_init_producer.record_flag_sets(5)
41+
telemetry_init_producer.record_invalid_flag_sets(2)
4142

4243
assert(telemetry_storage._tel_config.get_stats() == {'oM': 0,
4344
'sT': telemetry_storage._tel_config._get_storage_type(config['operationMode'], config['storageType']),
@@ -54,7 +55,8 @@ def test_record_config(self, mocker):
5455
'nR': 0,
5556
'aF': 1,
5657
'rF': 0,
57-
'fS': 2}
58+
'fsT': 5,
59+
'fsI': 2}
5860
)
5961

6062
def test_record_ready_time(self, mocker):

tests/models/test_telemetry_model.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,8 @@ def test_telemetry_config(self):
316316
'bT': 0,
317317
'aF': 0,
318318
'rF': 0,
319-
'fS': 0}
319+
'fsT': 0,
320+
'fsI': 0}
320321
)
321322

322323
telemetry_config.record_ready_time(10)
@@ -331,6 +332,9 @@ def test_telemetry_config(self):
331332
[telemetry_config.record_not_ready_usage() for i in range(5)]
332333
assert(telemetry_config.get_non_ready_usage() == 5)
333334

335+
telemetry_config.record_invalid_flag_sets(2)
336+
assert(telemetry_config._flag_sets_invalid == 2)
337+
334338
os.environ["https_proxy"] = "some_host_ip"
335339
assert(telemetry_config._check_if_proxy_detected() == True)
336340

tests/storage/test_inmemory_storage.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,8 @@ def test_resets(self):
617617
'hp': None,
618618
'aF': 0,
619619
'rF': 0,
620-
'fS': 0
620+
'fsT': 0,
621+
'fsI': 0
621622
})
622623
assert(storage._streaming_events.pop_streaming_events() == {'streamingEvents': []})
623624
assert(storage._tags == [])
@@ -643,6 +644,7 @@ def test_record_config(self):
643644
storage.record_config(config, {})
644645
storage.record_active_and_redundant_factories(1, 0)
645646
storage.record_flag_sets(2)
647+
storage.record_invalid_flag_sets(1)
646648
assert(storage._tel_config.get_stats() == {'oM': 0,
647649
'sT': storage._tel_config._get_storage_type(config['operationMode'], config['storageType']),
648650
'sE': config['streamingEnabled'],
@@ -658,7 +660,8 @@ def test_record_config(self):
658660
'nR': 0,
659661
'aF': 1,
660662
'rF': 0,
661-
'fS': 2}
663+
'fsT': 2,
664+
'fsI': 1}
662665
)
663666

664667
def test_record_counters(self):

0 commit comments

Comments
 (0)