You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ma...@apache.org on 2023/04/10 06:01:57 UTC

[iotdb] branch cpu-monitor updated: temp

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

marklau99 pushed a commit to branch cpu-monitor
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/cpu-monitor by this push:
     new ab9809db8b temp
ab9809db8b is described below

commit ab9809db8b459fe6d7c7a420f586ee0491c982bf
Author: Liu Xuxin <li...@outlook.com>
AuthorDate: Mon Apr 10 13:02:28 2023 +0800

    temp
---
 .../metricsets/cpu/AbstractCpuMetricsManager.java  | 63 ++++++++++++++++++++++
 .../iotdb/metrics/metricsets/cpu/CpuMetrics.java   | 18 +++----
 .../metrics/metricsets/cpu/CpuMetricsConstant.java | 48 +++++++++++++++++
 .../metrics/metricsets/cpu/ICpuMetricsManager.java | 33 ------------
 .../metricsets/cpu/LinuxCpuMetricsManager.java     | 47 ++++++++++++----
 5 files changed, 156 insertions(+), 53 deletions(-)

diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/AbstractCpuMetricsManager.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/AbstractCpuMetricsManager.java
new file mode 100644
index 0000000000..30b5d8da00
--- /dev/null
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/AbstractCpuMetricsManager.java
@@ -0,0 +1,63 @@
+/*
+ * 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.metrics.metricsets.cpu;
+
+import java.util.Collections;
+import java.util.Map;
+
+public class AbstractCpuMetricsManager {
+  protected final String processName;
+  protected final String pid;
+
+  public AbstractCpuMetricsManager(String processName, String pid) {
+    this.processName = processName;
+    this.pid = pid;
+  }
+
+  public static AbstractCpuMetricsManager getCpuMetricsManager(String processName) {
+    return null;
+  }
+
+  public Map<String, Double> getCpuUsageForPerThread() {
+    return Collections.emptyMap();
+  }
+
+  public Map<String, Double> getCpuUsageForPerModule() {
+    return Collections.emptyMap();
+  }
+
+  private String mapThreadNameToModule(String threadName) {
+    if (this.processName.equals(CpuMetricsConstant.DATA_NODE)) {
+      return mapDataNodeThreadNameToModule(threadName);
+    } else if (this.processName.equals(CpuMetricsConstant.CONFIG_NODE)) {
+      return mapConfigNodeThreadNameToModule(threadName);
+    } else {
+      return "unknown";
+    }
+  }
+
+  protected String mapDataNodeThreadNameToModule(String threadName) {
+    return null;
+  }
+
+  protected String mapConfigNodeThreadNameToModule(String threadName) {
+    return null;
+  }
+}
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuMetrics.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuMetrics.java
index a5bf639203..b7cd7e049a 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuMetrics.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuMetrics.java
@@ -26,28 +26,26 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class CpuMetrics implements IMetricSet {
-  private final ICpuMetricsManager cpuMetricsManager = ICpuMetricsManager.getCpuMetricsManager();
+  private final AbstractCpuMetricsManager cpuMetricsManager;
   private static final Logger log = LoggerFactory.getLogger(CpuMetrics.class);
   private final String processName;
   private static final String MODULE = "module";
   private static final String CPU_USAGE = "cpu_usage";
-  private final String dataNode = "datanode";
-  private final String configNode = "confignode";
-  private final String[] dataNodeModules =
-      new String[] {"query", "write", "flush", "compaction", "consensus", "metadata", "sync"};
-  private final String[] configNodeModules = new String[] {"consensus", "rpc"};
+
   private final String[] modules;
 
   public CpuMetrics(String processName) {
     this.processName = processName;
-    if (this.processName.equals(dataNode)) {
-      this.modules = dataNodeModules;
-    } else if (this.processName.equals(configNode)) {
-      this.modules = configNodeModules;
+    if (this.processName.equals(CpuMetricsConstant.DATA_NODE)) {
+      this.modules = CpuMetricsConstant.DATA_NODE_MODULES;
+    } else if (this.processName.equals(CpuMetricsConstant.CONFIG_NODE)) {
+      this.modules = CpuMetricsConstant.CONFIG_NODE_MODULES;
     } else {
       log.error("Invalid process name: {}", processName);
       modules = new String[0];
     }
+
+    this.cpuMetricsManager = AbstractCpuMetricsManager.getCpuMetricsManager(processName);
   }
 
   @Override
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuMetricsConstant.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuMetricsConstant.java
new file mode 100644
index 0000000000..b19203eff0
--- /dev/null
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/CpuMetricsConstant.java
@@ -0,0 +1,48 @@
+/*
+ * 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.metrics.metricsets.cpu;
+
+public class CpuMetricsConstant {
+  public static final String DATA_NODE = "datanode";
+  public static final String CONFIG_NODE = "confignode";
+  public static final String[] DATA_NODE_MODULES =
+      new String[] {"query", "write", "flush", "compaction", "consensus", "metadata", "sync"};
+  public static final String[] CONFIG_NODE_MODULES = new String[] {"consensus", "rpc"};
+
+  // thread name
+  // --------------------------  QueryThreads  --------------------------
+  public static final String QUERY_WORKER_THREAD_PREFIX = "Query-Worker-Thread";
+  public static final String QUERY_SENTINEL_THREAD_PREFIX = "Query-Sentinel-Thread";
+  public static final String DATA_NODE_INTERNAL_RPC_SERVICE_THREAD_NAME =
+      "DataNodeInternalRPC-Service";
+  public static final String DATA_NODE_INTERNAL_RPC_PROCESSOR_THREAD_NAME =
+      "DataNodeInternalRPC-Processor";
+  public static final String MPP_DATA_EXCHANGE_RPC_SERVICE_THREAD_NAME =
+      "MPPDataExchangeRPC-Service";
+  public static final String MPP_DATA_EXCHANGE_RPC_PROCESSOR_THREAD_NAME =
+      "MPPDataExchangeRPC-Processor";
+  public static final String MPP_DATA_EXCHANGE_EXECUTOR_THREAD_NAME =
+      "mpp-data-exchange-task-executors";
+  public static final String FRAGMENT_INSTANCE_MANAGEMENT_THREAD_NAME = "instance-management";
+  public static final String FRAGMENT_INSTANCE_NOTIFICATION_THREAD_NAME = "instance-notification";
+
+  // --------------------------  ConsensusThreads  --------------------------
+
+}
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/ICpuMetricsManager.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/ICpuMetricsManager.java
deleted file mode 100644
index bbffb29513..0000000000
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/ICpuMetricsManager.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.metrics.metricsets.cpu;
-
-import java.util.Collections;
-import java.util.Map;
-
-public interface ICpuMetricsManager {
-  static ICpuMetricsManager getCpuMetricsManager(String processName, String[] modules) {
-    return null;
-  }
-
-  default Map<String, Double> getCpuUsage() {
-    return Collections.emptyMap();
-  }
-}
diff --git a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/LinuxCpuMetricsManager.java b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/LinuxCpuMetricsManager.java
index ae1dd42dbe..9fc5e001ed 100644
--- a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/LinuxCpuMetricsManager.java
+++ b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/cpu/LinuxCpuMetricsManager.java
@@ -33,11 +33,8 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
-public class LinuxCpuMetricsManager implements ICpuMetricsManager {
+public class LinuxCpuMetricsManager extends AbstractCpuMetricsManager {
   private static final Logger log = LoggerFactory.getLogger(LinuxCpuMetricsManager.class);
-  private final String processName;
-  private final String pid;
-  private final String[] modules;
 
   @SuppressWarnings("squid:S1075")
   private static final String SYSTEM_STAT_FILE = "/proc/stat";
@@ -48,15 +45,18 @@ public class LinuxCpuMetricsManager implements ICpuMetricsManager {
   @SuppressWarnings("squid:S1075")
   private String collectThreadIdsPath = "/proc/%s/task";
 
-  public LinuxCpuMetricsManager(String processName, String[] modules) {
-    this.processName = processName;
-    this.modules = modules;
-    this.pid = String.valueOf(Thread.currentThread().getId());
+  public LinuxCpuMetricsManager(String processName) {
+    super(processName, String.valueOf(Thread.currentThread().getId()));
     this.collectThreadIdsPath = String.format(collectThreadIdsPath, pid);
   }
 
   @Override
-  public Map<String, Double> getCpuUsage() {
+  public Map<String, Double> getCpuUsageForPerThread() {
+    return null;
+  }
+
+  @Override
+  public Map<String, Double> getCpuUsageForPerModule() {
     return null;
   }
 
@@ -115,6 +115,33 @@ public class LinuxCpuMetricsManager implements ICpuMetricsManager {
    * @return a map from thread id to cpu time
    */
   private Map<String, Long> collectCpuTimeForPerThread(Set<String> threadIds) {
-    return null;
+    Map<String, Long> cpuTimeMap = new HashMap<>(threadIds.size() + 1, 1);
+    for (String threadId : threadIds) {
+      cpuTimeMap.put(threadId, collectCpuTimeForOneThread(threadId));
+    }
+    return cpuTimeMap;
+  }
+
+  /**
+   * Collect the cpu time for one specific thread.
+   *
+   * @param threadId the pid of the thread
+   * @return the cpu time of a thread
+   */
+  private long collectCpuTimeForOneThread(String threadId) {
+    File statFile = new File(String.format(THREAD_STAT_FILE, threadId));
+    if (!statFile.exists()) {
+      log.error("Cannot find file {}", statFile);
+      return 0;
+    }
+
+    try {
+      String statLine = Files.readAllLines(Paths.get(statFile.getAbsolutePath())).get(0);
+      String[] cpuInfo = statLine.split("\\s+");
+      return Long.parseLong(cpuInfo[13]) + Long.parseLong(cpuInfo[14]);
+    } catch (IOException e) {
+      log.error("Cannot read file {}", statFile, e);
+      return 0;
+    }
   }
 }