Compare commits

...

1 Commits

Author SHA1 Message Date
Devin AI
a9f444e575 fix: widen opentelemetry version constraints to >=1.34.0,<2
Fixes #4511

The opentelemetry packages were pinned with ~=1.34.0 (>=1.34.0, <1.35.0)
which prevented users from installing newer versions needed by tools like
Langfuse. Widened to >=1.34.0,<2 since crewAI only uses stable trace APIs
that have no breaking changes across 1.x versions.

Co-Authored-By: João <joao@crewai.com>
2026-02-18 15:58:42 +00:00
3 changed files with 122 additions and 6 deletions

View File

@@ -16,9 +16,9 @@ dependencies = [
"pdfplumber~=0.11.4",
"regex~=2026.1.15",
# Telemetry and Monitoring
"opentelemetry-api~=1.34.0",
"opentelemetry-sdk~=1.34.0",
"opentelemetry-exporter-otlp-proto-http~=1.34.0",
"opentelemetry-api>=1.34.0,<2",
"opentelemetry-sdk>=1.34.0,<2",
"opentelemetry-exporter-otlp-proto-http>=1.34.0,<2",
# Data Handling
"chromadb~=1.1.0",
"tokenizers~=0.20.3",

View File

@@ -0,0 +1,116 @@
import threading
from importlib.metadata import version
from unittest.mock import patch
import pytest
from packaging.version import Version
@pytest.fixture(autouse=True)
def cleanup_telemetry():
from crewai.telemetry import Telemetry
Telemetry._instance = None
if hasattr(Telemetry, "_lock"):
Telemetry._lock = threading.Lock()
yield
Telemetry._instance = None
if hasattr(Telemetry, "_lock"):
Telemetry._lock = threading.Lock()
def test_opentelemetry_api_version_not_pinned_to_minor():
"""Verify opentelemetry-api is >= 1.34.0 and allows versions beyond 1.34.x.
Regression test for https://github.com/crewAIInc/crewAI/issues/4511
The dependency was previously pinned with ~=1.34.0 (i.e. >=1.34.0, <1.35.0)
which blocked users from installing newer opentelemetry versions needed by
tools like Langfuse.
"""
installed = Version(version("opentelemetry-api"))
assert installed >= Version("1.34.0")
def test_opentelemetry_sdk_version_not_pinned_to_minor():
"""Verify opentelemetry-sdk is >= 1.34.0 and allows versions beyond 1.34.x."""
installed = Version(version("opentelemetry-sdk"))
assert installed >= Version("1.34.0")
def test_opentelemetry_exporter_version_not_pinned_to_minor():
"""Verify opentelemetry-exporter-otlp-proto-http is >= 1.34.0."""
installed = Version(version("opentelemetry-exporter-otlp-proto-http"))
assert installed >= Version("1.34.0")
def test_opentelemetry_trace_api_imports():
"""Verify all OpenTelemetry trace API imports used by crewAI work."""
from opentelemetry import trace
from opentelemetry.trace import Span, Status, StatusCode
assert trace.get_tracer is not None
assert trace.set_tracer_provider is not None
assert Span is not None
assert Status is not None
assert StatusCode is not None
def test_opentelemetry_sdk_imports():
"""Verify all OpenTelemetry SDK imports used by crewAI work."""
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExportResult
assert SERVICE_NAME is not None
assert Resource is not None
assert TracerProvider is not None
assert BatchSpanProcessor is not None
assert SpanExportResult is not None
def test_opentelemetry_exporter_imports():
"""Verify the OTLP HTTP trace exporter import used by crewAI works."""
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
assert OTLPSpanExporter is not None
def test_opentelemetry_baggage_and_context_imports():
"""Verify baggage and context imports used by crewAI work."""
from opentelemetry import baggage
from opentelemetry.context import attach, detach
assert baggage is not None
assert attach is not None
assert detach is not None
@pytest.mark.telemetry
def test_telemetry_initializes_with_current_opentelemetry():
"""Verify Telemetry singleton initializes successfully with the installed
opentelemetry version, confirming no API breakage.
Regression test for https://github.com/crewAIInc/crewAI/issues/4511
"""
import os
from crewai.telemetry import Telemetry
with patch.dict(
os.environ,
{"CREWAI_DISABLE_TELEMETRY": "false", "OTEL_SDK_DISABLED": "false"},
):
telemetry = Telemetry()
assert telemetry.ready is True
@pytest.mark.telemetry
def test_safe_otlp_span_exporter_instantiation():
"""Verify SafeOTLPSpanExporter can be instantiated with current opentelemetry."""
from crewai.telemetry.telemetry import SafeOTLPSpanExporter
exporter = SafeOTLPSpanExporter(
endpoint="http://localhost:4318/v1/traces",
timeout=5,
)
assert exporter is not None

6
uv.lock generated
View File

@@ -1209,9 +1209,9 @@ requires-dist = [
{ name = "openai", specifier = ">=1.83.0,<3" },
{ name = "openpyxl", specifier = "~=3.1.5" },
{ name = "openpyxl", marker = "extra == 'openpyxl'", specifier = "~=3.1.5" },
{ name = "opentelemetry-api", specifier = "~=1.34.0" },
{ name = "opentelemetry-exporter-otlp-proto-http", specifier = "~=1.34.0" },
{ name = "opentelemetry-sdk", specifier = "~=1.34.0" },
{ name = "opentelemetry-api", specifier = ">=1.34.0,<2" },
{ name = "opentelemetry-exporter-otlp-proto-http", specifier = ">=1.34.0,<2" },
{ name = "opentelemetry-sdk", specifier = ">=1.34.0,<2" },
{ name = "pandas", marker = "extra == 'pandas'", specifier = "~=2.2.3" },
{ name = "pdfplumber", specifier = "~=0.11.4" },
{ name = "portalocker", specifier = "~=2.7.0" },