openlit 1.34.24__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.
- {openlit-1.34.24 → openlit-1.34.26}/PKG-INFO +1 -1
- {openlit-1.34.24 → openlit-1.34.26}/pyproject.toml +1 -1
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/chroma/__init__.py +38 -34
- openlit-1.34.26/src/openlit/instrumentation/chroma/chroma.py +57 -0
- openlit-1.34.26/src/openlit/instrumentation/chroma/utils.py +272 -0
- openlit-1.34.26/src/openlit/instrumentation/pinecone/__init__.py +78 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/pinecone/async_pinecone.py +8 -11
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/pinecone/pinecone.py +8 -11
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/pinecone/utils.py +47 -3
- openlit-1.34.26/src/openlit/instrumentation/qdrant/__init__.py +80 -0
- openlit-1.34.26/src/openlit/instrumentation/qdrant/async_qdrant.py +55 -0
- openlit-1.34.26/src/openlit/instrumentation/qdrant/qdrant.py +55 -0
- openlit-1.34.26/src/openlit/instrumentation/qdrant/utils.py +328 -0
- openlit-1.34.24/src/openlit/instrumentation/chroma/chroma.py +0 -199
- openlit-1.34.24/src/openlit/instrumentation/pinecone/__init__.py +0 -174
- openlit-1.34.24/src/openlit/instrumentation/qdrant/__init__.py +0 -295
- openlit-1.34.24/src/openlit/instrumentation/qdrant/async_qdrant.py +0 -267
- openlit-1.34.24/src/openlit/instrumentation/qdrant/qdrant.py +0 -274
- {openlit-1.34.24 → openlit-1.34.26}/LICENSE +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/README.md +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/__helpers.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/evals/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/evals/all.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/evals/bias_detection.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/evals/hallucination.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/evals/toxicity.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/evals/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/guard/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/guard/all.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/guard/prompt_injection.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/guard/restrict_topic.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/guard/sensitive_topic.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/guard/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ag2/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ag2/ag2.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ag2/async_ag2.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ag2/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ai21/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ai21/ai21.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ai21/async_ai21.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ai21/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/anthropic/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/anthropic/anthropic.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/anthropic/async_anthropic.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/anthropic/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/assemblyai/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/assemblyai/assemblyai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/assemblyai/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/astra/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/astra/astra.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/astra/async_astra.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/astra/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/azure_ai_inference/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/azure_ai_inference/async_azure_ai_inference.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/azure_ai_inference/azure_ai_inference.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/azure_ai_inference/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/bedrock/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/bedrock/bedrock.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/bedrock/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/cohere/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/cohere/async_cohere.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/cohere/cohere.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/cohere/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/controlflow/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/controlflow/controlflow.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/crawl4ai/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/crawl4ai/async_crawl4ai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/crawl4ai/crawl4ai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/crewai/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/crewai/crewai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/dynamiq/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/dynamiq/dynamiq.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/elevenlabs/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/elevenlabs/async_elevenlabs.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/elevenlabs/elevenlabs.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/elevenlabs/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/embedchain/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/embedchain/embedchain.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/firecrawl/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/firecrawl/firecrawl.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/google_ai_studio/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/google_ai_studio/async_google_ai_studio.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/google_ai_studio/google_ai_studio.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/google_ai_studio/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/gpt4all/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/gpt4all/gpt4all.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/gpt4all/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/gpu/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/groq/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/groq/async_groq.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/groq/groq.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/groq/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/haystack/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/haystack/haystack.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/julep/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/julep/async_julep.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/julep/julep.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/langchain/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/langchain/async_langchain.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/langchain/langchain.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/langchain/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/langchain_community/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/langchain_community/async_langchain_community.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/langchain_community/langchain_community.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/langchain_community/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/letta/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/letta/letta.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/litellm/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/litellm/async_litellm.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/litellm/litellm.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/litellm/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/llamaindex/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/llamaindex/llamaindex.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/mem0/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/mem0/mem0.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/milvus/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/milvus/milvus.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/mistral/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/mistral/async_mistral.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/mistral/mistral.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/mistral/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/multion/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/multion/async_multion.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/multion/multion.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ollama/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ollama/async_ollama.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ollama/ollama.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/ollama/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/openai/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/openai/async_openai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/openai/openai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/openai/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/openai_agents/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/openai_agents/openai_agents.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/phidata/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/phidata/phidata.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/premai/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/premai/premai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/premai/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/pydantic_ai/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/pydantic_ai/pydantic_ai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/pydantic_ai/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/reka/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/reka/async_reka.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/reka/reka.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/reka/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/together/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/together/async_together.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/together/together.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/together/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/transformers/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/transformers/transformers.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/transformers/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/vertexai/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/vertexai/async_vertexai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/vertexai/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/vertexai/vertexai.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/vllm/__init__.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/vllm/utils.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/instrumentation/vllm/vllm.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/otel/events.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/otel/metrics.py +0 -0
- {openlit-1.34.24 → openlit-1.34.26}/src/openlit/otel/tracing.py +0 -0
- {openlit-1.34.24 → 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.
|
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.
|
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"
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
"""
|
2
|
+
OpenLIT ChromaDB Instrumentation
|
3
|
+
"""
|
4
|
+
|
3
5
|
from typing import Collection
|
4
6
|
import importlib.metadata
|
5
7
|
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
@@ -10,77 +12,79 @@ from openlit.instrumentation.chroma.chroma import general_wrap
|
|
10
12
|
_instruments = ("chromadb >= 0.4.0",)
|
11
13
|
|
12
14
|
class ChromaInstrumentor(BaseInstrumentor):
|
13
|
-
"""
|
15
|
+
"""
|
16
|
+
An instrumentor for ChromaDB client library.
|
17
|
+
"""
|
14
18
|
|
15
19
|
def instrumentation_dependencies(self) -> Collection[str]:
|
16
20
|
return _instruments
|
17
21
|
|
18
22
|
def _instrument(self, **kwargs):
|
19
|
-
|
20
|
-
environment = kwargs.get("environment")
|
23
|
+
version = importlib.metadata.version("chromadb")
|
24
|
+
environment = kwargs.get("environment", "default")
|
25
|
+
application_name = kwargs.get("application_name", "default")
|
21
26
|
tracer = kwargs.get("tracer")
|
27
|
+
pricing_info = kwargs.get("pricing_info", {})
|
28
|
+
capture_message_content = kwargs.get("capture_message_content", False)
|
22
29
|
metrics = kwargs.get("metrics_dict")
|
23
|
-
pricing_info = kwargs.get("pricing_info")
|
24
|
-
capture_message_content = kwargs.get("capture_message_content")
|
25
30
|
disable_metrics = kwargs.get("disable_metrics")
|
26
|
-
version = importlib.metadata.version("chromadb")
|
27
31
|
|
32
|
+
# Sync operations
|
28
33
|
wrap_function_wrapper(
|
29
|
-
"chromadb.db",
|
30
|
-
"DB.create_collection",
|
34
|
+
"chromadb.db",
|
35
|
+
"DB.create_collection",
|
31
36
|
general_wrap("chroma.create_collection", version, environment, application_name,
|
32
|
-
|
37
|
+
tracer, pricing_info, capture_message_content, metrics, disable_metrics),
|
33
38
|
)
|
34
39
|
|
35
40
|
wrap_function_wrapper(
|
36
|
-
"chromadb",
|
37
|
-
"Collection.add",
|
41
|
+
"chromadb",
|
42
|
+
"Collection.add",
|
38
43
|
general_wrap("chroma.add", version, environment, application_name,
|
39
|
-
|
44
|
+
tracer, pricing_info, capture_message_content, metrics, disable_metrics),
|
40
45
|
)
|
41
46
|
|
42
47
|
wrap_function_wrapper(
|
43
|
-
"chromadb",
|
44
|
-
"Collection.get",
|
48
|
+
"chromadb",
|
49
|
+
"Collection.get",
|
45
50
|
general_wrap("chroma.get", version, environment, application_name,
|
46
|
-
|
51
|
+
tracer, pricing_info, capture_message_content, metrics, disable_metrics),
|
47
52
|
)
|
48
53
|
|
49
54
|
wrap_function_wrapper(
|
50
|
-
"chromadb",
|
51
|
-
"Collection.peek",
|
55
|
+
"chromadb",
|
56
|
+
"Collection.peek",
|
52
57
|
general_wrap("chroma.peek", version, environment, application_name,
|
53
|
-
|
58
|
+
tracer, pricing_info, capture_message_content, metrics, disable_metrics),
|
54
59
|
)
|
55
60
|
|
56
61
|
wrap_function_wrapper(
|
57
|
-
"chromadb",
|
58
|
-
"Collection.query",
|
62
|
+
"chromadb",
|
63
|
+
"Collection.query",
|
59
64
|
general_wrap("chroma.query", version, environment, application_name,
|
60
|
-
|
65
|
+
tracer, pricing_info, capture_message_content, metrics, disable_metrics),
|
61
66
|
)
|
62
67
|
|
63
68
|
wrap_function_wrapper(
|
64
|
-
"chromadb",
|
65
|
-
"Collection.update",
|
69
|
+
"chromadb",
|
70
|
+
"Collection.update",
|
66
71
|
general_wrap("chroma.update", version, environment, application_name,
|
67
|
-
|
72
|
+
tracer, pricing_info, capture_message_content, metrics, disable_metrics),
|
68
73
|
)
|
69
74
|
|
70
75
|
wrap_function_wrapper(
|
71
|
-
"chromadb",
|
72
|
-
"Collection.upsert",
|
76
|
+
"chromadb",
|
77
|
+
"Collection.upsert",
|
73
78
|
general_wrap("chroma.upsert", version, environment, application_name,
|
74
|
-
|
79
|
+
tracer, pricing_info, capture_message_content, metrics, disable_metrics),
|
75
80
|
)
|
81
|
+
|
76
82
|
wrap_function_wrapper(
|
77
|
-
"chromadb",
|
78
|
-
"Collection.delete",
|
83
|
+
"chromadb",
|
84
|
+
"Collection.delete",
|
79
85
|
general_wrap("chroma.delete", version, environment, application_name,
|
80
|
-
|
86
|
+
tracer, pricing_info, capture_message_content, metrics, disable_metrics),
|
81
87
|
)
|
82
88
|
|
83
|
-
|
84
|
-
@staticmethod
|
85
89
|
def _uninstrument(self, **kwargs):
|
86
90
|
pass
|
@@ -0,0 +1,57 @@
|
|
1
|
+
"""
|
2
|
+
Module for monitoring ChromaDB API calls.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import time
|
6
|
+
from opentelemetry.trace import SpanKind
|
7
|
+
from opentelemetry import context as context_api
|
8
|
+
from openlit.__helpers import handle_exception
|
9
|
+
from openlit.instrumentation.chroma.utils import (
|
10
|
+
process_vectordb_response,
|
11
|
+
DB_OPERATION_MAP,
|
12
|
+
set_server_address_and_port,
|
13
|
+
)
|
14
|
+
|
15
|
+
def general_wrap(gen_ai_endpoint, version, environment, application_name,
|
16
|
+
tracer, pricing_info, capture_message_content, metrics, disable_metrics):
|
17
|
+
"""
|
18
|
+
Generates a telemetry wrapper for ChromaDB function calls.
|
19
|
+
"""
|
20
|
+
|
21
|
+
def wrapper(wrapped, instance, args, kwargs):
|
22
|
+
"""
|
23
|
+
Wraps the ChromaDB function call.
|
24
|
+
"""
|
25
|
+
|
26
|
+
if context_api.get_value(context_api._SUPPRESS_INSTRUMENTATION_KEY):
|
27
|
+
return wrapped(*args, **kwargs)
|
28
|
+
|
29
|
+
# Get server address and port using the standard helper
|
30
|
+
server_address, server_port = set_server_address_and_port(instance)
|
31
|
+
|
32
|
+
db_operation = DB_OPERATION_MAP.get(gen_ai_endpoint, "unknown")
|
33
|
+
if db_operation == "create_collection":
|
34
|
+
namespace = kwargs.get("name") or (args[0] if args else "unknown")
|
35
|
+
else:
|
36
|
+
namespace = getattr(instance, "name", "unknown")
|
37
|
+
span_name = f"{db_operation} {namespace}"
|
38
|
+
|
39
|
+
with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
|
40
|
+
start_time = time.time()
|
41
|
+
response = wrapped(*args, **kwargs)
|
42
|
+
|
43
|
+
try:
|
44
|
+
# Process response and generate telemetry
|
45
|
+
response = process_vectordb_response(
|
46
|
+
response, db_operation, server_address, server_port,
|
47
|
+
environment, application_name, metrics, start_time, span,
|
48
|
+
capture_message_content, disable_metrics, version, instance, args, endpoint=gen_ai_endpoint, **kwargs
|
49
|
+
)
|
50
|
+
|
51
|
+
except Exception as e:
|
52
|
+
handle_exception(span, e)
|
53
|
+
|
54
|
+
return response
|
55
|
+
|
56
|
+
|
57
|
+
return wrapper
|
@@ -0,0 +1,272 @@
|
|
1
|
+
"""
|
2
|
+
ChromaDB OpenTelemetry instrumentation utility functions
|
3
|
+
"""
|
4
|
+
import time
|
5
|
+
from urllib.parse import urlparse
|
6
|
+
from opentelemetry.trace import Status, StatusCode
|
7
|
+
|
8
|
+
from openlit.__helpers import (
|
9
|
+
common_db_span_attributes,
|
10
|
+
record_db_metrics,
|
11
|
+
)
|
12
|
+
from openlit.semcov import SemanticConvention
|
13
|
+
|
14
|
+
# Operation mapping for simple span naming
|
15
|
+
DB_OPERATION_MAP = {
|
16
|
+
"chroma.create_collection": SemanticConvention.DB_OPERATION_CREATE_COLLECTION,
|
17
|
+
"chroma.add": SemanticConvention.DB_OPERATION_INSERT,
|
18
|
+
"chroma.get": SemanticConvention.DB_OPERATION_GET,
|
19
|
+
"chroma.peek": SemanticConvention.DB_OPERATION_PEEK,
|
20
|
+
"chroma.query": SemanticConvention.DB_OPERATION_GET,
|
21
|
+
"chroma.update": SemanticConvention.DB_OPERATION_UPDATE,
|
22
|
+
"chroma.upsert": SemanticConvention.DB_OPERATION_UPSERT,
|
23
|
+
"chroma.delete": SemanticConvention.DB_OPERATION_DELETE,
|
24
|
+
}
|
25
|
+
|
26
|
+
def object_count(obj):
|
27
|
+
"""
|
28
|
+
Counts length of object if it exists, else returns 0.
|
29
|
+
"""
|
30
|
+
return len(obj) if obj else 0
|
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
|
+
|
77
|
+
def common_vectordb_logic(scope, environment, application_name,
|
78
|
+
metrics, capture_message_content, disable_metrics, version, instance=None, endpoint=None):
|
79
|
+
"""
|
80
|
+
Process vector database request and generate telemetry.
|
81
|
+
"""
|
82
|
+
|
83
|
+
scope._end_time = time.time()
|
84
|
+
|
85
|
+
# Set common database span attributes using helper
|
86
|
+
common_db_span_attributes(scope, SemanticConvention.DB_SYSTEM_CHROMA, scope._server_address, scope._server_port,
|
87
|
+
environment, application_name, version)
|
88
|
+
|
89
|
+
# Set DB operation specific attributes
|
90
|
+
scope._span.set_attribute(SemanticConvention.DB_OPERATION_NAME, scope._db_operation)
|
91
|
+
scope._span.set_attribute(SemanticConvention.DB_CLIENT_OPERATION_DURATION, scope._end_time - scope._start_time)
|
92
|
+
|
93
|
+
# Set collection name from instance
|
94
|
+
if hasattr(instance, "name"):
|
95
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_NAME, instance.name)
|
96
|
+
|
97
|
+
# Set Create Collection operation specific attributes
|
98
|
+
if scope._db_operation == SemanticConvention.DB_OPERATION_CREATE_COLLECTION:
|
99
|
+
# Standard database attributes
|
100
|
+
collection_name = scope._kwargs.get("name") or (scope._args[0] if scope._args else "unknown")
|
101
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_NAME, collection_name)
|
102
|
+
|
103
|
+
# Vector database specific attributes (extensions)
|
104
|
+
metadata = scope._kwargs.get("metadata", {})
|
105
|
+
if metadata:
|
106
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_METADATA, str(metadata))
|
107
|
+
|
108
|
+
elif scope._db_operation == SemanticConvention.DB_OPERATION_INSERT:
|
109
|
+
collection_name = getattr(instance, "name", "unknown")
|
110
|
+
query = scope._kwargs.get("ids", [])
|
111
|
+
|
112
|
+
# Standard database attributes
|
113
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_TEXT, str(query))
|
114
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_NAME, collection_name)
|
115
|
+
scope._span.set_attribute(SemanticConvention.DB_VECTOR_COUNT, object_count(query))
|
116
|
+
|
117
|
+
# Vector database specific attributes (extensions)
|
118
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_SUMMARY,
|
119
|
+
f"{scope._db_operation} {collection_name} "
|
120
|
+
f"ids={query} "
|
121
|
+
f"documents={scope._kwargs.get('documents', [])}")
|
122
|
+
|
123
|
+
elif scope._db_operation == SemanticConvention.DB_OPERATION_GET:
|
124
|
+
collection_name = getattr(instance, "name", "unknown")
|
125
|
+
|
126
|
+
# Handle different GET operations based on endpoint
|
127
|
+
if endpoint == "chroma.get":
|
128
|
+
# Collection.get() - retrieve documents by IDs
|
129
|
+
query = scope._kwargs.get("ids", [])
|
130
|
+
|
131
|
+
# Standard database attributes
|
132
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_TEXT, str(query))
|
133
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_NAME, collection_name)
|
134
|
+
scope._span.set_attribute(SemanticConvention.DB_VECTOR_COUNT, object_count(query))
|
135
|
+
|
136
|
+
# Vector database specific attributes (extensions)
|
137
|
+
scope._span.set_attribute(SemanticConvention.DB_FILTER, str(scope._kwargs.get("where", "")))
|
138
|
+
|
139
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_SUMMARY,
|
140
|
+
f"{scope._db_operation} {collection_name} "
|
141
|
+
f"ids={query} "
|
142
|
+
f"limit={scope._kwargs.get('limit', 'None')} "
|
143
|
+
f"offset={scope._kwargs.get('offset', 'None')}")
|
144
|
+
|
145
|
+
elif endpoint == "chroma.query":
|
146
|
+
query_texts = scope._kwargs.get("query_texts", [])
|
147
|
+
query_embeddings = scope._kwargs.get("query_embeddings", [])
|
148
|
+
|
149
|
+
# Create comprehensive query text (can be either embeddings or texts)
|
150
|
+
if query_texts:
|
151
|
+
query_content = f"texts={query_texts}"
|
152
|
+
elif query_embeddings:
|
153
|
+
query_content = f"embeddings={len(query_embeddings) if query_embeddings else 0} vectors"
|
154
|
+
else:
|
155
|
+
query_content = "no query provided"
|
156
|
+
|
157
|
+
# Standard database attributes
|
158
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_TEXT, query_content)
|
159
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_NAME, collection_name)
|
160
|
+
|
161
|
+
# Vector database specific attributes (extensions)
|
162
|
+
scope._span.set_attribute(SemanticConvention.DB_VECTOR_QUERY_TOP_K, scope._kwargs.get("n_results", 10))
|
163
|
+
scope._span.set_attribute(SemanticConvention.DB_FILTER, str(scope._kwargs.get("where", "")))
|
164
|
+
|
165
|
+
# Extract response metrics if available
|
166
|
+
if scope._response:
|
167
|
+
# Get number of results returned
|
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
|
170
|
+
scope._span.set_attribute(SemanticConvention.DB_RESPONSE_RETURNED_ROWS, returned_rows)
|
171
|
+
|
172
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_SUMMARY,
|
173
|
+
f"{scope._db_operation} {collection_name} "
|
174
|
+
f"n_results={scope._kwargs.get('n_results', 10)} "
|
175
|
+
f"{query_content} "
|
176
|
+
f"filter={scope._kwargs.get('where', 'None')}")
|
177
|
+
|
178
|
+
elif scope._db_operation == SemanticConvention.DB_OPERATION_UPDATE:
|
179
|
+
collection_name = getattr(instance, "name", "unknown")
|
180
|
+
query = scope._kwargs.get("ids", [])
|
181
|
+
|
182
|
+
# Standard database attributes
|
183
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_TEXT, str(query))
|
184
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_NAME, collection_name)
|
185
|
+
scope._span.set_attribute(SemanticConvention.DB_VECTOR_COUNT, object_count(query))
|
186
|
+
|
187
|
+
# Vector database specific attributes (extensions)
|
188
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_SUMMARY,
|
189
|
+
f"{scope._db_operation} {collection_name} "
|
190
|
+
f"ids={query} "
|
191
|
+
f"embeddings={scope._kwargs.get('embeddings', 'None')} "
|
192
|
+
f"metadatas={scope._kwargs.get('metadatas', 'None')} "
|
193
|
+
f"documents={scope._kwargs.get('documents', 'None')}")
|
194
|
+
|
195
|
+
elif scope._db_operation == SemanticConvention.DB_OPERATION_UPSERT:
|
196
|
+
collection_name = getattr(instance, "name", "unknown")
|
197
|
+
query = scope._kwargs.get("ids", [])
|
198
|
+
|
199
|
+
# Standard database attributes
|
200
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_TEXT, str(query))
|
201
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_NAME, collection_name)
|
202
|
+
scope._span.set_attribute(SemanticConvention.DB_VECTOR_COUNT, object_count(query))
|
203
|
+
|
204
|
+
# Vector database specific attributes (extensions)
|
205
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_SUMMARY,
|
206
|
+
f"{scope._db_operation} {collection_name} "
|
207
|
+
f"ids={query} "
|
208
|
+
f"embeddings={scope._kwargs.get('embeddings', 'None')} "
|
209
|
+
f"metadatas={scope._kwargs.get('metadatas', 'None')} "
|
210
|
+
f"documents={scope._kwargs.get('documents', 'None')}")
|
211
|
+
|
212
|
+
elif scope._db_operation == SemanticConvention.DB_OPERATION_DELETE:
|
213
|
+
collection_name = getattr(instance, "name", "unknown")
|
214
|
+
query = scope._kwargs.get("ids", [])
|
215
|
+
|
216
|
+
# Standard database attributes
|
217
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_TEXT, str(query))
|
218
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_NAME, collection_name)
|
219
|
+
scope._span.set_attribute(SemanticConvention.DB_VECTOR_COUNT, object_count(query))
|
220
|
+
|
221
|
+
# Vector database specific attributes (extensions)
|
222
|
+
scope._span.set_attribute(SemanticConvention.DB_FILTER, str(scope._kwargs.get("where", "")))
|
223
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_SUMMARY,
|
224
|
+
f"{scope._db_operation} {collection_name} "
|
225
|
+
f"ids={query} "
|
226
|
+
f"filter={scope._kwargs.get('where', 'None')} "
|
227
|
+
f"delete_all={scope._kwargs.get('delete_all', False)}")
|
228
|
+
|
229
|
+
elif scope._db_operation == SemanticConvention.DB_OPERATION_PEEK:
|
230
|
+
collection_name = getattr(instance, "name", "unknown")
|
231
|
+
query = f"PEEK limit={scope._kwargs.get('limit', '')}"
|
232
|
+
|
233
|
+
# Standard database attributes
|
234
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_TEXT, query)
|
235
|
+
scope._span.set_attribute(SemanticConvention.DB_COLLECTION_NAME, collection_name)
|
236
|
+
scope._span.set_attribute(SemanticConvention.DB_VECTOR_COUNT, scope._kwargs.get("limit", ""))
|
237
|
+
|
238
|
+
# Vector database specific attributes (extensions)
|
239
|
+
scope._span.set_attribute(SemanticConvention.DB_QUERY_SUMMARY,
|
240
|
+
f"{scope._db_operation} {collection_name} "
|
241
|
+
f"limit={scope._kwargs.get('limit', 'None')}")
|
242
|
+
|
243
|
+
scope._span.set_status(Status(StatusCode.OK))
|
244
|
+
|
245
|
+
# Record metrics using helper
|
246
|
+
if not disable_metrics:
|
247
|
+
record_db_metrics(metrics, SemanticConvention.DB_SYSTEM_CHROMA, scope._server_address, scope._server_port,
|
248
|
+
environment, application_name, scope._start_time, scope._end_time)
|
249
|
+
|
250
|
+
def process_vectordb_response(response, db_operation, server_address, server_port,
|
251
|
+
environment, application_name, metrics, start_time, span,
|
252
|
+
capture_message_content=False, disable_metrics=False,
|
253
|
+
version="1.0.0", instance=None, args=None, endpoint=None, **kwargs):
|
254
|
+
"""
|
255
|
+
Process vector database response and generate telemetry following OpenTelemetry conventions.
|
256
|
+
"""
|
257
|
+
|
258
|
+
scope = type("GenericScope", (), {})()
|
259
|
+
|
260
|
+
scope._start_time = start_time
|
261
|
+
scope._span = span
|
262
|
+
scope._kwargs = kwargs
|
263
|
+
scope._args = args or []
|
264
|
+
scope._db_operation = db_operation
|
265
|
+
scope._response = response
|
266
|
+
scope._server_address = server_address
|
267
|
+
scope._server_port = server_port
|
268
|
+
|
269
|
+
common_vectordb_logic(scope, environment, application_name,
|
270
|
+
metrics, capture_message_content, disable_metrics, version, instance, endpoint)
|
271
|
+
|
272
|
+
return response
|
@@ -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
|
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
|
-
|
43
|
-
|
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,
|
@@ -50,10 +48,9 @@ def async_general_wrap(gen_ai_endpoint, version, environment, application_name,
|
|
50
48
|
capture_message_content, disable_metrics, version, instance, args, **kwargs
|
51
49
|
)
|
52
50
|
|
53
|
-
return response
|
54
|
-
|
55
51
|
except Exception as e:
|
56
52
|
handle_exception(span, e)
|
57
|
-
|
53
|
+
|
54
|
+
return response
|
58
55
|
|
59
56
|
return wrapper
|
@@ -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
|
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
|
-
|
43
|
-
|
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,
|
@@ -50,10 +48,9 @@ def general_wrap(gen_ai_endpoint, version, environment, application_name,
|
|
50
48
|
capture_message_content, disable_metrics, version, instance, args, **kwargs
|
51
49
|
)
|
52
50
|
|
53
|
-
return response
|
54
|
-
|
55
51
|
except Exception as e:
|
56
52
|
handle_exception(span, e)
|
57
|
-
|
53
|
+
|
54
|
+
return response
|
58
55
|
|
59
56
|
return wrapper
|