Explorar o código

实现机器节点页面中 dagent 获取日志接口

reghao %!s(int64=4) %!d(string=hai) anos
pai
achega
7b10abd5b3

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/docker/DockerImpl.java

@@ -142,7 +142,7 @@ public class DockerImpl implements Docker {
                 .withNameFilter(List.of(containerName))
                 .exec();
         if (list.size() > 1) {
-            String msg = String.format("有多个名字为 %s 的容器不存在", containerName);
+            String msg = String.format("有多个名字为 %s 的容器", containerName);
             throw new DockerException(msg);
         } else if (list.size() == 1) {
             return list.get(0).getId();

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppRunningVo.java

@@ -37,6 +37,6 @@ public class AppRunningVo {
         this.status = appRunning.getStatus();
         this.startTime = appRunning.getStartTime() != null ? DateTimeConverter.format(appRunning.getStartTime()) : "N/A";
         this.pid = appRunning.getPid() != null ? appRunning.getPid() : -1;
-        this.lastCheck = "N/A";
+        this.lastCheck = appRunning.getLastCheck() != null ? DateTimeConverter.format(appRunning.getLastCheck()) : "N/A";
     }
 }

+ 10 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/page/MachineHostPageController.java

@@ -4,10 +4,12 @@ import cn.reghao.autodop.dmaster.app.model.constant.EnvList;
 import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
 import cn.reghao.autodop.dmaster.machine.model.SshConnData;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
+import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
 import cn.reghao.autodop.dmaster.machine.model.po.SshAuth;
 import cn.reghao.autodop.dmaster.machine.model.vo.MachineHostVO;
 import cn.reghao.autodop.dmaster.machine.model.vo.MachineInfoVO;
 import cn.reghao.autodop.dmaster.machine.model.vo.MachineSshAuth;
+import cn.reghao.autodop.dmaster.machine.model.vo.NodeLogVo;
 import cn.reghao.autodop.dmaster.machine.service.page.MachineHostPage;
 import cn.reghao.autodop.dmaster.machine.util.ssh.Keys;
 import cn.reghao.autodop.dmaster.util.db.PageList;
@@ -146,4 +148,12 @@ public class MachineHostPageController {
         model.addAttribute("machine", machineInfoVO);
         return "/machine/host/detail";
     }
+
+    @ApiOperation(value = "dagnet 日志页面")
+    @GetMapping("/dagentlog/{machineId}")
+    public String dagentLogPage(@PathVariable("machineId") String machineId, Model model) {
+        List<NodeLogVo> nodeLogs = machineHostPage.dagentLog(machineId);
+        model.addAttribute("list", nodeLogs);
+        return "/machine/host/dagentlog";
+    }
 }

+ 21 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MongoQuery.java

@@ -3,7 +3,10 @@ package cn.reghao.autodop.dmaster.machine.db.query;
 import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
 import com.mongodb.BasicDBObject;
 import com.mongodb.client.AggregateIterable;
+import com.mongodb.client.model.Filters;
 import org.bson.Document;
+import org.bson.conversions.Bson;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
@@ -80,15 +83,31 @@ public class MongoQuery {
         return list;
     }
 
-    public List query(String machineId, String appId, String yearMonthDay) {
+    public List<NodeLog> query(String machineId, String appId, String yearMonthDay) {
         LocalDate localDate = LocalDate.parse(yearMonthDay, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
         LocalDate localDate1 = localDate.plusDays(1);
+        LocalDate localDate2 = LocalDate.now();
+
 
         Query query = new Query();
         query.addCriteria(Criteria.where("machineId").is(machineId));
         query.addCriteria(Criteria.where("appId").is(appId));
         query.addCriteria(Criteria.where("createTime").gte(localDate.atStartOfDay())
                 .andOperator(Criteria.where("createTime").lt(localDate1.atStartOfDay())));
-        return mongoTemplate.find(query, null);
+        return mongoTemplate.find(query, NodeLog.class);
+    }
+
+    public List<NodeLog> query(String machineId, String appId) {
+        LocalDate localDate = LocalDate.now();
+        LocalDate localDate1 = localDate.plusDays(1);
+
+        Query query = new Query();
+        query.addCriteria(Criteria.where("machineId").is(machineId));
+        query.addCriteria(Criteria.where("appId").is(appId));
+        query.addCriteria(Criteria.where("createTime").gte(localDate.atStartOfDay())
+                .andOperator(Criteria.where("createTime").lt(localDate1.atStartOfDay())));
+        query.with(Sort.by(Sort.Order.desc("createTime")));
+
+        return mongoTemplate.find(query, NodeLog.class);
     }
 }

+ 15 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/NodeLogQuery.java

@@ -0,0 +1,15 @@
+package cn.reghao.autodop.dmaster.machine.db.query;
+
+import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
+import cn.reghao.jdkutil.db.BaseQuery;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2021-10-27 16:05:26
+ */
+public interface NodeLogQuery extends BaseQuery<NodeLog> {
+    List<NodeLog> findByAppIdAndMachineId(String appId, String machineId);
+}

+ 24 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/NodeLogQueryImpl.java

@@ -0,0 +1,24 @@
+package cn.reghao.autodop.dmaster.machine.db.query;
+
+import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2021-10-27 16:05:26
+ */
+@Service
+public class NodeLogQueryImpl implements NodeLogQuery {
+    private final MongoQuery mongoQuery;
+
+    public NodeLogQueryImpl(MongoQuery mongoQuery) {
+        this.mongoQuery = mongoQuery;
+    }
+
+    @Override
+    public List<NodeLog> findByAppIdAndMachineId(String appId, String machineId) {
+        return mongoQuery.query(machineId, appId);
+    }
+}

+ 3 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/repository/NodeLogRepository.java

@@ -1,6 +1,8 @@
 package cn.reghao.autodop.dmaster.machine.db.repository;
 
 import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.mongodb.repository.MongoRepository;
 
 import java.util.List;
@@ -10,5 +12,5 @@ import java.util.List;
  * @date 2020-01-21 14:53:03
  */
 public interface NodeLogRepository extends MongoRepository<NodeLog, String> {
-    List<NodeLog> findByMachineIdAndAppId(String machineId, String appId);
+    Page<NodeLog> findByAppIdAndMachineId(String appId, String machineId, Pageable pageable);
 }

+ 26 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/NodeLogVo.java

@@ -0,0 +1,26 @@
+package cn.reghao.autodop.dmaster.machine.model.vo;
+
+import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
+import cn.reghao.jdkutil.converter.DateTimeConverter;
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2021-10-27 16:46:21
+ */
+@Data
+public class NodeLogVo {
+    private String logTime;
+    private String level;
+    private String threadName;
+    private String loggerName;
+    private String message;
+
+    public NodeLogVo(NodeLog nodeLog) {
+        this.logTime = DateTimeConverter.format(nodeLog.getTimestamp());
+        this.level = nodeLog.getLevel();
+        this.threadName = nodeLog.getThreadName();
+        this.loggerName = nodeLog.getLoggerName();
+        this.message = nodeLog.getMessage();
+    }
+}

+ 5 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/page/MachineHostPage.java

@@ -1,12 +1,16 @@
 package cn.reghao.autodop.dmaster.machine.service.page;
 
 import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
+import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
 import cn.reghao.autodop.dmaster.machine.model.vo.MachineHostVO;
 import cn.reghao.autodop.dmaster.machine.model.vo.MachineInfoVO;
 import cn.reghao.autodop.dmaster.machine.model.vo.MachineSshAuth;
+import cn.reghao.autodop.dmaster.machine.model.vo.NodeLogVo;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2021-10-16 23:15:45
@@ -20,4 +24,5 @@ public interface MachineHostPage {
     void setNotifyPage(String machineId);
     MachineHost sshTerminalPage(String machineId);
     MachineInfoVO hostDetailPage(String machineId);
+    List<NodeLogVo> dagentLog(String machineId);
 }

+ 15 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/page/MachineHostPageImpl.java

@@ -1,15 +1,15 @@
 package cn.reghao.autodop.dmaster.machine.service.page;
 
+import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppId;
 import cn.reghao.autodop.dmaster.machine.db.crud.MachineHostCrud;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineInfoQuery;
-import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
-import cn.reghao.autodop.dmaster.machine.model.po.MachineInfo;
-import cn.reghao.autodop.dmaster.machine.model.po.NetworkInfo;
-import cn.reghao.autodop.dmaster.machine.model.po.SshAuth;
+import cn.reghao.autodop.dmaster.machine.db.query.NodeLogQuery;
+import cn.reghao.autodop.dmaster.machine.model.po.*;
 import cn.reghao.autodop.dmaster.machine.model.vo.MachineHostVO;
 import cn.reghao.autodop.dmaster.machine.model.vo.MachineInfoVO;
 import cn.reghao.autodop.dmaster.machine.model.vo.MachineSshAuth;
+import cn.reghao.autodop.dmaster.machine.model.vo.NodeLogVo;
 import cn.reghao.autodop.dmaster.notification.db.repository.NotifyGroupRepository;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
@@ -30,13 +30,16 @@ public class MachineHostPageImpl implements MachineHostPage {
     private MachineHostCrud hostCrud;
     private MachineInfoQuery infoQuery;
     private NotifyGroupRepository receiverRepository;
+    private NodeLogQuery nodeLogQuery;
 
     public MachineHostPageImpl(MachineHostCrud hostCrud, MachineHostQuery hostQuery,
-                               MachineInfoQuery infoQuery, NotifyGroupRepository receiverRepository) {
+                               MachineInfoQuery infoQuery, NotifyGroupRepository receiverRepository,
+                               NodeLogQuery nodeLogQuery) {
         this.hostCrud = hostCrud;
         this.hostQuery = hostQuery;
         this.infoQuery = infoQuery;
         this.receiverRepository = receiverRepository;
+        this.nodeLogQuery = nodeLogQuery;
     }
 
     @Override
@@ -91,4 +94,11 @@ public class MachineHostPageImpl implements MachineHostPage {
 
         return null;
     }
+
+    @Override
+    public List<NodeLogVo> dagentLog(String machineId) {
+        return nodeLogQuery.findByAppIdAndMachineId(AppId.dagent.name(), machineId).stream()
+                .map(NodeLogVo::new)
+                .collect(Collectors.toList());
+    }
 }

+ 29 - 99
dmaster/src/main/resources/templates/machine/host/dagentlog.html

@@ -2,106 +2,36 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
 
-<body>
-    <div class="timo-detail-page">
-        <div class="timo-detail-title">操作系统</div>
-        <table class="layui-table timo-detail-table">
-            <thead>
-            <tr>
-                <th data-field="name">名字</th>
-                <th data-field="arch">架构</th>
-                <th data-field="version">版本</th>
-                <th data-field="byteOrder">字节序</th>
-                <th data-field="bootTime">启动时间</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr>
-                <td th:text="${machine.name}"></td>
-                <td th:text="${machine.arch}"></td>
-                <td th:text="${machine.version}"></td>
-                <td th:text="${machine.byteOrder}"></td>
-                <td th:text="${machine.bootTime}"></td>
-            </tr>
-            </tbody>
-        </table>
-        <div class="timo-detail-title">网络</div>
-        <table class="layui-table timo-detail-table">
-            <thead>
-            <tr>
-                <th data-field="iface">网卡接口</th>
-                <th data-field="mac">MAC 地址</th>
-                <th data-field="ipv4">IPv4 地址</th>
-                <th data-field="pubicIpv4">IPv4 公网地址</th>
-                <th data-field="ipv6">IPv6 地址</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr th:each="item:${machine.networkInfos}">
-                <td th:text="${item.iface}"></td>
-                <td th:text="${item.mac}"></td>
-                <td th:text="${item.ipv4}"></td>
-                <td th:text="${item.publicIpv4}"></td>
-                <td th:text="${item.ipv6}"></td>
-            </tr>
-            </tbody>
-        </table>
-        <div class="timo-detail-title">CPU</div>
-        <table class="layui-table timo-detail-table">
-            <thead>
-            <tr>
-                <th data-field="vendor">品牌</th>
-                <th data-field="modelName">型号</th>
-                <th data-field="physicalCore">物理核</th>
-                <th data-field="logicalCore">逻辑核</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr>
-                <td th:text="${machine.vendor}"></td>
-                <td th:text="${machine.modelName}"></td>
-                <td th:text="${machine.physicalCore}"></td>
-                <td th:text="${machine.logicalCore}"></td>
-            </tr>
-            </tbody>
-        </table>
-        <div class="timo-detail-title">内存</div>
-        <table class="layui-table timo-detail-table">
-            <thead>
-            <tr>
-                <th data-field="memTotal">物理内存总量</th>
-                <th data-field="swapTotal">Swap 分区总量</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr>
-                <td th:text="${machine.memTotal}"></td>
-                <td th:text="${machine.swapTotal}"></td>
-            </tr>
-            </tbody>
-        </table>
-        <div class="timo-detail-title">磁盘</div>
-        <table class="layui-table timo-detail-table">
-            <thead>
-            <tr>
-                <th data-field="vendor">磁盘路径</th>
-                <th data-field="modelName">挂载分区</th>
-                <th data-field="physicalCore">文件系统</th>
-                <th data-field="logicalCore">磁盘总量</th>
-                <th data-field="logicalCore">inode 总量</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr th:each="item:${machine.diskInfoVOs}">
-                <td th:text="${item.diskPath}"></td>
-                <td th:text="${item.mountedOn}"></td>
-                <td th:text="${item.fsType}"></td>
-                <td th:text="${item.total}"></td>
-                <td th:text="${item.inodeTotal}"></td>
-            </tr>
-            </tbody>
-        </table>
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-body">
+        <div class="timo-table-wrap">
+            <table class="layui-table timo-table">
+                <thead>
+                <tr>
+                    <th class="sortable" data-field="logTime">时间</th>
+                    <th class="sortable" data-field="level">级别</th>
+                    <th class="sortable" data-field="threadName">线程</th>
+                    <th class="sortable" data-field="loggerName">记录器</th>
+                    <th class="sortable" data-field="message">内容</th>
+                </tr>
+                </thead>
+                <tbody>
+                <tr th:each="item:${list}">
+                    <td th:text="${item.logTime}">时间</td>
+                    <td th:text="${item.level}">级别</td>
+                    <td th:text="${item.threadName}">线程</td>
+                    <td th:text="${item.loggerName}">记录器</td>
+                    <td th:text="${item.message}">内容</td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
     </div>
+</div>
+
 <script th:replace="/common/template :: script"></script>
+<script type="text/javascript">
+</script>
 </body>
 </html>

+ 1 - 1
dmaster/src/main/resources/templates/machine/host/index.html

@@ -80,7 +80,7 @@
                            data-size="max" href="#">管理</a>-->
                         <a class="open-popup" data-title="WebTerminal" th:attr="data-url=@{'/machine/host/webssh/'+${item.machineId}}"
                            href="#">SSH 终端</a>
-                        <a class="open-popup" data-title="dagent 日志" th:attr="data-url=@{'/machine/host/detail/'+${item.machineId}}"
+                        <a class="open-popup" data-title="dagent 日志" th:attr="data-url=@{'/machine/host/dagentlog/'+${item.machineId}}"
                            data-size="960,480" href="#">dagent 日志</a>
                         <a class="open-popup" data-title="机器详细信息" th:attr="data-url=@{'/machine/host/detail/'+${item.machineId}}"
                            data-size="960,480" href="#">详细</a>

+ 1 - 1
dmaster/src/main/resources/templates/sys/log/runtimedetail.html

@@ -18,7 +18,7 @@
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
-                    <td th:text="${item.logTime}">时间</td>
+                    <td th:text="${item.timestamp}">时间</td>
                     <td th:text="${item.level}">级别</td>
                     <td th:text="${item.threadName}">线程</td>
                     <td th:text="${item.loggerName}">记录器</td>

+ 16 - 0
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/db/query/config/impl/AppConfigQueryImplTest.java

@@ -1,11 +1,14 @@
 package cn.reghao.autodop.dmaster.app.db.query.config.impl;
 
+import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppId;
 import cn.reghao.autodop.dmaster.DmasterApplication;
 import cn.reghao.autodop.dmaster.app.db.crud.config.AppConfigCrud;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
 import cn.reghao.autodop.dmaster.app.model.constant.EnvList;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.service.config.AppConfigService;
+import cn.reghao.autodop.dmaster.machine.db.query.MongoQuery;
+import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,6 +16,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -27,6 +31,8 @@ public class AppConfigQueryImplTest {
     private AppConfigCrud appConfigCrud;
     @Autowired
     private AppConfigService appConfigService;
+    @Autowired
+    private MongoQuery mongoQuery;
 
     @Test
     public void test() {
@@ -58,4 +64,14 @@ public class AppConfigQueryImplTest {
 
         System.out.println();
     }
+
+    @Test
+    public void dagentLog() {
+        String machineId = "5d1a727991f34d3a9c1220a1899e6ebd";
+        String appId = AppId.dagent.name();
+        String yearMonthDay = "2021-10-27";
+        //List<NodeLog> list = mongoQuery.aggregate1("NodeLog", machineId, appId);
+        List<NodeLog> list1 = mongoQuery.query(machineId, appId);
+        System.out.println();
+    }
 }