Browse Source

完成机器模块的大部分数据解析

reghao 6 years ago
parent
commit
ab14b8183c
36 changed files with 501 additions and 304 deletions
  1. 9 33
      common/src/main/java/cn/reghao/autodop/common/machine/Cpu.java
  2. 4 7
      common/src/main/java/cn/reghao/autodop/common/machine/Disk.java
  3. 17 7
      common/src/main/java/cn/reghao/autodop/common/machine/Memory.java
  4. 59 49
      common/src/main/java/cn/reghao/autodop/common/machine/Network.java
  5. 63 25
      common/src/main/java/cn/reghao/autodop/common/machine/Process.java
  6. 0 27
      common/src/main/java/cn/reghao/autodop/common/machine/SysInfo.java
  7. 23 0
      common/src/main/java/cn/reghao/autodop/common/machine/contant/ProcFile.java
  8. 17 0
      common/src/main/java/cn/reghao/autodop/common/machine/contant/ProcessState.java
  9. 0 39
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/CpuInfo.java
  10. 0 62
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/MemProfile.java
  11. 10 3
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/ProcessStat.java
  12. 21 0
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/SysStat.java
  13. 1 1
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/cpu/CpuStat.java
  14. 2 1
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/cpu/CpuUsage.java
  15. 1 1
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/disk/DiskStat.java
  16. 2 1
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/disk/DiskUsage.java
  17. 2 2
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/mem/MemStat.java
  18. 1 1
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/mem/MemUsage.java
  19. 31 0
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/net/NetCardStat.java
  20. 7 3
      common/src/main/java/cn/reghao/autodop/common/machine/pojo/net/NetConnStat.java
  21. 2 2
      common/src/main/java/cn/reghao/autodop/common/machine/utils/CpuPercentageCalculator.java
  22. 2 2
      common/src/main/java/cn/reghao/autodop/common/machine/utils/MemCalculator.java
  23. 24 0
      common/src/main/java/cn/reghao/autodop/common/utils/DateTimeUtil.java
  24. 33 0
      common/src/main/java/cn/reghao/autodop/common/utils/NetworkUtil.java
  25. 36 0
      common/src/main/java/cn/reghao/autodop/common/utils/StringUtil.java
  26. 2 0
      dagent/src/main/java/cn/reghao/autodop/dagent/DagentApplication.java
  27. 61 0
      dagent/src/main/java/cn/reghao/autodop/dagent/service/MachineStatusScheduler.java
  28. 1 1
      dagent/src/main/resources/application-dev.yml
  29. 1 1
      dagent/src/main/resources/application-prod.yml
  30. 1 1
      dagent/src/main/resources/application-test.yml
  31. 5 0
      dmaster/pom.xml
  32. 35 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/MachineController.java
  33. 0 24
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/NodeController.java
  34. 0 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/NodeManager.java
  35. 26 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/SysStatService.java
  36. 2 0
      dmaster/src/main/resources/application-dev.yml

+ 9 - 33
common/src/main/java/cn/reghao/autodop/common/machine/Cpu.java

@@ -1,15 +1,13 @@
 package cn.reghao.autodop.common.machine;
 
-import cn.reghao.autodop.common.machine.pojo.CpuInfo;
-import cn.reghao.autodop.common.machine.pojo.CpuStat;
-import cn.reghao.autodop.common.machine.pojo.CpuUsage;
+import cn.reghao.autodop.common.machine.contant.ProcFile;
+import cn.reghao.autodop.common.machine.pojo.cpu.CpuStat;
+import cn.reghao.autodop.common.machine.pojo.cpu.CpuUsage;
 import cn.reghao.autodop.common.machine.utils.AbstractPercentageCalculator;
 import cn.reghao.autodop.common.machine.utils.CpuPercentageCalculator;
 import cn.reghao.autodop.common.utils.text.TextFile;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.*;
-
 /**
  * CPU 信息
  *
@@ -20,38 +18,15 @@ import java.util.*;
 public class Cpu {
     private AbstractPercentageCalculator<CpuStat> calculator = new CpuPercentageCalculator();;
     private TextFile textFile = new TextFile();
-    private int cpuCores = Runtime.getRuntime().availableProcessors();
-
-    public List<CpuInfo> info() throws IllegalAccessException {
-        /*List<CpuInfo> infos = new ArrayList<>();
-        String infoFile = "/proc/cpuinfo";
-        String[] infoArray = new TextFile().readFile(infoFile).split("\n\n");
-        for (String info : infoArray) {
-            String[] tmp = info.split("\n");
-            // 不使用最后的 power management 字段
-            String[] tmpInfo = new String[tmp.length-1];
-            for (int i = 0; i < tmp.length-1; i++) {
-                tmpInfo[i] = tmp[i].split(": ")[1];
-            }
-
-            CpuInfo cpu = new CpuInfo();
-            BeanConversion<CpuInfo> conversion = new BeanConversion<>();
-            conversion.convert(tmpInfo, cpu);
-            infos.add(cpu);
-        }
-
-        return infos;*/
-        return null;
-    }
 
     /**
-     * CPU 使用率
+     * top 命令 CPU 部分
      *
      * @param interval 采样时间,单位是 ms
      * @return
      * @date 2020-03-19 上午10:07
      */
-    public CpuUsage usage(long interval) throws InterruptedException {
+    public CpuUsage topCpu(long interval) throws InterruptedException {
         CpuStat stat1 = stat();
         Thread.sleep(interval);
         CpuStat stat2 = stat();
@@ -60,8 +35,7 @@ public class Cpu {
     }
 
     private CpuStat stat() {
-        String statFile = "/proc/stat";
-        String[] stat = textFile.readFile(statFile).split(System.lineSeparator());
+        String[] stat = textFile.readFile(ProcFile.CPU_STAT).split(System.lineSeparator());
         String whiteSpace = "\\s+";
         String[] cpu = stat[0].split(whiteSpace);
 
@@ -82,6 +56,8 @@ public class Cpu {
 
     public static void main(String[] args) throws InterruptedException {
         Cpu cpu = new Cpu();
-        log.info("cpu usage -> {}", cpu.usage(1000));
+        while (true) {
+            log.info("cpu usage -> {}", cpu.topCpu(1000));
+        }
     }
 }

+ 4 - 7
common/src/main/java/cn/reghao/autodop/common/machine/Disk.java

@@ -1,11 +1,8 @@
 package cn.reghao.autodop.common.machine;
 
-import cn.reghao.autodop.common.machine.pojo.DiskStat;
 import cn.reghao.autodop.common.utils.text.TextFile;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.Arrays;
-
 /**
  * 磁盘信息
  *
@@ -25,8 +22,8 @@ public class Disk {
      * @return
      * @date 2019-10-29 上午9:38
      */
-    public void stat() {
-        String[] stats = textFile.readFile(statFile).split("\n");
+    public void df() {
+        /*String[] stats = textFile.readFile(statFile).split("\n");
         for (String stat : stats) {
             String[] tmp = stat.split(whiteSpace);
             DiskStat diskStat = new DiskStat();
@@ -35,11 +32,11 @@ public class Disk {
             diskStat.setDevice(tmp[3]);
 
             log.info("");
-        }
+        }*/
     }
 
     public static void main(String[] args) {
         Disk disk = new Disk();
-        disk.stat();
+        disk.df();
     }
 }

+ 17 - 7
common/src/main/java/cn/reghao/autodop/common/machine/Memory.java

@@ -1,7 +1,8 @@
 package cn.reghao.autodop.common.machine;
 
-import cn.reghao.autodop.common.machine.pojo.MemStat;
-import cn.reghao.autodop.common.machine.pojo.MemUsage;
+import cn.reghao.autodop.common.machine.contant.ProcFile;
+import cn.reghao.autodop.common.machine.pojo.mem.MemStat;
+import cn.reghao.autodop.common.machine.pojo.mem.MemUsage;
 import cn.reghao.autodop.common.machine.utils.AbstractPercentageCalculator;
 import cn.reghao.autodop.common.machine.utils.MemCalculator;
 import cn.reghao.autodop.common.utils.text.TextFile;
@@ -18,17 +19,23 @@ import java.util.Map;
  */
 @Slf4j
 public class Memory {
-    private final String meminfo = "/proc/meminfo";
     private AbstractPercentageCalculator<MemStat> calculator = new MemCalculator();
     private TextFile textFile = new TextFile();
 
-    public MemUsage usage() {
+    /**
+     * free -h 命令
+     *
+     * @param
+     * @return
+     * @date 2020-03-19 下午7:21
+     */
+    public MemUsage free() {
         MemStat memStat = stat();
         return (MemUsage) calculator.format(memStat, null);
     }
 
     private MemStat stat() {
-        String[] info = textFile.readFile(meminfo).replace(" ", "").split(System.lineSeparator());
+        String[] info = textFile.readFile(ProcFile.MEM_INFO).replace(" ", "").split(System.lineSeparator());
         Map<String, Long> map = new HashMap<>(info.length);
         for (String s : info) {
             String[] kv = s.split(":");
@@ -50,8 +57,11 @@ public class Memory {
         return memStat;
     }
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws InterruptedException {
         Memory mem = new Memory();
-        mem.usage();
+        while (true) {
+            Thread.sleep(1_000);
+            log.info("mem -> {}", mem.free());
+        }
     }
 }

+ 59 - 49
common/src/main/java/cn/reghao/autodop/common/machine/Network.java

@@ -1,21 +1,21 @@
 package cn.reghao.autodop.common.machine;
 
+import cn.reghao.autodop.common.machine.contant.ProcFile;
 import cn.reghao.autodop.common.machine.contant.TcpState;
-import cn.reghao.autodop.common.machine.pojo.NetStat;
+import cn.reghao.autodop.common.machine.pojo.net.NetCardStat;
+import cn.reghao.autodop.common.machine.pojo.net.NetConnStat;
+import cn.reghao.autodop.common.machine.pojo.ProcessStat;
 import cn.reghao.autodop.common.machine.utils.IpAddressConversion;
+import cn.reghao.autodop.common.utils.StringUtil;
 import cn.reghao.autodop.common.utils.text.TextFile;
 import lombok.extern.slf4j.Slf4j;
 
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
+import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.List;
 
 /**
- * 网络信息
+ * 网络信息,依赖于 ProcessStat
  *
  * @author reghao
  * @date 2019-10-23 21:17:04
@@ -25,65 +25,74 @@ public class Network {
     private TextFile textFile = new TextFile();
     private IpAddressConversion conversion = new IpAddressConversion();
 
-    /**
-     * 获取本机物理网卡 IPv4 地址(不获取 loopback 和虚拟接口的地址)
-     *
-     * @param
-     * @return
-     * @date 2019-10-23 下午9:27
-     */
-    public static List<String> ipv4() throws SocketException {
-        List<String> addresses = new ArrayList<>();
-
-        Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
-        while (interfaces.hasMoreElements()) {
-            NetworkInterface iface = (NetworkInterface) interfaces.nextElement();
-
-            Enumeration<InetAddress> inetAddrs = iface.getInetAddresses();
-            while (inetAddrs.hasMoreElements()) {
-                InetAddress address = inetAddrs.nextElement();
-                if (address instanceof Inet4Address && !address.isLoopbackAddress()) {
-                    String addr = address.getHostAddress();
-                    if (addr.contains("192.168") || addr.contains("172.16")) {
-                        addresses.add(addr);
-                    }
-                }
-            }
+    public List<NetCardStat> ifconfig() {
+        List<NetCardStat> cardStats = new ArrayList<>();
+        String[] devs = textFile.readFile(ProcFile.DEV).split(System.lineSeparator());
+        for (int i = 2; i < devs.length; i++) {
+            String[] data = StringUtil.format(devs[i]).split(" ");
+            NetCardStat cardStat = new NetCardStat();
+            cardStat.setIface(data[0]);
+            cardStat.setRecvBytes(Long.parseLong(data[1]));
+            cardStat.setRecvPackets(Long.parseLong(data[2]));
+            cardStat.setRecvErrs(Long.parseLong(data[3]));
+            cardStat.setRecvDrop(Long.parseLong(data[4]));
+            cardStat.setRecvFifo(Long.parseLong(data[5]));
+            cardStat.setRecvFrame(Long.parseLong(data[6]));
+            cardStat.setRecvCompressed(Long.parseLong(data[7]));
+            cardStat.setRecvMulticast(Long.parseLong(data[8]));
+            cardStat.setSendBytes(Long.parseLong(data[9]));
+            cardStat.setSendPackets(Long.parseLong(data[10]));
+            cardStat.setSendErrs(Long.parseLong(data[11]));
+            cardStat.setSendDrop(Long.parseLong(data[12]));
+            cardStat.setSendFifo(Long.parseLong(data[13]));
+            cardStat.setSendColls(Long.parseLong(data[14]));
+            cardStat.setSendCarrier(Long.parseLong(data[15]));
+            cardStat.setSendCompressed(Long.parseLong(data[16]));
+
+            cardStats.add(cardStat);
         }
 
-        return addresses;
+        log.info("");
+        return cardStats;
     }
 
     /**
-     * netstat -anp|grep '^tcp.*' 命令实现
+     * netstat -anp|grep '^tcp.*' 命令
      *
-     * @param
-     * @return
      * @date 2019-10-25 上午8:59
      */
-    public void netstat() {
-        String tcpFile = "/proc/net/tcp";
-        String[] conns = textFile.readFile(tcpFile).split(System.lineSeparator());
+    public List<NetConnStat> netstat() {
+        new Process().topProcess();
 
-        List<NetStat> list = new ArrayList<>();
+        String[] conns = textFile.readFile(ProcFile.TCP).split(System.lineSeparator());
+
+        List<NetConnStat> list = new ArrayList<>();
         for (int i = 1; i < conns.length; i++) {
             String[] fields = conns[i].split("\\s+");
-            NetStat netStat = new NetStat();
+            NetConnStat netConnStat = new NetConnStat();
             String localAddr = fields[2].split(":")[0];
             String localPort = fields[2].split(":")[1];
-            netStat.setLocalAddr(conversion.dotDecimal(localAddr));
-            netStat.setLocalPort(Integer.valueOf(localPort, 16));
+            netConnStat.setLocalAddr(conversion.dotDecimal(localAddr));
+            netConnStat.setLocalPort(Integer.valueOf(localPort, 16));
 
             String remoteAddr = fields[3].split(":")[0];
             String remotePort = fields[3].split(":")[1];
-            netStat.setRemoteAddr(conversion.dotDecimal(remoteAddr));
-            netStat.setRemotePort(Integer.valueOf(remotePort, 16));
-            netStat.setState(tcpState(Integer.valueOf(fields[4], 16)));
+            netConnStat.setRemoteAddr(conversion.dotDecimal(remoteAddr));
+            netConnStat.setRemotePort(Integer.valueOf(remotePort, 16));
+            netConnStat.setState(tcpState(Integer.valueOf(fields[4], 16)));
+
+            String sendq = fields[5].split(":")[0];
+            String recvq = fields[5].split(":")[1];
+            netConnStat.setSendq(Long.valueOf(sendq, 16));
+            netConnStat.setRecvq(Long.valueOf(recvq, 16));
 
-            list.add(netStat);
+            long inode = Long.parseLong(fields[10]);
+            netConnStat.setProcess(ProcessStat.socketInodes.get(inode));
+
+            list.add(netConnStat);
         }
 
-        log.info("");
+        return list;
     }
 
     private TcpState tcpState(int state) {
@@ -115,8 +124,9 @@ public class Network {
         }
     }
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws IOException {
         Network network = new Network();
-        network.netstat();
+        //network.netstat();
+        network.ifconfig();
     }
 }

+ 63 - 25
common/src/main/java/cn/reghao/autodop/common/machine/Process.java

@@ -1,10 +1,16 @@
 package cn.reghao.autodop.common.machine;
 
-import cn.reghao.autodop.common.machine.pojo.ProcessInfo;
+import cn.reghao.autodop.common.machine.contant.ProcFile;
+import cn.reghao.autodop.common.machine.pojo.ProcessStat;
+import cn.reghao.autodop.common.utils.DateTimeUtil;
 import cn.reghao.autodop.common.utils.text.TextFile;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.regex.Pattern;
@@ -21,42 +27,53 @@ public class Process {
     private final Pattern pattern = Pattern.compile("[0-9]*");
     private TextFile textFile = new TextFile();
 
-    public void ps() {
-        long start = System.currentTimeMillis();
-        File procDir = new File("/proc");
-        List<ProcessInfo> infos = Arrays.stream(Objects.requireNonNull(procDir.listFiles()))
+    /**
+     * top 命令进程部分
+     *
+     * @param
+     * @return
+     * @date 2020-03-19 下午9:22
+     */
+    public List<ProcessStat> topProcess() {
+        File procDir = new File(ProcFile.PROC);
+        return Arrays.stream(Objects.requireNonNull(procDir.listFiles()))
                 .parallel()
                 .filter(file -> pattern.matcher(file.getName()).matches())
                 .map(File::getAbsolutePath)
-                .map(this::info)
+                .map(this::stat)
                 .collect(Collectors.toList());
-
-        log.info("costs {}ms", System.currentTimeMillis()-start);
-        log.info("");
     }
 
-    private ProcessInfo info(String filepath) {
-        ProcessInfo info = new ProcessInfo();
+    private ProcessStat stat(String filepath) {
+        ProcessStat info = new ProcessStat();
         try {
             String[] stat = textFile.readFile(filepath + "/stat").split(" ");
 
             info.setPid(Integer.parseInt(stat[0]));
             info.setName(stat[1].replace("(", "").replace(")", ""));
-            info.setState(stat[3]);
-            info.setPpid(Integer.parseInt(stat[4]));
-            info.setUtime(Long.parseLong(stat[14]));
-            info.setStime(Long.parseLong(stat[15]));
-            info.setCutime(Long.parseLong(stat[16]));
-            info.setCstime(Long.parseLong(stat[17]));
-            info.setPriority(Integer.parseInt(stat[18]));
-            info.setNice(Integer.parseInt(stat[19]));
-            info.setNumThreads(Integer.parseInt(stat[20]));
-            info.setStarttime(Long.parseLong(stat[22]));
-            info.setVsize(stat[23]);
-            info.setRss(stat[24]);
-            info.setRsslim(stat[25]);
+            info.setState(stat[2]);
+            info.setPpid(Integer.parseInt(stat[3]));
+            info.setUtime(Long.parseLong(stat[13]));
+            info.setStime(Long.parseLong(stat[14]));
+            info.setCutime(Long.parseLong(stat[15]));
+            info.setCstime(Long.parseLong(stat[16]));
+            info.setPriority(Integer.parseInt(stat[17]));
+            info.setNice(Integer.parseInt(stat[18]));
+            info.setNumThreads(Integer.parseInt(stat[19]));
+
+            /*long boottime = 1584244563000L;
+            long starttime = Long.parseLong(stat[21]);
+            info.setStartTime(DateTimeUtil.msTimestamp(boottime + starttime*100));*/
+
+            info.setVsize(stat[22]);
+            info.setRss(stat[23]);
+            info.setRsslim(stat[24]);
             info.setDatetime(LocalDateTime.now().toString());
 
+            String pidName = info.getPid() + "/" + info.getName();
+            for (File file : Objects.requireNonNull(new File(filepath + "/fd").listFiles())) {
+                socketInode(file, pidName);
+            }
             return info;
         } catch (Exception ignore) {
         }
@@ -64,7 +81,28 @@ public class Process {
         return null;
     }
 
+    private void socketInode(File file, String pidName) {
+        try {
+            Path path = Paths.get(file.getAbsolutePath());
+            if (!Files.isSymbolicLink(path)) {
+                return;
+            }
+
+            String filename = Files.readSymbolicLink(path).toString();
+            if (filename.startsWith("socket")) {
+                // socket:[27223]
+                long inode = Long.parseLong(filename.split(":")[1].replace("[", "").replace("]", ""));
+                ProcessStat.socketInodes.put(inode, pidName);
+            }
+        } catch (IOException ignore) {
+        }
+    }
+
     public static void main(String[] args) {
-        new Process().ps();
+        Process process = new Process();
+        long start = System.currentTimeMillis();
+        List<ProcessStat> processStats = process.topProcess();
+        log.info("costs -> {}ms", System.currentTimeMillis()-start);
+        log.info("");
     }
 }

+ 0 - 27
common/src/main/java/cn/reghao/autodop/common/machine/SysInfo.java

@@ -1,27 +0,0 @@
-package cn.reghao.autodop.common.machine;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 操作系统信息
- *
- * @author reghao
- * @date 2019-10-27 00:03:56
- */
-@Slf4j
-public class SysInfo {
-    public native String shell(String cmd);
-
-    static {
-        // Java 会自动加上前缀 lib 和后缀 so
-        System.loadLibrary("shell");
-    }
-
-    public static void main(String[] args) {
-        SysInfo info = new SysInfo();
-        String cmd = "ls -l";
-
-        String result = info.shell(cmd);
-        log.info("result -> {}", result);
-    }
-}

+ 23 - 0
common/src/main/java/cn/reghao/autodop/common/machine/contant/ProcFile.java

@@ -0,0 +1,23 @@
+package cn.reghao.autodop.common.machine.contant;
+
+/**
+ * /proc 文件系统中的文件路径
+ *
+ * @author reghao
+ * @date 2020-03-20 11:39:26
+ */
+public class ProcFile {
+    public static final String PROC = "/proc";
+
+    public static final String CPU_INFO = "/proc/cpuinfo";
+    public static final String CPU_STAT = "/proc/stat";
+
+    public static final String MEM_INFO = "/proc/meminfo";
+
+    public static final String DEV = "/proc/net/dev";
+    public static final String TCP = "/proc/net/tcp";
+    // TODO 暂不处理 IPv6
+    public static final String TCP6 = "/proc/net/tcp6";
+    public static final String UDP = "/proc/net/udp";
+    public static final String UNIX = "/proc/net/unix";
+}

+ 17 - 0
common/src/main/java/cn/reghao/autodop/common/machine/contant/ProcessState.java

@@ -0,0 +1,17 @@
+package cn.reghao.autodop.common.machine.contant;
+
+/**
+ * 进程状态
+ *
+ * @author reghao
+ * @date 2020-03-19 17:25:49
+ */
+public enum ProcessState {
+    Running(1);
+
+    private int code;
+
+    ProcessState(int code) {
+        this.code = code;
+    }
+}

+ 0 - 39
common/src/main/java/cn/reghao/autodop/common/machine/pojo/CpuInfo.java

@@ -1,39 +0,0 @@
-package cn.reghao.autodop.common.machine.pojo;
-
-import lombok.Data;
-
-/**
- * /proc/cpuinfo 文件内容
- *
- * @author reghao
- * @date 2019-10-28 21:18:13
- */
-@Data
-public class CpuInfo {
-    private int processor;
-    private String vendorId;
-    private int cpuFamily;
-    private int model;
-    private String modelName;
-    private int stepping;
-    private String microCode;
-    private double cpuMHz;
-    private String cacheSize;
-    private int physicalId;
-    private int siblings;
-    private int coreId;
-    private int cpuCores;
-    private int apicId;
-    private int initialApicId;
-    private String fpu;
-    private String fpuException;
-    private int cpuidLevel;
-    private String wp;
-    private String flag;
-    private String bugs;
-    private double bogomips;
-    private int clflushSize;
-    private int cacheAligment;
-    private String addressSizes;
-    private String powerManagement;
-}

+ 0 - 62
common/src/main/java/cn/reghao/autodop/common/machine/pojo/MemProfile.java

@@ -1,62 +0,0 @@
-package cn.reghao.autodop.common.machine.pojo;
-
-import lombok.Data;
-
-/**
- * 内存状态
- * /proc/meminfo 文件内容
- *
- * @author reghao
- * @date 2019-10-26 22:21:18
- */
-@Data
-public class MemProfile {
-    private long memTotal;
-    private long memFree;
-    private long memAvailable;
-    private long buffers;
-    private long cached;
-    private long swapCached;
-    private long active;
-    private long inactive;
-    private long activeAnon;
-    private long inactiveAnon;
-    private long activeFile;
-    private long inactiveFile;
-    private long unevictable;
-    private long mlocked;
-    private long swapTotal;
-    private long swapFree;
-    private long dirty;
-    private long writeback;
-    private long anonPages;
-    private long mapped;
-    private long shmem;
-    private long slab;
-    private long sReclaimable;
-    private long sUnreclaim;
-    private long kernelStack;
-    private long pageTables;
-    private long nfsUnstable;
-    private long bounce;
-    private long writebackTmp;
-    private long commitLimit;
-    private long commitAs;
-    private long vMallocTotal;
-    private long vMallocUsed;
-    private long vMallocChunk;
-    private long perCpu;
-    private long hardwareCorrupted;
-    private long annoHugePages;
-    private long shmemHugePages;
-    private long shmemPmdMapped;
-    private long hugePagesTotal;
-    private long hugePagesFree;
-    private long hugePagesRsvd;
-    private long hugePagesSurp;
-    private long hugePageSize;
-    private long hugeTlb;
-    private long directMap4k;
-    private long directMap2m;
-    private long directMap1g;
-}

+ 10 - 3
common/src/main/java/cn/reghao/autodop/common/machine/pojo/ProcessInfo.java → common/src/main/java/cn/reghao/autodop/common/machine/pojo/ProcessStat.java

@@ -2,14 +2,21 @@ package cn.reghao.autodop.common.machine.pojo;
 
 import lombok.Data;
 
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
- * 进程详细信息
+ * 进程状态
+ * /proc/{pid}/stat 文件内容
  *
  * @author reghao
  * @date 2019-10-25 10:21:34
  */
 @Data
-public class ProcessInfo {
+public class ProcessStat {
+    public static Map<Long, String> socketInodes = new HashMap<>();
+
     private int pid;
     private String name;
     private String state;
@@ -21,7 +28,7 @@ public class ProcessInfo {
     private int priority;
     private int nice;
     private int numThreads;
-    private long starttime;
+    private String startTime;
     private String vsize;
     private String rss;
     private String rsslim;

+ 21 - 0
common/src/main/java/cn/reghao/autodop/common/machine/pojo/SysStat.java

@@ -0,0 +1,21 @@
+package cn.reghao.autodop.common.machine.pojo;
+
+import cn.reghao.autodop.common.machine.pojo.cpu.CpuUsage;
+import cn.reghao.autodop.common.machine.pojo.mem.MemUsage;
+import cn.reghao.autodop.common.machine.pojo.net.NetConnStat;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2020-03-20 16:32:20
+ */
+@Data
+public class SysStat {
+    private String host;
+    private CpuUsage cpu;
+    private MemUsage mem;
+    private List<ProcessStat> processStats;
+    private List<NetConnStat> connStats;
+}

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/machine/pojo/CpuStat.java → common/src/main/java/cn/reghao/autodop/common/machine/pojo/cpu/CpuStat.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.machine.pojo;
+package cn.reghao.autodop.common.machine.pojo.cpu;
 
 import lombok.Data;
 

+ 2 - 1
common/src/main/java/cn/reghao/autodop/common/machine/pojo/CpuUsage.java → common/src/main/java/cn/reghao/autodop/common/machine/pojo/cpu/CpuUsage.java

@@ -1,9 +1,10 @@
-package cn.reghao.autodop.common.machine.pojo;
+package cn.reghao.autodop.common.machine.pojo.cpu;
 
 import lombok.Data;
 
 /**
  * CPU 使用率
+ * top 命令中的 CPU 数据
  *
  * @author reghao
  * @date 2020-03-19 10:01:03

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/machine/pojo/DiskStat.java → common/src/main/java/cn/reghao/autodop/common/machine/pojo/disk/DiskStat.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.machine.pojo;
+package cn.reghao.autodop.common.machine.pojo.disk;
 
 import lombok.Data;
 

+ 2 - 1
common/src/main/java/cn/reghao/autodop/common/machine/pojo/DiskUsage.java → common/src/main/java/cn/reghao/autodop/common/machine/pojo/disk/DiskUsage.java

@@ -1,9 +1,10 @@
-package cn.reghao.autodop.common.machine.pojo;
+package cn.reghao.autodop.common.machine.pojo.disk;
 
 import lombok.Data;
 
 /**
  * 磁盘使用率
+ * df -h 命令内容
  *
  * @author reghao
  * @date 2019-10-30 09:59:52

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/machine/pojo/MemStat.java → common/src/main/java/cn/reghao/autodop/common/machine/pojo/mem/MemStat.java

@@ -1,10 +1,10 @@
-package cn.reghao.autodop.common.machine.pojo;
+package cn.reghao.autodop.common.machine.pojo.mem;
 
 import lombok.Data;
 
 /**
  * 内存状态
- * /proc/meminfo 文件内容
+ * /proc/meminfo 文件部分内容
  *
  * @author reghao
  * @date 2019-10-26 22:21:18

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/machine/pojo/MemUsage.java → common/src/main/java/cn/reghao/autodop/common/machine/pojo/mem/MemUsage.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.machine.pojo;
+package cn.reghao.autodop.common.machine.pojo.mem;
 
 import lombok.Data;
 

+ 31 - 0
common/src/main/java/cn/reghao/autodop/common/machine/pojo/net/NetCardStat.java

@@ -0,0 +1,31 @@
+package cn.reghao.autodop.common.machine.pojo.net;
+
+import lombok.Data;
+
+/**
+ * 网络连接状态
+ * netstat 命令输出
+ *
+ * @author reghao
+ * @date 2019-10-25 08:55:25
+ */
+@Data
+public class NetCardStat {
+    private String iface;
+    private long recvBytes;
+    private long recvPackets;
+    private long recvErrs;
+    private long recvDrop;
+    private long recvFifo;
+    private long recvFrame;
+    private long recvCompressed;
+    private long recvMulticast;
+    private long sendBytes;
+    private long sendPackets;
+    private long sendErrs;
+    private long sendDrop;
+    private long sendFifo;
+    private long sendColls;
+    private long sendCarrier;
+    private long sendCompressed;
+}

+ 7 - 3
common/src/main/java/cn/reghao/autodop/common/machine/pojo/NetStat.java → common/src/main/java/cn/reghao/autodop/common/machine/pojo/net/NetConnStat.java

@@ -1,19 +1,23 @@
-package cn.reghao.autodop.common.machine.pojo;
+package cn.reghao.autodop.common.machine.pojo.net;
 
 import cn.reghao.autodop.common.machine.contant.TcpState;
 import lombok.Data;
 
 /**
- * netstat 命令输出
+ * 网卡状态
+ * ifconfg 命令输出
  *
  * @author reghao
  * @date 2019-10-25 08:55:25
  */
 @Data
-public class NetStat {
+public class NetConnStat {
     private String localAddr;
     private int localPort;
     private String remoteAddr;
     private int remotePort;
     private TcpState state;
+    private long sendq;
+    private long recvq;
+    private String process;
 }

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/machine/utils/CpuPercentageCalculator.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.common.machine.utils;
 
-import cn.reghao.autodop.common.machine.pojo.CpuStat;
-import cn.reghao.autodop.common.machine.pojo.CpuUsage;
+import cn.reghao.autodop.common.machine.pojo.cpu.CpuStat;
+import cn.reghao.autodop.common.machine.pojo.cpu.CpuUsage;
 
 /**
  * @author reghao

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/machine/utils/MemCalculator.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.common.machine.utils;
 
-import cn.reghao.autodop.common.machine.pojo.MemStat;
-import cn.reghao.autodop.common.machine.pojo.MemUsage;
+import cn.reghao.autodop.common.machine.pojo.mem.MemStat;
+import cn.reghao.autodop.common.machine.pojo.mem.MemUsage;
 
 /**
  * @author reghao

+ 24 - 0
common/src/main/java/cn/reghao/autodop/common/utils/DateTimeUtil.java

@@ -0,0 +1,24 @@
+package cn.reghao.autodop.common.utils;
+
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+/**
+ * @author reghao
+ * @date 2020-03-20 10:20:01
+ */
+public class DateTimeUtil {
+    /**
+     * ms 级时间戳转换为日期时间
+     *
+     * @param
+     * @return
+     * @date 2020-03-20 上午10:20
+     */
+    public static String msTimestamp(long timestamp) {
+        Instant instant = Instant.ofEpochMilli(timestamp);
+        ZonedDateTime dateTime = instant.atZone(ZoneId.of("Asia/Shanghai"));
+        return dateTime.toLocalDateTime().toString();
+    }
+}

+ 33 - 0
common/src/main/java/cn/reghao/autodop/common/utils/NetworkUtil.java

@@ -1,8 +1,12 @@
 package cn.reghao.autodop.common.utils;
 
+import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.List;
 
 /**
  * @author reghao
@@ -34,4 +38,33 @@ public class NetworkUtil {
 
         return null;
     }
+
+    /**
+     * 获取本机物理网卡 IPv4 地址(不获取 loopback 和虚拟接口的地址)
+     *
+     * @param
+     * @return
+     * @date 2019-10-23 下午9:27
+     */
+    public static List<String> ipv4() throws SocketException {
+        List<String> addresses = new ArrayList<>();
+
+        Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
+        while (interfaces.hasMoreElements()) {
+            NetworkInterface iface = (NetworkInterface) interfaces.nextElement();
+
+            Enumeration<InetAddress> inetAddrs = iface.getInetAddresses();
+            while (inetAddrs.hasMoreElements()) {
+                InetAddress address = inetAddrs.nextElement();
+                if (address instanceof Inet4Address && !address.isLoopbackAddress()) {
+                    String addr = address.getHostAddress();
+                    if (addr.contains("192.168") || addr.contains("172.16")) {
+                        addresses.add(addr);
+                    }
+                }
+            }
+        }
+
+        return addresses;
+    }
 }

+ 36 - 0
common/src/main/java/cn/reghao/autodop/common/utils/StringUtil.java

@@ -0,0 +1,36 @@
+package cn.reghao.autodop.common.utils;
+
+/**
+ * @author reghao
+ * @date 2020-03-20 11:32:17
+ */
+public class StringUtil {
+    /**
+     * 格式化以空白符分隔的字段,行首和行尾不包含空白符
+     *
+     * @param
+     * @return
+     * @date 2020-03-20 上午11:13
+     */
+    public static String format(String str) {
+        StringBuilder sb = new StringBuilder();
+        char[] chars = str.toCharArray();
+        for (int i = firstNonWhiteSpaceIndex(chars); i < chars.length; i++) {
+            if (chars[i] != 32 || chars[i-1] != 32) {
+                sb.append(chars[i]);
+            }
+        }
+
+        return sb.toString();
+    }
+
+    private static int firstNonWhiteSpaceIndex(char[] chars) {
+        for (int i = 0; i < chars.length; i++) {
+            if (chars[i] != 32) {
+                return i;
+            }
+        }
+
+        return chars.length;
+    }
+}

+ 2 - 0
dagent/src/main/java/cn/reghao/autodop/dagent/DagentApplication.java

@@ -3,7 +3,9 @@ package cn.reghao.autodop.dagent;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
+@EnableScheduling
 @ComponentScan({"cn.reghao.autodop.common.grpc", "cn.reghao.autodop.dagent"})
 @SpringBootApplication
 public class DagentApplication {

+ 61 - 0
dagent/src/main/java/cn/reghao/autodop/dagent/service/MachineStatusScheduler.java

@@ -0,0 +1,61 @@
+package cn.reghao.autodop.dagent.service;
+
+import cn.reghao.autodop.common.http.DefaultWebRequest;
+import cn.reghao.autodop.common.http.HttpApi;
+import cn.reghao.autodop.common.http.WebRequest;
+import cn.reghao.autodop.common.machine.Cpu;
+import cn.reghao.autodop.common.machine.Memory;
+import cn.reghao.autodop.common.machine.Network;
+import cn.reghao.autodop.common.machine.Process;
+import cn.reghao.autodop.common.machine.pojo.ProcessStat;
+import cn.reghao.autodop.common.machine.pojo.SysStat;
+import cn.reghao.autodop.common.machine.pojo.cpu.CpuUsage;
+import cn.reghao.autodop.common.machine.pojo.mem.MemUsage;
+import cn.reghao.autodop.common.machine.pojo.net.NetConnStat;
+import cn.reghao.autodop.common.utils.JsonUtil;
+import cn.reghao.autodop.common.utils.NetworkUtil;
+import cn.reghao.autodop.dagent.config.DmasterProperties;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2020-03-20 17:04:48
+ */
+@Component
+public class MachineStatusScheduler {
+    private DmasterProperties properties;
+    private Cpu cpu;
+    private Memory mem;
+    private Process proc;
+    private Network net;
+
+    public MachineStatusScheduler(DmasterProperties properties) {
+        this.properties = properties;
+        this.cpu = new Cpu();
+        this.mem = new Memory();
+        this.proc = new Process();
+        this.net = new Network();
+    }
+
+    @Scheduled(fixedRate = 3_000)
+    public void status() throws Exception {
+        CpuUsage cpuUsage = cpu.topCpu(1_000);
+        MemUsage memUsage = mem.free();
+        List<ProcessStat> processes = proc.topProcess();
+        List<NetConnStat> connStats = net.netstat();
+
+        SysStat sysStat = new SysStat();
+        sysStat.setHost(NetworkUtil.hostAddress("192.168"));
+        sysStat.setCpu(cpuUsage);
+        sysStat.setMem(memUsage);
+        sysStat.setProcessStats(processes);
+        sysStat.setConnStats(connStats);
+
+        WebRequest request = new DefaultWebRequest();
+        String url = HttpApi.url(properties.getAddress(), properties.getPort(), properties.getApi());
+        request.postJson(url, JsonUtil.objectToJson(sysStat));
+    }
+}

+ 1 - 1
dagent/src/main/resources/application-dev.yml

@@ -1,4 +1,4 @@
 dmaster:
   address: localhost
   port: 4000
-  api: /api/node
+  api: /api/machine/status

+ 1 - 1
dagent/src/main/resources/application-prod.yml

@@ -1,4 +1,4 @@
 dmaster:
   address: 192.168.0.50
   port: 4000
-  api: /api/node
+  api: /api/machine/status

+ 1 - 1
dagent/src/main/resources/application-test.yml

@@ -1,4 +1,4 @@
 dmaster:
   address: 192.168.0.50
   port: 4000
-  api: /api/node
+  api: /api/machine/status

+ 5 - 0
dmaster/pom.xml

@@ -80,6 +80,11 @@
             <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
 
+        <!--<dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-mongodb</artifactId>
+        </dependency>-->
+
         <!--<dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-thymeleaf</artifactId>

+ 35 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/MachineController.java

@@ -0,0 +1,35 @@
+package cn.reghao.autodop.dmaster.machine;
+
+import cn.reghao.autodop.common.machine.pojo.SysStat;
+import cn.reghao.autodop.dmaster.result.WebResult;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2019-11-15 08:44:50
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/machine")
+public class MachineController {
+    private SysStatService sysStatService;
+
+    public MachineController(SysStatService sysStatService) {
+        this.sysStatService = sysStatService;
+    }
+
+    @ApiOperation(value = "")
+    @PostMapping("/status")
+    public String add(@RequestBody String json) {
+        sysStatService.extract(json);
+        return "ok";
+    }
+
+    @ApiOperation(value = "")
+    @GetMapping("/status")
+    public String get() {
+        return new WebResult<SysStat>().jsonResult(sysStatService.get());
+    }
+}

+ 0 - 24
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/NodeController.java

@@ -1,24 +0,0 @@
-package cn.reghao.autodop.dmaster.machine;
-
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author reghao
- * @date 2019-11-15 08:44:50
- */
-@Slf4j
-@RestController
-@RequestMapping("/api/node")
-public class NodeController {
-    @ApiOperation(value = "")
-    @PostMapping("/status/send")
-    public String info() {
-        return null;
-    }
-}

+ 0 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/NodeManager.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.dmaster.machine;
-
-import org.springframework.stereotype.Service;
-
-/**
- * @author reghao
- * @date 2019-11-15 08:48:04
- */
-@Service
-public class NodeManager {
-}

+ 26 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/SysStatService.java

@@ -0,0 +1,26 @@
+package cn.reghao.autodop.dmaster.machine;
+
+import cn.reghao.autodop.common.machine.pojo.SysStat;
+import cn.reghao.autodop.common.utils.JsonUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.Queue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * @author reghao
+ * @date 2019-11-15 08:48:04
+ */
+@Service
+public class SysStatService {
+    private Queue<SysStat> queue = new LinkedBlockingQueue<>();
+
+    public void extract(String json) {
+        SysStat sysStat = (SysStat) JsonUtil.jsonToObject(json, SysStat.class);
+        queue.add(sysStat);
+    }
+
+    public SysStat get() {
+        return queue.poll();
+    }
+}

+ 2 - 0
dmaster/src/main/resources/application-dev.yml

@@ -3,6 +3,8 @@ spring:
     url: jdbc:mysql://localhost:3306/reghao_autodop_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
     username: reghao
     password: 12345678
+#  data:
+#    mongodb:uri: mongodb://localhost:27017/test
 sysconfig:
   localRepos: /home/reghao/tmp/autodop/opt/data/local-repos
   compileDir: /home/reghao/tmp/autodop/opt/data/compile-dir