From e50bc13aed53c9844119b7321bee36ee0d68e6eb Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Wed, 21 Oct 2026 11:43:18 +0800 Subject: [PATCH] Fix table-model schema series metrics --- .../metric/SchemaRegionMemMetric.java | 17 +++++- .../metric/SchemaMemMetricTableTest.java | 55 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/metric/SchemaRegionMemMetric.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/metric/SchemaRegionMemMetric.java index 8969feb3f74ed..1719d7640dedc 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/metric/SchemaRegionMemMetric.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/metric/SchemaRegionMemMetric.java @@ -19,9 +19,11 @@ package org.apache.iotdb.db.schemaengine.metric; +import org.apache.iotdb.commons.schema.table.TsTable; import org.apache.iotdb.commons.service.metric.enums.Metric; import org.apache.iotdb.commons.service.metric.enums.Tag; import org.apache.iotdb.db.schemaengine.rescon.MemSchemaRegionStatistics; +import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache; import org.apache.iotdb.metrics.AbstractMetricService; import org.apache.iotdb.metrics.impl.DoNothingMetricManager; import org.apache.iotdb.metrics.type.Timer; @@ -83,7 +85,7 @@ public void bindTo(AbstractMetricService metricService) { Metric.SCHEMA_REGION.toString(), MetricLevel.IMPORTANT, regionStatistics, - i -> i.getSeriesNumber(true), + i -> i.getSeriesNumber(true) + getTableSeriesNumber(), Tag.NAME.toString(), SERIES_CNT, Tag.REGION.toString(), @@ -94,7 +96,7 @@ public void bindTo(AbstractMetricService metricService) { Metric.SCHEMA_REGION.toString(), MetricLevel.IMPORTANT, regionStatistics, - i -> i.getSeriesNumber(false), + i -> i.getSeriesNumber(false) + getTableSeriesNumber(), Tag.NAME.toString(), NON_VIEW_SERIES_CNT, Tag.REGION.toString(), @@ -154,6 +156,17 @@ public void bindTableMetrics(final String tableName) { tableName); } + private long getTableSeriesNumber() { + return regionStatistics.getTable2DevicesNumMap().entrySet().stream() + .mapToLong( + entry -> { + final TsTable table = + DataNodeTableCache.getInstance().getTableInCache(database, entry.getKey()); + return table == null ? 0 : (long) table.getFieldNum() * entry.getValue(); + }) + .sum(); + } + @Override public void unbindFrom(AbstractMetricService metricService) { traverserTimer = DoNothingMetricManager.DO_NOTHING_TIMER; diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/metric/SchemaMemMetricTableTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/metric/SchemaMemMetricTableTest.java index 294f5df630122..f9e92207f34fb 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/metric/SchemaMemMetricTableTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/metric/SchemaMemMetricTableTest.java @@ -19,9 +19,14 @@ package org.apache.iotdb.db.schemaengine.metric; +import org.apache.iotdb.commons.schema.table.TsTable; +import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema; import org.apache.iotdb.commons.service.metric.MetricService; +import org.apache.iotdb.commons.service.metric.enums.Tag; import org.apache.iotdb.db.schemaengine.rescon.MemSchemaEngineStatistics; import org.apache.iotdb.db.schemaengine.rescon.MemSchemaRegionStatistics; +import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache; +import org.apache.iotdb.db.schemaengine.table.ITableCache; import org.apache.iotdb.metrics.config.MetricConfig; import org.apache.iotdb.metrics.config.MetricConfigDescriptor; import org.apache.iotdb.metrics.metricsets.IMetricSet; @@ -30,6 +35,9 @@ import org.apache.iotdb.metrics.utils.MetricInfo; import org.apache.iotdb.metrics.utils.MetricLevel; +import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.file.metadata.enums.CompressionType; +import org.apache.tsfile.file.metadata.enums.TSEncoding; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -51,6 +59,8 @@ public class SchemaMemMetricTableTest { private static final String TABLE = "t1"; + private static final String DATABASE = "root.prometheus_metric_test"; + private static final int SCHEMA_REGION_ID = 4321; private final MetricService service = MetricService.getInstance(); private final MetricConfig config = MetricConfigDescriptor.getInstance().getMetricConfig(); @@ -95,6 +105,39 @@ public void testSchemaRegionTableMetrics() { checkTableMetrics(metric, metric::bindTableMetrics, table2DevicesNum); } + @Test + public void testSchemaRegionSeriesMetricsIncludeTableMeasurements() { + final ITableCache tableCache = DataNodeTableCache.getInstance(); + tableCache.invalid(DATABASE); + final TsTable table = new TsTable(TABLE); + table.addColumnSchema( + new FieldColumnSchema("s1", TSDataType.INT32, TSEncoding.RLE, CompressionType.GZIP)); + table.addColumnSchema( + new FieldColumnSchema("s2", TSDataType.INT32, TSEncoding.RLE, CompressionType.GZIP)); + tableCache.preUpdateTable(DATABASE, table, null); + tableCache.commitUpdateTable(DATABASE, TABLE, null); + + final MemSchemaRegionStatistics statistics = + new MemSchemaRegionStatistics(SCHEMA_REGION_ID, new MemSchemaEngineStatistics()); + statistics.addMeasurement(2); + statistics.addView(1); + statistics.getTable2DevicesNumMap().put(TABLE, 3L); + final SchemaRegionMemMetric metric = new SchemaRegionMemMetric(statistics, DATABASE); + + service.addMetricSet(metric); + try { + assertEquals( + 9, getSchemaRegionGauge("schema_region_series_cnt", SCHEMA_REGION_ID).getValue(), 0); + assertEquals( + 8, + getSchemaRegionGauge("schema_region_non_view_series_cnt", SCHEMA_REGION_ID).getValue(), + 0); + } finally { + service.removeMetricSet(metric); + tableCache.invalid(DATABASE); + } + } + private void checkTableMetrics( final IMetricSet metric, final Consumer bindTableMetrics, @@ -130,4 +173,16 @@ private IMetric findTableGauge() { } return null; } + + private AutoGauge getSchemaRegionGauge(final String name, final int schemaRegionId) { + for (final Map.Entry entry : service.getAllMetrics().entrySet()) { + if (name.equals(entry.getKey().getTags().get(Tag.NAME.toString())) + && ("SchemaRegion[" + schemaRegionId + "]") + .equals(entry.getKey().getTags().get(Tag.REGION.toString()))) { + return (AutoGauge) entry.getValue(); + } + } + throw new AssertionError( + "Gauge " + name + " for SchemaRegion[" + schemaRegionId + "] is missing"); + } }