11"""Commons module."""
2+ from splitio .util .time import get_current_epoch_time_ms
3+ from splitio .spec import SPEC_VERSION
24
35_CACHE_CONTROL = 'Cache-Control'
46_CACHE_CONTROL_NO_CACHE = 'no-cache'
57
8+ def headers_from_metadata (sdk_metadata , client_key = None ):
9+ """
10+ Generate a dict with headers required by data-recording API endpoints.
11+
12+ :param sdk_metadata: SDK Metadata object, generated at sdk initialization time.
13+ :type sdk_metadata: splitio.client.util.SdkMetadata
14+
15+ :param client_key: client key.
16+ :type client_key: str
17+
18+ :return: A dictionary with headers.
19+ :rtype: dict
20+ """
21+
22+ metadata = {
23+ 'SplitSDKVersion' : sdk_metadata .sdk_version ,
24+ 'SplitSDKMachineIP' : sdk_metadata .instance_ip ,
25+ 'SplitSDKMachineName' : sdk_metadata .instance_name
26+ } if sdk_metadata .instance_ip != 'NA' and sdk_metadata .instance_ip != 'unknown' else {
27+ 'SplitSDKVersion' : sdk_metadata .sdk_version ,
28+ }
29+
30+ if client_key is not None :
31+ metadata ['SplitSDKClientKey' ] = client_key
32+
33+ return metadata
34+
35+ def record_telemetry (status_code , elapsed , metric_name , telemetry_runtime_producer ):
36+ """
37+ Record Telemetry info
38+
39+ :param status_code: http request status code
40+ :type status_code: int
41+
42+ :param elapsed: response time elapsed.
43+ :type status_code: int
44+
45+ :param metric_name: metric name for telemetry
46+ :type metric_name: str
47+
48+ :param telemetry_runtime_producer: telemetry recording instance
49+ :type telemetry_runtime_producer: splitio.engine.telemetry.TelemetryRuntimeProducer
50+ """
51+ telemetry_runtime_producer .record_sync_latency (metric_name , elapsed )
52+ if 200 <= status_code < 300 :
53+ telemetry_runtime_producer .record_successful_sync (metric_name , get_current_epoch_time_ms ())
54+ return
55+ telemetry_runtime_producer .record_sync_error (metric_name , status_code )
56+
657class FetchOptions (object ):
758 """Fetch Options object."""
859
9- def __init__ (self , cache_control_headers = False , change_number = None , sets = None ):
60+ def __init__ (self , cache_control_headers = False , change_number = None , sets = None , spec = SPEC_VERSION ):
1061 """
1162 Class constructor.
1263
@@ -22,6 +73,7 @@ def __init__(self, cache_control_headers=False, change_number=None, sets=None):
2273 self ._cache_control_headers = cache_control_headers
2374 self ._change_number = change_number
2475 self ._sets = sets
76+ self ._spec = spec
2577
2678 @property
2779 def cache_control_headers (self ):
@@ -38,6 +90,11 @@ def sets(self):
3890 """Return sets."""
3991 return self ._sets
4092
93+ @property
94+ def spec (self ):
95+ """Return sets."""
96+ return self ._spec
97+
4198 def __eq__ (self , other ):
4299 """Match between other options."""
43100 if self ._cache_control_headers != other ._cache_control_headers :
@@ -48,7 +105,8 @@ def __eq__(self, other):
48105
49106 if self ._sets != other ._sets :
50107 return False
51-
108+ if self ._spec != other ._spec :
109+ return False
52110 return True
53111
54112
@@ -68,15 +126,16 @@ def build_fetch(change_number, fetch_options, metadata):
68126 :return: Objects for fetch
69127 :rtype: dict, dict
70128 """
71- query = {'since' : change_number }
129+ query = {'s' : fetch_options .spec } if fetch_options .spec is not None else {}
130+ query ['since' ] = change_number
72131 extra_headers = metadata
73132 if fetch_options is None :
74133 return query , extra_headers
75134
76135 if fetch_options .cache_control_headers :
77136 extra_headers [_CACHE_CONTROL ] = _CACHE_CONTROL_NO_CACHE
78- if fetch_options .change_number is not None :
79- query ['till' ] = fetch_options .change_number
80137 if fetch_options .sets is not None :
81138 query ['sets' ] = fetch_options .sets
139+ if fetch_options .change_number is not None :
140+ query ['till' ] = fetch_options .change_number
82141 return query , extra_headers
0 commit comments