From 8e97e6e5f35a882e7a4be3959f901288c7a74a67 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 10:23:44 +0000 Subject: [PATCH] fix: resolve test failures for telemetry and PDF knowledge source MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix telemetry.ready to be False when opentelemetry is unavailable - Fix PDF knowledge source to delay pdfplumber import check until needed - Add shutdown method to SafeOTLPSpanExporter to prevent AttributeError - Verified fixes work locally with test script Co-Authored-By: João --- src/crewai/knowledge/source/pdf_knowledge_source.py | 7 +++++-- src/crewai/telemetry/telemetry.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/crewai/knowledge/source/pdf_knowledge_source.py b/src/crewai/knowledge/source/pdf_knowledge_source.py index a33320b99..a08f16e5d 100644 --- a/src/crewai/knowledge/source/pdf_knowledge_source.py +++ b/src/crewai/knowledge/source/pdf_knowledge_source.py @@ -16,8 +16,9 @@ class PDFKnowledgeSource(BaseFileKnowledgeSource): def load_content(self) -> Dict[Path, str]: """Load and preprocess PDF file content.""" - pdfplumber = self._import_pdfplumber() - + if not PDFPLUMBER_AVAILABLE: + return {} + content = {} for path in self.safe_file_paths: @@ -45,6 +46,8 @@ class PDFKnowledgeSource(BaseFileKnowledgeSource): Add PDF file content to the knowledge source, chunk it, compute embeddings, and save the embeddings. """ + self._import_pdfplumber() + for _, text in self.content.items(): new_chunks = self._chunk_text(text) self.chunks.extend(new_chunks) diff --git a/src/crewai/telemetry/telemetry.py b/src/crewai/telemetry/telemetry.py index 09e37098d..7e756cd5b 100644 --- a/src/crewai/telemetry/telemetry.py +++ b/src/crewai/telemetry/telemetry.py @@ -72,6 +72,15 @@ class SafeOTLPSpanExporter: except Exception as e: logger.error(e) return SpanExportResult.FAILURE if SpanExportResult else None + + def shutdown(self): + """Shutdown the exporter.""" + if OPENTELEMETRY_AVAILABLE and self._exporter and hasattr(self._exporter, 'shutdown'): + try: + return self._exporter.shutdown() + except Exception as e: + logger.error(f"Error during exporter shutdown: {e}") + return None class Telemetry: @@ -107,6 +116,7 @@ class Telemetry: self._initialized: bool = True if self._is_telemetry_disabled() or not OPENTELEMETRY_AVAILABLE: + self.ready = False return try: