From 7041a97a79494178ee9667e25bafe203eafc650e Mon Sep 17 00:00:00 2001 From: dylan Date: Wed, 19 Nov 2025 17:03:36 -0500 Subject: [PATCH 1/3] format --- posthog/client.py | 30 +++++++++++++++++++----------- posthog/types.py | 1 + 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/posthog/client.py b/posthog/client.py index 85e92eb2..6f728e91 100644 --- a/posthog/client.py +++ b/posthog/client.py @@ -3,7 +3,7 @@ import os import sys from datetime import datetime, timedelta -from typing import Any, Callable, Dict, Optional, Union +from typing import Any, Dict, Optional, Union from typing_extensions import Unpack from uuid import uuid4 @@ -1381,6 +1381,7 @@ def _get_feature_flag_result( flag_result = None flag_details = None request_id = None + evaluated_at = None flag_value = self._locally_evaluate_flag( key, distinct_id, groups, person_properties, group_properties @@ -1405,13 +1406,15 @@ def _get_feature_flag_result( ) elif not only_evaluate_locally: try: - flag_details, request_id = self._get_feature_flag_details_from_server( - key, - distinct_id, - groups, - person_properties, - group_properties, - disable_geoip, + flag_details, request_id, evaluated_at = ( + self._get_feature_flag_details_from_server( + key, + distinct_id, + groups, + person_properties, + group_properties, + disable_geoip, + ) ) flag_result = FeatureFlagResult.from_flag_details( flag_details, override_match_value @@ -1450,6 +1453,7 @@ def _get_feature_flag_result( groups, disable_geoip, request_id, + evaluated_at, flag_details, ) @@ -1653,9 +1657,9 @@ def _get_feature_flag_details_from_server( person_properties: dict[str, str], group_properties: dict[str, str], disable_geoip: Optional[bool], - ) -> tuple[Optional[FeatureFlag], Optional[str]]: + ) -> tuple[Optional[FeatureFlag], Optional[str], Optional[int]]: """ - Calls /flags and returns the flag details and request id + Calls /flags and returns the flag details, request id, and evaluated at timestamp """ resp_data = self.get_flags_decision( distinct_id, @@ -1666,9 +1670,10 @@ def _get_feature_flag_details_from_server( flag_keys_to_evaluate=[key], ) request_id = resp_data.get("requestId") + evaluated_at = resp_data.get("evaluatedAt") flags = resp_data.get("flags") flag_details = flags.get(key) if flags else None - return flag_details, request_id + return flag_details, request_id, evaluated_at def _capture_feature_flag_called( self, @@ -1680,6 +1685,7 @@ def _capture_feature_flag_called( groups: Dict[str, str], disable_geoip: Optional[bool], request_id: Optional[str], + evaluated_at: Optional[int], flag_details: Optional[FeatureFlag], ): feature_flag_reported_key = ( @@ -1703,6 +1709,8 @@ def _capture_feature_flag_called( if request_id: properties["$feature_flag_request_id"] = request_id + if evaluated_at: + properties["$feature_flag_evaluated_at"] = evaluated_at if isinstance(flag_details, FeatureFlag): if flag_details.reason and flag_details.reason.description: properties["$feature_flag_reason"] = flag_details.reason.description diff --git a/posthog/types.py b/posthog/types.py index 951844e2..f706eacc 100644 --- a/posthog/types.py +++ b/posthog/types.py @@ -123,6 +123,7 @@ class FlagsResponse(TypedDict, total=False): errorsWhileComputingFlags: bool requestId: str quotaLimit: Optional[List[str]] + evaluatedAt: Optional[int] class FlagsAndPayloads(TypedDict, total=True): From 3943f15978f59e58990fcfe28eedfaff281b8d68 Mon Sep 17 00:00:00 2001 From: dylan Date: Mon, 24 Nov 2025 15:44:35 -0500 Subject: [PATCH 2/3] update tests --- posthog/test/test_feature_flags.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/posthog/test/test_feature_flags.py b/posthog/test/test_feature_flags.py index 9a4c1765..689c0b6a 100644 --- a/posthog/test/test_feature_flags.py +++ b/posthog/test/test_feature_flags.py @@ -3802,6 +3802,7 @@ def test_capture_is_called_with_flag_details(self, patch_flags, patch_capture): }, }, "requestId": "18043bf7-9cf6-44cd-b959-9662ee20d371", + "evaluatedAt": 1234567890, } client = Client(FAKE_TEST_API_KEY) @@ -3821,6 +3822,7 @@ def test_capture_is_called_with_flag_details(self, patch_flags, patch_capture): "$feature_flag_id": 23, "$feature_flag_version": 42, "$feature_flag_request_id": "18043bf7-9cf6-44cd-b959-9662ee20d371", + "$feature_flag_evaluated_at": 1234567890, }, groups={}, disable_geoip=None, From be516436bd92035183ba340c9f436127068b0144 Mon Sep 17 00:00:00 2001 From: dylan Date: Mon, 1 Dec 2025 21:56:20 -0500 Subject: [PATCH 3/3] bump version --- CHANGELOG.md | 4 ++++ posthog/version.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d646a6e5..a5a6cf56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 6.8.0 - 2025-12-01 + +- feat: add `$feature_flag_evaluated_at` properties to `$feature_flag_called` events + # 6.7.5 - 2025-09-16 - feat: Django middleware now supports async request handling. diff --git a/posthog/version.py b/posthog/version.py index 034d7acf..c3dd9e0b 100644 --- a/posthog/version.py +++ b/posthog/version.py @@ -1,4 +1,4 @@ -VERSION = "6.7.5" +VERSION = "6.8.0" if __name__ == "__main__": print(VERSION, end="") # noqa: T201