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 4fde65e41e [IOTDB-3394] Add cache metrics (#6201)
4fde65e41e is described below

commit 4fde65e41e7345937b309fa38ff303c25de4721a
Author: ZhangHongYin <[email protected]>
AuthorDate: Thu Jun 9 11:45:42 2022 +0800

    [IOTDB-3394] Add cache metrics (#6201)
    
    * rename CompactionMetricsManager and add CacheMetricsRecorder.
    
    * fix cache name.
    
    * fix the initiation of metric service.
    
    * update doc.
---
 docs/UserGuide/Maintenance-Tools/Metric-Tool.md    |  6 +-
 docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md |  5 +-
 .../engine/compaction/CompactionTaskManager.java   | 11 ++--
 .../utils/AlignedSeriesCompactionExecutor.java     |  8 +--
 .../utils/SingleSeriesCompactionExecutor.java      | 10 ++--
 .../writer/AbstractCompactionWriter.java           |  4 +-
 .../db/metadata/cache/DataNodeSchemaCache.java     | 17 ++++++
 .../mpp/plan/analyze/ClusterPartitionFetcher.java  | 41 +++++++++-----
 .../java/org/apache/iotdb/db/service/DataNode.java |  3 +-
 .../iotdb/db/service/metrics/enums/Metric.java     |  1 +
 .../metrics/recorder/CacheMetricsRecorder.java     | 65 ++++++++++++++++++++++
 .../recorder/CompactionMetricsRecorder.java}       | 16 ++++--
 12 files changed, 147 insertions(+), 40 deletions(-)

diff --git a/docs/UserGuide/Maintenance-Tools/Metric-Tool.md 
b/docs/UserGuide/Maintenance-Tools/Metric-Tool.md
index a3e311186d..0ed6b05ad7 100644
--- a/docs/UserGuide/Maintenance-Tools/Metric-Tool.md
+++ b/docs/UserGuide/Maintenance-Tools/Metric-Tool.md
@@ -101,11 +101,13 @@ Next, we will choose Prometheus format data as samples to 
describe each kind of
 | ------ | --------------------------------------- | --------- | 
--------------------------------------------------------------------- | 
--------------------------------- |
 | mem    | name="chunkMetaData/storageGroup/mtree" | important | Current 
memory size of chunkMetaData/storageGroup/mtree data in bytes | 
mem{name="chunkMetaData",} 2050.0 |
 
-#### 4.3.4. Cache Hit Ratio
+#### 4.3.4. Cache
 
 | 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 |
+| cache_hit | name="chunk/timeSeriesMeta/bloomFilter/SchemaCache" | important 
| Cache hit ratio of chunk/timeSeriesMeta/SchemaCache  and prevention ratio of 
bloom filter | cache_hit{name="chunk",} 80 |
+| cache_total | name="StorageGroup/SchemaPartition/DataPartition", 
type="hit/all" | important | The cache hit/all counts of 
StorageGroup/SchemaPartition/DataPartition | 
cache_total{name="DataPartition",type="all",} 801.0 |
+
 
 #### 4.3.5. Business Data
 
diff --git a/docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md 
b/docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md
index d7e5307548..0fcdc54abc 100644
--- a/docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md
+++ b/docs/zh/UserGuide/Maintenance-Tools/Metric-Tool.md
@@ -100,11 +100,12 @@ IoTDB对外提供JMX和Prometheus格式的监控指标,对于JMX,可以通
 | ------ | --------------------------------------- | --------- | 
-------------------------------------------------- | 
--------------------------------- |
 | mem    | name="chunkMetaData/storageGroup/mtree" | important | 
chunkMetaData/storageGroup/mtree占用的内存(byte) | mem{name="chunkMetaData",} 2050.0 
|
 
-#### 4.3.4. 缓存命中率
+#### 4.3.4. 缓存
 
 | Metric    | Tag                                     | level     | 说明         
                                    | 示例                        |
 | --------- | --------------------------------------- | --------- | 
------------------------------------------------ | --------------------------- |
-| cache_hit | name="chunk/timeSeriesMeta/bloomFilter" | important | 
chunk/timeSeriesMeta缓存命中率,bloomFilter拦截率 | cache_hit{name="chunk",} 80 |
+| cache_hit | name="chunk/timeSeriesMeta/bloomFilter/SchemaCache" | important 
| chunk/timeSeriesMeta/SchemaCache缓存命中率,bloomFilter拦截率 | 
cache_hit{name="chunk",} 80 |
+| cache_total | name="StorageGroup/SchemaPartition/DataPartition", 
type="hit/all" | important | StorageGroup/SchemaPartition/DataPartition 的命中/总次数 
| cache_total{name="DataPartition",type="all",} 801.0 |
 
 #### 4.3.5. 业务数据
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionTaskManager.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionTaskManager.java
index 4b07aa124a..76a53c7042 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionTaskManager.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionTaskManager.java
@@ -32,6 +32,7 @@ import 
org.apache.iotdb.db.engine.compaction.comparator.DefaultCompactionTaskCom
 import org.apache.iotdb.db.engine.compaction.constant.CompactionTaskStatus;
 import org.apache.iotdb.db.engine.compaction.task.AbstractCompactionTask;
 import org.apache.iotdb.db.engine.compaction.task.CompactionTaskSummary;
+import org.apache.iotdb.db.service.metrics.recorder.CompactionMetricsRecorder;
 import org.apache.iotdb.db.utils.datastructure.FixedPriorityBlockingQueue;
 
 import com.google.common.util.concurrent.RateLimiter;
@@ -109,7 +110,7 @@ public class CompactionTaskManager implements IService {
           
AbstractCompactionTask::resetCompactionCandidateStatusForAllSourceFiles);
       candidateCompactionTaskQueue.regsitPollLastHook(
           x ->
-              CompactionMetricsManager.recordTaskInfo(
+              CompactionMetricsRecorder.recordTaskInfo(
                   x, CompactionTaskStatus.POLL_FROM_QUEUE, 
candidateCompactionTaskQueue.size()));
 
       // Periodically do the following: fetch the highest priority thread from 
the
@@ -224,7 +225,7 @@ public class CompactionTaskManager implements IService {
       candidateCompactionTaskQueue.put(compactionTask);
 
       // add metrics
-      CompactionMetricsManager.recordTaskInfo(
+      CompactionMetricsRecorder.recordTaskInfo(
           compactionTask, CompactionTaskStatus.ADD_TO_QUEUE, 
candidateCompactionTaskQueue.size());
 
       return true;
@@ -251,12 +252,12 @@ public class CompactionTaskManager implements IService {
         AbstractCompactionTask task = candidateCompactionTaskQueue.take();
 
         // add metrics
-        CompactionMetricsManager.recordTaskInfo(
+        CompactionMetricsRecorder.recordTaskInfo(
             task, CompactionTaskStatus.POLL_FROM_QUEUE, 
candidateCompactionTaskQueue.size());
 
         if (task != null && task.checkValidAndSetMerging()) {
           submitTask(task);
-          CompactionMetricsManager.recordTaskInfo(
+          CompactionMetricsRecorder.recordTaskInfo(
               task, CompactionTaskStatus.READY_TO_EXECUTE, 
currentTaskNum.get());
         } else {
           logger.warn("A task {} is not submitted", task);
@@ -300,7 +301,7 @@ public class CompactionTaskManager implements IService {
       storageGroupTasks.get(storageGroupName).remove(task);
     }
     // add metrics
-    CompactionMetricsManager.recordTaskInfo(
+    CompactionMetricsRecorder.recordTaskInfo(
         task, CompactionTaskStatus.FINISHED, currentTaskNum.get());
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/AlignedSeriesCompactionExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/AlignedSeriesCompactionExecutor.java
index 8ee99d9e1f..c9c36378f5 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/AlignedSeriesCompactionExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/AlignedSeriesCompactionExecutor.java
@@ -20,11 +20,11 @@ package org.apache.iotdb.db.engine.compaction.inner.utils;
 
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.cache.ChunkCache;
-import org.apache.iotdb.db.engine.compaction.CompactionMetricsManager;
 import org.apache.iotdb.db.engine.compaction.CompactionTaskManager;
 import org.apache.iotdb.db.engine.compaction.constant.CompactionType;
 import org.apache.iotdb.db.engine.compaction.constant.ProcessChunkType;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
+import org.apache.iotdb.db.service.metrics.recorder.CompactionMetricsRecorder;
 import org.apache.iotdb.tsfile.file.header.ChunkHeader;
 import org.apache.iotdb.tsfile.file.metadata.AlignedChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
@@ -136,7 +136,7 @@ public class AlignedSeriesCompactionExecutor {
           new TsFileAlignedSeriesReaderIterator(reader, 
alignedChunkMetadataList, schemaList);
       while (readerIterator.hasNext()) {
         Pair<AlignedChunkReader, Long> chunkReaderAndChunkSize = 
readerIterator.nextReader();
-        CompactionMetricsManager.recordReadInfo(chunkReaderAndChunkSize.right);
+        
CompactionMetricsRecorder.recordReadInfo(chunkReaderAndChunkSize.right);
         compactOneAlignedChunk(chunkReaderAndChunkSize.left);
       }
     }
@@ -144,7 +144,7 @@ public class AlignedSeriesCompactionExecutor {
     if (remainingPointInChunkWriter != 0L) {
       CompactionTaskManager.mergeRateLimiterAcquire(
           rateLimiter, chunkWriter.estimateMaxSeriesMemSize());
-      CompactionMetricsManager.recordWriteInfo(
+      CompactionMetricsRecorder.recordWriteInfo(
           CompactionType.INNER_SEQ_COMPACTION,
           ProcessChunkType.DESERIALIZE_CHUNK,
           true,
@@ -182,7 +182,7 @@ public class AlignedSeriesCompactionExecutor {
         || chunkWriter.estimateMaxSeriesMemSize() >= chunkSizeThreshold * 
schemaList.size()) {
       CompactionTaskManager.mergeRateLimiterAcquire(
           rateLimiter, chunkWriter.estimateMaxSeriesMemSize());
-      CompactionMetricsManager.recordWriteInfo(
+      CompactionMetricsRecorder.recordWriteInfo(
           CompactionType.INNER_SEQ_COMPACTION,
           ProcessChunkType.DESERIALIZE_CHUNK,
           true,
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/SingleSeriesCompactionExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/SingleSeriesCompactionExecutor.java
index 1bba81dd04..bcc3f0ef3a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/SingleSeriesCompactionExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/SingleSeriesCompactionExecutor.java
@@ -20,11 +20,11 @@ package org.apache.iotdb.db.engine.compaction.inner.utils;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.engine.compaction.CompactionMetricsManager;
 import org.apache.iotdb.db.engine.compaction.CompactionTaskManager;
 import org.apache.iotdb.db.engine.compaction.constant.CompactionType;
 import org.apache.iotdb.db.engine.compaction.constant.ProcessChunkType;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
+import org.apache.iotdb.db.service.metrics.recorder.CompactionMetricsRecorder;
 import org.apache.iotdb.metrics.config.MetricConfigDescriptor;
 import org.apache.iotdb.tsfile.file.header.ChunkHeader;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
@@ -124,7 +124,7 @@ public class SingleSeriesCompactionExecutor {
         if (this.chunkWriter == null) {
           constructChunkWriterFromReadChunk(currentChunk);
         }
-        CompactionMetricsManager.recordReadInfo(
+        CompactionMetricsRecorder.recordReadInfo(
             currentChunk.getHeader().getSerializedSize() + 
currentChunk.getHeader().getDataSize());
 
         // if this chunk is modified, deserialize it into points
@@ -307,7 +307,7 @@ public class SingleSeriesCompactionExecutor {
     if (chunkMetadata.getEndTime() > maxEndTimestamp) {
       maxEndTimestamp = chunkMetadata.getEndTime();
     }
-    CompactionMetricsManager.recordWriteInfo(
+    CompactionMetricsRecorder.recordWriteInfo(
         CompactionType.INNER_SEQ_COMPACTION,
         isCachedChunk ? ProcessChunkType.MERGE_CHUNK : 
ProcessChunkType.FLUSH_CHUNK,
         false,
@@ -320,7 +320,7 @@ public class SingleSeriesCompactionExecutor {
         || chunkWriter.estimateMaxSeriesMemSize() >= targetChunkSize) {
       CompactionTaskManager.mergeRateLimiterAcquire(
           compactionRateLimiter, chunkWriter.estimateMaxSeriesMemSize());
-      CompactionMetricsManager.recordWriteInfo(
+      CompactionMetricsRecorder.recordWriteInfo(
           CompactionType.INNER_SEQ_COMPACTION,
           ProcessChunkType.DESERIALIZE_CHUNK,
           false,
@@ -342,7 +342,7 @@ public class SingleSeriesCompactionExecutor {
   private void flushChunkWriter() throws IOException {
     CompactionTaskManager.mergeRateLimiterAcquire(
         compactionRateLimiter, chunkWriter.estimateMaxSeriesMemSize());
-    CompactionMetricsManager.recordWriteInfo(
+    CompactionMetricsRecorder.recordWriteInfo(
         CompactionType.INNER_SEQ_COMPACTION,
         ProcessChunkType.DESERIALIZE_CHUNK,
         false,
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/writer/AbstractCompactionWriter.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/writer/AbstractCompactionWriter.java
index 5c1460230d..343e88ee58 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/writer/AbstractCompactionWriter.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/writer/AbstractCompactionWriter.java
@@ -19,10 +19,10 @@
 package org.apache.iotdb.db.engine.compaction.writer;
 
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.engine.compaction.CompactionMetricsManager;
 import org.apache.iotdb.db.engine.compaction.CompactionTaskManager;
 import org.apache.iotdb.db.engine.compaction.constant.CompactionType;
 import org.apache.iotdb.db.engine.compaction.constant.ProcessChunkType;
+import org.apache.iotdb.db.service.metrics.recorder.CompactionMetricsRecorder;
 import org.apache.iotdb.metrics.config.MetricConfigDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Binary;
@@ -152,7 +152,7 @@ public abstract class AbstractCompactionWriter implements 
AutoCloseable {
       throws IOException {
     if (measurementPointCountArray[subTaskId] % 10 == 0 && 
checkChunkSize(subTaskId)) {
       flushChunkToFileWriter(fileWriter, subTaskId);
-      CompactionMetricsManager.recordWriteInfo(
+      CompactionMetricsRecorder.recordWriteInfo(
           this instanceof CrossSpaceCompactionWriter
               ? CompactionType.CROSS_COMPACTION
               : CompactionType.INNER_UNSEQ_COMPACTION,
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCache.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCache.java
index 34054509e1..23fa436c8f 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCache.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCache.java
@@ -24,6 +24,11 @@ import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.service.metrics.MetricsService;
+import org.apache.iotdb.db.service.metrics.enums.Metric;
+import org.apache.iotdb.db.service.metrics.enums.Tag;
+import org.apache.iotdb.metrics.config.MetricConfigDescriptor;
+import org.apache.iotdb.metrics.utils.MetricLevel;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
@@ -42,6 +47,18 @@ public class DataNodeSchemaCache {
 
   private DataNodeSchemaCache() {
     cache = 
Caffeine.newBuilder().maximumSize(config.getDataNodeSchemaCacheSize()).build();
+    if 
(MetricConfigDescriptor.getInstance().getMetricConfig().getEnableMetric()) {
+      // add metrics
+      MetricsService.getInstance()
+          .getMetricManager()
+          .getOrCreateAutoGauge(
+              Metric.CACHE_HIT.toString(),
+              MetricLevel.IMPORTANT,
+              cache,
+              l -> (long) (l.stats().hitRate() * 100),
+              Tag.NAME.toString(),
+              "schemaCache");
+    }
   }
 
   public static DataNodeSchemaCache getInstance() {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
index c21b75346c..1470daf66a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
@@ -47,6 +47,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.sql.StatementAnalyzeException;
 import org.apache.iotdb.db.metadata.utils.MetaUtils;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
+import org.apache.iotdb.db.service.metrics.recorder.CacheMetricsRecorder;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.tsfile.utils.PublicBAOS;
 
@@ -451,26 +452,29 @@ public class ClusterPartitionFetcher implements 
IPartitionFetcher {
     /** get storage group by cache */
     public boolean getStorageGroup(
         List<String> devicePaths, Map<String, String> deviceToStorageGroupMap) 
{
+      boolean result = true;
       if (storageGroupCache.size() == 0) {
         logger.debug("Failed to get storage group");
-        return false;
-      }
-      for (String devicePath : devicePaths) {
-        boolean hit = false;
-        for (String storageGroup : storageGroupCache) {
-          if (devicePath.startsWith(storageGroup + ".")) {
-            deviceToStorageGroupMap.put(devicePath, storageGroup);
-            hit = true;
+        result = false;
+      } else {
+        for (String devicePath : devicePaths) {
+          boolean hit = false;
+          for (String storageGroup : storageGroupCache) {
+            if (devicePath.startsWith(storageGroup + ".")) {
+              deviceToStorageGroupMap.put(devicePath, storageGroup);
+              hit = true;
+              break;
+            }
+          }
+          if (!hit) {
+            logger.debug("{} cannot hit storage group cache", devicePath);
+            result = false;
             break;
           }
         }
-        if (!hit) {
-          logger.debug("{} cannot hit storage group cache", devicePath);
-          return false;
-        }
       }
-      logger.debug("Hit storage group");
-      return true;
+      CacheMetricsRecorder.record(result, "StorageGroup");
+      return result;
     }
 
     /** update the cache of storage group */
@@ -493,7 +497,9 @@ public class ClusterPartitionFetcher implements 
IPartitionFetcher {
 
     /** get schemaPartition by patternTree */
     public SchemaPartition getSchemaPartition(Map<String, String> 
deviceToStorageGroupMap) {
+      String name = "SchemaPartition";
       if (deviceToStorageGroupMap.size() == 0) {
+        CacheMetricsRecorder.record(false, name);
         return null;
       }
       Map<String, Map<TSeriesPartitionSlot, TRegionReplicaSet>> 
schemaPartitionMap =
@@ -506,6 +512,7 @@ public class ClusterPartitionFetcher implements 
IPartitionFetcher {
         if (null == regionReplicaSet) {
           // if one device not find, then return cache miss.
           logger.debug("Failed to find schema partition");
+          CacheMetricsRecorder.record(false, name);
           return null;
         }
         String storageGroupName = deviceToStorageGroupMap.get(device);
@@ -518,6 +525,7 @@ public class ClusterPartitionFetcher implements 
IPartitionFetcher {
       }
       logger.debug("Hit schema partition");
       // cache hit
+      CacheMetricsRecorder.record(true, name);
       return new SchemaPartition(
           schemaPartitionMap, seriesSlotExecutorName, seriesPartitionSlotNum);
     }
@@ -525,7 +533,9 @@ public class ClusterPartitionFetcher implements 
IPartitionFetcher {
     /** get dataPartition by query param map */
     public DataPartition getDataPartition(
         Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap) {
+      String name = "DataPartition";
       if (sgNameToQueryParamsMap.size() == 0) {
+        CacheMetricsRecorder.record(false, name);
         return null;
       }
       Map<String, Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, 
List<TRegionReplicaSet>>>>
@@ -545,6 +555,7 @@ public class ClusterPartitionFetcher implements 
IPartitionFetcher {
               || 0 == 
dataPartitionQueryParam.getTimePartitionSlotList().size()) {
             // if query all data, cache miss
             logger.debug("Failed to find data partition");
+            CacheMetricsRecorder.record(false, name);
             return null;
           }
           TSeriesPartitionSlot seriesPartitionSlot =
@@ -564,6 +575,7 @@ public class ClusterPartitionFetcher implements 
IPartitionFetcher {
             if (null == regionReplicaSets) {
               // if one time partition not find, cache miss
               logger.debug("Failed to find data partition");
+              CacheMetricsRecorder.record(false, name);
               return null;
             }
             timePartitionSlotListMap.put(timePartitionSlot, regionReplicaSets);
@@ -572,6 +584,7 @@ public class ClusterPartitionFetcher implements 
IPartitionFetcher {
       }
       logger.debug("Hit data partition");
       // cache hit
+      CacheMetricsRecorder.record(true, name);
       return new DataPartition(dataPartitionMap, seriesSlotExecutorName, 
seriesPartitionSlotNum);
     }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java 
b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
index 72b6a8df00..a6c590c148 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
@@ -267,6 +267,8 @@ public class DataNode implements DataNodeMBean {
     setUncaughtExceptionHandler();
     initServiceProvider();
 
+    // init metric service
+    registerManager.register(MetricsService.getInstance());
     // init rpc service
     IoTDBDescriptor.getInstance()
         .getConfig()
@@ -276,7 +278,6 @@ public class DataNode implements DataNodeMBean {
       registerManager.register(RPCService.getInstance());
     }
 
-    registerManager.register(MetricsService.getInstance());
     logger.info("recover the schema...");
     initConfigManager();
     registerManager.register(new JMXService());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/metrics/enums/Metric.java 
b/server/src/main/java/org/apache/iotdb/db/service/metrics/enums/Metric.java
index 79c96b6fd6..6d798dfd6b 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/metrics/enums/Metric.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/metrics/enums/Metric.java
@@ -26,6 +26,7 @@ public enum Metric {
   FILE_SIZE,
   FILE_COUNT,
   MEM,
+  CACHE,
   CACHE_HIT,
   ERROR_LOG,
   QUANTITY,
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/metrics/recorder/CacheMetricsRecorder.java
 
b/server/src/main/java/org/apache/iotdb/db/service/metrics/recorder/CacheMetricsRecorder.java
new file mode 100644
index 0000000000..1c1a0ccda6
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/service/metrics/recorder/CacheMetricsRecorder.java
@@ -0,0 +1,65 @@
+/*
+ * 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.recorder;
+
+import org.apache.iotdb.db.service.metrics.MetricsService;
+import org.apache.iotdb.db.service.metrics.enums.Metric;
+import org.apache.iotdb.db.service.metrics.enums.Tag;
+import org.apache.iotdb.metrics.config.MetricConfigDescriptor;
+import org.apache.iotdb.metrics.utils.MetricLevel;
+
+public class CacheMetricsRecorder {
+
+  private static final boolean ENABLE_METRIC =
+      MetricConfigDescriptor.getInstance().getMetricConfig().getEnableMetric();
+
+  /**
+   * record the result of cache
+   *
+   * @param result whether hit
+   * @param name the name of object that cached
+   */
+  public static void record(boolean result, String name) {
+    if (ENABLE_METRIC) {
+      if (result) {
+        // cache hit
+        MetricsService.getInstance()
+            .getMetricManager()
+            .count(
+                1,
+                Metric.CACHE.toString(),
+                MetricLevel.IMPORTANT,
+                Tag.NAME.toString(),
+                name,
+                Tag.TYPE.toString(),
+                "hit");
+      }
+      MetricsService.getInstance()
+          .getMetricManager()
+          .count(
+              1,
+              Metric.CACHE.toString(),
+              MetricLevel.IMPORTANT,
+              Tag.NAME.toString(),
+              name,
+              Tag.TYPE.toString(),
+              "all");
+    }
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionMetricsManager.java
 
b/server/src/main/java/org/apache/iotdb/db/service/metrics/recorder/CompactionMetricsRecorder.java
similarity index 94%
rename from 
server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionMetricsManager.java
rename to 
server/src/main/java/org/apache/iotdb/db/service/metrics/recorder/CompactionMetricsRecorder.java
index 3f42678141..b35f086b8b 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionMetricsManager.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/service/metrics/recorder/CompactionMetricsRecorder.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.db.engine.compaction;
+package org.apache.iotdb.db.service.metrics.recorder;
 
 import org.apache.iotdb.db.engine.compaction.constant.CompactionTaskStatus;
 import org.apache.iotdb.db.engine.compaction.constant.CompactionType;
@@ -32,14 +32,17 @@ import org.apache.iotdb.metrics.utils.MetricLevel;
 
 import java.util.concurrent.TimeUnit;
 
-public class CompactionMetricsManager {
+public class CompactionMetricsRecorder {
+
+  private static final boolean ENABLE_METRIC =
+      MetricConfigDescriptor.getInstance().getMetricConfig().getEnableMetric();
 
   public static void recordWriteInfo(
       CompactionType compactionType,
       ProcessChunkType processChunkType,
       boolean aligned,
       long byteNum) {
-    if 
(!MetricConfigDescriptor.getInstance().getMetricConfig().getEnableMetric()) {
+    if (!ENABLE_METRIC) {
       return;
     }
     MetricsService.getInstance()
@@ -69,7 +72,7 @@ public class CompactionMetricsManager {
   }
 
   public static void recordReadInfo(long byteNum) {
-    if 
(!MetricConfigDescriptor.getInstance().getMetricConfig().getEnableMetric()) {
+    if (!ENABLE_METRIC) {
       return;
     }
     MetricsService.getInstance()
@@ -84,7 +87,7 @@ public class CompactionMetricsManager {
 
   public static void recordTaskInfo(
       AbstractCompactionTask task, CompactionTaskStatus status, int size) {
-    if 
(!MetricConfigDescriptor.getInstance().getMetricConfig().getEnableMetric()) {
+    if (!ENABLE_METRIC) {
       return;
     }
     String taskType = "unknown";
@@ -166,6 +169,9 @@ public class CompactionMetricsManager {
                   "cross_compaction_count");
         }
         break;
+      default:
+        // do nothing
+        break;
     }
   }
 }

Reply via email to