Skip to content

Conversation

@kirtimanmishrazipstack
Copy link
Contributor

@kirtimanmishrazipstack kirtimanmishrazipstack commented Nov 9, 2025

What

  • Capture ETL error logs in worker-logging and display them in frontend on connector failure

Why

  • Connector logs should be displayed to end users

How

  • Added workflow logs on necessary places

Can this PR break any existing features. If yes, please list possible items. If no, please explain why. (PS: Admins do not merge the PR without this section filled)

  • N/A

Database Migrations

  • N/A

Env Config

  • N/A

Relevant Docs

Related Issues or PRs

Dependencies Versions

Notes on Testing

  • Created a mariadb destination connector.
  • Commented out test-connection functionality, to make sure test-connection is successful if even for a wrong SSL connection
  • Run the workflow
  • Displayed the error logs on unstract-worker-logging and frontend

Screenshots

6

Checklist

I have read and understood the Contribution Guidelines.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 9, 2025

Summary by CodeRabbit

Release Notes

  • Bug Fixes

    • Enhanced error handling and validation for source and destination connectors with more detailed error messages and logging.
    • Improved resilience for missing connector configurations with better fallback logic.
  • Improvements

    • Added comprehensive logging throughout workflow operations to aid in debugging and error tracking.
    • Strengthened connector initialization and filesystem retrieval processes with better error reporting.

✏️ Tip: You can customize this high-level summary in your review settings.

Walkthrough

The PR adds comprehensive logging and error handling enhancements across workflow management and connector processing. It introduces a new WorkflowLoggerHelper utility class, makes connector instances optional in validation flows with explicit logging, implements fallback chain logic for messaging channel initialization, and enhances logging coverage at critical error paths in source and destination connectors.

Changes

Cohort / File(s) Summary
Logging Infrastructure
workers/shared/workflow/logger_helper.py, backend/workflow_manager/utils/workflow_log.py
New utility class WorkflowLoggerHelper with log_info() and log_error() methods for safe workflow logging. Updates workflow_log.py messaging channel initialization with fallback chain: log_events_idpipeline_idexecution_id.
Connector Validation & Error Handling
backend/workflow_manager/endpoint_v2/destination.py, backend/workflow_manager/endpoint_v2/source.py, workers/shared/workflow/source_connector.py, workers/shared/workflow/destination_connector.py
Makes connector instances optional in validation; adds explicit logging for missing/invalid connection types and missing connectors. Introduces requires_connector condition for DATABASE destinations. Wraps filesystem initialization in try/except with contextual error logs. Expands HITL destination handling with additional comments and logging structure. Removes workflow_log truthiness guards in favor of hasattr() checks.
Pubsub Logging
unstract/core/src/unstract/core/pubsub_helper.py
Enhances logging to differentiate ERROR level payloads from others, emitting error logs for ERROR-level messages and debug logs for remaining cases.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • workers/shared/workflow/source_connector.py and destination_connector.py — These files contain the most extensive changes with new imports, logger helper integration, and restructured error handling; review for correctness of fallback logic and try/except placement.
  • backend/workflow_manager/endpoint_v2/destination.py — The requires_connector condition and optional connector handling warrant careful verification to ensure exceptions are raised correctly.
  • backend/workflow_manager/utils/workflow_log.py — The fallback chain for messaging_channel initialization should be validated to ensure it never becomes None and maintains correct precedence.
  • workers/shared/workflow/logger_helper.py — New utility class; verify integration points and null-safety handling.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 61.54% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main objective: capturing connector error logs in ETL and displaying them in the frontend.
Description check ✅ Passed The pull request description follows the required template with all critical sections completed: What, Why, How, breaking changes assessment, and testing notes are provided.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch UN-2301-ETL-Error-is-not-captured-and-added-in-logs-if-a-connector-stopped-working-suddenly

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@kirtimanmishrazipstack kirtimanmishrazipstack changed the title Un 2301 etl error is not captured and added in logs if a connector stopped working suddenly UN-2301 [FEAT] Capture ETL error logs in worker-logging and display them in frontend on connector failure Nov 9, 2025
@kirtimanmishrazipstack kirtimanmishrazipstack marked this pull request as ready for review November 9, 2025 13:38
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
workers/shared/workflow/source_connector.py (1)

189-225: Do not swallow source listing failures

By catching every Exception and returning [], we now hide fatal issues such as bad credentials or connector outages—the workflow will think “no files” and continue, so operators never see the failure despite the PR’s goal of surfacing errors. We need to re-raise after logging so the failure bubbles up and is captured by the worker log stream.

-        except Exception as e:
-            error_msg = f"Failed to list files from source connector directory '{input_directory}': {str(e)}"
-            if self.workflow_log:
-                self.workflow_log.log_error(logger, error_msg)
-            logger.error(error_msg)
-            return []
+        except Exception as e:
+            error_msg = (
+                f"Failed to list files from source connector directory "
+                f"'{input_directory}': {str(e)}"
+            )
+            if self.workflow_log:
+                self.workflow_log.log_error(logger, error_msg)
+            logger.error(error_msg, exc_info=True)
+            raise
🧹 Nitpick comments (1)
backend/workflow_manager/endpoint_v2/destination.py (1)

169-178: Avoid double-logging the same database error

workflow_log.log_error(...) already publishes the websocket entry and calls logger.error. The additional logger.error(error_msg) lines duplicate every failure message in the backend logs. Please drop the second call and rely on log_error (or pass exc_info=True via kwargs if you need the traceback).

-                self.workflow_log.log_error(logger, error_msg)
-                logger.error(error_msg)
+                self.workflow_log.log_error(logger, error_msg)
-                self.workflow_log.log_error(logger, error_msg)
-                logger.error(error_msg)
+                self.workflow_log.log_error(logger, error_msg)
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between dde2c9e and 3e1efc8.

📒 Files selected for processing (5)
  • backend/workflow_manager/endpoint_v2/destination.py (2 hunks)
  • backend/workflow_manager/utils/workflow_log.py (2 hunks)
  • backend/workflow_manager/workflow_v2/execution_log_utils.py (3 hunks)
  • unstract/core/src/unstract/core/pubsub_helper.py (1 hunks)
  • workers/shared/workflow/source_connector.py (3 hunks)
🧰 Additional context used
🪛 Ruff (0.14.3)
workers/shared/workflow/source_connector.py

132-132: Abstract raise to an inner function

(TRY301)


132-132: Create your own exception

(TRY002)


149-149: Consider moving this statement to an else block

(TRY300)


152-152: Use explicit conversion flag

Replace with conversion flag

(RUF010)


155-155: Use logging.exception instead of logging.error

Replace with exception

(TRY400)


219-219: Consider moving this statement to an else block

(TRY300)


220-220: Do not catch blind exception: Exception

(BLE001)


221-221: Use explicit conversion flag

Replace with conversion flag

(RUF010)


224-224: Use logging.exception instead of logging.error

Replace with exception

(TRY400)


242-242: Create your own exception

(TRY002)


249-249: Create your own exception

(TRY002)

backend/workflow_manager/endpoint_v2/destination.py

170-170: Use explicit conversion flag

Replace with conversion flag

(RUF010)


172-172: Use logging.exception instead of logging.error

Replace with exception

(TRY400)


176-176: Use explicit conversion flag

Replace with conversion flag

(RUF010)


178-178: Use logging.exception instead of logging.error

Replace with exception

(TRY400)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (3)
unstract/core/src/unstract/core/pubsub_helper.py (1)

156-162: Error-level publish logging is helpful

Thanks for surfacing ERROR payloads at error level while keeping everything else at debug; this will make troubleshooting failed connectors much easier without changing publish behavior.

backend/workflow_manager/utils/workflow_log.py (1)

20-22: Fallback channel keeps log routing robust

The staged fallback to pipeline_id and then execution_id guarantees we never publish to a None channel, which should prevent silent log drops when the state store is empty.

backend/workflow_manager/workflow_v2/execution_log_utils.py (1)

66-169: Richer log processing visibility looks great

Prioritizing ERROR entries, echoing each log with the right level, and emitting per-org summaries will make diagnosing connector failures far easier while keeping the storage path unchanged.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
backend/workflow_manager/endpoint_v2/destination.py (1)

170-179: Use logger.exception to preserve traceback context

Right now we log the formatted error_msg with logger.error and immediately re-raise. That gives the worker log the text but discards the traceback, which is exactly what we need when chasing connector failures. Switching these two logger.error(...) calls to logger.exception(...) will capture the stack automatically without changing control flow. This keeps the new workflow-log entry for the UI while still leaving full context in the server logs.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 3e1efc8 and 6c99a7b.

📒 Files selected for processing (2)
  • backend/workflow_manager/endpoint_v2/destination.py (2 hunks)
  • backend/workflow_manager/endpoint_v2/source.py (1 hunks)
🧰 Additional context used
🪛 Ruff (0.14.3)
backend/workflow_manager/endpoint_v2/destination.py

171-171: Use explicit conversion flag

Replace with conversion flag

(RUF010)


173-173: Use logging.exception instead of logging.error

Replace with exception

(TRY400)


177-177: Use explicit conversion flag

Replace with conversion flag

(RUF010)


179-179: Use logging.exception instead of logging.error

Replace with exception

(TRY400)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build

@kirtimanmishrazipstack kirtimanmishrazipstack changed the title UN-2301 [FEAT] Capture ETL error logs in worker-logging and display them in frontend on connector failure UN-2301 [FEAT] Capture connector error logs in ETL and display in frontend Nov 19, 2025
…in-logs-if-a-connector-stopped-working-suddenly
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 6c99a7b and a36a401.

📒 Files selected for processing (2)
  • backend/workflow_manager/endpoint_v2/destination.py (2 hunks)
  • backend/workflow_manager/endpoint_v2/source.py (1 hunks)
🧰 Additional context used
🪛 Ruff (0.14.5)
backend/workflow_manager/endpoint_v2/destination.py

165-165: Use explicit conversion flag

Replace with conversion flag

(RUF010)


167-167: Use logging.exception instead of logging.error

Replace with exception

(TRY400)


171-171: Use explicit conversion flag

Replace with conversion flag

(RUF010)


173-173: Use logging.exception instead of logging.error

Replace with exception

(TRY400)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (3)
backend/workflow_manager/endpoint_v2/source.py (1)

124-149: LGTM! Logging additions improve error visibility.

The logging additions follow a consistent pattern: logging at entry, before each exception, and at successful completion. This will help with debugging and make connector validation failures visible in the frontend as intended by the PR objectives.

backend/workflow_manager/endpoint_v2/destination.py (2)

127-149: Validation logging looks good with a minor consideration.

The logging additions follow the same pattern as in source.py and improve error visibility. The refactored requires_connector check (lines 142-145) is cleaner than checking multiple conditions inline.

Note: A previous review suggested considering DEBUG level for start/end logs to reduce noise. Monitor the log volume in practice and adjust if needed.

Based on past review comments.


176-178: LGTM! Completes the validation logging lifecycle.

The success log at the end provides clear confirmation that validation completed without errors, consistent with the pattern in source.py.

…Error-is-not-captured-and-added-in-logs-if-a-connector-stopped-working-suddenly
…in-logs-if-a-connector-stopped-working-suddenly
…a-connector-stopped-working-suddenly' of github.com:Zipstack/unstract into UN-2301-ETL-Error-is-not-captured-and-added-in-logs-if-a-connector-stopped-working-suddenly
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (3)
workers/shared/workflow/source_connector.py (2)

115-147: Consider consolidating the double logging pattern.

The error handling is comprehensive, but lines 145-146 log the same error message twice - once through logger_helper.log_error (which may be a no-op if workflow_log is None) and once through logger.error.

Consider using logger.exception instead of logger.error to capture the full stack trace, which would be more helpful for debugging connector initialization failures.

Apply this diff to improve error logging:

 except Exception as e:
     error_msg = f"Failed to initialize source connector filesystem: {str(e)}"
     self.logger_helper.log_error(logger, error_msg)
-    logger.error(error_msg)
+    logger.exception(error_msg)
     raise

201-205: Consider using logger.exception for better debugging.

The error handling logs the failure but returns an empty list, which might hide connector issues from callers. Additionally, using logger.exception instead of logger.error would capture the full stack trace, making it easier to diagnose connector problems.

Apply this diff:

 except Exception as e:
     error_msg = f"Failed to list files from source connector directory '{input_directory}': {str(e)}"
     self.logger_helper.log_error(logger, error_msg)
-    logger.error(error_msg)
+    logger.exception(error_msg)
     return []
workers/shared/workflow/destination_connector.py (1)

932-937: Standardize conditional logging for current_file_execution_id parameter to log_file_info() calls.

The inconsistency is confirmed: Lines 932-937, 1180-1185, 1194-1199, 1207-1212, and 1219-1224 guard log_file_info() calls with hasattr(self, "current_file_execution_id"), while lines 502-506, 528-532, 551-555, 581-585, 616-620, 1568-1572, and 1648-1652 call log_file_info() without guards.

The root cause: self.current_file_execution_id is an instance attribute set conditionally (lines 798, 975), whereas exec_ctx.file_execution_id is always available in those execution contexts. Since log_file_info() accepts file_execution_id: str | None and performs null checking internally, the hasattr guards skip logging when the attribute is missing, whereas the other calls always log (with potentially None values).

Choose one approach and apply consistently:

  • Option 1: Remove hasattr checks and ensure self.current_file_execution_id is always initialized before these methods are called.
  • Option 2: Add hasattr checks to all log_file_info() calls that use self.current_file_execution_id and document when logging is intentionally skipped.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between a36a401 and d493257.

📒 Files selected for processing (5)
  • backend/workflow_manager/endpoint_v2/destination.py (2 hunks)
  • backend/workflow_manager/endpoint_v2/source.py (1 hunks)
  • workers/shared/workflow/destination_connector.py (7 hunks)
  • workers/shared/workflow/logger_helper.py (1 hunks)
  • workers/shared/workflow/source_connector.py (5 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • backend/workflow_manager/endpoint_v2/destination.py
  • backend/workflow_manager/endpoint_v2/source.py
🧰 Additional context used
🪛 Ruff (0.14.5)
workers/shared/workflow/source_connector.py

128-128: Abstract raise to an inner function

(TRY301)


128-128: Create your own exception

(TRY002)


141-141: Consider moving this statement to an else block

(TRY300)


144-144: Use explicit conversion flag

Replace with conversion flag

(RUF010)


146-146: Use logging.exception instead of logging.error

Replace with exception

(TRY400)


202-202: Use explicit conversion flag

Replace with conversion flag

(RUF010)


204-204: Use logging.exception instead of logging.error

Replace with exception

(TRY400)


218-218: Create your own exception

(TRY002)


224-224: Create your own exception

(TRY002)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (4)
workers/shared/workflow/logger_helper.py (1)

13-48: LGTM! Clean abstraction for optional workflow logging.

The WorkflowLoggerHelper class effectively encapsulates the conditional logging pattern, eliminating repetitive checks throughout the codebase. The implementation is straightforward, well-documented, and follows good design principles.

workers/shared/workflow/source_connector.py (2)

16-17: LGTM! Proper integration of the logger helper.

The import and initialization of WorkflowLoggerHelper are correctly placed, enabling safe logging operations throughout the connector class.

Also applies to: 98-98


207-224: LGTM! Validation logic enhanced with proper logging.

The validation method now logs errors before raising exceptions, which will help users understand connector configuration issues. The error messages are clear and contextual.

workers/shared/workflow/destination_connector.py (1)

200-201: LGTM! Consistent logger helper initialization.

The logger helper is properly initialized in the constructor, following the same pattern as source_connector.py.

@github-actions
Copy link
Contributor

Test Results

Summary
  • Runner Tests: 11 passed, 0 failed (11 total)
  • SDK1 Tests: 66 passed, 0 failed (66 total)

Runner Tests - Full Report
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_logs}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_cleanup}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_cleanup\_skip}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_client\_init}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_container\_run\_config}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_container\_run\_config\_without\_mount}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_run\_container}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image\_for\_sidecar}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_sidecar\_container}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{11}}$$ $$\textcolor{#23d18b}{\tt{11}}$$
SDK1 Tests - Full Report
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_success\_on\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retry\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_non\_retryable\_http\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retryable\_http\_errors}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_post\_method\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retry\_logging}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_success\_on\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_retry\_on\_errors}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_wrapper\_methods\_retry}}$$ $$\textcolor{#23d18b}{\tt{4}}$$ $$\textcolor{#23d18b}{\tt{4}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_connection\_error\_is\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_timeout\_is\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_retryable\_status\_codes}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_non\_retryable\_status\_codes}}$$ $$\textcolor{#23d18b}{\tt{5}}$$ $$\textcolor{#23d18b}{\tt{5}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_without\_response}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_os\_error\_retryable\_errno}}$$ $$\textcolor{#23d18b}{\tt{5}}$$ $$\textcolor{#23d18b}{\tt{5}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_os\_error\_non\_retryable\_errno}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_other\_exception\_not\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_exponential\_backoff\_without\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_exponential\_backoff\_with\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_max\_delay\_cap}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_max\_delay\_cap\_with\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_successful\_call\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_retry\_after\_transient\_failure}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_max\_retries\_exceeded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_max\_time\_exceeded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_retry\_with\_custom\_predicate}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_no\_retry\_with\_predicate\_false}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_exception\_not\_in\_tuple\_not\_retried}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_delay\_would\_exceed\_max\_time}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_default\_configuration}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_environment\_variable\_configuration}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_max\_retries}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_max\_time}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_base\_delay}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_multiplier}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_jitter\_values}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_custom\_exceptions\_only}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_custom\_predicate\_only}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_both\_exceptions\_and\_predicate}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_exceptions\_match\_but\_predicate\_false}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_retry\_platform\_service\_call\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_retry\_prompt\_service\_call\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_platform\_service\_decorator\_retries\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_prompt\_service\_decorator\_retries\_on\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_warning\_logged\_on\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_info\_logged\_on\_success\_after\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_exception\_logged\_on\_giving\_up}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{66}}$$ $$\textcolor{#23d18b}{\tt{66}}$$

@sonarqubecloud
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants