@@ -17,6 +17,7 @@ def mock_get_meter(monkeypatch):
1717 "feature_flag.evaluation.error_total" : Mock (spec = metrics .Counter ),
1818 "feature_flag.evaluation.success_total" : Mock (spec = metrics .Counter ),
1919 "feature_flag.evaluation.request_total" : Mock (spec = metrics .Counter ),
20+ "feature_flag.evaluation.duration" : Mock (spec = metrics .Histogram ),
2021 }
2122
2223 def side_effect (* args , ** kwargs ):
@@ -26,6 +27,7 @@ def side_effect(*args, **kwargs):
2627 spec = metrics .Meter ,
2728 create_up_down_counter = side_effect ,
2829 create_counter = side_effect ,
30+ create_histogram = side_effect ,
2931 )
3032 monkeypatch .setattr (metrics , "get_meter" , lambda name : mock_meter )
3133
@@ -211,3 +213,36 @@ def test_metric_finally_after(mock_get_meter):
211213 mock_counters ["feature_flag.evaluation.success_total" ].add .assert_not_called ()
212214 mock_counters ["feature_flag.evaluation.request_total" ].add .assert_not_called ()
213215 mock_counters ["feature_flag.evaluation.error_total" ].add .assert_not_called ()
216+
217+
218+ def test_metric_duration (mock_get_meter ):
219+ _ , mock_counters = mock_get_meter
220+ hook = MetricsHook ()
221+ hook_context = HookContext (
222+ flag_key = "flag_key" ,
223+ flag_type = FlagType .BOOLEAN ,
224+ default_value = False ,
225+ evaluation_context = EvaluationContext (),
226+ provider_metadata = Metadata (name = "test-provider" ),
227+ )
228+ details = FlagEvaluationDetails (
229+ flag_key = "flag_key" ,
230+ value = True ,
231+ variant = "enabled" ,
232+ reason = Reason .TARGETING_MATCH ,
233+ error_code = None ,
234+ error_message = None ,
235+ )
236+ hook .before (hook_context , hints = {})
237+ hook .finally_after (hook_context , details , hints = {})
238+
239+ call_args = mock_counters ["feature_flag.evaluation.duration" ].record .call_args
240+ assert call_args is not None
241+ elapsed , attributes = call_args .args
242+ assert isinstance (elapsed , float )
243+ assert attributes == {
244+ "feature_flag.key" : "flag_key" ,
245+ "feature_flag.provider.name" : "test-provider" ,
246+ }
247+ mock_counters ["feature_flag.evaluation.success_total" ].add .assert_not_called ()
248+ mock_counters ["feature_flag.evaluation.error_total" ].add .assert_not_called ()
0 commit comments