2121from ldclient .impl .listeners import Listeners
2222from ldclient .impl .repeating_task import RepeatingTask
2323from ldclient .impl .rwlock import ReadWriteLock
24- from ldclient .impl .util import _LD_FD_FALLBACK_HEADER , _Fail , log
24+ from ldclient .impl .util import (
25+ _LD_ENVID_HEADER ,
26+ _LD_FD_FALLBACK_HEADER ,
27+ _Fail ,
28+ log
29+ )
2530from ldclient .interfaces import (
2631 DataSourceErrorInfo ,
2732 DataSourceErrorKind ,
@@ -95,6 +100,7 @@ def __init__(
95100 self ._lock = ReadWriteLock ()
96101 self ._active_synchronizer : Optional [Synchronizer ] = None
97102 self ._threads : List [Thread ] = []
103+ self ._environment_id : Optional [str ] = None
98104
99105 # Track configuration
100106 self ._configured_with_data_sources = (
@@ -216,6 +222,8 @@ def _run_initializers(self, set_on_ready: Event) -> bool:
216222
217223 if isinstance (basis_result , _Fail ):
218224 log .warning ("Initializer %s failed: %s" , initializer .name , basis_result .error )
225+ if basis_result .headers is not None :
226+ self ._record_environment_id (basis_result .headers .get (_LD_ENVID_HEADER ))
219227 # An error response can still carry the FDv1 fallback directive.
220228 if basis_result .headers is not None and \
221229 basis_result .headers .get (_LD_FD_FALLBACK_HEADER ) == 'true' :
@@ -240,6 +248,8 @@ def _run_initializers(self, set_on_ready: Event) -> bool:
240248 basis = basis_result .value
241249 log .info ("Initialized via %s" , initializer .name )
242250
251+ self ._record_environment_id (basis .environment_id )
252+
243253 # Apply the basis to the store
244254 self ._store .apply (basis .change_set , basis .persist )
245255
@@ -412,6 +422,8 @@ def reader(self: 'FDv2'):
412422 if self ._stop_event .is_set ():
413423 return ConditionDirective .FALLBACK
414424
425+ self ._record_environment_id (update .environment_id )
426+
415427 # Handle the update
416428 if update .change_set is not None :
417429 self ._store .apply (update .change_set , True )
@@ -496,6 +508,19 @@ def _persistent_store_outage_recovery(self, data_store_status: DataStoreStatus):
496508 if err is not None :
497509 log .error ("Failed to reinitialize data store" , exc_info = err )
498510
511+ def _record_environment_id (self , environment_id : Optional [str ]):
512+ if environment_id is None :
513+ return
514+
515+ with self ._lock .write ():
516+ self ._environment_id = environment_id
517+
518+ @property
519+ def environment_id (self ) -> Optional [str ]:
520+ """Get the environment ID reported by LaunchDarkly, if known."""
521+ with self ._lock .read ():
522+ return self ._environment_id
523+
499524 @property
500525 def store (self ) -> ReadOnlyStore :
501526 """Get the underlying store for flag evaluation."""
0 commit comments