Skip to content

UN-1798 [FIX] dashboard metrics and restore sidebar navigation#1813

Merged
Deepak-Kesavan merged 3 commits intomainfrom
UN-1798-dashboard-fixes
Mar 2, 2026
Merged

UN-1798 [FIX] dashboard metrics and restore sidebar navigation#1813
Deepak-Kesavan merged 3 commits intomainfrom
UN-1798-dashboard-fixes

Conversation

@athul-rs
Copy link
Contributor

@athul-rs athul-rs commented Mar 2, 2026

What

  • Fix pages_processed metric returning empty data in backfill and aggregation
  • Restore metrics dashboard sidebar navigation with "New" tag

Why

  • PageUsage.organization_id stores the org string identifier (e.g. "org_default"), but get_pages_processed() was querying with the UUID PK — never matching any records. The backfill command stored zeros into the aggregated tables, and the /overview/ endpoint served those zeros.
  • Sidebar refactor PR [MISC] Enhance sidebar UX to expand on hover #1768 removed the metrics dashboard menu item from the MANAGE section

How

  • services.py: In get_pages_processed, resolve UUID to organization.organization_id string before querying PageUsage
  • SideNavBar.jsx: Re-add DashboardIcon import, metrics dashboard menu item under MANAGE, import antd Tag component and render el.tag as a badge next to the title

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 2, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info

Configuration used: Organization 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 4dcb3ec and 0f416cf.

📒 Files selected for processing (2)
  • backend/dashboard_metrics/services.py
  • backend/dashboard_metrics/views.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • backend/dashboard_metrics/views.py

Summary by CodeRabbit

Release Notes

  • New Features

    • Added Dashboard menu item to the navigation sidebar for metrics access
    • Introduced HITL reviews and completions metrics to dashboard analytics
  • Style

    • Added tag styling to highlight new menu items in the navigation

Walkthrough

Backend adds HITL metrics (reviews and completions), resolves organization identifiers to stored string IDs, and safely locates the HITLQueue model; metrics are exposed via the live_series API. Frontend adds a Dashboard navigation item with a "New" tag.

Changes

Cohort / File(s) Summary
Dashboard Metrics Backend
backend/dashboard_metrics/services.py
Add _get_hitl_queue_model() and import Organization; resolve organization_id to stored string identifier; implement get_hitl_reviews and get_hitl_completions using HITLQueue (or return [] if unavailable); include hitl_reviews and hitl_completions in aggregated summary; handle missing org/model cases.
Dashboard Metrics Views
backend/dashboard_metrics/views.py
Add hitl_reviews and hitl_completions to the live_series metric queries mapping so the endpoint returns those metrics.
Navigation UI
frontend/src/components/navigations/side-nav-bar/SideNavBar.jsx, frontend/src/components/navigations/side-nav-bar/SideNavBar.css
Insert "Dashboard" menu item with a blue Tag labeled "New"; import Tag and DashboardIcon; add .sidebar-menu-tag CSS class and render tag next to menu titles.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant Client as Client (UI)
    participant Server as API Server (views/services)
    participant DB as Database (Organization, HITLQueue)
    Client->>Server: GET /{org}/metrics/live_series?metrics=...,hitl_reviews,hitl_completions
    Server->>DB: Resolve Organization by org identifier (string)
    alt Organization not found
        DB-->>Server: No organization
        Server-->>Client: Return empty/zero metrics for HITL
    else Organization found
        Server->>Server: _get_hitl_queue_model()
        alt HITLQueue model unavailable
            Server-->>Client: Return empty/zero metrics for HITL
        else HITLQueue model available
            Server->>DB: Query HITLQueue (count reviews per period by created_at)
            DB-->>Server: Reviews counts per period
            Server->>DB: Query HITLQueue (count APPROVED using approved_at)
            DB-->>Server: Completions counts per period
            Server-->>Client: Return combined metrics (including hitl_reviews, hitl_completions totals)
        end
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately identifies the main changes: fixing dashboard metrics query and restoring sidebar navigation, both core objectives of the PR.
Description check ✅ Passed The PR description covers all critical sections (What, Why, How) with clear explanations, though several template sections remain unfilled.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch UN-1798-dashboard-fixes

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.

Copy link
Contributor

@vishnuszipstack vishnuszipstack left a comment

Choose a reason for hiding this comment

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

move the inline css to class. other than that LGTM

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.

🧹 Nitpick comments (2)
backend/dashboard_metrics/services.py (1)

28-39: Consider moving return to else block (static analysis hint).

The static analysis tool suggests restructuring for slightly better exception handling style (TRY300):

♻️ Optional style improvement
 def _get_hitl_queue_model():
     """Get HITLQueue model if available (cloud-only).
 
     Returns None on OSS where manual_review_v2 is not installed.
     """
     try:
         from pluggable_apps.manual_review_v2.models import HITLQueue
-
-        return HITLQueue
     except ImportError:
         return None
+    else:
+        return HITLQueue

This is a minor style preference and the current code functions correctly.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/dashboard_metrics/services.py` around lines 28 - 39, The function
_get_hitl_queue_model currently returns inside the try block which triggers a
static analysis style hint; refactor it so the try block only imports and
assigns HITLQueue (e.g., temp variable), use an else clause to return the model,
and keep the except ImportError returning None—this removes the direct return
from the try and satisfies the TRY300 style rule while preserving behavior.
frontend/src/components/navigations/side-nav-bar/SideNavBar.jsx (1)

718-731: Consider extracting inline styles to a CSS class.

The inline styles work correctly, but for consistency with the rest of the component, consider moving these to SideNavBar.css:

.sidebar-item-tag {
  margin-left: 6px;
  font-size: 10px;
  line-height: 16px;
  padding: 0 4px;
  border-radius: 4px;
}

This is a minor maintainability improvement and can be deferred.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/src/components/navigations/side-nav-bar/SideNavBar.jsx` around lines
718 - 731, The inline style block applied to the Tag element inside
SideNavBar.jsx (the JSX that renders {el.tag && <Tag ...>{el.tag}</Tag>}) should
be moved into a CSS class for consistency: add a .sidebar-item-tag rule with the
provided properties to SideNavBar.css, then replace the Tag's style prop with
className="sidebar-item-tag" (keeping color="blue" and the conditional rendering
intact).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@backend/dashboard_metrics/services.py`:
- Around line 28-39: The function _get_hitl_queue_model currently returns inside
the try block which triggers a static analysis style hint; refactor it so the
try block only imports and assigns HITLQueue (e.g., temp variable), use an else
clause to return the model, and keep the except ImportError returning None—this
removes the direct return from the try and satisfies the TRY300 style rule while
preserving behavior.

In `@frontend/src/components/navigations/side-nav-bar/SideNavBar.jsx`:
- Around line 718-731: The inline style block applied to the Tag element inside
SideNavBar.jsx (the JSX that renders {el.tag && <Tag ...>{el.tag}</Tag>}) should
be moved into a CSS class for consistency: add a .sidebar-item-tag rule with the
provided properties to SideNavBar.css, then replace the Tag's style prop with
className="sidebar-item-tag" (keeping color="blue" and the conditional rendering
intact).

ℹ️ Review info

Configuration used: Organization 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 c188f0a and 6b2d28e.

📒 Files selected for processing (3)
  • backend/dashboard_metrics/services.py
  • backend/dashboard_metrics/views.py
  • frontend/src/components/navigations/side-nav-bar/SideNavBar.jsx

- Fix HITL import path: manual_review_v2 → pluggable_apps.manual_review_v2
- Fix HITL model: ManualReviewEntity → HITLQueue with _base_manager
- Fix pages_processed: resolve org string identifier from UUID for PageUsage
- Add HITL metrics to live_series endpoint and summary
- Restore metrics dashboard sidebar nav removed by sidebar refactor (#1768)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@athul-rs athul-rs force-pushed the UN-1798-dashboard-fixes branch from 6b2d28e to 6a7d9d6 Compare March 2, 2026 08:30
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.

🧹 Nitpick comments (1)
backend/dashboard_metrics/services.py (1)

33-38: Optional: adopt Ruff TRY300 structure in _get_hitl_queue_model.

Low-impact readability cleanup: move return HITLQueue to an else block after try/except.

♻️ Suggested diff
 def _get_hitl_queue_model():
     """Get HITLQueue model if available (cloud-only).

     Returns None on OSS where manual_review_v2 is not installed.
     """
     try:
         from pluggable_apps.manual_review_v2.models import HITLQueue
-
-        return HITLQueue
     except ImportError:
         return None
+    else:
+        return HITLQueue
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/dashboard_metrics/services.py` around lines 33 - 38, The helper
_get_hitl_queue_model currently returns HITLQueue inside the try block; to
follow Ruff TRY300 style and improve readability, change the structure so the
try only imports, the except returns None, and place the return HITLQueue in an
else block (or after the try/except) — locate the _get_hitl_queue_model function
and the HITLQueue import reference and move the return out of the try into an
else/after block so ImportError still returns None and successful imports return
the model cleanly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@backend/dashboard_metrics/services.py`:
- Around line 33-38: The helper _get_hitl_queue_model currently returns
HITLQueue inside the try block; to follow Ruff TRY300 style and improve
readability, change the structure so the try only imports, the except returns
None, and place the return HITLQueue in an else block (or after the try/except)
— locate the _get_hitl_queue_model function and the HITLQueue import reference
and move the return out of the try into an else/after block so ImportError still
returns None and successful imports return the model cleanly.

ℹ️ Review info

Configuration used: Organization 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 6b2d28e and 4dcb3ec.

📒 Files selected for processing (4)
  • backend/dashboard_metrics/services.py
  • backend/dashboard_metrics/views.py
  • frontend/src/components/navigations/side-nav-bar/SideNavBar.css
  • frontend/src/components/navigations/side-nav-bar/SideNavBar.jsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • backend/dashboard_metrics/views.py
  • frontend/src/components/navigations/side-nav-bar/SideNavBar.jsx

@athul-rs athul-rs changed the title [FIX] Fix dashboard metrics and restore sidebar navigation UN-1798 [FIX] dashboard metrics and restore sidebar navigation Mar 2, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Mar 2, 2026

Frontend Lint Report (Biome)

All checks passed! No linting or formatting issues found.

@github-actions
Copy link
Contributor

github-actions bot commented Mar 2, 2026

Test Results

Summary
  • Runner Tests: 11 passed, 0 failed (11 total)
  • SDK1 Tests: 63 passed, 0 failed (63 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\_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{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\_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{63}}$$ $$\textcolor{#23d18b}{\tt{63}}$$

@sonarqubecloud
Copy link

sonarqubecloud bot commented Mar 2, 2026

@Deepak-Kesavan Deepak-Kesavan merged commit 440ae49 into main Mar 2, 2026
8 checks passed
@Deepak-Kesavan Deepak-Kesavan deleted the UN-1798-dashboard-fixes branch March 2, 2026 09:03
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.

5 participants