This is an automated email from the ASF dual-hosted git repository.
marklau99 pushed a commit to branch add-level-file-metric
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/add-level-file-metric by this
push:
new c3f4bed686e add level file metrics
c3f4bed686e is described below
commit c3f4bed686edf15559baf23bec4063712ec017b5
Author: Liu Xuxin <[email protected]>
AuthorDate: Thu May 25 19:12:35 2023 +0800
add level file metrics
---
.../iotdb/db/engine/TsFileMetricManager.java | 74 +++++++++++++++++++++-
.../execute/task/CrossSpaceCompactionTask.java | 12 +++-
.../execute/task/InnerSpaceCompactionTask.java | 12 +++-
.../iotdb/db/engine/storagegroup/DataRegion.java | 41 +++++++++---
.../iotdb/db/service/metrics/FileMetrics.java | 1 +
5 files changed, 125 insertions(+), 15 deletions(-)
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/TsFileMetricManager.java
b/server/src/main/java/org/apache/iotdb/db/engine/TsFileMetricManager.java
index a3cf6c83361..1b7a1e600ad 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/TsFileMetricManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/TsFileMetricManager.java
@@ -19,19 +19,34 @@
package org.apache.iotdb.db.engine;
+import org.apache.iotdb.commons.service.metric.enums.Tag;
import
org.apache.iotdb.db.engine.compaction.execute.task.AbstractCompactionTask;
import
org.apache.iotdb.db.engine.compaction.execute.task.CompactionTaskSummary;
import
org.apache.iotdb.db.engine.compaction.execute.task.InnerSpaceCompactionTask;
import org.apache.iotdb.db.engine.compaction.schedule.CompactionTaskManager;
+import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
import org.apache.iotdb.db.service.metrics.FileMetrics;
+import org.apache.iotdb.metrics.AbstractMetricService;
+import org.apache.iotdb.metrics.utils.MetricLevel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
/** This class collect the number and size of tsfile, and send it to the
{@link FileMetrics} */
public class TsFileMetricManager {
+ private static final Logger log =
LoggerFactory.getLogger(TsFileMetricManager.class);
private static final TsFileMetricManager INSTANCE = new
TsFileMetricManager();
+ private static final String FILE_LEVEL_COUNT = "file_level_count";
+ private static final String SEQUENCE = "sequence";
+ private static final String UNSEQUENCE = "unsequence";
+ private static final String LEVEL = "level";
private final AtomicLong seqFileSize = new AtomicLong(0);
private final AtomicLong unseqFileSize = new AtomicLong(0);
private final AtomicInteger seqFileNum = new AtomicInteger(0);
@@ -40,6 +55,8 @@ public class TsFileMetricManager {
private final AtomicInteger modFileNum = new AtomicInteger(0);
private final AtomicLong modFileSize = new AtomicLong(0);
+ private final Map<Integer, Integer> seqLevelTsFileCountMap = new HashMap<>();
+ private final Map<Integer, Integer> unseqLevelTsFileCountMap = new
HashMap<>();
private long lastUpdateTime = 0;
private static final long UPDATE_INTERVAL = 10_000L;
@@ -50,6 +67,7 @@ public class TsFileMetricManager {
private final AtomicInteger innerSeqCompactionTempFileNum = new
AtomicInteger(0);
private final AtomicInteger innerUnseqCompactionTempFileNum = new
AtomicInteger(0);
private final AtomicInteger crossCompactionTempFileNum = new
AtomicInteger(0);
+ private AbstractMetricService metricService;
private TsFileMetricManager() {}
@@ -57,7 +75,11 @@ public class TsFileMetricManager {
return INSTANCE;
}
- public void addFile(long size, boolean seq) {
+ public void setMetricService(AbstractMetricService metricService) {
+ this.metricService = metricService;
+ }
+
+ public void addFile(long size, boolean seq, String name) {
if (seq) {
seqFileSize.getAndAdd(size);
seqFileNum.incrementAndGet();
@@ -65,9 +87,32 @@ public class TsFileMetricManager {
unseqFileSize.getAndAdd(size);
unseqFileNum.incrementAndGet();
}
+ try {
+ TsFileNameGenerator.TsFileName tsFileName =
TsFileNameGenerator.getTsFileName(name);
+ int level = tsFileName.getInnerCompactionCnt();
+ int count = -1;
+ if (seq) {
+ count = seqLevelTsFileCountMap.compute(level, (k, v) -> v == null ? 1
: v + 1);
+ } else {
+ count = unseqLevelTsFileCountMap.compute(level, (k, v) -> v == null ?
1 : v + 1);
+ }
+ if (metricService != null) {
+ metricService
+ .getOrCreateGauge(
+ FILE_LEVEL_COUNT,
+ MetricLevel.CORE,
+ Tag.TYPE.toString(),
+ seq ? SEQUENCE : UNSEQUENCE,
+ LEVEL,
+ String.valueOf(level))
+ .set(count);
+ }
+ } catch (IOException e) {
+ log.error("Unexpected error occurred when getting tsfile name", e);
+ }
}
- public void deleteFile(long size, boolean seq, int num) {
+ public void deleteFile(long size, boolean seq, int num, List<String> names) {
if (seq) {
seqFileSize.getAndAdd(-size);
seqFileNum.getAndAdd(-num);
@@ -75,6 +120,31 @@ public class TsFileMetricManager {
unseqFileSize.getAndAdd(-size);
unseqFileNum.getAndAdd(-num);
}
+ for (String name : names) {
+ int level = -1;
+ int count = -1;
+ try {
+ TsFileNameGenerator.TsFileName tsFileName =
TsFileNameGenerator.getTsFileName(name);
+ level = tsFileName.getInnerCompactionCnt();
+ count =
+ seq
+ ? seqLevelTsFileCountMap.compute(level, (k, v) -> v == null ?
0 : v - 1)
+ : unseqLevelTsFileCountMap.compute(level, (k, v) -> v == null
? 0 : v - 1);
+ } catch (IOException e) {
+ log.error("Unexpected error occurred when getting tsfile name", e);
+ }
+ if (metricService != null && level != -1 && count != -1) {
+ metricService
+ .getOrCreateGauge(
+ FILE_LEVEL_COUNT,
+ MetricLevel.CORE,
+ Tag.TYPE.toString(),
+ seq ? SEQUENCE : UNSEQUENCE,
+ LEVEL,
+ String.valueOf(level))
+ .set(count);
+ }
+ }
}
public long getFileSize(boolean seq) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/task/CrossSpaceCompactionTask.java
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/task/CrossSpaceCompactionTask.java
index 4aa9d378d33..67111d8229b 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/task/CrossSpaceCompactionTask.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/task/CrossSpaceCompactionTask.java
@@ -212,7 +212,9 @@ public class CrossSpaceCompactionTask extends
AbstractCompactionTask {
// update the metrics finally in case of any exception occurs
for (TsFileResource targetResource : targetTsfileResourceList) {
if (!targetResource.isDeleted()) {
-
TsFileMetricManager.getInstance().addFile(targetResource.getTsFileSize(), true);
+ TsFileMetricManager.getInstance()
+ .addFile(
+ targetResource.getTsFileSize(), true,
targetResource.getTsFile().getName());
// set target resources to CLOSED, so that they can be selected to
compact
targetResource.setStatus(TsFileResourceStatus.NORMAL);
@@ -221,10 +223,14 @@ public class CrossSpaceCompactionTask extends
AbstractCompactionTask {
targetResource.remove();
}
}
+ List<String> fileNames = new ArrayList<>();
+ selectedSequenceFiles.forEach(x ->
fileNames.add(x.getTsFile().getName()));
TsFileMetricManager.getInstance()
- .deleteFile(sequenceFileSize, true, selectedSequenceFiles.size());
+ .deleteFile(sequenceFileSize, true, selectedSequenceFiles.size(),
fileNames);
+ fileNames.clear();
+ selectedUnsequenceFiles.forEach(x ->
fileNames.add(x.getTsFile().getName()));
TsFileMetricManager.getInstance()
- .deleteFile(unsequenceFileSize, false,
selectedUnsequenceFiles.size());
+ .deleteFile(unsequenceFileSize, false,
selectedUnsequenceFiles.size(), fileNames);
CompactionMetrics.getInstance().recordSummaryInfo(summary);
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/task/InnerSpaceCompactionTask.java
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/task/InnerSpaceCompactionTask.java
index de28ae37c18..a9dcb0fbc78 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/task/InnerSpaceCompactionTask.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/task/InnerSpaceCompactionTask.java
@@ -236,7 +236,10 @@ public class InnerSpaceCompactionTask extends
AbstractCompactionTask {
// inner space compaction task has only one target file
if (!targetTsFileResource.isDeleted()) {
TsFileMetricManager.getInstance()
- .addFile(targetTsFileResource.getTsFile().length(), sequence);
+ .addFile(
+ targetTsFileResource.getTsFile().length(),
+ sequence,
+ targetTsFileResource.getTsFile().getName());
// set target resource to CLOSED, so that it can be selected to
compact
targetTsFileResource.setStatus(TsFileResourceStatus.NORMAL);
@@ -244,8 +247,13 @@ public class InnerSpaceCompactionTask extends
AbstractCompactionTask {
// target resource is empty after compaction, then delete it
targetTsFileResource.remove();
}
+ List<String> fileNames = new ArrayList<>();
+ for (TsFileResource resource : selectedTsFileResourceList) {
+ fileNames.add(resource.getTsFile().getName());
+ }
TsFileMetricManager.getInstance()
- .deleteFile(totalSizeOfDeletedFile, sequence,
selectedTsFileResourceList.size());
+ .deleteFile(
+ totalSizeOfDeletedFile, sequence,
selectedTsFileResourceList.size(), fileNames);
CompactionMetrics.getInstance().recordSummaryInfo(summary);
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
index dd90e5f2511..4d2131ce24d 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
@@ -470,7 +470,8 @@ public class DataRegion implements IDataRegionForQuery {
// tsFiles without resource file are unsealed
for (TsFileResource resource : value) {
if (resource.resourceFileExists()) {
-
TsFileMetricManager.getInstance().addFile(resource.getTsFile().length(), true);
+ TsFileMetricManager.getInstance()
+ .addFile(resource.getTsFile().length(), true,
resource.getTsFile().getName());
if (resource.getModFile().exists()) {
TsFileMetricManager.getInstance().increaseModFileNum(1);
TsFileMetricManager.getInstance()
@@ -496,7 +497,8 @@ public class DataRegion implements IDataRegionForQuery {
// tsFiles without resource file are unsealed
for (TsFileResource resource : value) {
if (resource.resourceFileExists()) {
-
TsFileMetricManager.getInstance().addFile(resource.getTsFile().length(), false);
+ TsFileMetricManager.getInstance()
+ .addFile(resource.getTsFile().length(), false,
resource.getTsFile().getName());
}
if (resource.getModFile().exists()) {
TsFileMetricManager.getInstance().increaseModFileNum(1);
@@ -797,7 +799,10 @@ public class DataRegion implements IDataRegionForQuery {
updateLastFlushTime(tsFileResource, isSeq);
tsFileResourceManager.registerSealedTsFileResource(tsFileResource);
TsFileMetricManager.getInstance()
- .addFile(tsFileResource.getTsFile().length(),
recoverPerformer.isSequence());
+ .addFile(
+ tsFileResource.getTsFile().length(),
+ recoverPerformer.isSequence(),
+ tsFileResource.getTsFile().getName());
} else {
// the last file is not closed, continue writing to it
RestorableTsFileIOWriter writer = recoverPerformer.getWriter();
@@ -1609,7 +1614,12 @@ public class DataRegion implements IDataRegionForQuery {
if (resource.tryWriteLock()) {
try {
// try to delete physical data file
- TsFileMetricManager.getInstance().deleteFile(resource.getTsFileSize(),
isSeq, 1);
+ TsFileMetricManager.getInstance()
+ .deleteFile(
+ resource.getTsFileSize(),
+ isSeq,
+ 1,
+ Collections.singletonList(resource.getTsFile().getName()));
resource.remove();
tsFileManager.remove(resource, isSeq);
logger.info(
@@ -2185,7 +2195,10 @@ public class DataRegion implements IDataRegionForQuery {
closeStorageGroupCondition.notifyAll();
}
TsFileMetricManager.getInstance()
- .addFile(tsFileProcessor.getTsFileResource().getTsFileSize(),
tsFileProcessor.isSequence());
+ .addFile(
+ tsFileProcessor.getTsFileResource().getTsFileSize(),
+ tsFileProcessor.isSequence(),
+ tsFileProcessor.getTsFileResource().getTsFile().getName());
logger.info("signal closing database condition in {}", databaseName + "-"
+ dataRegionId);
}
@@ -2387,7 +2400,11 @@ public class DataRegion implements IDataRegionForQuery {
}
loadTsFileToUnSequence(
tsfileToBeInserted, newTsFileResource, newFilePartitionId,
deleteOriginFile);
-
TsFileMetricManager.getInstance().addFile(newTsFileResource.getTsFile().length(),
false);
+ TsFileMetricManager.getInstance()
+ .addFile(
+ newTsFileResource.getTsFile().length(),
+ false,
+ newTsFileResource.getTsFile().getName());
resetLastCacheWhenLoadingTsFile(); // update last cache
updateLastFlushTime(newTsFileResource); // update last flush time
@@ -2724,7 +2741,11 @@ public class DataRegion implements IDataRegionForQuery {
tsFileResourceToBeMoved = sequenceResource;
tsFileManager.remove(tsFileResourceToBeMoved, true);
TsFileMetricManager.getInstance()
- .deleteFile(tsFileResourceToBeMoved.getTsFileSize(), true, 1);
+ .deleteFile(
+ tsFileResourceToBeMoved.getTsFileSize(),
+ true,
+ 1,
+
Collections.singletonList(tsFileResourceToBeMoved.getTsFile().getName()));
break;
}
}
@@ -2736,7 +2757,11 @@ public class DataRegion implements IDataRegionForQuery {
tsFileResourceToBeMoved = unsequenceResource;
tsFileManager.remove(tsFileResourceToBeMoved, false);
TsFileMetricManager.getInstance()
- .deleteFile(tsFileResourceToBeMoved.getTsFileSize(), false, 1);
+ .deleteFile(
+ tsFileResourceToBeMoved.getTsFileSize(),
+ false,
+ 1,
+
Collections.singletonList(tsFileResourceToBeMoved.getTsFile().getName()));
break;
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
b/server/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
index ec9b7775658..bc1954142c5 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
@@ -65,6 +65,7 @@ public class FileMetrics implements IMetricSet {
}
private void bindTsFileMetrics(AbstractMetricService metricService) {
+ TS_FILE_METRIC_MANAGER.setMetricService(metricService);
metricService.createAutoGauge(
Metric.FILE_SIZE.toString(),
MetricLevel.CORE,