You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/05/16 16:20:47 UTC

[iotdb] branch master updated: [IOTDB-2963] metrics of process and hardware (#5406)

This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 719a77ac5e [IOTDB-2963] metrics of process and hardware (#5406)
719a77ac5e is described below

commit 719a77ac5e1794c653479ee1dde72aa57c267007
Author: ljn55966005 <32...@users.noreply.github.com>
AuthorDate: Tue May 17 00:20:40 2022 +0800

    [IOTDB-2963] metrics of process and hardware (#5406)
    
    Co-authored-by: Erickin <95...@qq.com>
    Co-authored-by: zhengqiang-cisdi <lo...@qq.com>
---
 docs/UserGuide/Maintenance-Tools/Metric-Tool.md    |  41 +++++-
 docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md |  42 +++++-
 .../iotdb/metrics/DoNothingMetricService.java      |  10 ++
 .../org/apache/iotdb/metrics/MetricService.java    |  13 ++
 .../apache/iotdb/db/service/metrics/Metric.java    |  20 ++-
 .../iotdb/db/service/metrics/MetricsService.java   |  19 +++
 .../db/service/metrics/ProcessMetricsMonitor.java  | 148 +++++++++++++++++++++
 .../db/service/metrics/SysRunMetricsMonitor.java   | 134 +++++++++++++++++++
 8 files changed, 417 insertions(+), 10 deletions(-)

diff --git a/docs/UserGuide/Maintenance-Tools/Metric-Tool.md b/docs/UserGuide/Maintenance-Tools/Metric-Tool.md
index 8d33608802..35b44de4b6 100644
--- a/docs/UserGuide/Maintenance-Tools/Metric-Tool.md
+++ b/docs/UserGuide/Maintenance-Tools/Metric-Tool.md
@@ -111,25 +111,58 @@ Next, we will choose Prometheus format data as samples to describe each kind of
 | cost_task_seconds_sum   | name="compaction"                                                       | important   | The total cost seconds of all compaction tasks till now             | cost_task_seconds_sum{name="compaction",} 0.363               |
 | data_written            | name="compaction", <br />type="aligned/not-aligned/total"               | important   | The size of data written in compaction                              | data_written{name="compaction",type="total",} 10240           |
 | data_read               | name="compaction"                                                       | important   | The size of data read in compaction                                 | data_read={name="compaction",} 10240                          |
-#### 4.3.5. Memory Usage
+#### 4.3.5. CPU
+
+| Metric           | Tag        | level | 说明                                 | 示例                                         |
+| ---------------- | ---------- | ----- | ------------------------------------ | -------------------------------------------- |
+| process_cpu_load | name="cpu" | core  | current process CPU Usage (%)        | process_cpu_load{name="process",} 5.0        |
+| process_cpu_time | name="cpu" | core  | total Process CPU Time Occupied (ns) | process_cpu_time{name="process",} 3.265625E9 |
+| sys_cpu_load     | name="cpu" | core  | current system CPU Usage(%)          | sys_cpu_load{name="system",} 15.0            |
+| sys_cpu_cores    | name="cpu" | core  | available CPU cores                  | sys_cpu_cores{name="system",} 16.0           |
+
+#### 4.3.6. Memory Usage
 
 | Metric | Tag                                     | level  | Description                                                           | Sample                            |
 | ------ | --------------------------------------- | ------ | --------------------------------------------------------------------- | --------------------------------- |
 | mem    | name="chunkMetaData/storageGroup/mtree" | important | Current memory size of chunkMetaData/storageGroup/mtree data in bytes | mem{name="chunkMetaData",} 2050.0 |
+| process_max_mem | name="memory"                           | core      | The maximum available memory for the JVM                     | process_max_mem{name="process",} 3.545759744E9               |
+| process_used_mem               | name="memory"                           | core      | The current available memory for the JVM                     | process_used_mem{name="process",} 4.6065456E7                |
+| process_total_mem              | name="memory"                           | core      | The current requested memory for the JVM                     | process_total_mem{name="process",} 2.39599616E8              |
+| process_free_mem               | name="memory"                           | core      | The free available memory for the JVM                        | process_free_mem{name="process",} 1.94035584E8               |
+| process_mem_ratio              | name="memory"                           | core      | Memory footprint ratio of process                            | process_mem_ratio{name="process",} 0.0                       |
+| sys_total_physical_memory_size | name="memory"                           | core      | Maximum physical memory of system                            | sys_total_physical_memory_size{name="system",} 1.5950999552E10 |
+| sys_free_physical_memory_size  | name="memory"                           | core      | The current available memory of system                       | sys_free_physical_memory_size{name="system",} 4.532396032E9  |
+| sys_total_swap_space_size      | name="memory"                           | core      | The maximum swap area of system                              | sys_total_swap_space_size{name="system",} 2.1051273216E10    |
+| sys_free_swap_space_size       | name="memory"                           | core      | The available swap area of system | sys_free_swap_space_size{name="system",} 2.931576832E9 |
+| sys_committed_vm_size | name="memory" | important | the amount of virtual memory available to running processes | sys_committed_vm_size{name="system",} 5.04344576E8 |
+
+#### 4.3.7 Process Status
+
+| Metric                | Tag            | level | 说明                                                         | 示例                                        |
+| --------------------- | -------------- | ----- | ------------------------------------------------------------ | ------------------------------------------- |
+| process_threads_count | name="process" | core  | The current number of threads                                | process_threads_count{name="process",} 11.0 |
+| process_status        | name="process" | core  | The process survivor status, 1.0 means survivorship, and 0.0 means terminated | process_status{name="process",} 1.0         |
+
+#### 4.3.8. 磁盘
+
+| Metric               | Tag         | level | 说明                      | 示例                                                  |
+| -------------------- | ----------- | ----- | ------------------------- | ----------------------------------------------------- |
+| sys_disk_total_space | name="disk" | core  | The total disk space      | sys_disk_total_space{name="system",} 5.10770798592E11 |
+| sys_disk_free_space  | name="disk" | core  | The available  disk space | sys_disk_free_space{name="system",} 3.63467845632E11  |
 
-#### 4.3.6. Cache Hit Ratio
+#### 4.3.9. Cache Hit Ratio
 
 | Metric    | Tag                                     | level  | Description                                                                   | Sample                      |
 | --------- | --------------------------------------- | ------ | ----------------------------------------------------------------------------- | --------------------------- |
 | cache_hit | name="chunk/timeSeriesMeta/bloomFilter" | important | Cache hit ratio of chunk/timeSeriesMeta  and prevention ratio of bloom filter | cache_hit{name="chunk",} 80 |
 
-#### 4.3.7. Business Data
+#### 4.3.19. Business Data
 
 | Metric   | Tag                                   | level  | Description                                                   | Sample                           |
 | -------- | ------------------------------------- | ------ | ------------------------------------------------------------- | -------------------------------- |
 | quantity | name="timeSeries/storageGroup/device" | important | The current count of timeSeries/storageGroup/devices in IoTDB | quantity{name="timeSeries",} 1.0 |
 
-#### 4.3.8. Cluster
+#### 4.3.11. Cluster
 
 | Metric                    | Tag                             | level  | Description                                                                                  | Sample                                                                       |
 | ------------------------- | ------------------------------- | ------ | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
diff --git a/docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md b/docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md
index 1e989a113a..d627867c61 100644
--- a/docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md
+++ b/docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md
@@ -110,25 +110,57 @@ IoTDB对外提供JMX和Prometheus格式的监控指标,对于JMX,可以通
 | data_written            | name="compaction", <br />type="aligned/not-aligned/total"               | important          | 合并文件时写入量                  | data_written{name="compaction",type="total",} 10240  |
 | data_read               | name="compaction"                                                       | important          | 合并文件时的读取量                 | data_read={name="compaction",} 10240                 |
 
-#### 4.3.5. 内存占用
+#### 4.3.5. CPU
+| Metric | Tag                                     | level | 说明                                              | 示例                              |
+| ------ | --------------------------------------- | ------ | -------------------------------------------------- | --------------------------------- |
+| process_cpu_load | name="cpu" | core | process当前CPU占用率(%) | process_cpu_load{name="process",} 5.0 |
+| process_cpu_time | name="cpu" | core | process累计占用CPU时间(ns) | process_cpu_time{name="process",} 3.265625E9 |
+| sys_cpu_load | name="cpu" | core | system当前CPU占用率(%) | sys_cpu_load{name="system",} 15.0 |
+| sys_cpu_cores | name="cpu" | core | jvm可用处理器数 | sys_cpu_cores{name="system",} 16.0 |
+
+#### 4.3.6. 内存占用
 
-| Metric | Tag                                     | 说明   | level                                              | 示例                              |
+| Metric | Tag                                     | level | 说明                                              | 示例                              |
 | ------ | --------------------------------------- | ------ | -------------------------------------------------- | --------------------------------- |
 | mem    | name="chunkMetaData/storageGroup/mtree" | important | chunkMetaData/storageGroup/mtree占用的内存(byte) | mem{name="chunkMetaData",} 2050.0 |
+| process_max_mem | name="memory" | core | JVM最大可用内存 | process_max_mem{name="process",} 3.545759744E9 |
+| process_used_mem | name="memory" | core | JVM当前使用内存 | process_used_mem{name="process",} 4.6065456E7 |
+| process_total_mem | name="memory" | core | JVM当前已申请内存 | process_total_mem{name="process",} 2.39599616E8 |
+| process_free_mem | name="memory" | core      | JVM当前剩余可用内存 | process_free_mem{name="process",} 1.94035584E8 |
+| process_mem_ratio | name="memory" | core      | 进程的内存占用比例 | process_mem_ratio{name="process",} 0.0 |
+| sys_total_physical_memory_size | name="memory" | core | system最大物理内存 | sys_total_physical_memory_size{name="system",} 1.5950999552E10 |
+| sys_free_physical_memory_size | name="memory" | core | system当前剩余可用内存 | sys_free_physical_memory_size{name="system",} 4.532396032E9 |
+| sys_total_swap_space_size | name="memory" | core | system交换区最大空间 | sys_total_swap_space_size{name="system",} 2.1051273216E10 |
+| sys_free_swap_space_size | name="memory" | core | system交换区剩余可用空间 | sys_free_swap_space_size{name="system",} 2.931576832E9 |
+| sys_committed_vm_size | name="memory" | important | system保证可用于正在运行的进程的虚拟内存量 | sys_committed_vm_size{name="system",} 5.04344576E8 |
+
+#### 4.3.7. 进程状态
+
+| Metric                | Tag            | level | 说明                               | 示例                                        |
+| --------------------- | -------------- | ----- | ---------------------------------- | ------------------------------------------- |
+| process_threads_count | name="process" | core  | 当前线程数                         | process_threads_count{name="process",} 11.0 |
+| process_status        | name="process" | core  | 进程存活状态,1.0为存活,0.0为终止 | process_status{name="process",} 1.0         |
+
+#### 4.3.8. 磁盘
+
+| Metric               | Tag         | level | 说明         | 示例                                                  |
+| -------------------- | ----------- | ----- | ------------ | ----------------------------------------------------- |
+| sys_disk_total_space | name="disk" | core  | 磁盘总大小   | sys_disk_total_space{name="system",} 5.10770798592E11 |
+| sys_disk_free_space  | name="disk" | core  | 磁盘可用大小 | sys_disk_free_space{name="system",} 3.63467845632E11  |
 
-#### 4.3.6. 缓存命中率
+#### 4.3.9. 缓存命中率
 
 | Metric    | Tag                                     | level  | 说明                                             | 示例                        |
 | --------- | --------------------------------------- | ------ | ------------------------------------------------ | --------------------------- |
 | cache_hit | name="chunk/timeSeriesMeta/bloomFilter" | important | chunk/timeSeriesMeta缓存命中率,bloomFilter拦截率 | cache_hit{name="chunk",} 80 |
 
-#### 4.3.7. 业务数据
+#### 4.3.10. 业务数据
 
 | Metric   | Tag                                   | level  | 说明                                         | 示例                             |
 | -------- | ------------------------------------- | ------ | -------------------------------------------- | -------------------------------- |
 | quantity | name="timeSeries/storageGroup/device" | important | 当前时间timeSeries/storageGroup/device的数量 | quantity{name="timeSeries",} 1.0 |
 
-#### 4.3.8. 集群
+#### 4.3.11. 集群
 
 | Metric                    | Tag                             | level  | 说明                                                          | 示例                                                                         |
 | ------------------------- | ------------------------------- | ------ | ------------------------------------------------------------- | ---------------------------------------------------------------------------- |
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/DoNothingMetricService.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/DoNothingMetricService.java
index 4a53111955..b996b8e5ed 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/DoNothingMetricService.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/DoNothingMetricService.java
@@ -27,6 +27,16 @@ public class DoNothingMetricService extends MetricService {
     // do nothing
   }
 
+  @Override
+  protected void collectProcessInfo() {
+    // do nothing
+  }
+
+  @Override
+  protected void collectSystemInfo() {
+    // do nothing
+  }
+
   @Override
   protected void reloadProperties(ReloadLevel reloadLevel) {
     // do nothing
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricService.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricService.java
index e69f55ff00..10867edb59 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricService.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/MetricService.java
@@ -61,6 +61,7 @@ public abstract class MetricService {
     // do some init work
     metricManager.init();
     // do start all reporter without first time
+
     if (!firstInit.getAndSet(false)) {
       startAllReporter();
     }
@@ -72,6 +73,12 @@ public abstract class MetricService {
     logger.info("Start metric at level: " + metricConfig.getMetricLevel().name());
 
     collectFileSystemInfo();
+
+    // Collect process monitoring information
+    collectProcessInfo();
+
+    // Collect system monitoring information
+    collectSystemInfo();
   }
 
   /** Stop metric service. if is disabled, do nothing */
@@ -156,6 +163,12 @@ public abstract class MetricService {
   /** collect file system info in metric way */
   protected abstract void collectFileSystemInfo();
 
+  /** collect process info in metric way */
+  protected abstract void collectProcessInfo();
+
+  /** collect system hardware info in metric way */
+  protected abstract void collectSystemInfo();
+
   /**
    * support hot load of some properties
    *
diff --git a/server/src/main/java/org/apache/iotdb/db/service/metrics/Metric.java b/server/src/main/java/org/apache/iotdb/db/service/metrics/Metric.java
index dd545e7963..ca6b16844f 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/metrics/Metric.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/metrics/Metric.java
@@ -35,7 +35,25 @@ public enum Metric {
   CLUSTER_NODE_STATUS,
   CLUSTER_NODE_LEADER_COUNT,
   CLUSTER_ELECT,
-  CLUSTER_UNCOMMITTED_LOG;
+  CLUSTER_UNCOMMITTED_LOG,
+  PROCESS_CPU_LOAD,
+  PROCESS_CPU_TIME,
+  PROCESS_MAX_MEM,
+  PROCESS_USED_MEM,
+  PROCESS_TOTAL_MEM,
+  PROCESS_FREE_MEM,
+  PROCESS_THREADS_COUNT,
+  PROCESS_MEM_RATIO,
+  PROCESS_STATUS,
+  SYS_CPU_LOAD,
+  SYS_CPU_CORES,
+  SYS_TOTAL_PHYSICAL_MEMORY_SIZE,
+  SYS_FREE_PHYSICAL_MEMORY_SIZE,
+  SYS_TOTAL_SWAP_SPACE_SIZE,
+  SYS_FREE_SWAP_SPACE_SIZE,
+  SYS_COMMITTED_VM_SIZE,
+  SYS_DISK_TOTAL_SPACE,
+  SYS_DISK_FREE_SPACE;
 
   @Override
   public String toString() {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/metrics/MetricsService.java b/server/src/main/java/org/apache/iotdb/db/service/metrics/MetricsService.java
index 88d0cc2208..2e8579e568 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/metrics/MetricsService.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/metrics/MetricsService.java
@@ -173,6 +173,25 @@ public class MetricsService extends MetricService implements MetricsServiceMBean
         "unseq");
   }
 
+  @Override
+  protected void collectProcessInfo() {
+    logger.info("start collecting information of metric service's process");
+    ProcessMetricsMonitor processMetricsMonitor = ProcessMetricsMonitor.getInstance();
+    processMetricsMonitor.collectProcessCPUInfo();
+    processMetricsMonitor.collectProcessMemInfo();
+    processMetricsMonitor.collectThreadInfo();
+    processMetricsMonitor.collectProcessStatusInfo();
+  }
+
+  @Override
+  protected void collectSystemInfo() {
+    logger.info("start collecting information of system hardware");
+    SysRunMetricsMonitor sysRunMetricsMonitor = SysRunMetricsMonitor.getInstance();
+    sysRunMetricsMonitor.collectSystemCpuInfo();
+    sysRunMetricsMonitor.collectSystemMEMInfo();
+    sysRunMetricsMonitor.collectSystemDiskInfo();
+  }
+
   @Override
   public void reloadProperties(ReloadLevel reloadLevel) {
     logger.info("Reload properties of metric service");
diff --git a/server/src/main/java/org/apache/iotdb/db/service/metrics/ProcessMetricsMonitor.java b/server/src/main/java/org/apache/iotdb/db/service/metrics/ProcessMetricsMonitor.java
new file mode 100644
index 0000000000..3e91f605b0
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/service/metrics/ProcessMetricsMonitor.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.service.metrics;
+
+import org.apache.iotdb.metrics.MetricManager;
+import org.apache.iotdb.metrics.utils.MetricLevel;
+
+import com.sun.management.OperatingSystemMXBean;
+
+import java.lang.management.ManagementFactory;
+
+public class ProcessMetricsMonitor {
+
+  private MetricManager metricManager = MetricsService.getInstance().getMetricManager();
+  private OperatingSystemMXBean sunOsMXBean;
+  private Runtime runtime;
+
+  public void collectProcessCPUInfo() {
+    metricManager.getOrCreateAutoGauge(
+        Metric.PROCESS_CPU_LOAD.toString(),
+        MetricLevel.CORE,
+        sunOsMXBean,
+        a -> (long) (sunOsMXBean.getProcessCpuLoad() * 100),
+        Tag.NAME.toString(),
+        "process");
+
+    metricManager.getOrCreateAutoGauge(
+        Metric.PROCESS_CPU_TIME.toString(),
+        MetricLevel.CORE,
+        sunOsMXBean,
+        com.sun.management.OperatingSystemMXBean::getProcessCpuTime,
+        Tag.NAME.toString(),
+        "process");
+  }
+
+  public void collectProcessMemInfo() {
+    Runtime runtime = Runtime.getRuntime();
+    metricManager.getOrCreateAutoGauge(
+        Metric.PROCESS_MAX_MEM.toString(),
+        MetricLevel.CORE,
+        runtime,
+        a -> runtime.maxMemory(),
+        Tag.NAME.toString(),
+        "process");
+    metricManager.getOrCreateAutoGauge(
+        Metric.PROCESS_TOTAL_MEM.toString(),
+        MetricLevel.CORE,
+        runtime,
+        a -> runtime.totalMemory(),
+        Tag.NAME.toString(),
+        "process");
+    metricManager.getOrCreateAutoGauge(
+        Metric.PROCESS_FREE_MEM.toString(),
+        MetricLevel.CORE,
+        runtime,
+        a -> runtime.freeMemory(),
+        Tag.NAME.toString(),
+        "process");
+    metricManager.getOrCreateAutoGauge(
+        Metric.PROCESS_USED_MEM.toString(),
+        MetricLevel.CORE,
+        this,
+        a -> getProcessUsedMemory(),
+        Tag.NAME.toString(),
+        "process");
+    metricManager.getOrCreateAutoGauge(
+        Metric.PROCESS_MEM_RATIO.toString(),
+        MetricLevel.CORE,
+        this,
+        a -> Math.round(getProcessMemoryRatio()),
+        Tag.NAME.toString(),
+        "process");
+  }
+
+  public void collectThreadInfo() {
+    metricManager.getOrCreateAutoGauge(
+        Metric.PROCESS_THREADS_COUNT.toString(),
+        MetricLevel.CORE,
+        this,
+        a -> getThreadsCount(),
+        Tag.NAME.toString(),
+        "process");
+  }
+
+  public void collectProcessStatusInfo() {
+    metricManager.getOrCreateAutoGauge(
+        Metric.PROCESS_STATUS.toString(),
+        MetricLevel.CORE,
+        this,
+        a -> (getProcessStatus()),
+        Tag.NAME.toString(),
+        "process");
+  }
+
+  private ProcessMetricsMonitor() {
+    sunOsMXBean =
+        (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
+    runtime = Runtime.getRuntime();
+  }
+
+  private long getProcessUsedMemory() {
+    return runtime.totalMemory() - runtime.freeMemory();
+  }
+
+  private long getProcessStatus() {
+    return Thread.currentThread().isAlive() ? 1 : 0;
+  }
+
+  private int getThreadsCount() {
+    ThreadGroup parentThread;
+    for (parentThread = Thread.currentThread().getThreadGroup();
+        parentThread.getParent() != null;
+        parentThread = parentThread.getParent()) {}
+
+    return parentThread.activeCount();
+  }
+
+  private double getProcessMemoryRatio() {
+    long processUsedMemory = getProcessUsedMemory();
+    long totalPhysicalMemorySize = sunOsMXBean.getTotalPhysicalMemorySize();
+    return (double) processUsedMemory / (double) totalPhysicalMemorySize * 100;
+  }
+
+  public static ProcessMetricsMonitor getInstance() {
+    return ThreadMetricsMonitorHolder.INSTANCE;
+  }
+
+  private static class ThreadMetricsMonitorHolder {
+    private static final ProcessMetricsMonitor INSTANCE = new ProcessMetricsMonitor();
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/service/metrics/SysRunMetricsMonitor.java b/server/src/main/java/org/apache/iotdb/db/service/metrics/SysRunMetricsMonitor.java
new file mode 100644
index 0000000000..e7ccea7450
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/service/metrics/SysRunMetricsMonitor.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.service.metrics;
+
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.metrics.MetricManager;
+import org.apache.iotdb.metrics.utils.MetricLevel;
+
+import com.sun.management.OperatingSystemMXBean;
+
+import java.io.File;
+import java.lang.management.ManagementFactory;
+
+public class SysRunMetricsMonitor {
+  private MetricManager metricManager = MetricsService.getInstance().getMetricManager();
+  private com.sun.management.OperatingSystemMXBean osMXBean;
+
+  private SysRunMetricsMonitor() {
+    osMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
+  }
+
+  public void collectSystemCpuInfo() {
+    metricManager.getOrCreateAutoGauge(
+        Metric.SYS_CPU_LOAD.toString(),
+        MetricLevel.CORE,
+        osMXBean,
+        a -> (long) (osMXBean.getSystemCpuLoad() * 100),
+        Tag.NAME.toString(),
+        "system");
+
+    metricManager
+        .getOrCreateGauge(
+            Metric.SYS_CPU_CORES.toString(), MetricLevel.IMPORTANT, Tag.NAME.toString(), "system")
+        .set(osMXBean.getAvailableProcessors());
+  }
+
+  public void collectSystemMEMInfo() {
+    metricManager
+        .getOrCreateGauge(
+            Metric.SYS_TOTAL_PHYSICAL_MEMORY_SIZE.toString(),
+            MetricLevel.CORE,
+            Tag.NAME.toString(),
+            "system")
+        .set(osMXBean.getTotalPhysicalMemorySize());
+    metricManager.getOrCreateAutoGauge(
+        Metric.SYS_FREE_PHYSICAL_MEMORY_SIZE.toString(),
+        MetricLevel.CORE,
+        osMXBean,
+        a -> osMXBean.getFreePhysicalMemorySize(),
+        Tag.NAME.toString(),
+        "system");
+    metricManager.getOrCreateAutoGauge(
+        Metric.SYS_TOTAL_SWAP_SPACE_SIZE.toString(),
+        MetricLevel.CORE,
+        osMXBean,
+        a -> osMXBean.getTotalSwapSpaceSize(),
+        Tag.NAME.toString(),
+        "system");
+    metricManager.getOrCreateAutoGauge(
+        Metric.SYS_FREE_SWAP_SPACE_SIZE.toString(),
+        MetricLevel.CORE,
+        osMXBean,
+        a -> osMXBean.getFreeSwapSpaceSize(),
+        Tag.NAME.toString(),
+        "system");
+    metricManager.getOrCreateAutoGauge(
+        Metric.SYS_COMMITTED_VM_SIZE.toString(),
+        MetricLevel.CORE,
+        osMXBean,
+        a -> osMXBean.getCommittedVirtualMemorySize(),
+        Tag.NAME.toString(),
+        "system");
+  }
+
+  public void collectSystemDiskInfo() {
+    metricManager.getOrCreateAutoGauge(
+        Metric.SYS_DISK_TOTAL_SPACE.toString(),
+        MetricLevel.CORE,
+        this,
+        a -> getSysDiskTotalSpace(),
+        Tag.NAME.toString(),
+        "system");
+    metricManager.getOrCreateAutoGauge(
+        Metric.SYS_DISK_FREE_SPACE.toString(),
+        MetricLevel.CORE,
+        this,
+        a -> getSysDickFreeSpace(),
+        Tag.NAME.toString(),
+        "system");
+    String[] dataDirs = IoTDBDescriptor.getInstance().getConfig().getDataDirs();
+  }
+
+  private long getSysDiskTotalSpace() {
+    File[] files = File.listRoots();
+    long sysTotalSpace = 0L;
+    for (File file : files) {
+      sysTotalSpace += file.getTotalSpace();
+    }
+    return sysTotalSpace;
+  }
+
+  private long getSysDickFreeSpace() {
+    File[] files = File.listRoots();
+    long sysFreeSpace = 0L;
+    for (File file : files) {
+      sysFreeSpace += file.getFreeSpace();
+    }
+    return sysFreeSpace;
+  }
+
+  public static SysRunMetricsMonitor getInstance() {
+    return SysRunMetricsMonitor.SysRunMetricsMonitorHolder.INSTANCE;
+  }
+
+  private static class SysRunMetricsMonitorHolder {
+    private static final SysRunMetricsMonitor INSTANCE = new SysRunMetricsMonitor();
+  }
+}