Skip to content

Commit 244f26e

Browse files
committed
Address PR review feedback
- Fix fallback logic to only trigger on actual exceptions, not when errors_while_computing or flag_missing is set from a successful API response - Change log.exception() to log.warning() for expected operational errors (quota limits, timeouts, connection errors, API errors) to reduce log noise - Keep log.exception() only for truly unexpected errors (unknown_error) - Extract stale cache fallback into _get_stale_flag_fallback() helper method
1 parent b4d67bf commit 244f26e

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

posthog/client.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1509,6 +1509,19 @@ def feature_enabled(
15091509
return None
15101510
return bool(response)
15111511

1512+
def _get_stale_flag_fallback(
1513+
self, distinct_id: ID_TYPES, key: str
1514+
) -> Optional[FeatureFlagResult]:
1515+
"""Returns a stale cached flag value if available, otherwise None."""
1516+
if self.flag_cache:
1517+
stale_result = self.flag_cache.get_stale_cached_flag(distinct_id, key)
1518+
if stale_result:
1519+
self.log.info(
1520+
f"[FEATURE FLAGS] Using stale cached value for flag {key}"
1521+
)
1522+
return stale_result
1523+
return None
1524+
15121525
def _get_feature_flag_result(
15131526
self,
15141527
key: str,
@@ -1596,32 +1609,25 @@ def _get_feature_flag_result(
15961609
f"Successfully computed flag remotely: #{key} -> #{flag_result}"
15971610
)
15981611
except QuotaLimitError as e:
1599-
self.log.exception(f"[FEATURE FLAGS] Quota limit exceeded: {e}")
1612+
self.log.warning(f"[FEATURE FLAGS] Quota limit exceeded: {e}")
16001613
feature_flag_error = "quota_limited"
1614+
flag_result = self._get_stale_flag_fallback(distinct_id, key)
16011615
except RequestsTimeout as e:
1602-
self.log.exception(f"[FEATURE FLAGS] Request timed out: {e}")
1616+
self.log.warning(f"[FEATURE FLAGS] Request timed out: {e}")
16031617
feature_flag_error = "timeout"
1618+
flag_result = self._get_stale_flag_fallback(distinct_id, key)
16041619
except RequestsConnectionError as e:
1605-
self.log.exception(f"[FEATURE FLAGS] Connection error: {e}")
1620+
self.log.warning(f"[FEATURE FLAGS] Connection error: {e}")
16061621
feature_flag_error = "connection_error"
1622+
flag_result = self._get_stale_flag_fallback(distinct_id, key)
16071623
except APIError as e:
1608-
self.log.exception(f"[FEATURE FLAGS] API error: {e}")
1624+
self.log.warning(f"[FEATURE FLAGS] API error: {e}")
16091625
feature_flag_error = f"api_error_{e.status}"
1626+
flag_result = self._get_stale_flag_fallback(distinct_id, key)
16101627
except Exception as e:
16111628
self.log.exception(f"[FEATURE FLAGS] Unable to get flag remotely: {e}")
16121629
feature_flag_error = "unknown_error"
1613-
1614-
if feature_flag_error:
1615-
# Fallback to cached value if remote evaluation fails
1616-
if self.flag_cache:
1617-
stale_result = self.flag_cache.get_stale_cached_flag(
1618-
distinct_id, key
1619-
)
1620-
if stale_result:
1621-
self.log.info(
1622-
f"[FEATURE FLAGS] Using stale cached value for flag {key}"
1623-
)
1624-
flag_result = stale_result
1630+
flag_result = self._get_stale_flag_fallback(distinct_id, key)
16251631

16261632
if send_feature_flag_events:
16271633
self._capture_feature_flag_called(

0 commit comments

Comments
 (0)