Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
6 changes: 3 additions & 3 deletions lib/crewai/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
116 changes: 116 additions & 0 deletions lib/crewai/tests/telemetry/test_opentelemetry_version_compatibility.py
Original file line number Diff line number Diff line change
@@ -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 changes: 3 additions & 3 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading