This is an automated email from the ASF dual-hosted git repository.

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git


The following commit(s) were added to refs/heads/rocketmq-studio by this push:
     new a357a2db fix: surface Grafana resource discovery failures (#1421)
a357a2db is described below

commit a357a2dbd489af621bed1107dd2169c62947bfe8
Author: aias00 <[email protected]>
AuthorDate: Mon Aug 10 20:58:21 2026 +0800

    fix: surface Grafana resource discovery failures (#1421)
---
 .../cluster/metrics/grafana/GrafanaDashboardService.java  | 15 +++++++++++----
 .../metrics/grafana/GrafanaDashboardServiceTest.java      | 15 +++++++++++++++
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/cluster/metrics/grafana/GrafanaDashboardService.java
 
b/server/src/main/java/org/apache/rocketmq/studio/cluster/metrics/grafana/GrafanaDashboardService.java
index b37a6867..c16f2226 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/cluster/metrics/grafana/GrafanaDashboardService.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/cluster/metrics/grafana/GrafanaDashboardService.java
@@ -18,7 +18,6 @@ package org.apache.rocketmq.studio.cluster.metrics.grafana;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.studio.common.exception.BusinessException;
 import org.springframework.core.io.Resource;
@@ -42,13 +41,21 @@ import java.util.zip.ZipOutputStream;
  */
 @Slf4j
 @Service
-@RequiredArgsConstructor
 public class GrafanaDashboardService {
 
     private static final String LOCATION_PATTERN = "classpath*:grafana/*.json";
 
     private final ObjectMapper objectMapper;
-    private final ResourcePatternResolver resourceResolver = new 
PathMatchingResourcePatternResolver();
+    private final ResourcePatternResolver resourceResolver;
+
+    public GrafanaDashboardService(ObjectMapper objectMapper) {
+        this(objectMapper, new PathMatchingResourcePatternResolver());
+    }
+
+    GrafanaDashboardService(ObjectMapper objectMapper, ResourcePatternResolver 
resourceResolver) {
+        this.objectMapper = objectMapper;
+        this.resourceResolver = resourceResolver;
+    }
 
     /**
      * Lists metadata for every bundled Grafana dashboard.
@@ -152,7 +159,7 @@ public class GrafanaDashboardService {
             return resourceResolver.getResources(LOCATION_PATTERN);
         } catch (IOException e) {
             log.warn("Unable to resolve Grafana dashboard resources: {}", 
e.getMessage());
-            return new Resource[0];
+            throw new BusinessException(500, "Failed to resolve bundled 
Grafana dashboards");
         }
     }
 
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/cluster/metrics/grafana/GrafanaDashboardServiceTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/cluster/metrics/grafana/GrafanaDashboardServiceTest.java
index 3bc0667a..7e7fc028 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/cluster/metrics/grafana/GrafanaDashboardServiceTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/cluster/metrics/grafana/GrafanaDashboardServiceTest.java
@@ -21,6 +21,7 @@ import 
org.apache.rocketmq.studio.common.exception.BusinessException;
 import org.junit.jupiter.api.Test;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.ResourcePatternResolver;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -34,6 +35,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class GrafanaDashboardServiceTest {
 
@@ -135,6 +138,18 @@ class GrafanaDashboardServiceTest {
         assertEquals(List.of(new GrafanaDashboardInfo("valid", "Valid", "", 
List.of("rocketmq"))), dashboards);
     }
 
+    @Test
+    void listDashboardsShouldSurfaceResourceDiscoveryFailure() throws 
Exception {
+        ResourcePatternResolver resolver = mock(ResourcePatternResolver.class);
+        when(resolver.getResources("classpath*:grafana/*.json")).thenThrow(new 
java.io.IOException("broken jar"));
+        GrafanaDashboardService service = new GrafanaDashboardService(new 
ObjectMapper(), resolver);
+
+        BusinessException exception = assertThrows(BusinessException.class, 
service::listDashboards);
+
+        assertEquals(500, exception.getCode());
+        assertTrue(exception.getMessage().contains("resolve bundled Grafana 
dashboards"));
+    }
+
     private static GrafanaDashboardService serviceWithResources(Resource... 
resources) {
         return new GrafanaDashboardService(new ObjectMapper()) {
             @Override

Reply via email to