Skip to content

Commit efdc027

Browse files
committed
moved telemetry call to api.client for async
1 parent a0cfafe commit efdc027

File tree

15 files changed

+228
-130
lines changed

15 files changed

+228
-130
lines changed

splitio/api/auth.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import json
55

66
from splitio.api import APIException, headers_from_metadata
7-
from splitio.api.commons import record_telemetry
8-
from splitio.util.time import get_current_epoch_time_ms
97
from splitio.api.client import HttpClientException
108
from splitio.models.token import from_raw
119
from splitio.models.telemetry import HTTPExceptionsAndLatencies
@@ -31,6 +29,7 @@ def __init__(self, client, sdk_key, sdk_metadata, telemetry_runtime_producer):
3129
self._sdk_key = sdk_key
3230
self._metadata = headers_from_metadata(sdk_metadata)
3331
self._telemetry_runtime_producer = telemetry_runtime_producer
32+
self._client.set_telemetry_data(HTTPExceptionsAndLatencies.TOKEN, self._telemetry_runtime_producer)
3433

3534
def authenticate(self):
3635
"""
@@ -39,15 +38,13 @@ def authenticate(self):
3938
:return: Json representation of an authentication.
4039
:rtype: splitio.models.token.Token
4140
"""
42-
start = get_current_epoch_time_ms()
4341
try:
4442
response = self._client.get(
4543
'auth',
4644
'v2/auth',
4745
self._sdk_key,
4846
extra_headers=self._metadata,
4947
)
50-
record_telemetry(response.status_code, get_current_epoch_time_ms() - start, HTTPExceptionsAndLatencies.TOKEN, self._telemetry_runtime_producer)
5148
if 200 <= response.status_code < 300:
5249
payload = json.loads(response.body)
5350
return from_raw(payload)

splitio/api/client.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import abc
66

77
from splitio.optional.loaders import aiohttp
8+
from splitio.util.time import get_current_epoch_time_ms
89

910
SDK_URL = 'https://sdk.split.io/api'
1011
EVENTS_URL = 'https://events.split.io/api'
@@ -73,6 +74,20 @@ def get(self, server, path, apikey):
7374
def post(self, server, path, apikey):
7475
"""http post request"""
7576

77+
def set_telemetry_data(self, metric_name, telemetry_runtime_producer):
78+
"""
79+
Set the data needed for telemetry call
80+
81+
:param metric_name: metric name for telemetry
82+
:type metric_name: str
83+
84+
:param telemetry_runtime_producer: telemetry recording instance
85+
:type telemetry_runtime_producer: splitio.engine.telemetry.TelemetryRuntimeProducer
86+
"""
87+
self._telemetry_runtime_producer = telemetry_runtime_producer
88+
self._metric_name = metric_name
89+
90+
7691
class HttpClient(HttpClientBase):
7792
"""HttpClient wrapper."""
7893

@@ -116,13 +131,15 @@ def get(self, server, path, sdk_key, query=None, extra_headers=None): # pylint:
116131
if extra_headers is not None:
117132
headers.update(extra_headers)
118133

134+
start = get_current_epoch_time_ms()
119135
try:
120136
response = requests.get(
121137
_build_url(server, path, self._urls),
122138
params=query,
123139
headers=headers,
124140
timeout=self._timeout
125141
)
142+
self._record_telemetry(response.status_code, get_current_epoch_time_ms() - start)
126143
return HttpResponse(response.status_code, response.text, response.headers)
127144
except Exception as exc: # pylint: disable=broad-except
128145
raise HttpClientException('requests library is throwing exceptions') from exc
@@ -152,6 +169,7 @@ def post(self, server, path, sdk_key, body, query=None, extra_headers=None): #
152169
if extra_headers is not None:
153170
headers.update(extra_headers)
154171

172+
start = get_current_epoch_time_ms()
155173
try:
156174
response = requests.post(
157175
_build_url(server, path, self._urls),
@@ -160,10 +178,28 @@ def post(self, server, path, sdk_key, body, query=None, extra_headers=None): #
160178
headers=headers,
161179
timeout=self._timeout
162180
)
181+
self._record_telemetry(response.status_code, get_current_epoch_time_ms() - start)
163182
return HttpResponse(response.status_code, response.text, response.headers)
164183
except Exception as exc: # pylint: disable=broad-except
165184
raise HttpClientException('requests library is throwing exceptions') from exc
166185

186+
def _record_telemetry(self, status_code, elapsed):
187+
"""
188+
Record Telemetry info
189+
190+
:param status_code: http request status code
191+
:type status_code: int
192+
193+
:param elapsed: response time elapsed.
194+
:type status_code: int
195+
"""
196+
self._telemetry_runtime_producer.record_sync_latency(self._metric_name, elapsed)
197+
if 200 <= status_code < 300:
198+
self._telemetry_runtime_producer.record_successful_sync(self._metric_name, get_current_epoch_time_ms())
199+
return
200+
self._telemetry_runtime_producer.record_sync_error(self._metric_name, status_code)
201+
202+
167203
class HttpClientAsync(HttpClientBase):
168204
"""HttpClientAsync wrapper."""
169205

@@ -204,6 +240,7 @@ async def get(self, server, path, apikey, query=None, extra_headers=None): # py
204240
headers = _build_basic_headers(apikey)
205241
if extra_headers is not None:
206242
headers.update(extra_headers)
243+
start = get_current_epoch_time_ms()
207244
try:
208245
async with self._session.get(
209246
_build_url(server, path, self._urls),
@@ -212,6 +249,7 @@ async def get(self, server, path, apikey, query=None, extra_headers=None): # py
212249
timeout=self._timeout
213250
) as response:
214251
body = await response.text()
252+
await self._record_telemetry(response.status, get_current_epoch_time_ms() - start)
215253
return HttpResponse(response.status, body, response.headers)
216254
except aiohttp.ClientError as exc: # pylint: disable=broad-except
217255
raise HttpClientException('aiohttp library is throwing exceptions') from exc
@@ -237,6 +275,7 @@ async def post(self, server, path, apikey, body, query=None, extra_headers=None)
237275
headers = _build_basic_headers(apikey)
238276
if extra_headers is not None:
239277
headers.update(extra_headers)
278+
start = get_current_epoch_time_ms()
240279
try:
241280
async with self._session.post(
242281
_build_url(server, path, self._urls),
@@ -246,6 +285,23 @@ async def post(self, server, path, apikey, body, query=None, extra_headers=None)
246285
timeout=self._timeout
247286
) as response:
248287
body = await response.text()
288+
await self._record_telemetry(response.status, get_current_epoch_time_ms() - start)
249289
return HttpResponse(response.status, body, response.headers)
250290
except aiohttp.ClientError as exc: # pylint: disable=broad-except
251-
raise HttpClientException('aiohttp library is throwing exceptions') from exc
291+
raise HttpClientException('aiohttp library is throwing exceptions') from exc
292+
293+
async def _record_telemetry(self, status_code, elapsed):
294+
"""
295+
Record Telemetry info
296+
297+
:param status_code: http request status code
298+
:type status_code: int
299+
300+
:param elapsed: response time elapsed.
301+
:type status_code: int
302+
"""
303+
await self._telemetry_runtime_producer.record_sync_latency(self._metric_name, elapsed)
304+
if 200 <= status_code < 300:
305+
await self._telemetry_runtime_producer.record_successful_sync(self._metric_name, get_current_epoch_time_ms())
306+
return
307+
await self._telemetry_runtime_producer.record_sync_error(self._metric_name, status_code)

splitio/api/commons.py

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,8 @@
11
"""Commons module."""
2-
from splitio.util.time import get_current_epoch_time_ms
32

43
_CACHE_CONTROL = 'Cache-Control'
54
_CACHE_CONTROL_NO_CACHE = 'no-cache'
65

7-
def record_telemetry(status_code, elapsed, metric_name, telemetry_runtime_producer):
8-
"""
9-
Record Telemetry info
10-
11-
:param status_code: http request status code
12-
:type status_code: int
13-
14-
:param elapsed: response time elapsed.
15-
:type status_code: int
16-
17-
:param metric_name: metric name for telemetry
18-
:type metric_name: str
19-
20-
:param telemetry_runtime_producer: telemetry recording instance
21-
:type telemetry_runtime_producer: splitio.engine.telemetry.TelemetryRuntimeProducer
22-
"""
23-
telemetry_runtime_producer.record_sync_latency(metric_name, elapsed)
24-
if 200 <= status_code < 300:
25-
telemetry_runtime_producer.record_successful_sync(metric_name, get_current_epoch_time_ms())
26-
return
27-
telemetry_runtime_producer.record_sync_error(metric_name, status_code)
28-
296
class FetchOptions(object):
307
"""Fetch Options object."""
318

splitio/api/events.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
from splitio.api import APIException, headers_from_metadata
66
from splitio.api.client import HttpClientException
7-
from splitio.api.commons import record_telemetry
8-
from splitio.util.time import get_current_epoch_time_ms
97
from splitio.models.telemetry import HTTPExceptionsAndLatencies
108

119

@@ -30,6 +28,7 @@ def __init__(self, http_client, sdk_key, sdk_metadata, telemetry_runtime_produce
3028
self._sdk_key = sdk_key
3129
self._metadata = headers_from_metadata(sdk_metadata)
3230
self._telemetry_runtime_producer = telemetry_runtime_producer
31+
self._client.set_telemetry_data(HTTPExceptionsAndLatencies.EVENT, self._telemetry_runtime_producer)
3332

3433
@staticmethod
3534
def _build_bulk(events):
@@ -65,7 +64,6 @@ def flush_events(self, events):
6564
:rtype: bool
6665
"""
6766
bulk = self._build_bulk(events)
68-
start = get_current_epoch_time_ms()
6967
try:
7068
response = self._client.post(
7169
'events',
@@ -74,7 +72,6 @@ def flush_events(self, events):
7472
body=bulk,
7573
extra_headers=self._metadata,
7674
)
77-
record_telemetry(response.status_code, get_current_epoch_time_ms() - start, HTTPExceptionsAndLatencies.EVENT, self._telemetry_runtime_producer)
7875
if not 200 <= response.status_code < 300:
7976
raise APIException(response.body, response.status_code)
8077
except HttpClientException as exc:

splitio/api/impressions.py

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

66
from splitio.api import APIException, headers_from_metadata
77
from splitio.api.client import HttpClientException
8-
from splitio.api.commons import record_telemetry
9-
from splitio.util.time import get_current_epoch_time_ms
108
from splitio.engine.impressions import ImpressionsMode
119
from splitio.models.telemetry import HTTPExceptionsAndLatencies
1210

@@ -94,7 +92,7 @@ def flush_impressions(self, impressions):
9492
:type impressions: list
9593
"""
9694
bulk = self._build_bulk(impressions)
97-
start = get_current_epoch_time_ms()
95+
self._client.set_telemetry_data(HTTPExceptionsAndLatencies.IMPRESSION, self._telemetry_runtime_producer)
9896
try:
9997
response = self._client.post(
10098
'events',
@@ -103,7 +101,6 @@ def flush_impressions(self, impressions):
103101
body=bulk,
104102
extra_headers=self._metadata,
105103
)
106-
record_telemetry(response.status_code, get_current_epoch_time_ms() - start, HTTPExceptionsAndLatencies.IMPRESSION, self._telemetry_runtime_producer)
107104
if not 200 <= response.status_code < 300:
108105
raise APIException(response.body, response.status_code)
109106
except HttpClientException as exc:
@@ -121,7 +118,7 @@ def flush_counters(self, counters):
121118
:type impressions: list
122119
"""
123120
bulk = self._build_counters(counters)
124-
start = get_current_epoch_time_ms()
121+
self._client.set_telemetry_data(HTTPExceptionsAndLatencies.IMPRESSION_COUNT, self._telemetry_runtime_producer)
125122
try:
126123
response = self._client.post(
127124
'events',
@@ -130,7 +127,6 @@ def flush_counters(self, counters):
130127
body=bulk,
131128
extra_headers=self._metadata,
132129
)
133-
record_telemetry(response.status_code, get_current_epoch_time_ms() - start, HTTPExceptionsAndLatencies.IMPRESSION_COUNT, self._telemetry_runtime_producer)
134130
if not 200 <= response.status_code < 300:
135131
raise APIException(response.body, response.status_code)
136132
except HttpClientException as exc:

splitio/api/segments.py

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

77
from splitio.api import APIException, headers_from_metadata
8-
from splitio.api.commons import build_fetch, record_telemetry
9-
from splitio.util.time import get_current_epoch_time_ms
8+
from splitio.api.commons import build_fetch
109
from splitio.api.client import HttpClientException
1110
from splitio.models.telemetry import HTTPExceptionsAndLatencies
1211

@@ -33,6 +32,7 @@ def __init__(self, http_client, sdk_key, sdk_metadata, telemetry_runtime_produce
3332
self._sdk_key = sdk_key
3433
self._metadata = headers_from_metadata(sdk_metadata)
3534
self._telemetry_runtime_producer = telemetry_runtime_producer
35+
self._client.set_telemetry_data(HTTPExceptionsAndLatencies.SEGMENT, self._telemetry_runtime_producer)
3636

3737
def fetch_segment(self, segment_name, change_number, fetch_options):
3838
"""
@@ -50,7 +50,6 @@ def fetch_segment(self, segment_name, change_number, fetch_options):
5050
:return: Json representation of a segmentChange response.
5151
:rtype: dict
5252
"""
53-
start = get_current_epoch_time_ms()
5453
try:
5554
query, extra_headers = build_fetch(change_number, fetch_options, self._metadata)
5655
response = self._client.get(
@@ -60,11 +59,9 @@ def fetch_segment(self, segment_name, change_number, fetch_options):
6059
extra_headers=extra_headers,
6160
query=query,
6261
)
63-
record_telemetry(response.status_code, get_current_epoch_time_ms() - start, HTTPExceptionsAndLatencies.SEGMENT, self._telemetry_runtime_producer)
6462
if 200 <= response.status_code < 300:
6563
return json.loads(response.body)
66-
else:
67-
raise APIException(response.body, response.status_code)
64+
raise APIException(response.body, response.status_code)
6865
except HttpClientException as exc:
6966
_LOGGER.error(
7067
'Error fetching %s because an exception was raised by the HTTPClient',

splitio/api/splits.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
import time
66

77
from splitio.api import APIException, headers_from_metadata
8-
from splitio.api.commons import build_fetch, record_telemetry
9-
from splitio.util.time import get_current_epoch_time_ms
8+
from splitio.api.commons import build_fetch
109
from splitio.api.client import HttpClientException
1110
from splitio.models.telemetry import HTTPExceptionsAndLatencies
1211

@@ -31,6 +30,7 @@ def __init__(self, client, sdk_key, sdk_metadata, telemetry_runtime_producer):
3130
self._sdk_key = sdk_key
3231
self._metadata = headers_from_metadata(sdk_metadata)
3332
self._telemetry_runtime_producer = telemetry_runtime_producer
33+
self._client.set_telemetry_data(HTTPExceptionsAndLatencies.SPLIT, self._telemetry_runtime_producer)
3434

3535
def fetch_splits(self, change_number, fetch_options):
3636
"""
@@ -45,7 +45,6 @@ def fetch_splits(self, change_number, fetch_options):
4545
:return: Json representation of a splitChanges response.
4646
:rtype: dict
4747
"""
48-
start = get_current_epoch_time_ms()
4948
try:
5049
query, extra_headers = build_fetch(change_number, fetch_options, self._metadata)
5150
response = self._client.get(
@@ -55,7 +54,6 @@ def fetch_splits(self, change_number, fetch_options):
5554
extra_headers=extra_headers,
5655
query=query,
5756
)
58-
record_telemetry(response.status_code, get_current_epoch_time_ms() - start, HTTPExceptionsAndLatencies.SPLIT, self._telemetry_runtime_producer)
5957
if 200 <= response.status_code < 300:
6058
return json.loads(response.body)
6159
else:

0 commit comments

Comments
 (0)