openlit 1.33.14__tar.gz → 1.33.16__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 (131) hide show
  1. {openlit-1.33.14 → openlit-1.33.16}/PKG-INFO +1 -1
  2. {openlit-1.33.14 → openlit-1.33.16}/pyproject.toml +1 -1
  3. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/__init__.py +3 -0
  4. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/astra/__init__.py +82 -83
  5. openlit-1.33.16/src/openlit/instrumentation/astra/astra.py +45 -0
  6. openlit-1.33.16/src/openlit/instrumentation/astra/async_astra.py +45 -0
  7. openlit-1.33.16/src/openlit/instrumentation/astra/utils.py +102 -0
  8. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/chroma/chroma.py +10 -10
  9. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/dynamiq/dynamiq.py +2 -2
  10. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/milvus/milvus.py +10 -10
  11. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/openai/__init__.py +18 -2
  12. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/openai/async_openai.py +405 -0
  13. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/openai/openai.py +405 -0
  14. openlit-1.33.16/src/openlit/instrumentation/openai_agents/__init__.py +42 -0
  15. openlit-1.33.16/src/openlit/instrumentation/openai_agents/openai_agents.py +65 -0
  16. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/pinecone/pinecone.py +8 -8
  17. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/qdrant/async_qdrant.py +19 -19
  18. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/qdrant/qdrant.py +20 -20
  19. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/otel/metrics.py +18 -0
  20. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/semcov/__init__.py +26 -13
  21. openlit-1.33.14/src/openlit/instrumentation/astra/astra.py +0 -226
  22. openlit-1.33.14/src/openlit/instrumentation/astra/async_astra.py +0 -226
  23. {openlit-1.33.14 → openlit-1.33.16}/LICENSE +0 -0
  24. {openlit-1.33.14 → openlit-1.33.16}/README.md +0 -0
  25. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/__helpers.py +0 -0
  26. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/evals/__init__.py +0 -0
  27. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/evals/all.py +0 -0
  28. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/evals/bias_detection.py +0 -0
  29. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/evals/hallucination.py +0 -0
  30. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/evals/toxicity.py +0 -0
  31. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/evals/utils.py +0 -0
  32. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/guard/__init__.py +0 -0
  33. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/guard/all.py +0 -0
  34. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/guard/prompt_injection.py +0 -0
  35. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/guard/restrict_topic.py +0 -0
  36. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/guard/sensitive_topic.py +0 -0
  37. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/guard/utils.py +0 -0
  38. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ag2/__init__.py +0 -0
  39. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ag2/ag2.py +0 -0
  40. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ai21/__init__.py +0 -0
  41. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ai21/ai21.py +0 -0
  42. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ai21/async_ai21.py +0 -0
  43. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ai21/utils.py +0 -0
  44. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/anthropic/__init__.py +0 -0
  45. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/anthropic/anthropic.py +0 -0
  46. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/anthropic/async_anthropic.py +0 -0
  47. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/anthropic/utils.py +0 -0
  48. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/assemblyai/__init__.py +0 -0
  49. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/assemblyai/assemblyai.py +0 -0
  50. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/azure_ai_inference/__init__.py +0 -0
  51. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/azure_ai_inference/async_azure_ai_inference.py +0 -0
  52. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/azure_ai_inference/azure_ai_inference.py +0 -0
  53. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/bedrock/__init__.py +0 -0
  54. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/bedrock/bedrock.py +0 -0
  55. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/chroma/__init__.py +0 -0
  56. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/cohere/__init__.py +0 -0
  57. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/cohere/async_cohere.py +0 -0
  58. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/cohere/cohere.py +0 -0
  59. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/controlflow/__init__.py +0 -0
  60. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/controlflow/controlflow.py +0 -0
  61. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/crawl4ai/__init__.py +0 -0
  62. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/crawl4ai/async_crawl4ai.py +0 -0
  63. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/crawl4ai/crawl4ai.py +0 -0
  64. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/crewai/__init__.py +0 -0
  65. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/crewai/crewai.py +0 -0
  66. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/dynamiq/__init__.py +0 -0
  67. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/elevenlabs/__init__.py +0 -0
  68. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/elevenlabs/async_elevenlabs.py +0 -0
  69. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/elevenlabs/elevenlabs.py +0 -0
  70. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/embedchain/__init__.py +0 -0
  71. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/embedchain/embedchain.py +0 -0
  72. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/firecrawl/__init__.py +0 -0
  73. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/firecrawl/firecrawl.py +0 -0
  74. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/google_ai_studio/__init__.py +0 -0
  75. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/google_ai_studio/async_google_ai_studio.py +0 -0
  76. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/google_ai_studio/google_ai_studio.py +0 -0
  77. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/gpt4all/__init__.py +0 -0
  78. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/gpt4all/gpt4all.py +0 -0
  79. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/gpu/__init__.py +0 -0
  80. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/groq/__init__.py +0 -0
  81. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/groq/async_groq.py +0 -0
  82. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/groq/groq.py +0 -0
  83. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/haystack/__init__.py +0 -0
  84. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/haystack/haystack.py +0 -0
  85. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/julep/__init__.py +0 -0
  86. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/julep/async_julep.py +0 -0
  87. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/julep/julep.py +0 -0
  88. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/langchain/__init__.py +0 -0
  89. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/langchain/async_langchain.py +0 -0
  90. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/langchain/langchain.py +0 -0
  91. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/letta/__init__.py +0 -0
  92. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/letta/letta.py +0 -0
  93. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/litellm/__init__.py +0 -0
  94. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/litellm/async_litellm.py +0 -0
  95. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/litellm/litellm.py +0 -0
  96. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/llamaindex/__init__.py +0 -0
  97. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/llamaindex/llamaindex.py +0 -0
  98. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/mem0/__init__.py +0 -0
  99. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/mem0/mem0.py +0 -0
  100. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/milvus/__init__.py +0 -0
  101. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/mistral/__init__.py +0 -0
  102. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/mistral/async_mistral.py +0 -0
  103. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/mistral/mistral.py +0 -0
  104. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/multion/__init__.py +0 -0
  105. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/multion/async_multion.py +0 -0
  106. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/multion/multion.py +0 -0
  107. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ollama/__init__.py +0 -0
  108. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ollama/async_ollama.py +0 -0
  109. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ollama/ollama.py +0 -0
  110. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/ollama/utils.py +0 -0
  111. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/phidata/__init__.py +0 -0
  112. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/phidata/phidata.py +0 -0
  113. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/pinecone/__init__.py +0 -0
  114. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/premai/__init__.py +0 -0
  115. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/premai/premai.py +0 -0
  116. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/qdrant/__init__.py +0 -0
  117. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/reka/__init__.py +0 -0
  118. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/reka/async_reka.py +0 -0
  119. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/reka/reka.py +0 -0
  120. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/together/__init__.py +0 -0
  121. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/together/async_together.py +0 -0
  122. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/together/together.py +0 -0
  123. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/transformers/__init__.py +0 -0
  124. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/transformers/transformers.py +0 -0
  125. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/vertexai/__init__.py +0 -0
  126. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/vertexai/async_vertexai.py +0 -0
  127. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/vertexai/vertexai.py +0 -0
  128. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/vllm/__init__.py +0 -0
  129. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/instrumentation/vllm/vllm.py +0 -0
  130. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/otel/events.py +0 -0
  131. {openlit-1.33.14 → openlit-1.33.16}/src/openlit/otel/tracing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: openlit
3
- Version: 1.33.14
3
+ Version: 1.33.16
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.33.14"
3
+ version = "1.33.16"
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"
@@ -65,6 +65,7 @@ from openlit.instrumentation.controlflow import ControlFlowInstrumentor
65
65
  from openlit.instrumentation.crawl4ai import Crawl4AIInstrumentor
66
66
  from openlit.instrumentation.firecrawl import FireCrawlInstrumentor
67
67
  from openlit.instrumentation.letta import LettaInstrumentor
68
+ from openlit.instrumentation.openai_agents import OpenAIAgentsInstrumentor
68
69
  from openlit.instrumentation.gpu import GPUInstrumentor
69
70
  import openlit.guard
70
71
  import openlit.evals
@@ -293,6 +294,7 @@ def init(
293
294
  "firecrawl": "firecrawl",
294
295
  "letta": "letta",
295
296
  "together": "together",
297
+ "openai-agents": "agents"
296
298
  }
297
299
 
298
300
  invalid_instrumentors = [
@@ -411,6 +413,7 @@ def init(
411
413
  "firecrawl": FireCrawlInstrumentor(),
412
414
  "letta": LettaInstrumentor(),
413
415
  "together": TogetherInstrumentor(),
416
+ "openai-agents": OpenAIAgentsInstrumentor(),
414
417
  }
415
418
 
416
419
  # Initialize and instrument only the enabled instrumentors
@@ -1,4 +1,3 @@
1
- # pylint: disable=useless-return, bad-staticmethod-argument, disable=duplicate-code
2
1
  """Initializer of Auto Instrumentation of AstraDB Functions"""
3
2
  from typing import Collection
4
3
  import importlib.metadata
@@ -8,7 +7,7 @@ from wrapt import wrap_function_wrapper
8
7
  from openlit.instrumentation.astra.astra import general_wrap
9
8
  # from openlit.instrumentation.astra.async_astra import asyc_general_wrap
10
9
 
11
- _instruments = ("astrapy >= 1.5.2",)
10
+ _instruments = ('astrapy >= 1.5.2',)
12
11
 
13
12
  class AstraInstrumentor(BaseInstrumentor):
14
13
  """An instrumentor for AstraDB's client library."""
@@ -17,163 +16,163 @@ class AstraInstrumentor(BaseInstrumentor):
17
16
  return _instruments
18
17
 
19
18
  def _instrument(self, **kwargs):
20
- application_name = kwargs.get("application_name")
21
- environment = kwargs.get("environment")
22
- tracer = kwargs.get("tracer")
23
- metrics = kwargs.get("metrics_dict")
24
- pricing_info = kwargs.get("pricing_info")
25
- capture_message_content = kwargs.get("capture_message_content")
26
- disable_metrics = kwargs.get("disable_metrics")
27
- version = importlib.metadata.version("astrapy")
19
+ application_name = kwargs.get('application_name')
20
+ environment = kwargs.get('environment')
21
+ tracer = kwargs.get('tracer')
22
+ metrics = kwargs.get('metrics_dict')
23
+ pricing_info = kwargs.get('pricing_info')
24
+ capture_message_content = kwargs.get('capture_message_content')
25
+ disable_metrics = kwargs.get('disable_metrics')
26
+ version = importlib.metadata.version('astrapy')
28
27
 
29
28
  # Sync
30
29
  wrap_function_wrapper(
31
- "astrapy.database",
32
- "Database.create_collection",
33
- general_wrap("astra.create_collection", version, environment, application_name,
30
+ 'astrapy.database',
31
+ 'Database.create_collection',
32
+ general_wrap('astra.create_collection', version, environment, application_name,
34
33
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
35
34
  )
36
35
  wrap_function_wrapper(
37
- "astrapy.database",
38
- "Database.drop_collection",
39
- general_wrap("astra.drop_collection", version, environment, application_name,
36
+ 'astrapy.database',
37
+ 'Database.drop_collection',
38
+ general_wrap('astra.drop_collection', version, environment, application_name,
40
39
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
41
40
  )
42
41
  wrap_function_wrapper(
43
- "astrapy.collection",
44
- "Collection.insert_one",
45
- general_wrap("astra.insert_one", version, environment, application_name,
42
+ 'astrapy.collection',
43
+ 'Collection.insert_one',
44
+ general_wrap('astra.insert', version, environment, application_name,
46
45
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
47
46
  )
48
47
  wrap_function_wrapper(
49
- "astrapy.collection",
50
- "Collection.insert_many",
51
- general_wrap("astra.insert_many", version, environment, application_name,
48
+ 'astrapy.collection',
49
+ 'Collection.insert_many',
50
+ general_wrap('astra.insert', version, environment, application_name,
52
51
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
53
52
  )
54
53
  wrap_function_wrapper(
55
- "astrapy.collection",
56
- "Collection.update_one",
57
- general_wrap("astra.update_one", version, environment, application_name,
54
+ 'astrapy.collection',
55
+ 'Collection.update_one',
56
+ general_wrap('astra.update', version, environment, application_name,
58
57
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
59
58
  )
60
59
  wrap_function_wrapper(
61
- "astrapy.collection",
62
- "Collection.update_many",
63
- general_wrap("astra.update_many", version, environment, application_name,
60
+ 'astrapy.collection',
61
+ 'Collection.update_many',
62
+ general_wrap('astra.update', version, environment, application_name,
64
63
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
65
64
  )
66
65
  wrap_function_wrapper(
67
- "astrapy.collection",
68
- "Collection.find_one_and_update",
69
- general_wrap("astra.find_one_and_update", version, environment, application_name,
66
+ 'astrapy.collection',
67
+ 'Collection.find_one_and_update',
68
+ general_wrap('astra.find_one_and_update', version, environment, application_name,
70
69
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
71
70
  )
72
71
  wrap_function_wrapper(
73
- "astrapy.collection",
74
- "Collection.find",
75
- general_wrap("astra.find", version, environment, application_name,
72
+ 'astrapy.collection',
73
+ 'Collection.find',
74
+ general_wrap('astra.find', version, environment, application_name,
76
75
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
77
76
  )
78
77
  wrap_function_wrapper(
79
- "astrapy.collection",
80
- "Collection.replace_one",
81
- general_wrap("astra.replace_one", version, environment, application_name,
78
+ 'astrapy.collection',
79
+ 'Collection.replace_one',
80
+ general_wrap('astra.replace_one', version, environment, application_name,
82
81
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
83
82
  )
84
83
  wrap_function_wrapper(
85
- "astrapy.collection",
86
- "Collection.find_one_and_delete",
87
- general_wrap("astra.find_one_and_delete", version, environment, application_name,
84
+ 'astrapy.collection',
85
+ 'Collection.find_one_and_delete',
86
+ general_wrap('astra.find_one_and_delete', version, environment, application_name,
88
87
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
89
88
  )
90
89
  wrap_function_wrapper(
91
- "astrapy.collection",
92
- "Collection.delete_one",
93
- general_wrap("astra.delete_one", version, environment, application_name,
90
+ 'astrapy.collection',
91
+ 'Collection.delete_one',
92
+ general_wrap('astra.delete', version, environment, application_name,
94
93
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
95
94
  )
96
95
  wrap_function_wrapper(
97
- "astrapy.collection",
98
- "Collection.delete_many",
99
- general_wrap("astra.delete_many", version, environment, application_name,
96
+ 'astrapy.collection',
97
+ 'Collection.delete_many',
98
+ general_wrap('astra.delete', version, environment, application_name,
100
99
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
101
100
  )
102
101
 
103
102
  # ASync
104
103
  wrap_function_wrapper(
105
- "astrapy.database",
106
- "AsyncDatabase.create_collection",
107
- general_wrap("astra.create_collection", version, environment, application_name,
104
+ 'astrapy.database',
105
+ 'AsyncDatabase.create_collection',
106
+ general_wrap('astra.create_collection', version, environment, application_name,
108
107
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
109
108
  )
110
109
  wrap_function_wrapper(
111
- "astrapy.database",
112
- "AsyncDatabase.drop_collection",
113
- general_wrap("astra.drop_collection", version, environment, application_name,
110
+ 'astrapy.database',
111
+ 'AsyncDatabase.drop_collection',
112
+ general_wrap('astra.drop_collection', version, environment, application_name,
114
113
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
115
114
  )
116
115
  wrap_function_wrapper(
117
- "astrapy.collection",
118
- "AsyncCollection.insert_one",
119
- general_wrap("astra.insert_one", version, environment, application_name,
116
+ 'astrapy.collection',
117
+ 'AsyncCollection.insert_one',
118
+ general_wrap('astra.insert_one', version, environment, application_name,
120
119
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
121
120
  )
122
121
  wrap_function_wrapper(
123
- "astrapy.collection",
124
- "AsyncCollection.insert_many",
125
- general_wrap("astra.insert_many", version, environment, application_name,
122
+ 'astrapy.collection',
123
+ 'AsyncCollection.insert_many',
124
+ general_wrap('astra.insert_many', version, environment, application_name,
126
125
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
127
126
  )
128
127
  wrap_function_wrapper(
129
- "astrapy.collection",
130
- "AsyncCollection.update_one",
131
- general_wrap("astra.update_one", version, environment, application_name,
128
+ 'astrapy.collection',
129
+ 'AsyncCollection.update_one',
130
+ general_wrap('astra.update_one', version, environment, application_name,
132
131
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
133
132
  )
134
133
  wrap_function_wrapper(
135
- "astrapy.collection",
136
- "AsyncCollection.update_many",
137
- general_wrap("astra.update_many", version, environment, application_name,
134
+ 'astrapy.collection',
135
+ 'AsyncCollection.update_many',
136
+ general_wrap('astra.update_many', version, environment, application_name,
138
137
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
139
138
  )
140
139
  wrap_function_wrapper(
141
- "astrapy.collection",
142
- "AsyncCollection.find_one_and_update",
143
- general_wrap("astra.find_one_and_update", version, environment, application_name,
140
+ 'astrapy.collection',
141
+ 'AsyncCollection.find_one_and_update',
142
+ general_wrap('astra.find_one_and_update', version, environment, application_name,
144
143
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
145
144
  )
146
145
  wrap_function_wrapper(
147
- "astrapy.collection",
148
- "AsyncCollection.find",
149
- general_wrap("astra.find", version, environment, application_name,
146
+ 'astrapy.collection',
147
+ 'AsyncCollection.find',
148
+ general_wrap('astra.find', version, environment, application_name,
150
149
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
151
150
  )
152
151
  wrap_function_wrapper(
153
- "astrapy.collection",
154
- "AsyncCollection.replace_one",
155
- general_wrap("astra.replace_one", version, environment, application_name,
152
+ 'astrapy.collection',
153
+ 'AsyncCollection.replace_one',
154
+ general_wrap('astra.replace_one', version, environment, application_name,
156
155
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
157
156
  )
158
157
  wrap_function_wrapper(
159
- "astrapy.collection",
160
- "AsyncCollection.find_one_and_delete",
161
- general_wrap("astra.find_one_and_delete", version, environment, application_name,
158
+ 'astrapy.collection',
159
+ 'AsyncCollection.find_one_and_delete',
160
+ general_wrap('astra.find_one_and_delete', version, environment, application_name,
162
161
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
163
162
  )
164
163
  wrap_function_wrapper(
165
- "astrapy.collection",
166
- "AsyncCollection.delete_one",
167
- general_wrap("astra.delete_one", version, environment, application_name,
164
+ 'astrapy.collection',
165
+ 'AsyncCollection.delete_one',
166
+ general_wrap('astra.delete_one', version, environment, application_name,
168
167
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
169
168
  )
170
169
  wrap_function_wrapper(
171
- "astrapy.collection",
172
- "AsyncCollection.delete_many",
173
- general_wrap("astra.delete_many", version, environment, application_name,
170
+ 'astrapy.collection',
171
+ 'AsyncCollection.delete_many',
172
+ general_wrap('astra.delete_many', version, environment, application_name,
174
173
  tracer, pricing_info, capture_message_content, metrics, disable_metrics),
175
174
  )
176
175
 
177
- @staticmethod
178
176
  def _uninstrument(self, **kwargs):
177
+ # Proper uninstrumentation logic to revert patched methods
179
178
  pass
@@ -0,0 +1,45 @@
1
+ """
2
+ Module for monitoring AstraDB.
3
+ """
4
+
5
+ import time
6
+ from opentelemetry.trace import SpanKind
7
+ from openlit.instrumentation.astra.utils import (
8
+ DB_OPERATION_MAP,
9
+ process_db_operations
10
+ )
11
+ from openlit.semcov import SemanticConvetion
12
+
13
+ def general_wrap(gen_ai_endpoint, version, environment, application_name,
14
+ tracer, pricing_info, capture_message_content, metrics, disable_metrics):
15
+ """
16
+ Generates a telemetry wrapper for VectorDB function call
17
+ """
18
+
19
+ def wrapper(wrapped, instance, args, kwargs):
20
+ """
21
+ Wraps the VectorDB function call.
22
+ """
23
+
24
+ db_operation = DB_OPERATION_MAP.get(gen_ai_endpoint, "UNKNOWN")
25
+ if db_operation == SemanticConvetion.DB_OPERATION_REPLACE and kwargs.get('upsert'):
26
+ db_operation = SemanticConvetion.DB_OPERATION_UPSERT
27
+
28
+ span_name = f"{db_operation} {instance.name}"
29
+
30
+ with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
31
+ start_time = time.time()
32
+ response = wrapped(*args, **kwargs)
33
+ server_address = getattr(getattr(instance, 'database', instance), 'api_endpoint', '')
34
+ server_port = 443
35
+ collection_name = instance.name
36
+ response = process_db_operations(
37
+ response, span, start_time, gen_ai_endpoint,
38
+ version, environment, application_name, capture_message_content,
39
+ metrics, disable_metrics, server_address, server_port,
40
+ collection_name, db_operation, kwargs, args
41
+ )
42
+
43
+ return response
44
+
45
+ return wrapper
@@ -0,0 +1,45 @@
1
+ """
2
+ Module for monitoring AstraDB.
3
+ """
4
+
5
+ import time
6
+ from opentelemetry.trace import SpanKind
7
+ from openlit.instrumentation.astra.utils import (
8
+ DB_OPERATION_MAP,
9
+ process_db_operations
10
+ )
11
+ from openlit.semcov import SemanticConvetion
12
+
13
+ def async_general_wrap(gen_ai_endpoint, version, environment, application_name,
14
+ tracer, pricing_info, capture_message_content, metrics, disable_metrics):
15
+ """
16
+ Generates a telemetry wrapper for VectorDB function call
17
+ """
18
+
19
+ async def wrapper(wrapped, instance, args, kwargs):
20
+ """
21
+ Wraps the VectorDB function call.
22
+ """
23
+
24
+ db_operation = DB_OPERATION_MAP.get(gen_ai_endpoint, "UNKNOWN")
25
+ if db_operation == SemanticConvetion.DB_OPERATION_REPLACE and kwargs.get('upsert'):
26
+ db_operation = SemanticConvetion.DB_OPERATION_UPSERT
27
+
28
+ span_name = f"{db_operation} {instance.name}"
29
+
30
+ with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
31
+ start_time = time.time()
32
+ response = await wrapped(*args, **kwargs)
33
+ server_address = getattr(getattr(instance, 'database', instance), 'api_endpoint', '')
34
+ server_port = 443
35
+ collection_name = instance.name
36
+ response = process_db_operations(
37
+ response, span, start_time, gen_ai_endpoint,
38
+ version, environment, application_name, capture_message_content,
39
+ metrics, disable_metrics, server_address, server_port,
40
+ collection_name, db_operation, kwargs, args
41
+ )
42
+
43
+ return response
44
+
45
+ return wrapper
@@ -0,0 +1,102 @@
1
+ """
2
+ Astra OpenTelemetry instrumentation utility functions
3
+ """
4
+
5
+ import time
6
+ import logging
7
+ from opentelemetry.trace import Status, StatusCode
8
+ from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
9
+ from openlit.__helpers import handle_exception
10
+ from openlit.semcov import SemanticConvetion
11
+
12
+ # Initialize logger for logging potential issues and operations
13
+ logger = logging.getLogger(__name__)
14
+
15
+ def object_count(obj):
16
+ """Counts Length of object if it exists, Else returns None."""
17
+ return len(obj) if isinstance(obj, list) else 1
18
+
19
+ DB_OPERATION_MAP = {
20
+ 'astra.create_collection': SemanticConvetion.DB_OPERATION_CREATE_COLLECTION,
21
+ 'astra.drop_collection': SemanticConvetion.DB_OPERATION_DELETE_COLLECTION,
22
+ 'astra.insert': SemanticConvetion.DB_OPERATION_INSERT,
23
+ 'astra.update': SemanticConvetion.DB_OPERATION_UPDATE,
24
+ 'astra.find': SemanticConvetion.DB_OPERATION_SELECT,
25
+ 'astra.find_one_and_update': SemanticConvetion.DB_OPERATION_REPLACE,
26
+ 'astra.replace_one': SemanticConvetion.DB_OPERATION_REPLACE,
27
+ 'astra.delete': SemanticConvetion.DB_OPERATION_DELETE,
28
+ 'astra.find_one_and_delete': SemanticConvetion.DB_OPERATION_FIND_AND_DELETE
29
+ }
30
+
31
+ def process_db_operations(response, span, start_time, gen_ai_endpoint,
32
+ version, environment, application_name,
33
+ capture_message_content, metrics, disable_metrics, server_address,
34
+ server_port, collection_name, db_operation, kwargs, args):
35
+ """
36
+ Process DB operation and generate Telemetry
37
+ """
38
+
39
+ end_time = time.time()
40
+
41
+ try:
42
+ span.set_attribute(TELEMETRY_SDK_NAME, 'openlit')
43
+ span.set_attribute(SemanticConvetion.GEN_AI_OPERATION, SemanticConvetion.GEN_AI_OPERATION_TYPE_VECTORDB)
44
+ span.set_attribute(SemanticConvetion.DB_SYSTEM_NAME, SemanticConvetion.DB_SYSTEM_ASTRA)
45
+ span.set_attribute(SemanticConvetion.DB_CLIENT_OPERATION_DURATION, end_time - start_time)
46
+ span.set_attribute(SemanticConvetion.SERVER_ADDRESS, server_address)
47
+ span.set_attribute(SemanticConvetion.SERVER_PORT, server_port)
48
+ span.set_attribute(DEPLOYMENT_ENVIRONMENT, environment)
49
+ span.set_attribute(SERVICE_NAME, application_name)
50
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME, db_operation)
51
+ span.set_attribute(SemanticConvetion.DB_COLLECTION_NAME, collection_name)
52
+ span.set_attribute(SemanticConvetion.DB_SDK_VERSION, version)
53
+
54
+ if db_operation == SemanticConvetion.DB_OPERATION_CREATE_COLLECTION:
55
+ span.set_attribute(SemanticConvetion.DB_NAMESPACE, response.keyspace)
56
+ span.set_attribute(SemanticConvetion.DB_COLLECTION_NAME, response.name)
57
+ span.set_attribute(SemanticConvetion.DB_INDEX_DIMENSION, kwargs.get('dimension', ''))
58
+ span.set_attribute(SemanticConvetion.DB_INDEX_METRIC, str(kwargs.get('metric', '')))
59
+
60
+ if db_operation == SemanticConvetion.DB_OPERATION_INSERT:
61
+ span.set_attribute(SemanticConvetion.DB_DOCUMENTS_COUNT, object_count(args[0]))
62
+ span.set_attribute(SemanticConvetion.DB_QUERY_TEXT, str(args[0] or kwargs.get('documents', {})))
63
+
64
+ elif db_operation == SemanticConvetion.DB_OPERATION_UPDATE:
65
+ span.set_attribute(SemanticConvetion.DB_RESPONSE_RETURNED_ROWS, response.update_info.get('nModified', 0))
66
+ span.set_attribute(SemanticConvetion.DB_QUERY_TEXT, str(args[1] or kwargs.get('update', {})))
67
+
68
+ elif db_operation == SemanticConvetion.DB_OPERATION_DELETE:
69
+ span.set_attribute(SemanticConvetion.DB_RESPONSE_RETURNED_ROWS, response.deleted_count)
70
+ span.set_attribute(SemanticConvetion.DB_QUERY_TEXT, str(args[0] or kwargs.get('filter', {})))
71
+
72
+ elif db_operation in [
73
+ SemanticConvetion.DB_OPERATION_SELECT,
74
+ SemanticConvetion.DB_OPERATION_FIND_AND_DELETE,
75
+ SemanticConvetion.DB_OPERATION_REPLACE
76
+ ]:
77
+ span.set_attribute(SemanticConvetion.DB_QUERY_TEXT, str(args or kwargs.get('filter', {})))
78
+
79
+ span.set_status(Status(StatusCode.OK))
80
+
81
+ if not disable_metrics:
82
+ attributes = {
83
+ TELEMETRY_SDK_NAME: 'openlit',
84
+ SERVICE_NAME: application_name,
85
+ SemanticConvetion.DB_SYSTEM_NAME: SemanticConvetion.DB_SYSTEM_ASTRA,
86
+ DEPLOYMENT_ENVIRONMENT: environment,
87
+ SemanticConvetion.GEN_AI_OPERATION: SemanticConvetion.GEN_AI_OPERATION_TYPE_VECTORDB,
88
+ SemanticConvetion.DB_OPERATION_NAME: db_operation
89
+ }
90
+
91
+ metrics['db_requests'].add(1, attributes)
92
+ metrics['db_client_operation_duration'].record(end_time - start_time, attributes)
93
+
94
+ # Return original response
95
+ return response
96
+
97
+ except Exception as e:
98
+ handle_exception(span, e)
99
+ logger.error('Error in trace creation: %s', e)
100
+
101
+ # Return original response
102
+ return response
@@ -79,14 +79,14 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
79
79
  application_name)
80
80
  span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
81
81
  SemanticConvetion.GEN_AI_OPERATION_TYPE_VECTORDB)
82
- span.set_attribute(SemanticConvetion.DB_SYSTEM,
82
+ span.set_attribute(SemanticConvetion.DB_SYSTEM_NAME,
83
83
  SemanticConvetion.DB_SYSTEM_CHROMA)
84
84
  span.set_attribute(SemanticConvetion.DB_COLLECTION_NAME,
85
85
  instance.name)
86
86
 
87
87
  if gen_ai_endpoint == "chroma.add":
88
88
  db_operation = SemanticConvetion.DB_OPERATION_ADD
89
- span.set_attribute(SemanticConvetion.DB_OPERATION,
89
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME,
90
90
  SemanticConvetion.DB_OPERATION_ADD)
91
91
  span.set_attribute(SemanticConvetion.DB_ID_COUNT,
92
92
  object_count(kwargs.get("ids", [])))
@@ -99,7 +99,7 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
99
99
 
100
100
  elif gen_ai_endpoint == "chroma.get":
101
101
  db_operation = SemanticConvetion.DB_OPERATION_GET
102
- span.set_attribute(SemanticConvetion.DB_OPERATION,
102
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME,
103
103
  SemanticConvetion.DB_OPERATION_GET)
104
104
  span.set_attribute(SemanticConvetion.DB_ID_COUNT,
105
105
  object_count(kwargs.get("ids", [])))
@@ -112,7 +112,7 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
112
112
 
113
113
  elif gen_ai_endpoint == "chroma.query":
114
114
  db_operation = SemanticConvetion.DB_OPERATION_QUERY
115
- span.set_attribute(SemanticConvetion.DB_OPERATION,
115
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME,
116
116
  SemanticConvetion.DB_OPERATION_QUERY)
117
117
  span.set_attribute(SemanticConvetion.DB_STATEMENT,
118
118
  str(kwargs.get("query_texts", "")))
@@ -125,7 +125,7 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
125
125
 
126
126
  elif gen_ai_endpoint == "chroma.update":
127
127
  db_operation = SemanticConvetion.DB_OPERATION_UPDATE
128
- span.set_attribute(SemanticConvetion.DB_OPERATION,
128
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME,
129
129
  SemanticConvetion.DB_OPERATION_UPDATE)
130
130
  span.set_attribute(SemanticConvetion.DB_VECTOR_COUNT,
131
131
  object_count(kwargs.get("embeddings", [])))
@@ -138,7 +138,7 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
138
138
 
139
139
  elif gen_ai_endpoint == "chroma.upsert":
140
140
  db_operation = SemanticConvetion.DB_OPERATION_UPSERT
141
- span.set_attribute(SemanticConvetion.DB_OPERATION,
141
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME,
142
142
  SemanticConvetion.DB_OPERATION_UPSERT)
143
143
  span.set_attribute(SemanticConvetion.DB_VECTOR_COUNT,
144
144
  object_count(kwargs.get("embeddings", [])))
@@ -151,7 +151,7 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
151
151
 
152
152
  elif gen_ai_endpoint == "chroma.delete":
153
153
  db_operation = SemanticConvetion.DB_OPERATION_DELETE
154
- span.set_attribute(SemanticConvetion.DB_OPERATION,
154
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME,
155
155
  SemanticConvetion.DB_OPERATION_DELETE)
156
156
  span.set_attribute(SemanticConvetion.DB_ID_COUNT,
157
157
  object_count(kwargs.get("ids", [])))
@@ -164,7 +164,7 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
164
164
 
165
165
  elif gen_ai_endpoint == "chroma.peek":
166
166
  db_operation = SemanticConvetion.DB_OPERATION_PEEK
167
- span.set_attribute(SemanticConvetion.DB_OPERATION,
167
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME,
168
168
  SemanticConvetion.DB_OPERATION_PEEK)
169
169
 
170
170
  span.set_status(Status(StatusCode.OK))
@@ -175,13 +175,13 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
175
175
  "openlit",
176
176
  SERVICE_NAME:
177
177
  application_name,
178
- SemanticConvetion.DB_SYSTEM:
178
+ SemanticConvetion.DB_SYSTEM_NAME:
179
179
  SemanticConvetion.DB_SYSTEM_CHROMA,
180
180
  DEPLOYMENT_ENVIRONMENT:
181
181
  environment,
182
182
  SemanticConvetion.GEN_AI_OPERATION:
183
183
  SemanticConvetion.GEN_AI_OPERATION_TYPE_VECTORDB,
184
- SemanticConvetion.DB_OPERATION:
184
+ SemanticConvetion.DB_OPERATION_NAME:
185
185
  db_operation
186
186
  }
187
187
 
@@ -84,13 +84,13 @@ def dynamiq_wrap(gen_ai_endpoint, version, environment, application_name,
84
84
  getattr(getattr(instance.flow, 'nodes', [None])[0], 'model', 'default_model'))
85
85
 
86
86
  elif gen_ai_endpoint == "dynamiq.memory_add":
87
- span.set_attribute(SemanticConvetion.DB_OPERATION,
87
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME,
88
88
  SemanticConvetion.DB_OPERATION_ADD)
89
89
  span.set_attribute(SemanticConvetion.DB_METADATA, str(kwargs.get('metadata', '')))
90
90
 
91
91
  elif gen_ai_endpoint == "dynamiq.memory_search":
92
92
  query_value = kwargs.get('query', '') or (args[0] if args else '')
93
- span.set_attribute(SemanticConvetion.DB_OPERATION,
93
+ span.set_attribute(SemanticConvetion.DB_OPERATION_NAME,
94
94
  SemanticConvetion.DB_OPERATION_GET)
95
95
  span.set_attribute(SemanticConvetion.DB_FILTER, str(kwargs.get('filters', '')))
96
96
  span.set_attribute(SemanticConvetion.DB_STATEMENT, query_value)