diff --git a/litellm/caching.py b/litellm/caching.py index d1f3387ee4..c1a4aa9b6a 100644 --- a/litellm/caching.py +++ b/litellm/caching.py @@ -26,6 +26,16 @@ def print_verbose(print_statement): pass +def _get_parent_otel_span_from_kwargs(kwargs: Optional[dict] = None): + try: + if kwargs is None: + return None + _metadata = kwargs.get("metadata") or {} + return _metadata.get("litellm_parent_otel_span") + except: + return None + + class BaseCache: def set_cache(self, key, value, **kwargs): raise NotImplementedError @@ -233,6 +243,9 @@ class RedisCache(BaseCache): service=ServiceTypes.REDIS, duration=_duration, call_type="increment_cache", + start_time=start_time, + end_time=end_time, + parent_otel_span=_get_parent_otel_span_from_kwargs(kwargs), ) ) return result @@ -276,6 +289,9 @@ class RedisCache(BaseCache): service=ServiceTypes.REDIS, duration=_duration, call_type="async_scan_iter", + start_time=start_time, + end_time=end_time, + # parent_otel_span=_get_parent_otel_span_from_kwargs(kwargs) ) ) # DO NOT SLOW DOWN CALL B/C OF THIS return keys @@ -331,6 +347,9 @@ class RedisCache(BaseCache): service=ServiceTypes.REDIS, duration=_duration, call_type="async_set_cache", + start_time=start_time, + end_time=end_time, + parent_otel_span=_get_parent_otel_span_from_kwargs(kwargs), ) ) except Exception as e: @@ -389,6 +408,9 @@ class RedisCache(BaseCache): service=ServiceTypes.REDIS, duration=_duration, call_type="async_set_cache_pipeline", + start_time=start_time, + end_time=end_time, + # parent_otel_span=_get_parent_otel_span_from_kwargs(kwargs) ) ) return results @@ -434,6 +456,9 @@ class RedisCache(BaseCache): service=ServiceTypes.REDIS, duration=_duration, call_type="async_increment", + start_time=start_time, + end_time=end_time, + parent_otel_span=_get_parent_otel_span_from_kwargs(kwargs), ) ) return result @@ -540,6 +565,9 @@ class RedisCache(BaseCache): service=ServiceTypes.REDIS, duration=_duration, call_type="async_get_cache", + start_time=start_time, + end_time=end_time, + parent_otel_span=_get_parent_otel_span_from_kwargs(kwargs), ) ) return response @@ -583,6 +611,9 @@ class RedisCache(BaseCache): service=ServiceTypes.REDIS, duration=_duration, call_type="async_batch_get_cache", + start_time=start_time, + end_time=end_time, + # parent_otel_span=_get_parent_otel_span_from_kwargs(kwargs) ) ) diff --git a/litellm/integrations/opentelemetry.py b/litellm/integrations/opentelemetry.py index 089b67368a..deee0a2f26 100644 --- a/litellm/integrations/opentelemetry.py +++ b/litellm/integrations/opentelemetry.py @@ -100,19 +100,32 @@ class OpenTelemetry(CustomLogger): from datetime import datetime from opentelemetry.trace import Status, StatusCode + _start_time_ns = start_time + _end_time_ns = end_time + + if isinstance(start_time, float): + _start_time_ns = int(int(start_time) * 1e9) + else: + _start_time_ns = self._to_ns(start_time) + + if isinstance(end_time, float): + _end_time_ns = int(int(end_time) * 1e9) + else: + _end_time_ns = self._to_ns(end_time) + if parent_otel_span is not None: _span_name = payload.service service_logging_span = self.tracer.start_span( name=_span_name, context=trace.set_span_in_context(parent_otel_span), - start_time=self._to_ns(start_time), + start_time=_start_time_ns, ) service_logging_span.set_attribute(key="call_type", value=payload.call_type) service_logging_span.set_attribute( key="service", value=payload.service.value ) service_logging_span.set_status(Status(StatusCode.OK)) - service_logging_span.end(end_time=self._to_ns(end_time)) + service_logging_span.end(end_time=_end_time_ns) async def async_post_call_failure_hook( self, original_exception: Exception, user_api_key_dict: UserAPIKeyAuth