Commit 90ac416e023bf6e0cc4a239120913b2953bfe9f5

Authored by RuoYi
1 parent 5b63f0ca

新增缓存监控功能

ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java 0 → 100644
  1 +package com.ruoyi.web.controller.monitor;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.HashMap;
  5 +import java.util.List;
  6 +import java.util.Map;
  7 +import java.util.Properties;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.data.redis.core.RedisCallback;
  10 +import org.springframework.data.redis.core.RedisTemplate;
  11 +import org.springframework.security.access.prepost.PreAuthorize;
  12 +import org.springframework.web.bind.annotation.GetMapping;
  13 +import org.springframework.web.bind.annotation.RequestMapping;
  14 +import org.springframework.web.bind.annotation.RestController;
  15 +import com.ruoyi.common.core.domain.AjaxResult;
  16 +import com.ruoyi.common.utils.StringUtils;
  17 +
  18 +/**
  19 + * 缓存监控
  20 + *
  21 + * @author ruoyi
  22 + */
  23 +@RestController
  24 +@RequestMapping("/monitor/cache")
  25 +public class CacheController
  26 +{
  27 + @Autowired
  28 + private RedisTemplate<String, String> redisTemplate;
  29 +
  30 + @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
  31 + @GetMapping()
  32 + public AjaxResult getInfo() throws Exception
  33 + {
  34 + Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
  35 + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
  36 + Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
  37 +
  38 + Map<String, Object> result = new HashMap<>(3);
  39 + result.put("info", info);
  40 + result.put("dbSize", dbSize);
  41 +
  42 + List<Map<String, String>> pieList = new ArrayList<>();
  43 + commandStats.stringPropertyNames().forEach(key -> {
  44 + Map<String, String> data = new HashMap<>(2);
  45 + String property = commandStats.getProperty(key);
  46 + data.put("name", StringUtils.removeStart(key, "cmdstat_"));
  47 + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
  48 + pieList.add(data);
  49 + });
  50 + result.put("commandStats", pieList);
  51 + return AjaxResult.success(result);
  52 + }
  53 +}
... ...
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java
... ... @@ -4,7 +4,6 @@ import org.springframework.security.access.prepost.PreAuthorize;
4 4 import org.springframework.web.bind.annotation.GetMapping;
5 5 import org.springframework.web.bind.annotation.RequestMapping;
6 6 import org.springframework.web.bind.annotation.RestController;
7   -import com.ruoyi.common.core.controller.BaseController;
8 7 import com.ruoyi.common.core.domain.AjaxResult;
9 8 import com.ruoyi.framework.web.domain.Server;
10 9  
... ... @@ -15,7 +14,7 @@ import com.ruoyi.framework.web.domain.Server;
15 14 */
16 15 @RestController
17 16 @RequestMapping("/monitor/server")
18   -public class ServerController extends BaseController
  17 +public class ServerController
19 18 {
20 19 @PreAuthorize("@ss.hasPermi('monitor:server:list')")
21 20 @GetMapping()
... ...
ruoyi-ui/src/api/monitor/cache.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 查询缓存详细
  4 +export function getCache() {
  5 + return request({
  6 + url: '/monitor/cache',
  7 + method: 'get'
  8 + })
  9 +}
... ...
ruoyi-ui/src/assets/icons/svg/redis.svg 0 → 100644
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1605865043777" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="856" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M1023.786667 611.84c-0.426667 9.770667-13.354667 20.693333-39.893334 34.56-54.613333 28.458667-337.749333 144.896-397.994666 176.298667-60.288 31.402667-93.738667 31.104-141.354667 8.32-47.616-22.741333-348.842667-144.469333-403.114667-170.368-27.093333-12.970667-40.917333-23.893333-41.386666-34.218667v103.509333c0 10.325333 14.250667 21.290667 41.386666 34.261334 54.272 25.941333 355.541333 147.626667 403.114667 170.368 47.616 22.784 81.066667 23.082667 141.354667-8.362667 60.245333-31.402667 343.338667-147.797333 397.994666-176.298667 27.776-14.464 40.106667-25.728 40.106667-35.925333v-102.058667l-0.213333-0.085333z m0-168.746667c-0.512 9.770667-13.397333 20.650667-39.893334 34.517334-54.613333 28.458667-337.749333 144.896-397.994666 176.298666-60.288 31.402667-93.738667 31.104-141.354667 8.362667-47.616-22.741333-348.842667-144.469333-403.114667-170.410667-27.093333-12.928-40.917333-23.893333-41.386666-34.176v103.509334c0 10.325333 14.250667 21.248 41.386666 34.218666 54.272 25.941333 355.498667 147.626667 403.114667 170.368 47.616 22.784 81.066667 23.082667 141.354667-8.32 60.245333-31.402667 343.338667-147.84 397.994666-176.298666 27.776-14.506667 40.106667-25.770667 40.106667-35.968v-102.058667l-0.256-0.042667z m0-175.018666c0.469333-10.410667-13.141333-19.541333-40.533334-29.610667-53.248-19.498667-334.634667-131.498667-388.522666-151.253333-53.888-19.712-75.818667-18.901333-139.093334 3.84C392.234667 113.706667 92.629333 231.253333 39.338667 252.074667c-26.666667 10.496-39.68 20.181333-39.253334 30.506666V386.133333c0 10.325333 14.250667 21.248 41.386667 34.218667 54.272 25.941333 355.498667 147.669333 403.114667 170.410667 47.616 22.741333 81.066667 23.04 141.354666-8.362667 60.245333-31.402667 343.338667-147.84 397.994667-176.298667 27.776-14.506667 40.106667-25.770667 40.106667-35.968V268.074667h-0.341334zM366.677333 366.08l237.269334-36.437333-71.68 105.088-165.546667-68.650667z m524.8-94.634667l-140.330666 55.466667-15.232 5.973333-140.245334-55.466666 155.392-61.44 140.373334 55.466666z m-411.989333-101.674666l-22.954667-42.325334 71.594667 27.989334 67.498667-22.101334-18.261334 43.733334 68.778667 25.770666-88.704 9.216-19.882667 47.786667-32.085333-53.290667-102.4-9.216 76.416-27.562666z m-176.768 59.733333c70.058667 0 126.805333 21.973333 126.805333 49.109333s-56.746667 49.152-126.805333 49.152-126.848-22.058667-126.848-49.152c0-27.136 56.789333-49.152 126.848-49.152z" p-id="857"></path></svg>
0 2 \ No newline at end of file
... ...
ruoyi-ui/src/views/monitor/cache/index.vue 0 → 100644
  1 +<template>
  2 + <div class="app-container">
  3 + <el-row>
  4 + <el-col :span="24" class="card-box">
  5 + <el-card>
  6 + <div slot="header"><span>基本信息</span></div>
  7 + <div class="el-table el-table--enable-row-hover el-table--medium">
  8 + <table cellspacing="0" style="width: 100%">
  9 + <tbody>
  10 + <tr>
  11 + <td><div class="cell">Redis版本</div></td>
  12 + <td><div class="cell" v-if="cache.info">{{ cache.info.redis_version }}</div></td>
  13 + <td><div class="cell">运行模式</div></td>
  14 + <td><div class="cell" v-if="cache.info">{{ cache.info.redis_mode == "standalone" ? "单机" : "集群" }}</div></td>
  15 + <td><div class="cell">端口</div></td>
  16 + <td><div class="cell" v-if="cache.info">{{ cache.info.tcp_port }}</div></td>
  17 + <td><div class="cell">客户端数</div></td>
  18 + <td><div class="cell" v-if="cache.info">{{ cache.info.connected_clients }}</div></td>
  19 + </tr>
  20 + <tr>
  21 + <td><div class="cell">运行时间(天)</div></td>
  22 + <td><div class="cell" v-if="cache.info">{{ cache.info.uptime_in_days }}</div></td>
  23 + <td><div class="cell">使用内存</div></td>
  24 + <td><div class="cell" v-if="cache.info">{{ cache.info.used_memory_human }}</div></td>
  25 + <td><div class="cell">使用CPU</div></td>
  26 + <td><div class="cell" v-if="cache.info">{{ parseFloat(cache.info.used_cpu_user_children).toFixed(2) }}</div></td>
  27 + <td><div class="cell">内存配置</div></td>
  28 + <td><div class="cell" v-if="cache.info">{{ cache.info.maxmemory_human }}</div></td>
  29 + </tr>
  30 + <tr>
  31 + <td><div class="cell">AOF是否开启</div></td>
  32 + <td><div class="cell" v-if="cache.info">{{ cache.info.aof_enabled == "0" ? "否" : "是" }}</div></td>
  33 + <td><div class="cell">RDB是否成功</div></td>
  34 + <td><div class="cell" v-if="cache.info">{{ cache.info.rdb_last_bgsave_status }}</div></td>
  35 + <td><div class="cell">Key数量</div></td>
  36 + <td><div class="cell" v-if="cache.dbSize">{{ cache.dbSize }} </div></td>
  37 + <td><div class="cell">网络入口/出口</div></td>
  38 + <td><div class="cell" v-if="cache.info">{{ cache.info.instantaneous_input_kbps }}kps/{{cache.info.instantaneous_output_kbps}}kps</div></td>
  39 + </tr>
  40 + </tbody>
  41 + </table>
  42 + </div>
  43 + </el-card>
  44 + </el-col>
  45 +
  46 + <el-col :span="12" class="card-box">
  47 + <el-card>
  48 + <div slot="header"><span>命令统计</span></div>
  49 + <div class="el-table el-table--enable-row-hover el-table--medium">
  50 + <div ref="commandstats" style="height: 420px" />
  51 + </div>
  52 + </el-card>
  53 + </el-col>
  54 +
  55 + <el-col :span="12" class="card-box">
  56 + <el-card>
  57 + <div slot="header">
  58 + <span>内存信息</span>
  59 + </div>
  60 + <div class="el-table el-table--enable-row-hover el-table--medium">
  61 + <div ref="usedmemory" style="height: 420px" />
  62 + </div>
  63 + </el-card>
  64 + </el-col>
  65 + </el-row>
  66 + </div>
  67 +</template>
  68 +
  69 +<script>
  70 +import { getCache } from "@/api/monitor/cache";
  71 +import echarts from "echarts";
  72 +
  73 +export default {
  74 + name: "Server",
  75 + data() {
  76 + return {
  77 + // 加载层信息
  78 + loading: [],
  79 + // 统计命令信息
  80 + commandstats: null,
  81 + // 使用内存
  82 + usedmemory: null,
  83 + // cache信息
  84 + cache: [],
  85 + };
  86 + },
  87 + created() {
  88 + this.getList();
  89 + this.openLoading();
  90 + },
  91 + methods: {
  92 + /** 查缓存询信息 */
  93 + getList() {
  94 + getCache().then((response) => {
  95 + this.cache = response.data;
  96 + this.loading.close();
  97 +
  98 + this.commandstats = echarts.init(this.$refs.commandstats, "macarons");
  99 + this.commandstats.setOption({
  100 + tooltip: {
  101 + trigger: "item",
  102 + formatter: "{a} <br/>{b} : {c} ({d}%)",
  103 + },
  104 + series: [
  105 + {
  106 + name: "命令",
  107 + type: "pie",
  108 + roseType: "radius",
  109 + radius: [15, 95],
  110 + center: ["50%", "38%"],
  111 + data: response.data.commandStats,
  112 + animationEasing: "cubicInOut",
  113 + animationDuration: 1000,
  114 + },
  115 + ],
  116 + });
  117 + this.usedmemory = echarts.init(this.$refs.usedmemory, "macarons");
  118 + this.usedmemory.setOption({
  119 + tooltip: {
  120 + formatter: "{b} <br/>{a} : {c}M",
  121 + },
  122 + series: [
  123 + {
  124 + name: "峰值",
  125 + type: "gauge",
  126 + detail: {
  127 + formatter: "{value}M",
  128 + },
  129 + data: [
  130 + {
  131 + value: parseFloat(this.cache.info.used_memory_human),
  132 + name: "内存消耗",
  133 + },
  134 + ],
  135 + },
  136 + ],
  137 + });
  138 + });
  139 + },
  140 + // 打开加载层
  141 + openLoading() {
  142 + this.loading = this.$loading({
  143 + lock: true,
  144 + text: "拼命读取中",
  145 + spinner: "el-icon-loading",
  146 + background: "rgba(0, 0, 0, 0.7)",
  147 + });
  148 + },
  149 + },
  150 +};
  151 +</script>
... ...
sql/ry_20201021.sql renamed to sql/ry_20201123.sql
... ... @@ -174,9 +174,10 @@ insert into sys_menu values(&#39;109&#39;, &#39;在线用户&#39;, &#39;2&#39;, &#39;1&#39;, &#39;online&#39;, &#39;m
174 174 insert into sys_menu values('110', '定时任务', '2', '2', 'job', 'monitor/job/index', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', sysdate(), '', null, '定时任务菜单');
175 175 insert into sys_menu values('111', '数据监控', '2', '3', 'druid', 'monitor/druid/index', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', sysdate(), '', null, '数据监控菜单');
176 176 insert into sys_menu values('112', '服务监控', '2', '4', 'server', 'monitor/server/index', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', sysdate(), '', null, '服务监控菜单');
177   -insert into sys_menu values('113', '表单构建', '3', '1', 'build', 'tool/build/index', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', sysdate(), '', null, '表单构建菜单');
178   -insert into sys_menu values('114', '代码生成', '3', '2', 'gen', 'tool/gen/index', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', sysdate(), '', null, '代码生成菜单');
179   -insert into sys_menu values('115', '系统接口', '3', '3', 'swagger', 'tool/swagger/index', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', sysdate(), '', null, '系统接口菜单');
  177 +insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', sysdate(), '', null, '缓存监控菜单');
  178 +insert into sys_menu values('114', '表单构建', '3', '1', 'build', 'tool/build/index', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', sysdate(), '', null, '表单构建菜单');
  179 +insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', sysdate(), '', null, '代码生成菜单');
  180 +insert into sys_menu values('116', '系统接口', '3', '3', 'swagger', 'tool/swagger/index', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', sysdate(), '', null, '系统接口菜单');
180 181 -- 三级菜单
181 182 insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', sysdate(), '', null, '操作日志菜单');
182 183 insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', sysdate(), '', null, '登录日志菜单');
... ... @@ -247,12 +248,12 @@ insert into sys_menu values(&#39;1052&#39;, &#39;任务删除&#39;, &#39;110&#39;, &#39;4&#39;, &#39;#&#39;, &#39;&#39;, 1, 0, &#39;
247 248 insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', sysdate(), '', null, '');
248 249 insert into sys_menu values('1054', '任务导出', '110', '7', '#', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', sysdate(), '', null, '');
249 250 -- 代码生成按钮
250   -insert into sys_menu values('1055', '生成查询', '114', '1', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', sysdate(), '', null, '');
251   -insert into sys_menu values('1056', '生成修改', '114', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', sysdate(), '', null, '');
252   -insert into sys_menu values('1057', '生成删除', '114', '3', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', sysdate(), '', null, '');
253   -insert into sys_menu values('1058', '导入代码', '114', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', sysdate(), '', null, '');
254   -insert into sys_menu values('1059', '预览代码', '114', '4', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', sysdate(), '', null, '');
255   -insert into sys_menu values('1060', '生成代码', '114', '5', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', sysdate(), '', null, '');
  251 +insert into sys_menu values('1055', '生成查询', '115', '1', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', sysdate(), '', null, '');
  252 +insert into sys_menu values('1056', '生成修改', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', sysdate(), '', null, '');
  253 +insert into sys_menu values('1057', '生成删除', '115', '3', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', sysdate(), '', null, '');
  254 +insert into sys_menu values('1058', '导入代码', '115', '2', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', sysdate(), '', null, '');
  255 +insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', sysdate(), '', null, '');
  256 +insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', sysdate(), '', null, '');
256 257  
257 258  
258 259 -- ----------------------------
... ... @@ -305,6 +306,7 @@ insert into sys_role_menu values (&#39;2&#39;, &#39;112&#39;);
305 306 insert into sys_role_menu values ('2', '113');
306 307 insert into sys_role_menu values ('2', '114');
307 308 insert into sys_role_menu values ('2', '115');
  309 +insert into sys_role_menu values ('2', '116');
308 310 insert into sys_role_menu values ('2', '500');
309 311 insert into sys_role_menu values ('2', '501');
310 312 insert into sys_role_menu values ('2', '1000');
... ...