Browse Source

迁移 Redis 监控接口

YunaiV 4 years ago
parent
commit
a7d0f30853

+ 0 - 53
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java

@@ -1,53 +0,0 @@
-package com.ruoyi.web.controller.monitor;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisCallback;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.utils.StringUtils;
-
-/**
- * 缓存监控
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/cache")
-public class CacheController
-{
-    @Autowired
-    private RedisTemplate<String, String> redisTemplate;
-
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @GetMapping()
-    public AjaxResult getInfo() throws Exception
-    {
-        Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
-        Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
-        Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
-
-        Map<String, Object> result = new HashMap<>(3);
-        result.put("info", info);
-        result.put("dbSize", dbSize);
-
-        List<Map<String, String>> pieList = new ArrayList<>();
-        commandStats.stringPropertyNames().forEach(key -> {
-            Map<String, String> data = new HashMap<>(2);
-            String property = commandStats.getProperty(key);
-            data.put("name", StringUtils.removeStart(key, "cmdstat_"));
-            data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
-            pieList.add(data);
-        });
-        result.put("commandStats", pieList);
-        return AjaxResult.success(result);
-    }
-}

+ 3 - 0
src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.http

@@ -0,0 +1,3 @@
+### 请求 /get-permission-info 接口 => 成功
+GET {{baseUrl}}/infra/redis/get-monitor-info
+Authorization: Bearer {{token}}

+ 49 - 0
src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/RedisController.java

@@ -0,0 +1,49 @@
+package cn.iocoder.dashboard.modules.infra.controller.redis;
+
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.dashboard.common.pojo.CommonResult;
+import cn.iocoder.dashboard.modules.infra.controller.redis.vo.InfRedisMonitorRespVO;
+import org.springframework.data.redis.connection.RedisServerCommands;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Properties;
+
+import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
+
+@RestController
+@RequestMapping("/infra/redis")
+public class RedisController {
+
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    @PreAuthorize("@ss.hasPermission('monitor:cache:list')")
+    @GetMapping("/get-monitor-info")
+    public CommonResult<InfRedisMonitorRespVO> getRedisMonitorInfo() {
+        // 获得 Redis 统计信息
+        Properties info = stringRedisTemplate.execute((RedisCallback<Properties>) RedisServerCommands::info);
+        Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize);
+        Properties commandStats = stringRedisTemplate.execute((RedisCallback<Properties>) connection -> connection.info("commandstats"));
+        assert commandStats != null; // 断言,避免警告
+
+        // 拼接结果返回
+        InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize)
+                .commandStats(new ArrayList<>(commandStats.size())).build();
+        commandStats.forEach((key, value) -> {
+            respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder()
+                    .command(StrUtil.subAfter((String) key, "cmdstat_", false))
+                    .calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ",")))
+                    .usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ",")))
+                    .build());
+        });
+        return success(respVO);
+    }
+
+}

+ 34 - 0
src/main/java/cn/iocoder/dashboard/modules/infra/controller/redis/vo/InfRedisMonitorRespVO.java

@@ -0,0 +1,34 @@
+package cn.iocoder.dashboard.modules.infra.controller.redis.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Properties;
+
+@Data
+@Builder
+@AllArgsConstructor
+public class InfRedisMonitorRespVO {
+
+    private Properties info;
+
+    private Long dbSize;
+
+    private List<Object> commandStats;
+
+    @Data
+    @Builder
+    @AllArgsConstructor
+    public static class CommandStat {
+
+        private String command;
+
+        private Integer calls;
+
+        private Integer usec;
+
+    }
+
+}

+ 8 - 0
src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java

@@ -1,5 +1,7 @@
 package cn.iocoder.dashboard.util.json;
 
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -36,6 +38,9 @@ public class JsonUtils {
     }
 
     public static <T> T parseObject(String text, Class<T> clazz) {
+        if (StrUtil.isEmpty(text)) {
+            return null;
+        }
         try {
             return objectMapper.readValue(text, clazz);
         } catch (IOException e) {
@@ -44,6 +49,9 @@ public class JsonUtils {
     }
 
     public static <T> T parseObject(byte[] bytes, Class<T> clazz) {
+        if (ArrayUtil.isEmpty(bytes)) {
+            return null;
+        }
         try {
             return objectMapper.readValue(bytes, clazz);
         } catch (IOException e) {