openlit 1.34.25__tar.gz → 1.34.26__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. {openlit-1.34.25 → openlit-1.34.26}/PKG-INFO +1 -1
  2. {openlit-1.34.25 → openlit-1.34.26}/pyproject.toml +1 -1
  3. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/chroma/__init__.py +1 -1
  4. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/chroma/chroma.py +6 -8
  5. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/chroma/utils.py +48 -3
  6. openlit-1.34.26/src/openlit/instrumentation/pinecone/__init__.py +78 -0
  7. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/pinecone/async_pinecone.py +6 -8
  8. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/pinecone/pinecone.py +6 -8
  9. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/pinecone/utils.py +41 -1
  10. openlit-1.34.26/src/openlit/instrumentation/qdrant/__init__.py +80 -0
  11. openlit-1.34.26/src/openlit/instrumentation/qdrant/async_qdrant.py +55 -0
  12. openlit-1.34.26/src/openlit/instrumentation/qdrant/qdrant.py +55 -0
  13. openlit-1.34.26/src/openlit/instrumentation/qdrant/utils.py +328 -0
  14. openlit-1.34.25/src/openlit/instrumentation/pinecone/__init__.py +0 -174
  15. openlit-1.34.25/src/openlit/instrumentation/qdrant/__init__.py +0 -295
  16. openlit-1.34.25/src/openlit/instrumentation/qdrant/async_qdrant.py +0 -267
  17. openlit-1.34.25/src/openlit/instrumentation/qdrant/qdrant.py +0 -274
  18. {openlit-1.34.25 → openlit-1.34.26}/LICENSE +0 -0
  19. {openlit-1.34.25 → openlit-1.34.26}/README.md +0 -0
  20. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/__helpers.py +0 -0
  21. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/__init__.py +0 -0
  22. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/evals/__init__.py +0 -0
  23. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/evals/all.py +0 -0
  24. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/evals/bias_detection.py +0 -0
  25. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/evals/hallucination.py +0 -0
  26. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/evals/toxicity.py +0 -0
  27. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/evals/utils.py +0 -0
  28. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/guard/__init__.py +0 -0
  29. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/guard/all.py +0 -0
  30. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/guard/prompt_injection.py +0 -0
  31. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/guard/restrict_topic.py +0 -0
  32. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/guard/sensitive_topic.py +0 -0
  33. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/guard/utils.py +0 -0
  34. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ag2/__init__.py +0 -0
  35. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ag2/ag2.py +0 -0
  36. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ag2/async_ag2.py +0 -0
  37. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ag2/utils.py +0 -0
  38. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ai21/__init__.py +0 -0
  39. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ai21/ai21.py +0 -0
  40. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ai21/async_ai21.py +0 -0
  41. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ai21/utils.py +0 -0
  42. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/anthropic/__init__.py +0 -0
  43. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/anthropic/anthropic.py +0 -0
  44. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/anthropic/async_anthropic.py +0 -0
  45. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/anthropic/utils.py +0 -0
  46. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/assemblyai/__init__.py +0 -0
  47. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/assemblyai/assemblyai.py +0 -0
  48. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/assemblyai/utils.py +0 -0
  49. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/astra/__init__.py +0 -0
  50. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/astra/astra.py +0 -0
  51. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/astra/async_astra.py +0 -0
  52. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/astra/utils.py +0 -0
  53. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/azure_ai_inference/__init__.py +0 -0
  54. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/azure_ai_inference/async_azure_ai_inference.py +0 -0
  55. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/azure_ai_inference/azure_ai_inference.py +0 -0
  56. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/azure_ai_inference/utils.py +0 -0
  57. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/bedrock/__init__.py +0 -0
  58. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/bedrock/bedrock.py +0 -0
  59. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/bedrock/utils.py +0 -0
  60. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/cohere/__init__.py +0 -0
  61. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/cohere/async_cohere.py +0 -0
  62. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/cohere/cohere.py +0 -0
  63. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/cohere/utils.py +0 -0
  64. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/controlflow/__init__.py +0 -0
  65. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/controlflow/controlflow.py +0 -0
  66. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/crawl4ai/__init__.py +0 -0
  67. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/crawl4ai/async_crawl4ai.py +0 -0
  68. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/crawl4ai/crawl4ai.py +0 -0
  69. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/crewai/__init__.py +0 -0
  70. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/crewai/crewai.py +0 -0
  71. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/dynamiq/__init__.py +0 -0
  72. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/dynamiq/dynamiq.py +0 -0
  73. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/elevenlabs/__init__.py +0 -0
  74. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/elevenlabs/async_elevenlabs.py +0 -0
  75. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/elevenlabs/elevenlabs.py +0 -0
  76. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/elevenlabs/utils.py +0 -0
  77. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/embedchain/__init__.py +0 -0
  78. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/embedchain/embedchain.py +0 -0
  79. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/firecrawl/__init__.py +0 -0
  80. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/firecrawl/firecrawl.py +0 -0
  81. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/google_ai_studio/__init__.py +0 -0
  82. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/google_ai_studio/async_google_ai_studio.py +0 -0
  83. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/google_ai_studio/google_ai_studio.py +0 -0
  84. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/google_ai_studio/utils.py +0 -0
  85. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/gpt4all/__init__.py +0 -0
  86. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/gpt4all/gpt4all.py +0 -0
  87. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/gpt4all/utils.py +0 -0
  88. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/gpu/__init__.py +0 -0
  89. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/groq/__init__.py +0 -0
  90. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/groq/async_groq.py +0 -0
  91. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/groq/groq.py +0 -0
  92. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/groq/utils.py +0 -0
  93. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/haystack/__init__.py +0 -0
  94. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/haystack/haystack.py +0 -0
  95. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/julep/__init__.py +0 -0
  96. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/julep/async_julep.py +0 -0
  97. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/julep/julep.py +0 -0
  98. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/langchain/__init__.py +0 -0
  99. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/langchain/async_langchain.py +0 -0
  100. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/langchain/langchain.py +0 -0
  101. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/langchain/utils.py +0 -0
  102. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/langchain_community/__init__.py +0 -0
  103. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/langchain_community/async_langchain_community.py +0 -0
  104. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/langchain_community/langchain_community.py +0 -0
  105. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/langchain_community/utils.py +0 -0
  106. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/letta/__init__.py +0 -0
  107. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/letta/letta.py +0 -0
  108. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/litellm/__init__.py +0 -0
  109. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/litellm/async_litellm.py +0 -0
  110. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/litellm/litellm.py +0 -0
  111. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/litellm/utils.py +0 -0
  112. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/llamaindex/__init__.py +0 -0
  113. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/llamaindex/llamaindex.py +0 -0
  114. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/mem0/__init__.py +0 -0
  115. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/mem0/mem0.py +0 -0
  116. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/milvus/__init__.py +0 -0
  117. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/milvus/milvus.py +0 -0
  118. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/mistral/__init__.py +0 -0
  119. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/mistral/async_mistral.py +0 -0
  120. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/mistral/mistral.py +0 -0
  121. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/mistral/utils.py +0 -0
  122. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/multion/__init__.py +0 -0
  123. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/multion/async_multion.py +0 -0
  124. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/multion/multion.py +0 -0
  125. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ollama/__init__.py +0 -0
  126. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ollama/async_ollama.py +0 -0
  127. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ollama/ollama.py +0 -0
  128. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/ollama/utils.py +0 -0
  129. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/openai/__init__.py +0 -0
  130. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/openai/async_openai.py +0 -0
  131. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/openai/openai.py +0 -0
  132. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/openai/utils.py +0 -0
  133. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/openai_agents/__init__.py +0 -0
  134. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/openai_agents/openai_agents.py +0 -0
  135. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/phidata/__init__.py +0 -0
  136. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/phidata/phidata.py +0 -0
  137. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/premai/__init__.py +0 -0
  138. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/premai/premai.py +0 -0
  139. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/premai/utils.py +0 -0
  140. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/pydantic_ai/__init__.py +0 -0
  141. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/pydantic_ai/pydantic_ai.py +0 -0
  142. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/pydantic_ai/utils.py +0 -0
  143. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/reka/__init__.py +0 -0
  144. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/reka/async_reka.py +0 -0
  145. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/reka/reka.py +0 -0
  146. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/reka/utils.py +0 -0
  147. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/together/__init__.py +0 -0
  148. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/together/async_together.py +0 -0
  149. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/together/together.py +0 -0
  150. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/together/utils.py +0 -0
  151. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/transformers/__init__.py +0 -0
  152. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/transformers/transformers.py +0 -0
  153. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/transformers/utils.py +0 -0
  154. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/vertexai/__init__.py +0 -0
  155. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/vertexai/async_vertexai.py +0 -0
  156. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/vertexai/utils.py +0 -0
  157. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/vertexai/vertexai.py +0 -0
  158. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/vllm/__init__.py +0 -0
  159. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/vllm/utils.py +0 -0
  160. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/instrumentation/vllm/vllm.py +0 -0
  161. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/otel/events.py +0 -0
  162. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/otel/metrics.py +0 -0
  163. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/otel/tracing.py +0 -0
  164. {openlit-1.34.25 → openlit-1.34.26}/src/openlit/semcov/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: openlit
3
- Version: 1.34.25
3
+ Version: 1.34.26
4
4
  Summary: OpenTelemetry-native Auto instrumentation library for monitoring LLM Applications and GPUs, facilitating the integration of observability into your GenAI-driven projects
5
5
  License: Apache-2.0
6
6
  Keywords: OpenTelemetry,otel,otlp,llm,tracing,openai,anthropic,claude,cohere,llm monitoring,observability,monitoring,gpt,Generative AI,chatGPT,gpu
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "openlit"
3
- version = "1.34.25"
3
+ version = "1.34.26"
4
4
  description = "OpenTelemetry-native Auto instrumentation library for monitoring LLM Applications and GPUs, facilitating the integration of observability into your GenAI-driven projects"
5
5
  authors = ["OpenLIT"]
6
6
  license = "Apache-2.0"
@@ -13,7 +13,7 @@ _instruments = ("chromadb >= 0.4.0",)
13
13
 
14
14
  class ChromaInstrumentor(BaseInstrumentor):
15
15
  """
16
- An instrumentor for ChromaDB's client library.
16
+ An instrumentor for ChromaDB client library.
17
17
  """
18
18
 
19
19
  def instrumentation_dependencies(self) -> Collection[str]:
@@ -5,13 +5,11 @@ Module for monitoring ChromaDB API calls.
5
5
  import time
6
6
  from opentelemetry.trace import SpanKind
7
7
  from opentelemetry import context as context_api
8
- from openlit.__helpers import (
9
- handle_exception,
10
- set_server_address_and_port,
11
- )
8
+ from openlit.__helpers import handle_exception
12
9
  from openlit.instrumentation.chroma.utils import (
13
10
  process_vectordb_response,
14
11
  DB_OPERATION_MAP,
12
+ set_server_address_and_port,
15
13
  )
16
14
 
17
15
  def general_wrap(gen_ai_endpoint, version, environment, application_name,
@@ -29,7 +27,7 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
29
27
  return wrapped(*args, **kwargs)
30
28
 
31
29
  # Get server address and port using the standard helper
32
- server_address, server_port = set_server_address_and_port(instance, "localhost", 8000)
30
+ server_address, server_port = set_server_address_and_port(instance)
33
31
 
34
32
  db_operation = DB_OPERATION_MAP.get(gen_ai_endpoint, "unknown")
35
33
  if db_operation == "create_collection":
@@ -39,10 +37,10 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
39
37
  span_name = f"{db_operation} {namespace}"
40
38
 
41
39
  with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
42
- try:
43
- start_time = time.time()
44
- response = wrapped(*args, **kwargs)
40
+ start_time = time.time()
41
+ response = wrapped(*args, **kwargs)
45
42
 
43
+ try:
46
44
  # Process response and generate telemetry
47
45
  response = process_vectordb_response(
48
46
  response, db_operation, server_address, server_port,
@@ -2,7 +2,7 @@
2
2
  ChromaDB OpenTelemetry instrumentation utility functions
3
3
  """
4
4
  import time
5
-
5
+ from urllib.parse import urlparse
6
6
  from opentelemetry.trace import Status, StatusCode
7
7
 
8
8
  from openlit.__helpers import (
@@ -29,6 +29,51 @@ def object_count(obj):
29
29
  """
30
30
  return len(obj) if obj else 0
31
31
 
32
+ def set_server_address_and_port(instance):
33
+ """
34
+ Extracts server address and port from ChromaDB client instance.
35
+
36
+ Args:
37
+ instance: ChromaDB client instance
38
+
39
+ Returns:
40
+ tuple: (server_address, server_port)
41
+ """
42
+ server_address = "localhost"
43
+ server_port = 8000
44
+
45
+ # Try getting base_url from multiple potential attributes
46
+ base_client = getattr(instance, "_client", None)
47
+ base_url = getattr(base_client, "base_url", None)
48
+
49
+ if not base_url:
50
+ # Attempt to get endpoint from instance._config.endpoint
51
+ config = getattr(instance, "_config", None)
52
+ base_url = getattr(config, "endpoint", None)
53
+
54
+ if not base_url:
55
+ # Attempt to get server_url from instance.sdk_configuration.server_url
56
+ config = getattr(instance, "sdk_configuration", None)
57
+ base_url = getattr(config, "server_url", None)
58
+
59
+ if base_url:
60
+ if isinstance(base_url, str):
61
+ # Check if it a full URL or just a hostname
62
+ if base_url.startswith(("http://", "https://")):
63
+ try:
64
+ url = urlparse(base_url)
65
+ if url.hostname:
66
+ server_address = url.hostname
67
+ if url.port:
68
+ server_port = url.port
69
+ except Exception:
70
+ pass
71
+ else:
72
+ # Just a hostname
73
+ server_address = base_url
74
+
75
+ return server_address, server_port
76
+
32
77
  def common_vectordb_logic(scope, environment, application_name,
33
78
  metrics, capture_message_content, disable_metrics, version, instance=None, endpoint=None):
34
79
  """
@@ -120,8 +165,8 @@ def common_vectordb_logic(scope, environment, application_name,
120
165
  # Extract response metrics if available
121
166
  if scope._response:
122
167
  # Get number of results returned
123
- if hasattr(scope._response, 'get') and scope._response.get('ids'):
124
- returned_rows = object_count(scope._response['ids'][0]) if scope._response['ids'] else 0
168
+ if hasattr(scope._response, "get") and scope._response.get("ids"):
169
+ returned_rows = object_count(scope._response["ids"][0]) if scope._response["ids"] else 0
125
170
  scope._span.set_attribute(SemanticConvention.DB_RESPONSE_RETURNED_ROWS, returned_rows)
126
171
 
127
172
  scope._span.set_attribute(SemanticConvention.DB_QUERY_SUMMARY,
@@ -0,0 +1,78 @@
1
+ """Initializer of Auto Instrumentation of Pinecone Functions"""
2
+
3
+ from typing import Collection
4
+ import importlib.metadata
5
+ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
6
+ from wrapt import wrap_function_wrapper
7
+
8
+ from openlit.instrumentation.pinecone.pinecone import general_wrap
9
+ from openlit.instrumentation.pinecone.async_pinecone import async_general_wrap
10
+
11
+ _instruments = ("pinecone >= 7.3.0",)
12
+
13
+ # Pinecone sync operations
14
+ PINECONE_SYNC_OPERATIONS = [
15
+ ("pinecone.pinecone", "Pinecone.create_index", "pinecone.create_collection"),
16
+ ("pinecone.pinecone", "Pinecone.create_index_for_model", "pinecone.create_collection"),
17
+ ("pinecone.db_data.index", "Index.upsert", "pinecone.upsert"),
18
+ ("pinecone.db_data.index", "Index.upsert_records", "pinecone.upsert_records"),
19
+ ("pinecone.db_data.index", "Index.query", "pinecone.query"),
20
+ ("pinecone.db_data.index", "Index.search", "pinecone.search"),
21
+ ("pinecone.db_data.index", "Index.fetch", "pinecone.fetch"),
22
+ ("pinecone.db_data.index", "Index.search_records", "pinecone.search_records"),
23
+ ("pinecone.db_data.index", "Index.update", "pinecone.update"),
24
+ ("pinecone.db_data.index", "Index.delete", "pinecone.delete"),
25
+ ]
26
+
27
+ # Pinecone async operations
28
+ PINECONE_ASYNC_OPERATIONS = [
29
+ ("pinecone.pinecone_asyncio", "PineconeAsyncio.create_index", "pinecone.create_index"),
30
+ ("pinecone.pinecone_asyncio", "PineconeAsyncio.create_index_for_model", "pinecone.create_index"),
31
+ ("pinecone.db_data.index_asyncio", "_IndexAsyncio.upsert", "pinecone.upsert"),
32
+ ("pinecone.db_data.index_asyncio", "_IndexAsyncio.upsert_records", "pinecone.upsert_records"),
33
+ ("pinecone.db_data.index_asyncio", "_IndexAsyncio.query", "pinecone.query"),
34
+ ("pinecone.db_data.index_asyncio", "_IndexAsyncio.search", "pinecone.search"),
35
+ ("pinecone.db_data.index_asyncio", "_IndexAsyncio.fetch", "pinecone.fetch"),
36
+ ("pinecone.db_data.index_asyncio", "_IndexAsyncio.search_records", "pinecone.search_records"),
37
+ ("pinecone.db_data.index_asyncio", "_IndexAsyncio.update", "pinecone.update"),
38
+ ("pinecone.db_data.index_asyncio", "_IndexAsyncio.delete", "pinecone.delete"),
39
+ ]
40
+
41
+ class PineconeInstrumentor(BaseInstrumentor):
42
+ """
43
+ An instrumentor for Pinecone client library.
44
+ """
45
+
46
+ def instrumentation_dependencies(self) -> Collection[str]:
47
+ return _instruments
48
+
49
+ def _instrument(self, **kwargs):
50
+ version = importlib.metadata.version("pinecone")
51
+ environment = kwargs.get("environment", "default")
52
+ application_name = kwargs.get("application_name", "default")
53
+ tracer = kwargs.get("tracer")
54
+ pricing_info = kwargs.get("pricing_info", {})
55
+ capture_message_content = kwargs.get("capture_message_content", False)
56
+ metrics = kwargs.get("metrics_dict")
57
+ disable_metrics = kwargs.get("disable_metrics")
58
+
59
+ # Wrap sync operations
60
+ for module, class_method, endpoint in PINECONE_SYNC_OPERATIONS:
61
+ wrap_function_wrapper(
62
+ module,
63
+ class_method,
64
+ general_wrap(endpoint, version, environment, application_name,
65
+ tracer, pricing_info, capture_message_content, metrics, disable_metrics),
66
+ )
67
+
68
+ # Wrap async operations
69
+ for module, class_method, endpoint in PINECONE_ASYNC_OPERATIONS:
70
+ wrap_function_wrapper(
71
+ module,
72
+ class_method,
73
+ async_general_wrap(endpoint, version, environment, application_name,
74
+ tracer, pricing_info, capture_message_content, metrics, disable_metrics),
75
+ )
76
+
77
+ def _uninstrument(self, **kwargs):
78
+ pass
@@ -5,13 +5,11 @@ Module for monitoring Pinecone async API calls.
5
5
  import time
6
6
  from opentelemetry.trace import SpanKind
7
7
  from opentelemetry import context as context_api
8
- from openlit.__helpers import (
9
- handle_exception,
10
- set_server_address_and_port,
11
- )
8
+ from openlit.__helpers import handle_exception
12
9
  from openlit.instrumentation.pinecone.utils import (
13
10
  process_vectordb_response,
14
11
  DB_OPERATION_MAP,
12
+ set_server_address_and_port,
15
13
  )
16
14
 
17
15
  def async_general_wrap(gen_ai_endpoint, version, environment, application_name,
@@ -29,7 +27,7 @@ def async_general_wrap(gen_ai_endpoint, version, environment, application_name,
29
27
  return await wrapped(*args, **kwargs)
30
28
 
31
29
  # Get server address and port using the standard helper
32
- server_address, server_port = set_server_address_and_port(instance, "pinecone.io", 443)
30
+ server_address, server_port = set_server_address_and_port(instance)
33
31
 
34
32
  db_operation = DB_OPERATION_MAP.get(gen_ai_endpoint, "unknown")
35
33
  if db_operation == "create_collection":
@@ -39,10 +37,10 @@ def async_general_wrap(gen_ai_endpoint, version, environment, application_name,
39
37
  span_name = f"{db_operation} {namespace}"
40
38
 
41
39
  with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
42
- try:
43
- start_time = time.time()
44
- response = await wrapped(*args, **kwargs)
40
+ start_time = time.time()
41
+ response = await wrapped(*args, **kwargs)
45
42
 
43
+ try:
46
44
  # Process response and generate telemetry
47
45
  response = process_vectordb_response(
48
46
  response, db_operation, server_address, server_port,
@@ -5,13 +5,11 @@ Module for monitoring Pinecone API calls.
5
5
  import time
6
6
  from opentelemetry.trace import SpanKind
7
7
  from opentelemetry import context as context_api
8
- from openlit.__helpers import (
9
- handle_exception,
10
- set_server_address_and_port,
11
- )
8
+ from openlit.__helpers import handle_exception
12
9
  from openlit.instrumentation.pinecone.utils import (
13
10
  process_vectordb_response,
14
11
  DB_OPERATION_MAP,
12
+ set_server_address_and_port,
15
13
  )
16
14
 
17
15
  def general_wrap(gen_ai_endpoint, version, environment, application_name,
@@ -29,7 +27,7 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
29
27
  return wrapped(*args, **kwargs)
30
28
 
31
29
  # Get server address and port using the standard helper
32
- server_address, server_port = set_server_address_and_port(instance, "pinecone.io", 443)
30
+ server_address, server_port = set_server_address_and_port(instance)
33
31
 
34
32
  db_operation = DB_OPERATION_MAP.get(gen_ai_endpoint, "unknown")
35
33
  if db_operation == "create_collection":
@@ -39,10 +37,10 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
39
37
  span_name = f"{db_operation} {namespace}"
40
38
 
41
39
  with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
42
- try:
43
- start_time = time.time()
44
- response = wrapped(*args, **kwargs)
40
+ start_time = time.time()
41
+ response = wrapped(*args, **kwargs)
45
42
 
43
+ try:
46
44
  # Process response and generate telemetry
47
45
  response = process_vectordb_response(
48
46
  response, db_operation, server_address, server_port,
@@ -2,7 +2,7 @@
2
2
  Pinecone OpenTelemetry instrumentation utility functions
3
3
  """
4
4
  import time
5
-
5
+ from urllib.parse import urlparse
6
6
  from opentelemetry.trace import Status, StatusCode
7
7
 
8
8
  from openlit.__helpers import (
@@ -30,6 +30,46 @@ def object_count(obj):
30
30
  """
31
31
  return len(obj) if obj else 0
32
32
 
33
+ def set_server_address_and_port(instance):
34
+ """
35
+ Extracts server address and port from Pinecone client instance.
36
+
37
+ Args:
38
+ instance: Pinecone client instance
39
+
40
+ Returns:
41
+ tuple: (server_address, server_port)
42
+ """
43
+ server_address = "pinecone.io"
44
+ server_port = 443
45
+
46
+ # Try getting base_url from multiple potential attributes
47
+ base_client = getattr(instance, "_client", None)
48
+ base_url = getattr(base_client, "base_url", None)
49
+
50
+ if not base_url:
51
+ # Attempt to get host from instance.config.host (used by Pinecone)
52
+ config = getattr(instance, "config", None)
53
+ base_url = getattr(config, "host", None)
54
+
55
+ if base_url:
56
+ if isinstance(base_url, str):
57
+ # Check if its a full URL or just a hostname
58
+ if base_url.startswith(("http://", "https://")):
59
+ try:
60
+ url = urlparse(base_url)
61
+ if url.hostname:
62
+ server_address = url.hostname
63
+ if url.port:
64
+ server_port = url.port
65
+ except Exception:
66
+ pass
67
+ else:
68
+ # Just a hostname
69
+ server_address = base_url
70
+
71
+ return server_address, server_port
72
+
33
73
  def common_vectordb_logic(scope, environment, application_name,
34
74
  metrics, capture_message_content, disable_metrics, version, instance=None):
35
75
  """
@@ -0,0 +1,80 @@
1
+ """
2
+ OpenLIT Qdrant Instrumentation
3
+ """
4
+
5
+ from typing import Collection
6
+ import importlib.metadata
7
+ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
8
+ from wrapt import wrap_function_wrapper
9
+
10
+ from openlit.instrumentation.qdrant.qdrant import general_wrap
11
+ from openlit.instrumentation.qdrant.async_qdrant import async_general_wrap
12
+
13
+ _instruments = ("qdrant-client >= 1.9.0",)
14
+
15
+ # Operations to wrap for both sync and async clients
16
+ QDRANT_OPERATIONS = [
17
+ ("create_collection", "qdrant.create_collection"),
18
+ ("delete_collection", "qdrant.delete_collection"),
19
+ ("update_collection", "qdrant.update_collection"),
20
+ ("upload_collection", "qdrant.upload_collection"),
21
+ ("upsert", "qdrant.upsert"),
22
+ ("set_payload", "qdrant.set_payload"),
23
+ ("overwrite_payload", "qdrant.overwrite_payload"),
24
+ ("clear_payload", "qdrant.clear_payload"),
25
+ ("delete_payload", "qdrant.delete_payload"),
26
+ ("upload_points", "qdrant.upload_points"),
27
+ ("update_vectors", "qdrant.update_vectors"),
28
+ ("delete_vectors", "qdrant.delete_vectors"),
29
+ ("delete", "qdrant.delete"),
30
+ ("retrieve", "qdrant.retrieve"),
31
+ ("scroll", "qdrant.scroll"),
32
+ ("search", "qdrant.search"),
33
+ ("search_groups", "qdrant.search_groups"),
34
+ ("recommend", "qdrant.recommend"),
35
+ ("create_payload_index", "qdrant.create_payload_index"),
36
+ ("query_points", "qdrant.query_points"),
37
+ ]
38
+
39
+ class QdrantInstrumentor(BaseInstrumentor):
40
+ """
41
+ An instrumentor for Qdrant client library.
42
+ """
43
+
44
+ def instrumentation_dependencies(self) -> Collection[str]:
45
+ return _instruments
46
+
47
+ def _instrument(self, **kwargs):
48
+ version = importlib.metadata.version("qdrant-client")
49
+ environment = kwargs.get("environment", "default")
50
+ application_name = kwargs.get("application_name", "default")
51
+ tracer = kwargs.get("tracer")
52
+ pricing_info = kwargs.get("pricing_info", {})
53
+ capture_message_content = kwargs.get("capture_message_content", False)
54
+ metrics = kwargs.get("metrics_dict")
55
+ disable_metrics = kwargs.get("disable_metrics")
56
+
57
+ # Wrap sync operations
58
+ for method_name, endpoint in QDRANT_OPERATIONS:
59
+ wrap_function_wrapper(
60
+ "qdrant_client",
61
+ f"QdrantClient.{method_name}",
62
+ general_wrap(
63
+ endpoint, version, environment, application_name, tracer,
64
+ pricing_info, capture_message_content, metrics, disable_metrics
65
+ ),
66
+ )
67
+
68
+ # Wrap async operations
69
+ for method_name, endpoint in QDRANT_OPERATIONS:
70
+ wrap_function_wrapper(
71
+ "qdrant_client",
72
+ f"AsyncQdrantClient.{method_name}",
73
+ async_general_wrap(
74
+ endpoint, version, environment, application_name, tracer,
75
+ pricing_info, capture_message_content, metrics, disable_metrics
76
+ ),
77
+ )
78
+
79
+ def _uninstrument(self, **kwargs):
80
+ pass
@@ -0,0 +1,55 @@
1
+ # pylint: disable=duplicate-code, broad-exception-caught, too-many-statements, unused-argument, possibly-used-before-assignment, too-many-branches
2
+ """
3
+ Module for monitoring Qdrant async operations.
4
+ """
5
+
6
+ import time
7
+ from opentelemetry.trace import SpanKind
8
+ from opentelemetry import context as context_api
9
+ from openlit.__helpers import handle_exception
10
+ from openlit.instrumentation.qdrant.utils import DB_OPERATION_MAP, process_qdrant_response, set_server_address_and_port
11
+
12
+ def async_general_wrap(gen_ai_endpoint, version, environment, application_name, tracer,
13
+ pricing_info, capture_message_content, metrics, disable_metrics):
14
+ """
15
+ Generates a telemetry wrapper for Pinecone function calls.
16
+ """
17
+
18
+ async def wrapper(wrapped, instance, args, kwargs):
19
+ """
20
+ Wraps the Qdrant async operation with tracing and logging.
21
+ """
22
+ # CRITICAL: Suppression check
23
+ if context_api.get_value(context_api._SUPPRESS_INSTRUMENTATION_KEY):
24
+ return await wrapped(*args, **kwargs)
25
+
26
+ # Extract operation from endpoint
27
+ db_operation = DB_OPERATION_MAP.get(gen_ai_endpoint, "unknown")
28
+
29
+ # Server address calculation
30
+ server_address, server_port = set_server_address_and_port(instance)
31
+
32
+ # Span naming: use operation + collection
33
+ collection_name = kwargs.get("collection_name", "unknown")
34
+ span_name = f"{db_operation} {collection_name}"
35
+
36
+ # CRITICAL: Use tracer.start_as_current_span() for proper context
37
+ with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
38
+ start_time = time.time()
39
+ response = await wrapped(*args, **kwargs)
40
+
41
+ try:
42
+ # Process response with endpoint information
43
+ response = process_qdrant_response(
44
+ response, db_operation, server_address, server_port,
45
+ environment, application_name, metrics, start_time, span,
46
+ capture_message_content, disable_metrics, version,
47
+ instance=instance, args=args, endpoint=gen_ai_endpoint, **kwargs
48
+ )
49
+
50
+ except Exception as e:
51
+ handle_exception(span, e)
52
+
53
+ return response
54
+
55
+ return wrapper
@@ -0,0 +1,55 @@
1
+ # pylint: disable=duplicate-code, broad-exception-caught, too-many-statements, unused-argument, possibly-used-before-assignment, too-many-branches
2
+ """
3
+ Module for monitoring Qdrant operations.
4
+ """
5
+
6
+ import time
7
+ from opentelemetry.trace import SpanKind
8
+ from opentelemetry import context as context_api
9
+ from openlit.__helpers import handle_exception
10
+ from openlit.instrumentation.qdrant.utils import DB_OPERATION_MAP, process_qdrant_response, set_server_address_and_port
11
+
12
+ def general_wrap(gen_ai_endpoint, version, environment, application_name, tracer,
13
+ pricing_info, capture_message_content, metrics, disable_metrics):
14
+ """
15
+ Generates a telemetry wrapper for Pinecone function calls.
16
+ """
17
+
18
+ def wrapper(wrapped, instance, args, kwargs):
19
+ """
20
+ Wraps the Qdrant operation with tracing and logging.
21
+ """
22
+ # CRITICAL: Suppression check
23
+ if context_api.get_value(context_api._SUPPRESS_INSTRUMENTATION_KEY):
24
+ return wrapped(*args, **kwargs)
25
+
26
+ # Extract operation from endpoint
27
+ db_operation = DB_OPERATION_MAP.get(gen_ai_endpoint, "unknown")
28
+
29
+ # Server address calculation
30
+ server_address, server_port = set_server_address_and_port(instance)
31
+
32
+ # Span naming: use operation + collection
33
+ collection_name = kwargs.get("collection_name", "unknown")
34
+ span_name = f"{db_operation} {collection_name}"
35
+
36
+ # CRITICAL: Use tracer.start_as_current_span() for proper context
37
+ with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
38
+ start_time = time.time()
39
+ response = wrapped(*args, **kwargs)
40
+
41
+ try:
42
+ # Process response with endpoint information
43
+ response = process_qdrant_response(
44
+ response, db_operation, server_address, server_port,
45
+ environment, application_name, metrics, start_time, span,
46
+ capture_message_content, disable_metrics, version,
47
+ instance=instance, args=args, endpoint=gen_ai_endpoint, **kwargs
48
+ )
49
+
50
+ except Exception as e:
51
+ handle_exception(span, e)
52
+
53
+ return response
54
+
55
+ return wrapper