Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 15 additions & 13 deletions src/langtrace_python_sdk/instrumentation/__init__.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,31 @@
from .anthropic import AnthropicInstrumentation
from .autogen import AutogenInstrumentation
from .aws_bedrock import AWSBedrockInstrumentation
from .cerebras import CerebrasInstrumentation
from .chroma import ChromaInstrumentation
from .cohere import CohereInstrumentation
from .crewai import CrewAIInstrumentation
from .crewai_tools import CrewaiToolsInstrumentation
from .dspy import DspyInstrumentation
from .embedchain import EmbedchainInstrumentation
from .gemini import GeminiInstrumentation
from .google_genai import GoogleGenaiInstrumentation
from .groq import GroqInstrumentation
from .langchain import LangchainInstrumentation
from .langchain_community import LangchainCommunityInstrumentation
from .langchain_core import LangchainCoreInstrumentation
from .langgraph import LanggraphInstrumentation
from .litellm import LiteLLMInstrumentation
from .llamaindex import LlamaindexInstrumentation
from .milvus import MilvusInstrumentation
from .mistral import MistralInstrumentation
from .ollama import OllamaInstrumentor
from .openai import OpenAIInstrumentation
from .pinecone import PineconeInstrumentation
from .pymongo import PyMongoInstrumentation
from .qdrant import QdrantInstrumentation
from .weaviate import WeaviateInstrumentation
from .ollama import OllamaInstrumentor
from .dspy import DspyInstrumentation
from .autogen import AutogenInstrumentation
from .vertexai import VertexAIInstrumentation
from .gemini import GeminiInstrumentation
from .mistral import MistralInstrumentation
from .aws_bedrock import AWSBedrockInstrumentation
from .embedchain import EmbedchainInstrumentation
from .litellm import LiteLLMInstrumentation
from .pymongo import PyMongoInstrumentation
from .cerebras import CerebrasInstrumentation
from .milvus import MilvusInstrumentation
from .google_genai import GoogleGenaiInstrumentation
from .weaviate import WeaviateInstrumentation

__all__ = [
"AnthropicInstrumentation",
Expand Down Expand Up @@ -54,4 +55,5 @@
"CerebrasInstrumentation",
"MilvusInstrumentation",
"GoogleGenaiInstrumentation",
"CrewaiToolsInstrumentation",
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from .instrumentation import CrewaiToolsInstrumentation

__all__ = ["CrewaiToolsInstrumentation"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
"""
Copyright (c) 2024 Scale3 Labs

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""

from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.trace import get_tracer
from wrapt import wrap_function_wrapper as _W
from typing import Collection
from importlib_metadata import version as v
from .patch import patch_run


class CrewaiToolsInstrumentation(BaseInstrumentor):
"""
The CrewAIInstrumentation class represents the CrewAI instrumentation"""

def instrumentation_dependencies(self) -> Collection[str]:
return ["crewai-tools >= 0.32.0"]

def _instrument(self, **kwargs):
print("Instrumenting CrewaiTools")
tracer_provider = kwargs.get("tracer_provider")
tracer = get_tracer(__name__, "", tracer_provider)
version = v("crewai-tools")
try:
_W(
"crewai_tools.tools.serper_dev_tool.serper_dev_tool",
"SerperDevTool._run",
patch_run("SerperDevTool._run", version, tracer),
)
# pylint: disable=broad-except
except Exception:
pass

def _uninstrument(self, **kwargs):
pass
65 changes: 65 additions & 0 deletions src/langtrace_python_sdk/instrumentation/crewai_tools/patch.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import json

from importlib_metadata import version as v
from langtrace.trace_attributes import FrameworkSpanAttributes
from opentelemetry import baggage
from opentelemetry.trace import SpanKind, Tracer
from opentelemetry.trace.status import Status, StatusCode

from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME
from langtrace_python_sdk.constants.instrumentation.common import (
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY, SERVICE_PROVIDERS)
from langtrace_python_sdk.utils import set_span_attribute
from langtrace_python_sdk.utils.llm import get_span_name, set_span_attributes
from langtrace_python_sdk.utils.misc import serialize_args, serialize_kwargs


def patch_run(operation_name, version, tracer: Tracer):
def traced_method(wrapped, instance, args, kwargs):
print("\n\n\nTracing CrewaiTools\n\n\n")
service_provider = SERVICE_PROVIDERS["CREWAI"]
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
span_attributes = {
Copy link
Collaborator

@alizenhom alizenhom Jan 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
span_attributes = {
span_attributes = {
**get_langtrace_attributes(version, service_provider, vendor_type="framework)
**get_extra_attributes()
}

for future reference should use helper methods from llm.py

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oops just saw this. will update. thanks

"langtrace.sdk.name": "langtrace-python-sdk",
"langtrace.service.name": service_provider,
"langtrace.service.type": "framework",
"langtrace.service.version": version,
"langtrace.version": v(LANGTRACE_SDK_NAME),
**(extra_attributes if extra_attributes is not None else {}),
}

inputs = {}
if len(args) > 0:
inputs["args"] = serialize_args(*args)
if len(kwargs) > 0:
inputs["kwargs"] = serialize_kwargs(**kwargs)
span_attributes["crewai_tools.tools.serper_dev_tool.inputs"] = json.dumps(inputs)

attributes = FrameworkSpanAttributes(**span_attributes)

with tracer.start_as_current_span(
get_span_name(operation_name), kind=SpanKind.CLIENT
) as span:

try:
set_span_attributes(span, attributes)
result = wrapped(*args, **kwargs)
if result is not None and len(result) > 0:
set_span_attribute(
span, "crewai_tools.tools.serper_dev_tool.outputs", str(result)
)
if result:
span.set_status(Status(StatusCode.OK))
return result

except Exception as err:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
except Exception as err:
except Exception as err:
handle_span_error(span,err)
raise

for future ref, should use helper method

# Record the exception in the span
span.record_exception(err)

# Set the span status to indicate an error
span.set_status(Status(StatusCode.ERROR, str(err)))

# Reraise the exception to ensure it's not swallowed
raise

return traced_method
91 changes: 34 additions & 57 deletions src/langtrace_python_sdk/langtrace.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,74 +14,50 @@
limitations under the License.
"""

import logging
import os
import sys
from typing import Any, Dict, Optional

import sentry_sdk
import logging
from typing import Dict, Optional, Any
from colorama import Fore
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME, SENTRY_DSN
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import \
OTLPSpanExporter as GRPCExporter
from opentelemetry.exporter.otlp.proto.http.trace_exporter import \
OTLPSpanExporter as HTTPExporter
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (
BatchSpanProcessor,
ConsoleSpanExporter,
SimpleSpanProcessor,
)

from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
OTLPSpanExporter as GRPCExporter,
)
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
OTLPSpanExporter as HTTPExporter,
)
from langtrace_python_sdk.constants.exporter.langtrace_exporter import (
LANGTRACE_REMOTE_URL,
LANGTRACE_SESSION_ID_HEADER,
)
from langtrace_python_sdk.instrumentation import (
AnthropicInstrumentation,
ChromaInstrumentation,
CohereInstrumentation,
CrewAIInstrumentation,
DspyInstrumentation,
EmbedchainInstrumentation,
GeminiInstrumentation,
GroqInstrumentation,
LangchainCommunityInstrumentation,
LangchainCoreInstrumentation,
LangchainInstrumentation,
LanggraphInstrumentation,
LiteLLMInstrumentation,
LlamaindexInstrumentation,
MistralInstrumentation,
AWSBedrockInstrumentation,
OllamaInstrumentor,
OpenAIInstrumentation,
PineconeInstrumentation,
QdrantInstrumentation,
AutogenInstrumentation,
VertexAIInstrumentation,
WeaviateInstrumentation,
PyMongoInstrumentation,
CerebrasInstrumentation,
MilvusInstrumentation,
GoogleGenaiInstrumentation,
)
from opentelemetry.sdk.trace.export import (BatchSpanProcessor,
ConsoleSpanExporter,
SimpleSpanProcessor)
from opentelemetry.util.re import parse_env_headers
from sentry_sdk.types import Event, Hint

from langtrace_python_sdk.types import DisableInstrumentations, InstrumentationMethods
from langtrace_python_sdk.utils import (
check_if_sdk_is_outdated,
get_sdk_version,
is_package_installed,
validate_instrumentations,
)
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME, SENTRY_DSN
from langtrace_python_sdk.constants.exporter.langtrace_exporter import (
LANGTRACE_REMOTE_URL, LANGTRACE_SESSION_ID_HEADER)
from langtrace_python_sdk.extensions.langtrace_exporter import \
LangTraceExporter
from langtrace_python_sdk.instrumentation import (
AnthropicInstrumentation, AutogenInstrumentation,
AWSBedrockInstrumentation, CerebrasInstrumentation, ChromaInstrumentation,
CohereInstrumentation, CrewAIInstrumentation, CrewaiToolsInstrumentation,
DspyInstrumentation, EmbedchainInstrumentation, GeminiInstrumentation,
GoogleGenaiInstrumentation, GroqInstrumentation,
LangchainCommunityInstrumentation, LangchainCoreInstrumentation,
LangchainInstrumentation, LanggraphInstrumentation, LiteLLMInstrumentation,
LlamaindexInstrumentation, MilvusInstrumentation, MistralInstrumentation,
OllamaInstrumentor, OpenAIInstrumentation, PineconeInstrumentation,
PyMongoInstrumentation, QdrantInstrumentation, VertexAIInstrumentation,
WeaviateInstrumentation)
from langtrace_python_sdk.types import (DisableInstrumentations,
InstrumentationMethods)
from langtrace_python_sdk.utils import (check_if_sdk_is_outdated,
get_sdk_version, is_package_installed,
validate_instrumentations)
from langtrace_python_sdk.utils.langtrace_sampler import LangtraceSampler
from langtrace_python_sdk.extensions.langtrace_exporter import LangTraceExporter
from sentry_sdk.types import Event, Hint


class LangtraceConfig:
Expand Down Expand Up @@ -309,6 +285,7 @@ def init(
"pymongo": PyMongoInstrumentation(),
"cerebras-cloud-sdk": CerebrasInstrumentation(),
"pymilvus": MilvusInstrumentation(),
"crewai-tools": CrewaiToolsInstrumentation(),
}

init_instrumentations(config.disable_instrumentations, all_instrumentations)
Expand Down
2 changes: 1 addition & 1 deletion src/langtrace_python_sdk/version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "3.3.31"
__version__ = "3.4.0"
Loading