Skip to content

Commit 9dc6f0e

Browse files
authored
Merge pull request #469 from splitio/flagsets-telemetry-init
Added flagsets total and invalid count for telemetry config
2 parents d783365 + 065badf commit 9dc6f0e

22 files changed

+145
-42
lines changed

splitio/client/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,9 +404,9 @@ def _get_treatments_by_flag_sets(self, key, flag_sets, method, attributes=None):
404404
:return: Dictionary with the result of all the feature flags provided
405405
:rtype: dict
406406
"""
407-
feature_flags_names = self._get_feature_flag_names_by_flag_sets(flag_sets, method)
407+
feature_flags_names = self._get_feature_flag_names_by_flag_sets(flag_sets, method.value)
408408
if feature_flags_names == []:
409-
_LOGGER.warning("%s: No valid Flag set or no feature flags found for evaluating treatments" % (method))
409+
_LOGGER.warning("%s: No valid Flag set or no feature flags found for evaluating treatments" % (method.value))
410410
return {}
411411

412412
if 'config' in method.value:

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/client/input_validator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,4 +597,4 @@ def validate_flag_sets(flag_sets, method_name):
597597

598598
sanitized_flag_sets.add(flag_set)
599599

600-
return sorted(list(sanitized_flag_sets))
600+
return list(sanitized_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/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import abc
33
import threading
44

5-
65
class SplitStorage(object, metaclass=abc.ABCMeta):
76
"""Split storage interface implemented as an abstract class."""
87

@@ -324,6 +323,7 @@ def __init__(self, flag_sets=[]):
324323
"""Constructor."""
325324
self.flag_sets = set(flag_sets)
326325
self.should_filter = any(flag_sets)
326+
self.sorted_flag_sets = sorted(flag_sets)
327327

328328
def set_exist(self, flag_set):
329329
"""

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

splitio/sync/split.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ def _get_config_sets(self):
123123
"""
124124
if self._feature_flag_storage.flag_set_filter.flag_sets == set({}):
125125
return None
126-
return ','.join(self._feature_flag_storage.flag_set_filter.flag_sets)
126+
return ','.join(self._feature_flag_storage.flag_set_filter.sorted_flag_sets)
127127

128128
def synchronize_splits(self, till=None):
129129
"""

0 commit comments

Comments
 (0)