This is an automated email from the ASF dual-hosted git repository. spricoder pushed a commit to branch feature/disk-metric in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 289b02cc0713eab21ae0ed2333c8438c2550a2a2 Author: spricoder <[email protected]> AuthorDate: Thu Sep 21 13:30:23 2023 +0800 add database and region tags into file metric --- .../iotdb/db/service/metrics/FileMetrics.java | 162 +++++++++++++++------ .../db/storageengine/dataregion/DataRegion.java | 47 +++--- .../execute/task/CrossSpaceCompactionTask.java | 6 +- .../execute/task/InnerSpaceCompactionTask.java | 2 + .../compaction/execute/utils/CompactionUtils.java | 14 +- 5 files changed, 151 insertions(+), 80 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java index c57a3a8526e..8b7d627ea37 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java @@ -25,6 +25,7 @@ import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.Abst import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.CompactionTaskSummary; import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.InnerSpaceCompactionTask; import org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionTaskManager; +import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource; import org.apache.iotdb.db.storageengine.dataregion.tsfile.generator.TsFileNameGenerator; import org.apache.iotdb.db.storageengine.dataregion.wal.WALManager; import org.apache.iotdb.metrics.AbstractMetricService; @@ -66,6 +67,10 @@ public class FileMetrics implements IMetricSet { private static final String SEQUENCE = "sequence"; private static final String UNSEQUENCE = "unsequence"; private static final String LEVEL = "level"; + private final Map<String, Map<String, Long>> seqFileSizeGaugeMap = new ConcurrentHashMap<>(); + private final Map<String, Map<String, Long>> unseqFileSizeGaugeMap = new ConcurrentHashMap<>(); + private final Map<String, Map<String, Integer>> seqFileNumGaugeMap = new ConcurrentHashMap<>(); + private final Map<String, Map<String, Integer>> unseqFileNumGaugeMap = new ConcurrentHashMap<>(); private final AtomicLong seqFileSize = new AtomicLong(0); private final AtomicLong unseqFileSize = new AtomicLong(0); private final AtomicInteger seqFileNum = new AtomicInteger(0); @@ -114,20 +119,6 @@ public class FileMetrics implements IMetricSet { } private void bindTsFileMetrics(AbstractMetricService metricService) { - metricService.createAutoGauge( - Metric.FILE_SIZE.toString(), - MetricLevel.CORE, - this, - o -> o.getFileSize(true), - Tag.NAME.toString(), - "seq"); - metricService.createAutoGauge( - Metric.FILE_SIZE.toString(), - MetricLevel.CORE, - this, - o -> o.getFileSize(false), - Tag.NAME.toString(), - "unseq"); metricService.createAutoGauge( Metric.FILE_SIZE.toString(), MetricLevel.CORE, @@ -135,20 +126,6 @@ public class FileMetrics implements IMetricSet { FileMetrics::getModFileSize, Tag.NAME.toString(), "mods"); - metricService.createAutoGauge( - Metric.FILE_COUNT.toString(), - MetricLevel.CORE, - this, - o -> o.getFileNum(true), - Tag.NAME.toString(), - "seq"); - metricService.createAutoGauge( - Metric.FILE_COUNT.toString(), - MetricLevel.CORE, - this, - o -> o.getFileNum(false), - Tag.NAME.toString(), - "unseq"); metricService.createAutoGauge( Metric.FILE_COUNT.toString(), MetricLevel.CORE, @@ -333,8 +310,8 @@ public class FileMetrics implements IMetricSet { } // following are update functions for tsfile metrics - public void addFile(long size, boolean seq, String name) { - updateGlobalCountAndSize(size, 1, seq); + public void addFile(String database, String regionId, long size, boolean seq, String name) { + updateGlobalCountAndSize(database, regionId, size, 1, seq); try { TsFileNameGenerator.TsFileName tsFileName = TsFileNameGenerator.getTsFileName(name); int level = tsFileName.getInnerCompactionCnt(); @@ -344,13 +321,110 @@ public class FileMetrics implements IMetricSet { } } - private void updateGlobalCountAndSize(long sizeDelta, int countDelta, boolean seq) { + private void updateGlobalCountAndSize( + String database, String regionId, long sizeDelta, int countDelta, boolean seq) { if (seq) { - seqFileSize.getAndAdd(sizeDelta); - seqFileNum.getAndAdd(countDelta); + // update sequence file size + seqFileSizeGaugeMap.compute( + database, + (k, v) -> { + long size = 0; + if (v == null) { + v = new ConcurrentHashMap<>(); + } else if (v.containsKey(regionId)) { + size = v.get(regionId); + } + v.put(regionId, size + sizeDelta); + return v; + }); + // update sequence file number + seqFileNumGaugeMap.compute( + database, + (k, v) -> { + int count = 0; + if (v == null) { + v = new ConcurrentHashMap<>(); + } else if (v.containsKey(regionId)) { + count += countDelta; + } + v.put(regionId, count); + return v; + }); + // update sequence file size metric + metricService + .getOrCreateGauge( + Metric.FILE_SIZE.toString(), + MetricLevel.CORE, + Tag.NAME.toString(), + "seq", + Tag.DATABASE.toString(), + database, + Tag.REGION.toString(), + regionId) + .set(seqFileSizeGaugeMap.get(database).get(regionId)); + // update sequence file number metric + metricService + .getOrCreateGauge( + Metric.FILE_COUNT.toString(), + MetricLevel.CORE, + Tag.NAME.toString(), + "seq", + Tag.DATABASE.toString(), + database, + Tag.REGION.toString(), + regionId) + .set(seqFileNumGaugeMap.get(database).get(regionId)); } else { - unseqFileSize.getAndAdd(sizeDelta); - unseqFileNum.getAndAdd(countDelta); + // update unsequence file size + unseqFileSizeGaugeMap.compute( + database, + (k, v) -> { + long size = 0; + if (v == null) { + v = new ConcurrentHashMap<>(); + } else if (v.containsKey(regionId)) { + size = v.get(regionId); + } + v.put(regionId, size + sizeDelta); + return v; + }); + // update unsequence file number + unseqFileNumGaugeMap.compute( + database, + (k, v) -> { + int count = 0; + if (v == null) { + v = new ConcurrentHashMap<>(); + } else if (v.containsKey(regionId)) { + count = v.get(regionId); + } + v.put(regionId, count + countDelta); + return v; + }); + // update unsequence file size metric + metricService + .getOrCreateGauge( + Metric.FILE_SIZE.toString(), + MetricLevel.CORE, + Tag.NAME.toString(), + "unseq", + Tag.DATABASE.toString(), + database, + Tag.REGION.toString(), + regionId) + .set(unseqFileSizeGaugeMap.get(database).get(regionId)); + // update unsequence file number metric + metricService + .getOrCreateGauge( + Metric.FILE_COUNT.toString(), + MetricLevel.CORE, + Tag.NAME.toString(), + "unseq", + Tag.DATABASE.toString(), + database, + Tag.REGION.toString(), + regionId) + .set(unseqFileNumGaugeMap.get(database).get(regionId)); } } @@ -435,19 +509,15 @@ public class FileMetrics implements IMetricSet { .set(size); } - public void deleteFile(long[] sizeList, boolean seq, List<String> names) { - long totalSize = 0; - for (long size : sizeList) { - totalSize += size; - } - updateGlobalCountAndSize(-totalSize, -sizeList.length, seq); - for (int i = 0, length = names.size(); i < length; ++i) { - int level = -1; - String name = names.get(i); - long size = sizeList[i]; + public void deleteFile(boolean seq, List<TsFileResource> tsFileResourceList) { + for (TsFileResource tsFileResource : tsFileResourceList) { + String name = tsFileResource.getTsFile().getName(); + long size = tsFileResource.getTsFileSize(); + updateGlobalCountAndSize( + tsFileResource.getDatabaseName(), tsFileResource.getDataRegionId(), -size, -1, seq); try { TsFileNameGenerator.TsFileName tsFileName = TsFileNameGenerator.getTsFileName(name); - level = tsFileName.getInnerCompactionCnt(); + int level = tsFileName.getInnerCompactionCnt(); updateLevelCountAndSize(-size, -1, seq, level); } catch (IOException e) { log.warn("Unexpected error occurred when getting tsfile name", e); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java index 0794f469073..61f01a7c02a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java @@ -443,7 +443,12 @@ public class DataRegion implements IDataRegionForQuery { for (TsFileResource resource : value) { if (resource.resourceFileExists()) { FileMetrics.getInstance() - .addFile(resource.getTsFile().length(), true, resource.getTsFile().getName()); + .addFile( + resource.getDatabaseName(), + resource.getDataRegionId(), + resource.getTsFile().length(), + true, + resource.getTsFile().getName()); if (resource.getModFile().exists()) { FileMetrics.getInstance().increaseModFileNum(1); FileMetrics.getInstance().increaseModFileSize(resource.getModFile().getSize()); @@ -469,7 +474,12 @@ public class DataRegion implements IDataRegionForQuery { for (TsFileResource resource : value) { if (resource.resourceFileExists()) { FileMetrics.getInstance() - .addFile(resource.getTsFile().length(), false, resource.getTsFile().getName()); + .addFile( + resource.getDatabaseName(), + resource.getDataRegionId(), + resource.getTsFile().length(), + false, + resource.getTsFile().getName()); } if (resource.getModFile().exists()) { FileMetrics.getInstance().increaseModFileNum(1); @@ -703,6 +713,8 @@ public class DataRegion implements IDataRegionForQuery { tsFileResourceManager.registerSealedTsFileResource(tsFileResource); FileMetrics.getInstance() .addFile( + tsFileResource.getDatabaseName(), + tsFileResource.getDataRegionId(), tsFileResource.getTsFile().length(), recoverPerformer.isSequence(), tsFileResource.getTsFile().getName()); @@ -1445,11 +1457,7 @@ public class DataRegion implements IDataRegionForQuery { tsFileResourceList.addAll(tsFileManager.getTsFileList(false)); tsFileResourceList.forEach( x -> { - FileMetrics.getInstance() - .deleteFile( - new long[] {x.getTsFileSize()}, - x.isSeq(), - Collections.singletonList(x.getTsFile().getName())); + FileMetrics.getInstance().deleteFile(x.isSeq(), Collections.singletonList(x)); if (x.getModFile().exists()) { FileMetrics.getInstance().decreaseModFileNum(1); FileMetrics.getInstance().decreaseModFileSize(x.getModFile().getSize()); @@ -1524,11 +1532,7 @@ public class DataRegion implements IDataRegionForQuery { try { // try to delete physical data file resource.remove(); - FileMetrics.getInstance() - .deleteFile( - new long[] {resource.getTsFileSize()}, - isSeq, - Collections.singletonList(resource.getTsFile().getName())); + FileMetrics.getInstance().deleteFile(isSeq, Collections.singletonList(resource)); logger.info( "Removed a file {} before {} by ttl ({} {})", resource.getTsFilePath(), @@ -2074,11 +2078,14 @@ public class DataRegion implements IDataRegionForQuery { synchronized (closeStorageGroupCondition) { closeStorageGroupCondition.notifyAll(); } + TsFileResource tsFileResource = tsFileProcessor.getTsFileResource(); FileMetrics.getInstance() .addFile( - tsFileProcessor.getTsFileResource().getTsFileSize(), + tsFileResource.getDatabaseName(), + tsFileResource.getDataRegionId(), + tsFileResource.getTsFileSize(), tsFileProcessor.isSequence(), - tsFileProcessor.getTsFileResource().getTsFile().getName()); + tsFileResource.getTsFile().getName()); logger.info("signal closing database condition in {}", databaseName + "-" + dataRegionId); } @@ -2203,6 +2210,8 @@ public class DataRegion implements IDataRegionForQuery { FileMetrics.getInstance() .addFile( + newTsFileResource.getDatabaseName(), + newTsFileResource.getDataRegionId(), newTsFileResource.getTsFile().length(), false, newTsFileResource.getTsFile().getName()); @@ -2492,10 +2501,7 @@ public class DataRegion implements IDataRegionForQuery { tsFileResourceToBeMoved = sequenceResource; tsFileManager.remove(tsFileResourceToBeMoved, true); FileMetrics.getInstance() - .deleteFile( - new long[] {tsFileResourceToBeMoved.getTsFileSize()}, - true, - Collections.singletonList(tsFileResourceToBeMoved.getTsFile().getName())); + .deleteFile(true, Collections.singletonList(tsFileResourceToBeMoved)); break; } } @@ -2507,10 +2513,7 @@ public class DataRegion implements IDataRegionForQuery { tsFileResourceToBeMoved = unsequenceResource; tsFileManager.remove(tsFileResourceToBeMoved, false); FileMetrics.getInstance() - .deleteFile( - new long[] {tsFileResourceToBeMoved.getTsFileSize()}, - false, - Collections.singletonList(tsFileResourceToBeMoved.getTsFile().getName())); + .deleteFile(false, Collections.singletonList(tsFileResourceToBeMoved)); break; } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java index af9c49eb5b9..03ac69e3c0d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java @@ -220,7 +220,11 @@ public class CrossSpaceCompactionTask extends AbstractCompactionTask { if (!targetResource.isDeleted()) { FileMetrics.getInstance() .addFile( - targetResource.getTsFileSize(), true, targetResource.getTsFile().getName()); + targetResource.getDatabaseName(), + targetResource.getDataRegionId(), + targetResource.getTsFileSize(), + true, + targetResource.getTsFile().getName()); // set target resources to CLOSED, so that they can be selected to compact targetResource.setStatus(TsFileResourceStatus.NORMAL); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java index 301f7b16634..8fa7481654e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java @@ -258,6 +258,8 @@ public class InnerSpaceCompactionTask extends AbstractCompactionTask { if (!targetTsFileResource.isDeleted()) { FileMetrics.getInstance() .addFile( + targetTsFileResource.getDatabaseName(), + targetTsFileResource.getDataRegionId(), targetTsFileResource.getTsFile().length(), sequence, targetTsFileResource.getTsFile().getName()); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java index ae76fc1a0cf..a44730501ad 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java @@ -54,7 +54,6 @@ import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -446,9 +445,7 @@ public class CompactionUtils { public static void deleteSourceTsFileAndUpdateFileMetrics( List<TsFileResource> resources, boolean seq) { - long[] fileSizes = new long[resources.size()]; - List<String> fileNames = new ArrayList<>(resources.size()); - int removeSuccessFileNum = 0; + List<TsFileResource> removeResources = new ArrayList<>(); for (TsFileResource resource : resources) { if (!resource.remove()) { logger.warn( @@ -456,14 +453,9 @@ public class CompactionUtils { resource.getTsFile().getAbsolutePath()); } else { logger.info("[Compaction] delete file: {}", resource.getTsFile().getAbsolutePath()); - fileSizes[removeSuccessFileNum] = resource.getTsFileSize(); - fileNames.add(resource.getTsFile().getName()); - removeSuccessFileNum++; + removeResources.add(resource); } } - if (removeSuccessFileNum != 0) { - fileSizes = Arrays.copyOfRange(fileSizes, 0, removeSuccessFileNum); - FileMetrics.getInstance().deleteFile(fileSizes, seq, fileNames); - } + FileMetrics.getInstance().deleteFile(seq, resources); } }
