From 275252009c7f2704d6f293e6fa1111fdd462d77b Mon Sep 17 00:00:00 2001 From: Josh Bonczkowski Date: Fri, 13 Mar 2026 13:58:20 -0400 Subject: [PATCH] Addressing feedback. - When an error occurs, still check if the periodic supportability metric should be emitted - Added a check to ensure the extension is ready in the error handler to match _process_success --- litellm/integrations/newrelic/newrelic.py | 5 ++++ .../integrations/newrelic/test_newrelic.py | 24 ++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/litellm/integrations/newrelic/newrelic.py b/litellm/integrations/newrelic/newrelic.py index f935ca5a22a..e01bd104fcd 100644 --- a/litellm/integrations/newrelic/newrelic.py +++ b/litellm/integrations/newrelic/newrelic.py @@ -595,6 +595,11 @@ class NewRelicLogger(CustomLogger): def _record_error_metric(self): """Record error metric to New Relic.""" try: + if not self.enabled: + return + + self._check_and_emit_periodic_metric() + import newrelic.agent app = newrelic.agent.application() diff --git a/tests/test_litellm/integrations/newrelic/test_newrelic.py b/tests/test_litellm/integrations/newrelic/test_newrelic.py index 8490ed0d026..29334c1f718 100644 --- a/tests/test_litellm/integrations/newrelic/test_newrelic.py +++ b/tests/test_litellm/integrations/newrelic/test_newrelic.py @@ -415,26 +415,38 @@ class TestProcessSuccess: class TestRecordErrorMetric: + def setup_method(self): + self.logger = make_logger() + def test_calls_record_custom_metric(self): - logger = make_logger() mock_app = MagicMock() mock_app.enabled = True - with patch("newrelic.agent.application", return_value=mock_app): - logger._record_error_metric() + with patch.object(self.logger, "_check_and_emit_periodic_metric"): + with patch("newrelic.agent.application", return_value=mock_app): + self.logger._record_error_metric() mock_app.record_custom_metric.assert_called_once_with("LLM/LiteLLM/Error", 1) def test_skips_when_app_disabled(self): - logger = make_logger() mock_app = MagicMock() mock_app.enabled = False - with patch("newrelic.agent.application", return_value=mock_app): - logger._record_error_metric() + with patch.object(self.logger, "_check_and_emit_periodic_metric"): + with patch("newrelic.agent.application", return_value=mock_app): + self.logger._record_error_metric() mock_app.record_custom_metric.assert_not_called() + def test_calls_check_and_emit_periodic_metric(self): + with patch.object( + self.logger, "_check_and_emit_periodic_metric" + ) as mock_periodic: + with patch("newrelic.agent.application", return_value=MagicMock()): + self.logger._record_error_metric() + + mock_periodic.assert_called_once() + # --------------------------------------------------------------------------- # 9. _emit_supportability_metric