Skip to content

Commit 0709c1b

Browse files
author
Pranjal Vachaspati
committed
Allow not sending an evaluation event when evaluating a flag
1 parent 7bb5378 commit 0709c1b

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

ldclient/client.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -495,23 +495,25 @@ def flush(self):
495495
return
496496
return self._event_processor.flush()
497497

498-
def variation(self, key: str, context: Context, default: Any) -> Any:
498+
def variation(self, key: str, context: Context, default: Any, send_events: bool = True) -> Any:
499499
"""Calculates the value of a feature flag for a given context.
500500
501501
:param key: the unique key for the feature flag
502502
:param context: the evaluation context
503503
:param default: the default value of the flag, to be used if the value is not
504504
available from LaunchDarkly
505+
:param send_events: whether to send evaluation events to LaunchDarkly. Defaults to True.
506+
Set to False to evaluate the flag without generating analytics events.
505507
:return: the variation for the given context, or the ``default`` value if the flag cannot be evaluated
506508
"""
507509

508510
def evaluate():
509-
detail, _ = self._evaluate_internal(key, context, default, self._event_factory_default)
511+
detail, _ = self._evaluate_internal(key, context, default, self._event_factory_default, send_events)
510512
return _EvaluationWithHookResult(evaluation_detail=detail)
511513

512514
return self.__evaluate_with_hooks(key=key, context=context, default_value=default, method="variation", block=evaluate).evaluation_detail.value
513515

514-
def variation_detail(self, key: str, context: Context, default: Any) -> EvaluationDetail:
516+
def variation_detail(self, key: str, context: Context, default: Any, send_events: bool = True) -> EvaluationDetail:
515517
"""Calculates the value of a feature flag for a given context, and returns an object that
516518
describes the way the value was determined.
517519
@@ -522,12 +524,14 @@ def variation_detail(self, key: str, context: Context, default: Any) -> Evaluati
522524
:param context: the evaluation context
523525
:param default: the default value of the flag, to be used if the value is not
524526
available from LaunchDarkly
527+
:param send_events: whether to send evaluation events to LaunchDarkly. Defaults to True.
528+
Set to False to evaluate the flag without generating analytics events.
525529
:return: an :class:`ldclient.evaluation.EvaluationDetail` object that includes the feature
526530
flag value and evaluation reason
527531
"""
528532

529533
def evaluate():
530-
detail, _ = self._evaluate_internal(key, context, default, self._event_factory_with_reasons)
534+
detail, _ = self._evaluate_internal(key, context, default, self._event_factory_with_reasons, send_events)
531535
return _EvaluationWithHookResult(evaluation_detail=detail)
532536

533537
return self.__evaluate_with_hooks(key=key, context=context, default_value=default, method="variation_detail", block=evaluate).evaluation_detail
@@ -562,7 +566,7 @@ def evaluate():
562566
hook_result = self.__evaluate_with_hooks(key=key, context=context, default_value=default_stage.value, method="migration_variation", block=evaluate)
563567
return hook_result.results['default_stage'], hook_result.results['tracker']
564568

565-
def _evaluate_internal(self, key: str, context: Context, default: Any, event_factory) -> Tuple[EvaluationDetail, Optional[FeatureFlag]]:
569+
def _evaluate_internal(self, key: str, context: Context, default: Any, event_factory, send_events: bool = True) -> Tuple[EvaluationDetail, Optional[FeatureFlag]]:
566570
default = self._config.get_default(key, default)
567571

568572
if self._config.offline:
@@ -574,7 +578,8 @@ def _evaluate_internal(self, key: str, context: Context, default: Any, event_fac
574578
else:
575579
log.warning("Feature Flag evaluation attempted before client has initialized! Feature store unavailable - returning default: " + str(default) + " for feature key: " + key)
576580
reason = error_reason('CLIENT_NOT_READY')
577-
self._send_event(event_factory.new_unknown_flag_event(key, context, default, reason))
581+
if send_events:
582+
self._send_event(event_factory.new_unknown_flag_event(key, context, default, reason))
578583
return EvaluationDetail(default, None, reason), None
579584

580585
if not context.valid:
@@ -587,27 +592,32 @@ def _evaluate_internal(self, key: str, context: Context, default: Any, event_fac
587592
log.error("Unexpected error while retrieving feature flag \"%s\": %s" % (key, repr(e)))
588593
log.debug(traceback.format_exc())
589594
reason = error_reason('EXCEPTION')
590-
self._send_event(event_factory.new_unknown_flag_event(key, context, default, reason))
595+
if send_events:
596+
self._send_event(event_factory.new_unknown_flag_event(key, context, default, reason))
591597
return EvaluationDetail(default, None, reason), None
592598
if not flag:
593599
reason = error_reason('FLAG_NOT_FOUND')
594-
self._send_event(event_factory.new_unknown_flag_event(key, context, default, reason))
600+
if send_events:
601+
self._send_event(event_factory.new_unknown_flag_event(key, context, default, reason))
595602
return EvaluationDetail(default, None, reason), None
596603
else:
597604
try:
598605
result = self._evaluator.evaluate(flag, context, event_factory)
599-
for event in result.events or []:
600-
self._send_event(event)
606+
if send_events:
607+
for event in result.events or []:
608+
self._send_event(event)
601609
detail = result.detail
602610
if detail.is_default_value():
603611
detail = EvaluationDetail(default, None, detail.reason)
604-
self._send_event(event_factory.new_eval_event(flag, context, detail, default))
612+
if send_events:
613+
self._send_event(event_factory.new_eval_event(flag, context, detail, default))
605614
return detail, flag
606615
except Exception as e:
607616
log.error("Unexpected error while evaluating feature flag \"%s\": %s" % (key, repr(e)))
608617
log.debug(traceback.format_exc())
609618
reason = error_reason('EXCEPTION')
610-
self._send_event(event_factory.new_default_event(flag, context, default, reason))
619+
if send_events:
620+
self._send_event(event_factory.new_default_event(flag, context, default, reason))
611621
return EvaluationDetail(default, None, reason), flag
612622

613623
def all_flags_state(self, context: Context, **kwargs) -> FeatureFlagsState:

0 commit comments

Comments
 (0)