Skip to content

Commit 55bb946

Browse files
authored
Fix app config telemetry (Azure#40360)
* Updating Endpoint + Remove Feature Id * Update _azureappconfigurationprovider.py
1 parent 7d9b583 commit 55bb946

File tree

6 files changed

+48
-30
lines changed

6 files changed

+48
-30
lines changed

sdk/appconfiguration/azure-appconfiguration-provider/azure/appconfiguration/provider/_azureappconfigurationprovider.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,11 @@ def refresh(self, **kwargs) -> None: # pylint: disable=too-many-statements
366366
if self._feature_flag_refresh_enabled:
367367
need_ff_refresh, refresh_on_feature_flags, feature_flags, filters_used = (
368368
client.refresh_feature_flags(
369-
self._refresh_on_feature_flags, self._feature_flag_selectors, headers=headers, **kwargs
369+
self._refresh_on_feature_flags,
370+
self._feature_flag_selectors,
371+
headers,
372+
self._origin_endpoint,
373+
**kwargs,
370374
)
371375
)
372376
if refresh_on_feature_flags:
@@ -425,7 +429,11 @@ def _load_all(self, **kwargs):
425429
configuration_settings_processed = self._process_configurations(configuration_settings)
426430
if self._feature_flag_enabled:
427431
feature_flags, feature_flag_sentinel_keys, used_filters = client.load_feature_flags(
428-
self._feature_flag_selectors, self._feature_flag_refresh_enabled, headers=headers, **kwargs
432+
self._feature_flag_selectors,
433+
self._feature_flag_refresh_enabled,
434+
self._origin_endpoint,
435+
headers=headers,
436+
**kwargs,
429437
)
430438
self._feature_filter_usage = used_filters
431439
configuration_settings_processed[FEATURE_MANAGEMENT_KEY] = {}

sdk/appconfiguration/azure-appconfiguration-provider/azure/appconfiguration/provider/_client_manager.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,20 @@ def load_configuration_settings(
158158

159159
@distributed_trace
160160
def load_feature_flags(
161-
self, feature_flag_selectors: List[SettingSelector], feature_flag_refresh_enabled: bool, **kwargs
162-
) -> Tuple[List[FeatureFlagConfigurationSetting], Dict[Tuple[str, str], str], Dict[str, bool]]:
161+
self,
162+
feature_flag_selectors: List[SettingSelector],
163+
feature_flag_refresh_enabled: bool,
164+
provided_endpoint: str,
165+
**kwargs
166+
) -> Tuple[
167+
List[FeatureFlagConfigurationSetting],
168+
Dict[Tuple[str, str], str],
169+
Dict[str, bool],
170+
]:
163171
feature_flag_sentinel_keys = {}
164172
loaded_feature_flags = []
165173
# Needs to be removed unknown keyword argument for list_configuration_settings
166174
kwargs.pop("sentinel_keys", None)
167-
endpoint = self._client._impl._config.endpoint # pylint: disable=protected-access
168175
filters_used: Dict[str, bool] = {}
169176
for select in feature_flag_selectors:
170177
feature_flags = self._client.list_configuration_settings(
@@ -178,7 +185,7 @@ def load_feature_flags(
178185

179186
feature_flag_value = json.loads(feature_flag.value)
180187

181-
self._feature_flag_telemetry(endpoint, feature_flag, feature_flag_value)
188+
self._feature_flag_telemetry(provided_endpoint, feature_flag, feature_flag_value)
182189
self._feature_flag_appconfig_telemetry(feature_flag, filters_used)
183190

184191
loaded_feature_flags.append(feature_flag_value)
@@ -228,6 +235,7 @@ def refresh_feature_flags(
228235
refresh_on: Mapping[Tuple[str, str], Optional[str]],
229236
feature_flag_selectors: List[SettingSelector],
230237
headers: Dict[str, str],
238+
provided_endpoint: str,
231239
**kwargs
232240
) -> Tuple[bool, Optional[Mapping[Tuple[str, str], Optional[str]]], Optional[List[Any]], Dict[str, bool]]:
233241
"""
@@ -236,6 +244,7 @@ def refresh_feature_flags(
236244
:param Mapping[Tuple[str, str], Optional[str]] refresh_on: The feature flags to check for changes
237245
:param List[SettingSelector] feature_flag_selectors: The selectors to use to load feature flags
238246
:param Mapping[str, str] headers: The headers to use for the request
247+
:param str provided_endpoint: The endpoint provided by the user
239248
240249
:return: A tuple with the first item being true/false if a change is detected. The second item is the updated
241250
value of the feature flag sentinel keys. The third item is the updated feature flags.
@@ -246,7 +255,7 @@ def refresh_feature_flags(
246255
changed = self._check_configuration_setting(key=key, label=label, etag=etag, headers=headers, **kwargs)
247256
if changed:
248257
feature_flags, feature_flag_sentinel_keys, filters_used = self.load_feature_flags(
249-
feature_flag_selectors, True, headers=headers, **kwargs
258+
feature_flag_selectors, True, provided_endpoint, headers=headers, **kwargs
250259
)
251260
return True, feature_flag_sentinel_keys, feature_flags, filters_used
252261
return False, None, None, {}

sdk/appconfiguration/azure-appconfiguration-provider/azure/appconfiguration/provider/_client_manager_base.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
# license information.
55
# -------------------------------------------------------------------------
66
import random
7-
import hashlib
8-
import base64
97
from dataclasses import dataclass
108
from typing import Dict, Mapping, Any, Optional
119
from azure.appconfiguration import ( # type:ignore # pylint:disable=no-name-in-module
@@ -23,7 +21,6 @@
2321
METADATA_KEY,
2422
ETAG_KEY,
2523
FEATURE_FLAG_REFERENCE_KEY,
26-
FEATURE_FLAG_ID_KEY,
2724
)
2825

2926
FALLBACK_CLIENT_REFRESH_EXPIRED_INTERVAL = 3600 # 1 hour in seconds
@@ -36,15 +33,6 @@
3633
class _ConfigurationClientWrapperBase:
3734
endpoint: str
3835

39-
@staticmethod
40-
def _calculate_feature_id(key, label):
41-
basic_value = f"{key}\n"
42-
if label and not label.isspace():
43-
basic_value += f"{label}"
44-
feature_flag_id_hash_bytes = hashlib.sha256(basic_value.encode()).digest()
45-
encoded_flag = base64.urlsafe_b64encode(feature_flag_id_hash_bytes)
46-
return encoded_flag[: encoded_flag.find(b"=")]
47-
4836
def _feature_flag_telemetry(
4937
self, endpoint: str, feature_flag: FeatureFlagConfigurationSetting, feature_flag_value: Dict
5038
):
@@ -60,9 +48,6 @@ def _feature_flag_telemetry(
6048
feature_flag_reference += f"?label={feature_flag.label}"
6149
if feature_flag_value[TELEMETRY_KEY].get("enabled"):
6250
feature_flag_value[TELEMETRY_KEY][METADATA_KEY][FEATURE_FLAG_REFERENCE_KEY] = feature_flag_reference
63-
feature_flag_value[TELEMETRY_KEY][METADATA_KEY][FEATURE_FLAG_ID_KEY] = self._calculate_feature_id(
64-
feature_flag.key, feature_flag.label
65-
)
6651

6752
def _feature_flag_appconfig_telemetry(
6853
self, feature_flag: FeatureFlagConfigurationSetting, filters_used: Dict[str, bool]

sdk/appconfiguration/azure-appconfiguration-provider/azure/appconfiguration/provider/_constants.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
ETAG_KEY = "ETag"
2424
FEATURE_FLAG_REFERENCE_KEY = "FeatureFlagReference"
25-
FEATURE_FLAG_ID_KEY = "FeatureFlagId"
2625

2726
PERCENTAGE_FILTER_NAMES = ["Percentage", "PercentageFilter", "Microsoft.Percentage", "Microsoft.PercentageFilter"]
2827
TIME_WINDOW_FILTER_NAMES = ["TimeWindow", "TimeWindowFilter", "Microsoft.TimeWindow", "Microsoft.TimeWindowFilter"]

sdk/appconfiguration/azure-appconfiguration-provider/azure/appconfiguration/provider/aio/_async_client_manager.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,20 @@ async def load_configuration_settings(
160160

161161
@distributed_trace
162162
async def load_feature_flags(
163-
self, feature_flag_selectors: List[SettingSelector], feature_flag_refresh_enabled: bool, **kwargs
164-
) -> Tuple[List[FeatureFlagConfigurationSetting], Dict[Tuple[str, str], str], Dict[str, bool]]:
163+
self,
164+
feature_flag_selectors: List[SettingSelector],
165+
feature_flag_refresh_enabled: bool,
166+
provided_endpoint: str,
167+
**kwargs
168+
) -> Tuple[
169+
List[FeatureFlagConfigurationSetting],
170+
Dict[Tuple[str, str], str],
171+
Dict[str, bool],
172+
]:
165173
feature_flag_sentinel_keys = {}
166174
loaded_feature_flags = []
167175
# Needs to be removed unknown keyword argument for list_configuration_settings
168176
kwargs.pop("sentinel_keys", None)
169-
endpoint = self._client._impl._config.endpoint # pylint: disable=protected-access
170177
filters_used: Dict[str, bool] = {}
171178
for select in feature_flag_selectors:
172179
feature_flags = self._client.list_configuration_settings(
@@ -180,7 +187,7 @@ async def load_feature_flags(
180187

181188
feature_flag_value = json.loads(feature_flag.value)
182189

183-
self._feature_flag_telemetry(endpoint, feature_flag, feature_flag_value)
190+
self._feature_flag_telemetry(provided_endpoint, feature_flag, feature_flag_value)
184191
self._feature_flag_appconfig_telemetry(feature_flag, filters_used)
185192

186193
loaded_feature_flags.append(feature_flag_value)
@@ -232,6 +239,7 @@ async def refresh_feature_flags(
232239
refresh_on: Mapping[Tuple[str, str], Optional[str]],
233240
feature_flag_selectors: List[SettingSelector],
234241
headers: Dict[str, str],
242+
provided_endpoint: str,
235243
**kwargs
236244
) -> Tuple[bool, Optional[Mapping[Tuple[str, str], Optional[str]]], Optional[List[Any]], Dict[str, bool]]:
237245
"""
@@ -240,6 +248,7 @@ async def refresh_feature_flags(
240248
:param Mapping[Tuple[str, str], Optional[str]] refresh_on: The feature flags to check for changes
241249
:param List[SettingSelector] feature_flag_selectors: The selectors to use to load feature flags
242250
:param Mapping[str, str] headers: The headers to use for the request
251+
:param str provided_endpoint: The endpoint provided by the user
243252
244253
:return: A tuple with the first item being true/false if a change is detected. The second item is the updated
245254
value of the feature flag sentinel keys. The third item is the updated feature flags.
@@ -252,7 +261,7 @@ async def refresh_feature_flags(
252261
)
253262
if changed:
254263
feature_flags, feature_flag_sentinel_keys, filters_used = await self.load_feature_flags(
255-
feature_flag_selectors, True, headers=headers, **kwargs
264+
feature_flag_selectors, True, provided_endpoint, headers=headers, **kwargs
256265
)
257266
return True, feature_flag_sentinel_keys, feature_flags, filters_used
258267
return False, None, None, {}

sdk/appconfiguration/azure-appconfiguration-provider/azure/appconfiguration/provider/aio/_azureappconfigurationproviderasync.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,11 @@ async def refresh(self, **kwargs) -> None: # pylint: disable=too-many-statement
383383
if self._feature_flag_refresh_enabled:
384384
need_ff_refresh, refresh_on_feature_flags, feature_flags, filters_used = (
385385
await client.refresh_feature_flags(
386-
self._refresh_on_feature_flags, self._feature_flag_selectors, headers=headers, **kwargs
386+
self._refresh_on_feature_flags,
387+
self._feature_flag_selectors,
388+
headers,
389+
self._origin_endpoint,
390+
**kwargs,
387391
)
388392
)
389393
if refresh_on_feature_flags:
@@ -442,7 +446,11 @@ async def _load_all(self, **kwargs):
442446
configuration_settings_processed = await self._process_configurations(configuration_settings)
443447
if self._feature_flag_enabled:
444448
feature_flags, feature_flag_sentinel_keys, used_filters = await client.load_feature_flags(
445-
self._feature_flag_selectors, self._feature_flag_refresh_enabled, headers=headers, **kwargs
449+
self._feature_flag_selectors,
450+
self._feature_flag_refresh_enabled,
451+
self._origin_endpoint,
452+
headers=headers,
453+
**kwargs,
446454
)
447455
self._feature_filter_usage = used_filters
448456
configuration_settings_processed[FEATURE_MANAGEMENT_KEY] = {}

0 commit comments

Comments
 (0)