Skip to content

Commit d49af6f

Browse files
authored
feat: add metrics metadata (#317)
1 parent aab747d commit d49af6f

File tree

4 files changed

+78
-6
lines changed

4 files changed

+78
-6
lines changed

UnleashClient/api/register.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import json
22
from datetime import datetime, timezone
3+
from platform import python_implementation, python_version
34

45
import requests
56
from requests.exceptions import InvalidHeader, InvalidSchema, InvalidURL, MissingSchema
67

78
from UnleashClient.constants import (
89
APPLICATION_HEADERS,
10+
CLIENT_SPEC_VERSION,
911
REGISTER_URL,
1012
SDK_NAME,
1113
SDK_VERSION,
@@ -41,22 +43,26 @@ def register_client(
4143
:param request_timeout:
4244
:return: true if registration successful, false if registration unsuccessful or exception.
4345
"""
44-
registation_request = {
46+
registration_request = {
4547
"appName": app_name,
4648
"instanceId": instance_id,
4749
"sdkVersion": f"{SDK_NAME}:{SDK_VERSION}",
4850
"strategies": [*supported_strategies],
4951
"started": datetime.now(timezone.utc).isoformat(),
5052
"interval": metrics_interval,
53+
"platformName": python_implementation(),
54+
"platformVersion": python_version(),
55+
"yggdrasilVersion": None,
56+
"specVersion": CLIENT_SPEC_VERSION,
5157
}
5258

5359
try:
5460
LOGGER.info("Registering unleash client with unleash @ %s", url)
55-
LOGGER.info("Registration request information: %s", registation_request)
61+
LOGGER.info("Registration request information: %s", registration_request)
5662

5763
resp = requests.post(
5864
url + REGISTER_URL,
59-
data=json.dumps(registation_request),
65+
data=json.dumps(registration_request),
6066
headers={**custom_headers, **APPLICATION_HEADERS},
6167
timeout=request_timeout,
6268
**custom_options,

UnleashClient/periodic_tasks/send_metrics.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from collections import ChainMap
22
from datetime import datetime, timezone
3+
from platform import python_implementation, python_version
34

45
from UnleashClient.api import send_metrics
56
from UnleashClient.cache import BaseCache
6-
from UnleashClient.constants import METRIC_LAST_SENT_TIME
7+
from UnleashClient.constants import CLIENT_SPEC_VERSION, METRIC_LAST_SENT_TIME
78
from UnleashClient.utils import LOGGER
89

910

@@ -52,6 +53,10 @@ def aggregate_and_send_metrics(
5253
"stop": datetime.now(timezone.utc).isoformat(),
5354
"toggles": feature_stats_dict,
5455
},
56+
"platformName": python_implementation(),
57+
"platformVersion": python_version(),
58+
"yggdrasilVersion": None,
59+
"specVersion": CLIENT_SPEC_VERSION,
5560
}
5661

5762
if feature_stats_dict:

tests/unit_tests/api/test_register.py

+27-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import json
2+
13
import responses
24
from pytest import mark, param
35
from requests import ConnectionError
@@ -13,7 +15,7 @@
1315
URL,
1416
)
1517
from UnleashClient.api import register_client
16-
from UnleashClient.constants import REGISTER_URL
18+
from UnleashClient.constants import CLIENT_SPEC_VERSION, REGISTER_URL
1719

1820
FULL_REGISTER_URL = URL + REGISTER_URL
1921

@@ -48,3 +50,27 @@ def test_register_client(payload, status, expected):
4850

4951
assert len(responses.calls) == 1
5052
assert result is expected
53+
54+
55+
@responses.activate
56+
def test_register_includes_metadata():
57+
responses.add(responses.POST, FULL_REGISTER_URL, json={}, status=202)
58+
59+
register_client(
60+
URL,
61+
APP_NAME,
62+
INSTANCE_ID,
63+
METRICS_INTERVAL,
64+
CUSTOM_HEADERS,
65+
CUSTOM_OPTIONS,
66+
DEFAULT_STRATEGY_MAPPING,
67+
REQUEST_TIMEOUT,
68+
)
69+
70+
assert len(responses.calls) == 1
71+
request = json.loads(responses.calls[0].request.body)
72+
73+
assert request["yggdrasilVersion"] is None
74+
assert request["specVersion"] == CLIENT_SPEC_VERSION
75+
assert request["platformName"] is not None
76+
assert request["platformVersion"] is not None

tests/unit_tests/periodic/test_aggregate_and_send_metrics.py

+36-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
URL,
1515
)
1616
from UnleashClient.cache import FileCache
17-
from UnleashClient.constants import METRIC_LAST_SENT_TIME, METRICS_URL
17+
from UnleashClient.constants import (
18+
CLIENT_SPEC_VERSION,
19+
METRIC_LAST_SENT_TIME,
20+
METRICS_URL,
21+
)
1822
from UnleashClient.features import Feature
1923
from UnleashClient.periodic_tasks import aggregate_and_send_metrics
2024
from UnleashClient.strategies import Default, RemoteAddress
@@ -107,3 +111,34 @@ def test_no_metrics():
107111
)
108112

109113
assert len(responses.calls) == 0
114+
115+
116+
@responses.activate
117+
def test_metrics_metadata_is_sent():
118+
responses.add(responses.POST, FULL_METRICS_URL, json={}, status=200)
119+
120+
cache = FileCache("TestCache")
121+
122+
to_make_sure_metrics_fires = Feature("My Feature1", True, None)
123+
to_make_sure_metrics_fires.yes_count = 1
124+
125+
features = {"Something": to_make_sure_metrics_fires}
126+
127+
aggregate_and_send_metrics(
128+
URL,
129+
APP_NAME,
130+
INSTANCE_ID,
131+
CUSTOM_HEADERS,
132+
CUSTOM_OPTIONS,
133+
features,
134+
cache,
135+
REQUEST_TIMEOUT,
136+
)
137+
138+
assert len(responses.calls) == 1
139+
request = json.loads(responses.calls[0].request.body)
140+
141+
assert request["yggdrasilVersion"] is None
142+
assert request["specVersion"] == CLIENT_SPEC_VERSION
143+
assert request["platformName"] is not None
144+
assert request["platformVersion"] is not None

0 commit comments

Comments
 (0)