Skip to content

Commit 4780075

Browse files
committed
feat(opentelemetry): use generation_name for span naming in logging method
1 parent 65532e5 commit 4780075

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

litellm/integrations/opentelemetry.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,9 +575,16 @@ def _maybe_log_raw_request(
575575
if litellm.turn_off_message_logging or not self.message_logging:
576576
return
577577

578+
litellm_params = kwargs.get("litellm_params", {})
579+
metadata = litellm_params.get("metadata", {})
580+
generation_name = metadata.get("generation_name")
581+
582+
raw_span_name = generation_name if generation_name else RAW_REQUEST_SPAN_NAME
583+
584+
578585
otel_tracer: Tracer = self.get_tracer_to_use_for_request(kwargs)
579586
raw_span = otel_tracer.start_span(
580-
name=RAW_REQUEST_SPAN_NAME,
587+
name=raw_span_name,
581588
start_time=self._to_ns(start_time),
582589
context=trace.set_span_in_context(parent_span),
583590
)
@@ -1165,6 +1172,13 @@ def _to_ns(self, dt):
11651172
return int(dt.timestamp() * 1e9)
11661173

11671174
def _get_span_name(self, kwargs):
1175+
litellm_params = kwargs.get("litellm_params", {})
1176+
metadata = litellm_params.get("metadata", {})
1177+
generation_name = metadata.get("generation_name")
1178+
1179+
if generation_name:
1180+
return generation_name
1181+
11681182
return LITELLM_REQUEST_SPAN_NAME
11691183

11701184
def get_traceparent_from_header(self, headers):

tests/test_litellm/integrations/test_opentelemetry.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,3 +751,58 @@ def test_handle_success_spans_and_metrics(self):
751751
# ─── no events when only metrics enabled ─────────────────────────────────
752752
logs = log_exporter.get_finished_logs()
753753
self.assertFalse(logs, "Did not expect any logs")
754+
755+
def test_get_span_name_with_generation_name(self):
756+
"""Test _get_span_name returns generation_name when present"""
757+
otel = OpenTelemetry()
758+
kwargs = {
759+
"litellm_params": {
760+
"metadata": {
761+
"generation_name": "custom_span"
762+
}
763+
}
764+
}
765+
result = otel._get_span_name(kwargs)
766+
self.assertEqual(result, "custom_span")
767+
768+
def test_get_span_name_without_generation_name(self):
769+
"""Test _get_span_name returns default when generation_name missing"""
770+
from litellm.integrations.opentelemetry import LITELLM_REQUEST_SPAN_NAME
771+
772+
otel = OpenTelemetry()
773+
kwargs = {"litellm_params": {"metadata": {}}}
774+
result = otel._get_span_name(kwargs)
775+
self.assertEqual(result, LITELLM_REQUEST_SPAN_NAME)
776+
777+
@patch('litellm.turn_off_message_logging', False)
778+
def test_maybe_log_raw_request_creates_span(self):
779+
"""Test _maybe_log_raw_request creates span when logging enabled"""
780+
from litellm.integrations.opentelemetry import RAW_REQUEST_SPAN_NAME
781+
782+
otel = OpenTelemetry()
783+
otel.message_logging = True
784+
785+
mock_tracer = MagicMock()
786+
mock_span = MagicMock()
787+
mock_tracer.start_span.return_value = mock_span
788+
otel.get_tracer_to_use_for_request = MagicMock(return_value=mock_tracer)
789+
otel.set_raw_request_attributes = MagicMock()
790+
otel._to_ns = MagicMock(return_value=1234567890)
791+
792+
kwargs = {"litellm_params": {"metadata": {}}}
793+
otel._maybe_log_raw_request(kwargs, {}, datetime.now(), datetime.now(), MagicMock())
794+
795+
mock_tracer.start_span.assert_called_once()
796+
self.assertEqual(mock_tracer.start_span.call_args[1]['name'], RAW_REQUEST_SPAN_NAME)
797+
798+
@patch('litellm.turn_off_message_logging', True)
799+
def test_maybe_log_raw_request_skips_when_logging_disabled(self):
800+
"""Test _maybe_log_raw_request skips when logging disabled"""
801+
otel = OpenTelemetry()
802+
mock_tracer = MagicMock()
803+
otel.get_tracer_to_use_for_request = MagicMock(return_value=mock_tracer)
804+
805+
kwargs = {"litellm_params": {"metadata": {}}}
806+
otel._maybe_log_raw_request(kwargs, {}, datetime.now(), datetime.now(), MagicMock())
807+
808+
mock_tracer.start_span.assert_not_called()

0 commit comments

Comments
 (0)