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;
+ }
}
}