Skip to content

Commit 5f14b58

Browse files
committed
Merge branch 'development' into release
2 parents b856e03 + b894632 commit 5f14b58

File tree

6 files changed

+166
-71
lines changed

6 files changed

+166
-71
lines changed

src/langtrace_python_sdk/instrumentation/__init__.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
11
from .anthropic import AnthropicInstrumentation
2+
from .autogen import AutogenInstrumentation
3+
from .aws_bedrock import AWSBedrockInstrumentation
4+
from .cerebras import CerebrasInstrumentation
25
from .chroma import ChromaInstrumentation
36
from .cohere import CohereInstrumentation
47
from .crewai import CrewAIInstrumentation
8+
from .crewai_tools import CrewaiToolsInstrumentation
9+
from .dspy import DspyInstrumentation
10+
from .embedchain import EmbedchainInstrumentation
11+
from .gemini import GeminiInstrumentation
12+
from .google_genai import GoogleGenaiInstrumentation
513
from .groq import GroqInstrumentation
614
from .langchain import LangchainInstrumentation
715
from .langchain_community import LangchainCommunityInstrumentation
816
from .langchain_core import LangchainCoreInstrumentation
917
from .langgraph import LanggraphInstrumentation
18+
from .litellm import LiteLLMInstrumentation
1019
from .llamaindex import LlamaindexInstrumentation
20+
from .milvus import MilvusInstrumentation
21+
from .mistral import MistralInstrumentation
22+
from .ollama import OllamaInstrumentor
1123
from .openai import OpenAIInstrumentation
1224
from .pinecone import PineconeInstrumentation
25+
from .pymongo import PyMongoInstrumentation
1326
from .qdrant import QdrantInstrumentation
14-
from .weaviate import WeaviateInstrumentation
15-
from .ollama import OllamaInstrumentor
16-
from .dspy import DspyInstrumentation
17-
from .autogen import AutogenInstrumentation
1827
from .vertexai import VertexAIInstrumentation
19-
from .gemini import GeminiInstrumentation
20-
from .mistral import MistralInstrumentation
21-
from .aws_bedrock import AWSBedrockInstrumentation
22-
from .embedchain import EmbedchainInstrumentation
23-
from .litellm import LiteLLMInstrumentation
24-
from .pymongo import PyMongoInstrumentation
25-
from .cerebras import CerebrasInstrumentation
26-
from .milvus import MilvusInstrumentation
27-
from .google_genai import GoogleGenaiInstrumentation
28+
from .weaviate import WeaviateInstrumentation
2829

2930
__all__ = [
3031
"AnthropicInstrumentation",
@@ -54,4 +55,5 @@
5455
"CerebrasInstrumentation",
5556
"MilvusInstrumentation",
5657
"GoogleGenaiInstrumentation",
58+
"CrewaiToolsInstrumentation",
5759
]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .instrumentation import CrewaiToolsInstrumentation
2+
3+
__all__ = ["CrewaiToolsInstrumentation"]
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""
2+
Copyright (c) 2025 Scale3 Labs
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
"""
16+
17+
from typing import Collection
18+
19+
from importlib_metadata import version as v
20+
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
21+
from opentelemetry.trace import get_tracer
22+
from wrapt import wrap_function_wrapper as _W
23+
24+
from .patch import patch_run
25+
26+
27+
class CrewaiToolsInstrumentation(BaseInstrumentor):
28+
"""
29+
The CrewAIInstrumentation class represents the CrewAI instrumentation"""
30+
31+
def instrumentation_dependencies(self) -> Collection[str]:
32+
return ["crewai-tools >= 0.32.0"]
33+
34+
def _instrument(self, **kwargs):
35+
tracer_provider = kwargs.get("tracer_provider")
36+
tracer = get_tracer(__name__, "", tracer_provider)
37+
version = v("crewai-tools")
38+
try:
39+
_W(
40+
"crewai_tools.tools.serper_dev_tool.serper_dev_tool",
41+
"SerperDevTool._run",
42+
patch_run("SerperDevTool._run", version, tracer),
43+
)
44+
# pylint: disable=broad-except
45+
except Exception:
46+
pass
47+
48+
def _uninstrument(self, **kwargs):
49+
pass
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import json
2+
3+
from importlib_metadata import version as v
4+
from langtrace.trace_attributes import FrameworkSpanAttributes
5+
from opentelemetry import baggage
6+
from opentelemetry.trace import SpanKind, Tracer
7+
from opentelemetry.trace.status import Status, StatusCode
8+
9+
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME
10+
from langtrace_python_sdk.constants.instrumentation.common import (
11+
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY, SERVICE_PROVIDERS)
12+
from langtrace_python_sdk.utils import set_span_attribute
13+
from langtrace_python_sdk.utils.llm import get_span_name, set_span_attributes
14+
from langtrace_python_sdk.utils.misc import serialize_args, serialize_kwargs
15+
16+
17+
def patch_run(operation_name, version, tracer: Tracer):
18+
def traced_method(wrapped, instance, args, kwargs):
19+
service_provider = SERVICE_PROVIDERS["CREWAI"]
20+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
21+
span_attributes = {
22+
"langtrace.sdk.name": "langtrace-python-sdk",
23+
"langtrace.service.name": service_provider,
24+
"langtrace.service.type": "framework",
25+
"langtrace.service.version": version,
26+
"langtrace.version": v(LANGTRACE_SDK_NAME),
27+
**(extra_attributes if extra_attributes is not None else {}),
28+
}
29+
30+
inputs = {}
31+
if len(args) > 0:
32+
inputs["args"] = serialize_args(*args)
33+
if len(kwargs) > 0:
34+
inputs["kwargs"] = serialize_kwargs(**kwargs)
35+
span_attributes["crewai_tools.tools.serper_dev_tool.inputs"] = json.dumps(inputs)
36+
37+
attributes = FrameworkSpanAttributes(**span_attributes)
38+
39+
with tracer.start_as_current_span(
40+
get_span_name(operation_name), kind=SpanKind.CLIENT
41+
) as span:
42+
43+
try:
44+
set_span_attributes(span, attributes)
45+
result = wrapped(*args, **kwargs)
46+
if result is not None and len(result) > 0:
47+
set_span_attribute(
48+
span, "crewai_tools.tools.serper_dev_tool.outputs", str(result)
49+
)
50+
if result:
51+
span.set_status(Status(StatusCode.OK))
52+
return result
53+
54+
except Exception as err:
55+
# Record the exception in the span
56+
span.record_exception(err)
57+
58+
# Set the span status to indicate an error
59+
span.set_status(Status(StatusCode.ERROR, str(err)))
60+
61+
# Reraise the exception to ensure it's not swallowed
62+
raise
63+
64+
return traced_method

src/langtrace_python_sdk/langtrace.py

Lines changed: 34 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -14,74 +14,50 @@
1414
limitations under the License.
1515
"""
1616

17+
import logging
1718
import os
1819
import sys
20+
from typing import Any, Dict, Optional
21+
1922
import sentry_sdk
20-
import logging
21-
from typing import Dict, Optional, Any
2223
from colorama import Fore
23-
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME, SENTRY_DSN
2424
from opentelemetry import trace
25+
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import \
26+
OTLPSpanExporter as GRPCExporter
27+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import \
28+
OTLPSpanExporter as HTTPExporter
2529
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
2630
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
2731
from opentelemetry.sdk.trace import TracerProvider
28-
from opentelemetry.sdk.trace.export import (
29-
BatchSpanProcessor,
30-
ConsoleSpanExporter,
31-
SimpleSpanProcessor,
32-
)
33-
34-
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
35-
OTLPSpanExporter as GRPCExporter,
36-
)
37-
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
38-
OTLPSpanExporter as HTTPExporter,
39-
)
40-
from langtrace_python_sdk.constants.exporter.langtrace_exporter import (
41-
LANGTRACE_REMOTE_URL,
42-
LANGTRACE_SESSION_ID_HEADER,
43-
)
44-
from langtrace_python_sdk.instrumentation import (
45-
AnthropicInstrumentation,
46-
ChromaInstrumentation,
47-
CohereInstrumentation,
48-
CrewAIInstrumentation,
49-
DspyInstrumentation,
50-
EmbedchainInstrumentation,
51-
GeminiInstrumentation,
52-
GroqInstrumentation,
53-
LangchainCommunityInstrumentation,
54-
LangchainCoreInstrumentation,
55-
LangchainInstrumentation,
56-
LanggraphInstrumentation,
57-
LiteLLMInstrumentation,
58-
LlamaindexInstrumentation,
59-
MistralInstrumentation,
60-
AWSBedrockInstrumentation,
61-
OllamaInstrumentor,
62-
OpenAIInstrumentation,
63-
PineconeInstrumentation,
64-
QdrantInstrumentation,
65-
AutogenInstrumentation,
66-
VertexAIInstrumentation,
67-
WeaviateInstrumentation,
68-
PyMongoInstrumentation,
69-
CerebrasInstrumentation,
70-
MilvusInstrumentation,
71-
GoogleGenaiInstrumentation,
72-
)
32+
from opentelemetry.sdk.trace.export import (BatchSpanProcessor,
33+
ConsoleSpanExporter,
34+
SimpleSpanProcessor)
7335
from opentelemetry.util.re import parse_env_headers
36+
from sentry_sdk.types import Event, Hint
7437

75-
from langtrace_python_sdk.types import DisableInstrumentations, InstrumentationMethods
76-
from langtrace_python_sdk.utils import (
77-
check_if_sdk_is_outdated,
78-
get_sdk_version,
79-
is_package_installed,
80-
validate_instrumentations,
81-
)
38+
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME, SENTRY_DSN
39+
from langtrace_python_sdk.constants.exporter.langtrace_exporter import (
40+
LANGTRACE_REMOTE_URL, LANGTRACE_SESSION_ID_HEADER)
41+
from langtrace_python_sdk.extensions.langtrace_exporter import \
42+
LangTraceExporter
43+
from langtrace_python_sdk.instrumentation import (
44+
AnthropicInstrumentation, AutogenInstrumentation,
45+
AWSBedrockInstrumentation, CerebrasInstrumentation, ChromaInstrumentation,
46+
CohereInstrumentation, CrewAIInstrumentation, CrewaiToolsInstrumentation,
47+
DspyInstrumentation, EmbedchainInstrumentation, GeminiInstrumentation,
48+
GoogleGenaiInstrumentation, GroqInstrumentation,
49+
LangchainCommunityInstrumentation, LangchainCoreInstrumentation,
50+
LangchainInstrumentation, LanggraphInstrumentation, LiteLLMInstrumentation,
51+
LlamaindexInstrumentation, MilvusInstrumentation, MistralInstrumentation,
52+
OllamaInstrumentor, OpenAIInstrumentation, PineconeInstrumentation,
53+
PyMongoInstrumentation, QdrantInstrumentation, VertexAIInstrumentation,
54+
WeaviateInstrumentation)
55+
from langtrace_python_sdk.types import (DisableInstrumentations,
56+
InstrumentationMethods)
57+
from langtrace_python_sdk.utils import (check_if_sdk_is_outdated,
58+
get_sdk_version, is_package_installed,
59+
validate_instrumentations)
8260
from langtrace_python_sdk.utils.langtrace_sampler import LangtraceSampler
83-
from langtrace_python_sdk.extensions.langtrace_exporter import LangTraceExporter
84-
from sentry_sdk.types import Event, Hint
8561

8662

8763
class LangtraceConfig:
@@ -309,6 +285,7 @@ def init(
309285
"pymongo": PyMongoInstrumentation(),
310286
"cerebras-cloud-sdk": CerebrasInstrumentation(),
311287
"pymilvus": MilvusInstrumentation(),
288+
"crewai-tools": CrewaiToolsInstrumentation(),
312289
}
313290

314291
init_instrumentations(config.disable_instrumentations, all_instrumentations)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "3.3.31"
1+
__version__ = "3.4.0"

0 commit comments

Comments
 (0)