Skip to content

Commit 104b55d

Browse files
committed
add metadata headers to splits & segments endpoint
1 parent d0196f0 commit 104b55d

File tree

7 files changed

+42
-15
lines changed

7 files changed

+42
-15
lines changed

splitio/api/segments.py

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

66
from future.utils import raise_from
77

8-
from splitio.api import APIException
8+
from splitio.api import APIException, headers_from_metadata
99
from splitio.api.client import HttpClientException
1010

1111

@@ -15,17 +15,21 @@
1515
class SegmentsAPI(object): # pylint: disable=too-few-public-methods
1616
"""Class that uses an httpClient to communicate with the segments API."""
1717

18-
def __init__(self, http_client, apikey):
18+
def __init__(self, http_client, apikey, sdk_metadata):
1919
"""
2020
Class constructor.
2121
2222
:param client: HTTP Client responsble for issuing calls to the backend.
2323
:type client: client.HttpClient
2424
:param apikey: User apikey token.
2525
:type apikey: string
26+
:param sdk_metadata: SDK version & machine name & IP.
27+
:type sdk_metadata: splitio.client.util.SdkMetadata
28+
2629
"""
2730
self._client = http_client
2831
self._apikey = apikey
32+
self._metadata = headers_from_metadata(sdk_metadata)
2933

3034
def fetch_segment(self, segment_name, change_number):
3135
"""
@@ -44,7 +48,8 @@ def fetch_segment(self, segment_name, change_number):
4448
'sdk',
4549
'/segmentChanges/{segment_name}'.format(segment_name=segment_name),
4650
self._apikey,
47-
{'since': change_number}
51+
extra_headers=self._metadata,
52+
query={'since': change_number}
4853
)
4954

5055
if 200 <= response.status_code < 300:

splitio/api/splits.py

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

66
from future.utils import raise_from
77

8-
from splitio.api import APIException
8+
from splitio.api import APIException, headers_from_metadata
99
from splitio.api.client import HttpClientException
1010

1111

@@ -15,17 +15,20 @@
1515
class SplitsAPI(object): # pylint: disable=too-few-public-methods
1616
"""Class that uses an httpClient to communicate with the splits API."""
1717

18-
def __init__(self, client, apikey):
18+
def __init__(self, client, apikey, sdk_metadata):
1919
"""
2020
Class constructor.
2121
2222
:param client: HTTP Client responsble for issuing calls to the backend.
2323
:type client: HttpClient
2424
:param apikey: User apikey token.
2525
:type apikey: string
26+
:param sdk_metadata: SDK version & machine name & IP.
27+
:type sdk_metadata: splitio.client.util.SdkMetadata
2628
"""
2729
self._client = client
2830
self._apikey = apikey
31+
self._metadata = headers_from_metadata(sdk_metadata)
2932

3033
def fetch_splits(self, change_number):
3134
"""
@@ -42,7 +45,8 @@ def fetch_splits(self, change_number):
4245
'sdk',
4346
'/splitChanges',
4447
self._apikey,
45-
{'since': change_number}
48+
extra_headers=self._metadata,
49+
query={'since': change_number}
4650
)
4751
if 200 <= response.status_code < 300:
4852
return json.loads(response.body)

splitio/client/factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,8 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
261261
sdk_metadata = util.get_metadata(cfg)
262262
apis = {
263263
'auth': AuthAPI(http_client, api_key, sdk_metadata),
264-
'splits': SplitsAPI(http_client, api_key),
265-
'segments': SegmentsAPI(http_client, api_key),
264+
'splits': SplitsAPI(http_client, api_key, sdk_metadata),
265+
'segments': SegmentsAPI(http_client, api_key, sdk_metadata),
266266
'impressions': ImpressionsAPI(http_client, api_key, sdk_metadata, cfg['impressionsMode']),
267267
'events': EventsAPI(http_client, api_key, sdk_metadata),
268268
'telemetry': TelemetryAPI(http_client, api_key, sdk_metadata)

splitio/tasks/uwsgi_wrappers.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@ def uwsgi_update_splits(user_config):
4545
:type user_config: dict
4646
"""
4747
config = _get_config(user_config)
48+
metadata = get_metadata(config)
4849
seconds = config['featuresRefreshRate']
4950
split_sync = SplitSynchronizer(
5051
SplitsAPI(
51-
HttpClient(1500, config.get('sdk_url'), config.get('events_url')), config['apikey']
52+
HttpClient(1500, config.get('sdk_url'), config.get('events_url')), config['apikey'],
53+
metadata
5254
),
5355
UWSGISplitStorage(get_uwsgi()),
5456
)
@@ -71,9 +73,11 @@ def uwsgi_update_segments(user_config):
7173
"""
7274
config = _get_config(user_config)
7375
seconds = config['segmentsRefreshRate']
76+
metadata = get_metadata(config)
7477
segment_sync = SegmentSynchronizer(
7578
SegmentsAPI(
76-
HttpClient(1500, config.get('sdk_url'), config.get('events_url')), config['apikey']
79+
HttpClient(1500, config.get('sdk_url'), config.get('events_url')), config['apikey'],
80+
metadata
7781
),
7882
UWSGISplitStorage(get_uwsgi()),
7983
UWSGISegmentStorage(get_uwsgi()),

splitio/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '8.3.1-rc1'
1+
__version__ = '8.3.1-rc2'

tests/api/test_segments_api.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import pytest
44
from splitio.api import segments, client, APIException
5+
from splitio.client.util import SdkMetadata
56

67

78
class SegmentAPITests(object):
@@ -11,11 +12,17 @@ def test_fetch_segment_changes(self, mocker):
1112
"""Test segment changes fetching API call."""
1213
httpclient = mocker.Mock(spec=client.HttpClient)
1314
httpclient.get.return_value = client.HttpResponse(200, '{"prop1": "value1"}')
14-
segment_api = segments.SegmentsAPI(httpclient, 'some_api_key')
15+
segment_api = segments.SegmentsAPI(httpclient, 'some_api_key', SdkMetadata('1.0', 'some', '1.2.3.4'))
1516
response = segment_api.fetch_segment('some_segment', 123)
1617

1718
assert response['prop1'] == 'value1'
18-
assert httpclient.get.mock_calls == [mocker.call('sdk', '/segmentChanges/some_segment', 'some_api_key', {'since': 123})]
19+
assert httpclient.get.mock_calls == [mocker.call('sdk', '/segmentChanges/some_segment', 'some_api_key',
20+
extra_headers={
21+
'SplitSDKVersion': '1.0',
22+
'SplitSDKMachineIP': '1.2.3.4',
23+
'SplitSDKMachineName': 'some'
24+
},
25+
query={'since': 123})]
1926

2027
httpclient.reset_mock()
2128
def raise_exception(*args, **kwargs):

tests/api/test_splits_api.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import pytest
44
from splitio.api import splits, client, APIException
5+
from splitio.client.util import SdkMetadata
56

67

78
class SplitAPITests(object):
@@ -11,11 +12,17 @@ def test_fetch_split_changes(self, mocker):
1112
"""Test split changes fetching API call."""
1213
httpclient = mocker.Mock(spec=client.HttpClient)
1314
httpclient.get.return_value = client.HttpResponse(200, '{"prop1": "value1"}')
14-
split_api = splits.SplitsAPI(httpclient, 'some_api_key')
15+
split_api = splits.SplitsAPI(httpclient, 'some_api_key', SdkMetadata('1.0', 'some', '1.2.3.4'))
1516
response = split_api.fetch_splits(123)
1617

1718
assert response['prop1'] == 'value1'
18-
assert httpclient.get.mock_calls == [mocker.call('sdk', '/splitChanges', 'some_api_key', {'since': 123})]
19+
assert httpclient.get.mock_calls == [mocker.call('sdk', '/splitChanges', 'some_api_key',
20+
extra_headers={
21+
'SplitSDKVersion': '1.0',
22+
'SplitSDKMachineIP': '1.2.3.4',
23+
'SplitSDKMachineName': 'some'
24+
},
25+
query={'since': 123})]
1926

2027
httpclient.reset_mock()
2128
def raise_exception(*args, **kwargs):

0 commit comments

Comments
 (0)