diff --git a/itbaima-monitor-server/src/main/java/com/example/controller/MonitorController.java b/itbaima-monitor-server/src/main/java/com/example/controller/MonitorController.java index b193b16..9b09023 100644 --- a/itbaima-monitor-server/src/main/java/com/example/controller/MonitorController.java +++ b/itbaima-monitor-server/src/main/java/com/example/controller/MonitorController.java @@ -3,8 +3,10 @@ package com.example.controller; import com.example.entity.RestBean; import com.example.entity.vo.request.RenameClientVO; import com.example.entity.vo.request.RenameNodeVO; +import com.example.entity.vo.request.RuntimeDetailVO; import com.example.entity.vo.response.ClientDetailsVO; import com.example.entity.vo.response.ClientPreviewVO; +import com.example.entity.vo.response.RuntimeDetailsVO; import com.example.service.ClientService; import jakarta.annotation.Resource; import jakarta.validation.Valid; @@ -40,4 +42,14 @@ public class MonitorController { public RestBean clientDetails(int clientId) { return RestBean.success(service.clientDetails(clientId)); } + + @GetMapping("/runtime-history") + public RestBean runtimeDetailsHistory(int clientId) { + return RestBean.success(service.clientRuntimeDetailsHistory(clientId)); + } + + @GetMapping("/runtime-now") + public RestBean runtimeDetailsNow(int clientId) { + return RestBean.success(service.clientRuntimeDetailsNow(clientId)); + } } diff --git a/itbaima-monitor-server/src/main/java/com/example/entity/vo/response/RuntimeDetailsVO.java b/itbaima-monitor-server/src/main/java/com/example/entity/vo/response/RuntimeDetailsVO.java new file mode 100644 index 0000000..ac3f5a2 --- /dev/null +++ b/itbaima-monitor-server/src/main/java/com/example/entity/vo/response/RuntimeDetailsVO.java @@ -0,0 +1,14 @@ +package com.example.entity.vo.response; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; + +import java.util.LinkedList; +import java.util.List; + +@Data +public class RuntimeDetailsVO { + double memory; + double disk; + List list = new LinkedList<>(); +} diff --git a/itbaima-monitor-server/src/main/java/com/example/filter/RequestLogFilter.java b/itbaima-monitor-server/src/main/java/com/example/filter/RequestLogFilter.java index 1840062..8df4a7b 100644 --- a/itbaima-monitor-server/src/main/java/com/example/filter/RequestLogFilter.java +++ b/itbaima-monitor-server/src/main/java/com/example/filter/RequestLogFilter.java @@ -29,7 +29,8 @@ public class RequestLogFilter extends OncePerRequestFilter { @Resource SnowflakeIdGenerator generator; - private final Set ignores = Set.of("/swagger-ui", "/v3/api-docs", "/monitor/runtime", "/api/monitor/list"); + private final Set ignores = Set.of("/swagger-ui", "/v3/api-docs", + "/monitor/runtime", "/api/monitor/list", "/api/monitor/runtime"); @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { diff --git a/itbaima-monitor-server/src/main/java/com/example/service/ClientService.java b/itbaima-monitor-server/src/main/java/com/example/service/ClientService.java index ab9ba92..16132e3 100644 --- a/itbaima-monitor-server/src/main/java/com/example/service/ClientService.java +++ b/itbaima-monitor-server/src/main/java/com/example/service/ClientService.java @@ -8,6 +8,7 @@ import com.example.entity.vo.request.RenameNodeVO; import com.example.entity.vo.request.RuntimeDetailVO; import com.example.entity.vo.response.ClientDetailsVO; import com.example.entity.vo.response.ClientPreviewVO; +import com.example.entity.vo.response.RuntimeDetailsVO; import java.util.List; @@ -22,4 +23,6 @@ public interface ClientService extends IService { void renameClient(RenameClientVO vo); void renameNode(RenameNodeVO vo); ClientDetailsVO clientDetails(int clientId); + RuntimeDetailsVO clientRuntimeDetailsHistory(int clientId); + RuntimeDetailVO clientRuntimeDetailsNow(int clientId); } diff --git a/itbaima-monitor-server/src/main/java/com/example/service/impl/ClientServiceImpl.java b/itbaima-monitor-server/src/main/java/com/example/service/impl/ClientServiceImpl.java index fafa5aa..d7796a7 100644 --- a/itbaima-monitor-server/src/main/java/com/example/service/impl/ClientServiceImpl.java +++ b/itbaima-monitor-server/src/main/java/com/example/service/impl/ClientServiceImpl.java @@ -10,6 +10,7 @@ import com.example.entity.vo.request.RenameNodeVO; import com.example.entity.vo.request.RuntimeDetailVO; import com.example.entity.vo.response.ClientDetailsVO; import com.example.entity.vo.response.ClientPreviewVO; +import com.example.entity.vo.response.RuntimeDetailsVO; import com.example.mapper.ClientDetailMapper; import com.example.mapper.ClientMapper; import com.example.service.ClientService; @@ -129,6 +130,19 @@ public class ClientServiceImpl extends ServiceImpl impleme return vo; } + @Override + public RuntimeDetailsVO clientRuntimeDetailsHistory(int clientId) { + RuntimeDetailsVO vo = influx.readRuntimeData(); + ClientDetail client = detailMapper.selectById(clientId); + BeanUtils.copyProperties(client, vo); + return vo; + } + + @Override + public RuntimeDetailVO clientRuntimeDetailsNow(int clientId) { + return lastRuntime.get(clientId); + } + private boolean isOnline(RuntimeDetailVO runtime) { return runtime != null && System.currentTimeMillis() - runtime.getTimestamp() < 60 * 1000; } diff --git a/itbaima-monitor-server/src/main/java/com/example/utils/InfluxDbUtils.java b/itbaima-monitor-server/src/main/java/com/example/utils/InfluxDbUtils.java index c0ef686..74e8694 100644 --- a/itbaima-monitor-server/src/main/java/com/example/utils/InfluxDbUtils.java +++ b/itbaima-monitor-server/src/main/java/com/example/utils/InfluxDbUtils.java @@ -1,17 +1,22 @@ package com.example.utils; +import com.alibaba.fastjson2.JSONObject; import com.example.entity.dto.RuntimeData; import com.example.entity.vo.request.RuntimeDetailVO; +import com.example.entity.vo.response.RuntimeDetailsVO; import com.influxdb.client.InfluxDBClient; import com.influxdb.client.InfluxDBClientFactory; import com.influxdb.client.WriteApiBlocking; import com.influxdb.client.domain.WritePrecision; +import com.influxdb.query.FluxRecord; +import com.influxdb.query.FluxTable; import jakarta.annotation.PostConstruct; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Date; +import java.util.List; @Component public class InfluxDbUtils { @@ -41,4 +46,27 @@ public class InfluxDbUtils { WriteApiBlocking writeApi = client.getWriteApiBlocking(); writeApi.writeMeasurement(BUCKET, ORG, WritePrecision.NS, data); } + + public RuntimeDetailsVO readRuntimeData() { + String query = """ + from(bucket: "%s") + |> range(start: %s) + |> filter(fn: (r) => r["_measurement"] == "runtime") + """; + String format = String.format(query, BUCKET, "-1h"); + List tables = client.getQueryApi().query(format, ORG); + int size = tables.size(); + List records = tables.get(0).getRecords(); + RuntimeDetailsVO vo = new RuntimeDetailsVO(); + for (int i = 0; i < records.size(); i++) { + JSONObject object = new JSONObject(); + object.put("timestamp", records.get(i).getTime()); + for (int j = 0; j < size; j++) { + FluxRecord record = tables.get(j).getRecords().get(i); + object.put(record.getField(), record.getValue()); + } + vo.getList().add(object); + } + return vo; + } } diff --git a/itbaima-monitor-web/src/component/ClientDetails.vue b/itbaima-monitor-web/src/component/ClientDetails.vue index 7714460..867df1b 100644 --- a/itbaima-monitor-web/src/component/ClientDetails.vue +++ b/itbaima-monitor-web/src/component/ClientDetails.vue @@ -1,9 +1,9 @@ @@ -151,37 +169,41 @@ watch(() => props.id, init, { immediate: true }) 实时监控 -
-
- +
+
+
CPU
-
20%
+
{{ (now.cpuUsage * 100).toFixed(1) }}%
+ type="dashboard" :width="100" :percentage="now.memoryUsage / details.runtime.memory * 100" + :status="percentageToStatus(now.memoryUsage / details.runtime.memory * 100)">
内存
-
28.6 GB
+
{{ (now.memoryUsage).toFixed(1) }} GB
实时网络速度
- {{` 20KB/s`}} + {{` ${fitToRightByteUnit(now.networkUpload, 'KB')}/s`}} - {{` 0KB/s`}} + {{` ${fitToRightByteUnit(now.networkDownload, 'KB')}/s`}}
- 磁盘总容量 + 磁盘
-
6.6 GB / 40.0 GB
+
{{now.diskUsage.toFixed(1)}} GB / {{details.runtime.disk.toFixed(1)}} GB
- +
diff --git a/itbaima-monitor-web/src/views/main/Manage.vue b/itbaima-monitor-web/src/views/main/Manage.vue index 297e6e3..b9885fa 100644 --- a/itbaima-monitor-web/src/views/main/Manage.vue +++ b/itbaima-monitor-web/src/views/main/Manage.vue @@ -10,9 +10,9 @@ const detail = reactive({ show: false, id: -1 }) -const displayClientDetails = (id) => { - detail.show = true +const displayClientDetails = id => { detail.id = id + detail.show = true } const updateList = () => get('/api/monitor/list', data => list.value = data) @@ -30,8 +30,8 @@ updateList() @click="displayClientDetails(item.id)"/>
- + :with-header="false" v-if="list.length" @close="detail.id = -1"> +