This is an automated email from the ASF dual-hosted git repository.

lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new e7010eec5 [core] Introduce 
compactionCompletedCount/compactionQueuedCount metrics. (#4391)
e7010eec5 is described below

commit e7010eec51b502fc7ccf53846ad25b9759aedf7a
Author: Fantasy-Jay <[email protected]>
AuthorDate: Wed Oct 30 11:14:00 2024 +0800

    [core] Introduce compactionCompletedCount/compactionQueuedCount metrics. 
(#4391)
---
 docs/content/maintenance/metrics.md                | 10 ++++++++
 .../append/BucketedAppendCompactManager.java       |  8 ++++++
 .../org/apache/paimon/compact/CompactTask.java     |  8 ++++++
 .../mergetree/compact/MergeTreeCompactManager.java |  3 +++
 .../operation/metrics/CompactionMetrics.java       | 29 ++++++++++++++++++++++
 .../operation/metrics/CompactionMetricsTest.java   | 27 +++++++++++++++++++-
 .../flink/compact/UnawareBucketCompactor.java      | 17 +++++++++++++
 .../flink/compact/UnawareBucketCompactorTest.java  | 26 +++++++++++++++----
 8 files changed, 122 insertions(+), 6 deletions(-)

diff --git a/docs/content/maintenance/metrics.md 
b/docs/content/maintenance/metrics.md
index c21be8ec0..e8a160498 100644
--- a/docs/content/maintenance/metrics.md
+++ b/docs/content/maintenance/metrics.md
@@ -249,6 +249,16 @@ Below is lists of Paimon built-in metrics. They are 
summarized into types of sca
             <td>Gauge</td>
             <td>The average runtime of compaction threads, calculated based on 
recorded compaction time data in milliseconds. The value represents the average 
duration of compaction operations. Higher values indicate longer average 
compaction times, which may suggest the need for performance optimization.</td>
         </tr>
+       <tr>
+            <td>compactionCompletedCount</td>
+            <td>Counter</td>
+            <td>The total number of compactions that have completed.</td>
+        </tr>
+        <tr>
+            <td>compactionQueuedCount</td>
+            <td>Counter</td>
+            <td>The total number of compactions that are queued/running.</td>
+        </tr>
     </tbody>
 </table>
 
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/append/BucketedAppendCompactManager.java
 
b/paimon-core/src/main/java/org/apache/paimon/append/BucketedAppendCompactManager.java
index 3f9114069..02f469624 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/append/BucketedAppendCompactManager.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/append/BucketedAppendCompactManager.java
@@ -115,10 +115,17 @@ public class BucketedAppendCompactManager extends 
CompactFutureManager {
                                 targetFileSize,
                                 rewriter,
                                 metricsReporter));
+        recordCompactionsQueuedRequest();
         compacting = new ArrayList<>(toCompact);
         toCompact.clear();
     }
 
+    private void recordCompactionsQueuedRequest() {
+        if (metricsReporter != null) {
+            metricsReporter.increaseCompactionsQueuedCount();
+        }
+    }
+
     private void triggerCompactionWithBestEffort() {
         if (taskFuture != null) {
             return;
@@ -130,6 +137,7 @@ public class BucketedAppendCompactManager extends 
CompactFutureManager {
                     executor.submit(
                             new AutoCompactTask(
                                     dvMaintainer, compacting, rewriter, 
metricsReporter));
+            recordCompactionsQueuedRequest();
         }
     }
 
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/compact/CompactTask.java 
b/paimon-core/src/main/java/org/apache/paimon/compact/CompactTask.java
index 3e5079c03..7da79aa51 100644
--- a/paimon-core/src/main/java/org/apache/paimon/compact/CompactTask.java
+++ b/paimon-core/src/main/java/org/apache/paimon/compact/CompactTask.java
@@ -53,6 +53,7 @@ public abstract class CompactTask implements 
Callable<CompactResult> {
                         if (metricsReporter != null) {
                             metricsReporter.reportCompactionTime(
                                     System.currentTimeMillis() - startMillis);
+                            
metricsReporter.increaseCompactionsCompletedCount();
                         }
                     },
                     LOG);
@@ -63,6 +64,13 @@ public abstract class CompactTask implements 
Callable<CompactResult> {
             return result;
         } finally {
             MetricUtils.safeCall(this::stopTimer, LOG);
+            MetricUtils.safeCall(this::decreaseCompactionsQueuedCount, LOG);
+        }
+    }
+
+    private void decreaseCompactionsQueuedCount() {
+        if (metricsReporter != null) {
+            metricsReporter.decreaseCompactionsQueuedCount();
         }
     }
 
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/mergetree/compact/MergeTreeCompactManager.java
 
b/paimon-core/src/main/java/org/apache/paimon/mergetree/compact/MergeTreeCompactManager.java
index 28853a123..8ae292013 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/mergetree/compact/MergeTreeCompactManager.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/mergetree/compact/MergeTreeCompactManager.java
@@ -211,6 +211,9 @@ public class MergeTreeCompactManager extends 
CompactFutureManager {
                             .collect(Collectors.joining(", ")));
         }
         taskFuture = executor.submit(task);
+        if (metricsReporter != null) {
+            metricsReporter.increaseCompactionsQueuedCount();
+        }
     }
 
     /** Finish current task, and update result files to {@link Levels}. */
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/operation/metrics/CompactionMetrics.java
 
b/paimon-core/src/main/java/org/apache/paimon/operation/metrics/CompactionMetrics.java
index dd899e9bf..b0940a939 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/operation/metrics/CompactionMetrics.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/operation/metrics/CompactionMetrics.java
@@ -20,6 +20,7 @@ package org.apache.paimon.operation.metrics;
 
 import org.apache.paimon.annotation.VisibleForTesting;
 import org.apache.paimon.data.BinaryRow;
+import org.apache.paimon.metrics.Counter;
 import org.apache.paimon.metrics.MetricGroup;
 import org.apache.paimon.metrics.MetricRegistry;
 
@@ -41,6 +42,8 @@ public class CompactionMetrics {
     public static final String AVG_LEVEL0_FILE_COUNT = "avgLevel0FileCount";
     public static final String COMPACTION_THREAD_BUSY = "compactionThreadBusy";
     public static final String AVG_COMPACTION_TIME = "avgCompactionTime";
+    public static final String COMPACTION_COMPLETED_COUNT = 
"compactionCompletedCount";
+    public static final String COMPACTION_QUEUED_COUNT = 
"compactionQueuedCount";
     private static final long BUSY_MEASURE_MILLIS = 60_000;
     private static final int COMPACTION_TIME_WINDOW = 100;
 
@@ -48,6 +51,8 @@ public class CompactionMetrics {
     private final Map<PartitionAndBucket, ReporterImpl> reporters;
     private final Map<Long, CompactTimer> compactTimers;
     private final Queue<Long> compactionTimes;
+    private Counter compactionsCompletedCounter;
+    private Counter compactionsQueuedCounter;
 
     public CompactionMetrics(MetricRegistry registry, String tableName) {
         this.metricGroup = registry.tableMetricGroup(GROUP_NAME, tableName);
@@ -70,6 +75,9 @@ public class CompactionMetrics {
         metricGroup.gauge(
                 AVG_COMPACTION_TIME, () -> 
getCompactionTimeStream().average().orElse(0.0));
         metricGroup.gauge(COMPACTION_THREAD_BUSY, () -> 
getCompactBusyStream().sum());
+
+        compactionsCompletedCounter = 
metricGroup.counter(COMPACTION_COMPLETED_COUNT);
+        compactionsQueuedCounter = 
metricGroup.counter(COMPACTION_QUEUED_COUNT);
     }
 
     private LongStream getLevel0FileCountStream() {
@@ -98,6 +106,12 @@ public class CompactionMetrics {
 
         void reportCompactionTime(long time);
 
+        void increaseCompactionsCompletedCount();
+
+        void increaseCompactionsQueuedCount();
+
+        void decreaseCompactionsQueuedCount();
+
         void unregister();
     }
 
@@ -133,6 +147,21 @@ public class CompactionMetrics {
             this.level0FileCount = count;
         }
 
+        @Override
+        public void increaseCompactionsCompletedCount() {
+            compactionsCompletedCounter.inc();
+        }
+
+        @Override
+        public void increaseCompactionsQueuedCount() {
+            compactionsQueuedCounter.inc();
+        }
+
+        @Override
+        public void decreaseCompactionsQueuedCount() {
+            compactionsQueuedCounter.dec();
+        }
+
         @Override
         public void unregister() {
             reporters.remove(key);
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CompactionMetricsTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CompactionMetricsTest.java
index 2ce1cc4ea..222b99769 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CompactionMetricsTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CompactionMetricsTest.java
@@ -19,7 +19,9 @@
 package org.apache.paimon.operation.metrics;
 
 import org.apache.paimon.data.BinaryRow;
+import org.apache.paimon.metrics.Counter;
 import org.apache.paimon.metrics.Gauge;
+import org.apache.paimon.metrics.Metric;
 import org.apache.paimon.metrics.MetricRegistryImpl;
 
 import org.junit.jupiter.api.Test;
@@ -36,6 +38,8 @@ public class CompactionMetricsTest {
         assertThat(getMetric(metrics, 
CompactionMetrics.AVG_LEVEL0_FILE_COUNT)).isEqualTo(-1.0);
         assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_THREAD_BUSY)).isEqualTo(0.0);
         assertThat(getMetric(metrics, 
CompactionMetrics.AVG_COMPACTION_TIME)).isEqualTo(0.0);
+        assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_COMPLETED_COUNT)).isEqualTo(0L);
+        assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_QUEUED_COUNT)).isEqualTo(0L);
         CompactionMetrics.Reporter[] reporters = new 
CompactionMetrics.Reporter[3];
         for (int i = 0; i < reporters.length; i++) {
             reporters[i] = metrics.createReporter(BinaryRow.EMPTY_ROW, i);
@@ -44,6 +48,8 @@ public class CompactionMetricsTest {
         assertThat(getMetric(metrics, 
CompactionMetrics.MAX_LEVEL0_FILE_COUNT)).isEqualTo(0L);
         assertThat(getMetric(metrics, 
CompactionMetrics.AVG_LEVEL0_FILE_COUNT)).isEqualTo(0.0);
         assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_THREAD_BUSY)).isEqualTo(0.0);
+        assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_COMPLETED_COUNT)).isEqualTo(0L);
+        assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_QUEUED_COUNT)).isEqualTo(0L);
 
         reporters[0].reportLevel0FileCount(5);
         reporters[1].reportLevel0FileCount(3);
@@ -60,9 +66,28 @@ public class CompactionMetricsTest {
         reporters[0].reportCompactionTime(270000);
         assertThat(getMetric(metrics, CompactionMetrics.AVG_COMPACTION_TIME))
                 .isEqualTo(273333.3333333333);
+
+        // enqueue compaction request
+        reporters[0].increaseCompactionsQueuedCount();
+        reporters[1].increaseCompactionsQueuedCount();
+        reporters[2].increaseCompactionsQueuedCount();
+        assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_COMPLETED_COUNT)).isEqualTo(0L);
+        assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_QUEUED_COUNT)).isEqualTo(3L);
+
+        // completed compactions and remove them from queue
+        reporters[0].increaseCompactionsCompletedCount();
+        reporters[0].decreaseCompactionsQueuedCount();
+        reporters[1].decreaseCompactionsQueuedCount();
+        assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_COMPLETED_COUNT)).isEqualTo(1L);
+        assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_QUEUED_COUNT)).isEqualTo(1L);
     }
 
     private Object getMetric(CompactionMetrics metrics, String metricName) {
-        return ((Gauge<?>) 
metrics.getMetricGroup().getMetrics().get(metricName)).getValue();
+        Metric metric = metrics.getMetricGroup().getMetrics().get(metricName);
+        if (metric instanceof Gauge) {
+            return ((Gauge<?>) metric).getValue();
+        } else {
+            return ((Counter) metric).getCount();
+        }
     }
 }
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/compact/UnawareBucketCompactor.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/compact/UnawareBucketCompactor.java
index a34f00907..e8021329c 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/compact/UnawareBucketCompactor.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/compact/UnawareBucketCompactor.java
@@ -100,14 +100,31 @@ public class UnawareBucketCompactor {
                                                         
metricsReporter.reportCompactionTime(
                                                                 
System.currentTimeMillis()
                                                                         - 
startMillis);
+                                                        metricsReporter
+                                                                
.increaseCompactionsCompletedCount();
                                                     }
                                                 },
                                                 LOG);
                                         return commitMessage;
                                     } finally {
                                         MetricUtils.safeCall(this::stopTimer, 
LOG);
+                                        MetricUtils.safeCall(
+                                                
this::decreaseCompactionsQueuedCount, LOG);
                                     }
                                 }));
+        recordCompactionsQueuedRequest();
+    }
+
+    private void recordCompactionsQueuedRequest() {
+        if (metricsReporter != null) {
+            metricsReporter.increaseCompactionsQueuedCount();
+        }
+    }
+
+    private void decreaseCompactionsQueuedCount() {
+        if (metricsReporter != null) {
+            metricsReporter.decreaseCompactionsQueuedCount();
+        }
     }
 
     private void startTimer() {
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/compact/UnawareBucketCompactorTest.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/compact/UnawareBucketCompactorTest.java
index 69229ddce..1ec26afab 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/compact/UnawareBucketCompactorTest.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/compact/UnawareBucketCompactorTest.java
@@ -34,8 +34,10 @@ import org.apache.paimon.table.sink.CommitMessage;
 import org.apache.paimon.types.DataTypes;
 import org.apache.paimon.utils.ExecutorThreadFactory;
 
+import org.apache.flink.metrics.Counter;
 import org.apache.flink.metrics.Gauge;
 import org.apache.flink.metrics.MetricGroup;
+import org.apache.flink.metrics.SimpleCounter;
 import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
@@ -48,6 +50,8 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 import static 
org.apache.paimon.operation.metrics.CompactionMetrics.AVG_COMPACTION_TIME;
+import static 
org.apache.paimon.operation.metrics.CompactionMetrics.COMPACTION_COMPLETED_COUNT;
+import static 
org.apache.paimon.operation.metrics.CompactionMetrics.COMPACTION_QUEUED_COUNT;
 import static 
org.apache.paimon.operation.metrics.CompactionMetrics.COMPACTION_THREAD_BUSY;
 
 /** Test for {@link UnawareBucketCompactor}. */
@@ -65,7 +69,8 @@ public class UnawareBucketCompactorTest {
                 Executors.newSingleThreadScheduledExecutor(
                         new ExecutorThreadFactory(
                                 Thread.currentThread().getName() + 
"-append-only-compact-worker"));
-        Map<String, Gauge> map = new HashMap<>();
+        Map<String, Gauge> gaugeMap = new HashMap<>();
+        Map<String, Counter> counterMap = new HashMap<>();
         UnawareBucketCompactor unawareBucketCompactor =
                 new UnawareBucketCompactor(
                         (FileStoreTable) catalog.getTable(identifier()),
@@ -74,7 +79,7 @@ public class UnawareBucketCompactorTest {
                         new FileStoreSourceReaderTest.DummyMetricGroup() {
                             @Override
                             public <T, G extends Gauge<T>> G gauge(String 
name, G gauge) {
-                                map.put(name, gauge);
+                                gaugeMap.put(name, gauge);
                                 return null;
                             }
 
@@ -87,6 +92,13 @@ public class UnawareBucketCompactorTest {
                             public MetricGroup addGroup(String key, String 
value) {
                                 return this;
                             }
+
+                            @Override
+                            public Counter counter(String name) {
+                                SimpleCounter counter = new SimpleCounter();
+                                counterMap.put(name, counter);
+                                return counter;
+                            }
                         });
 
         for (int i = 0; i < 320; i++) {
@@ -94,11 +106,15 @@ public class UnawareBucketCompactorTest {
             Thread.sleep(250);
         }
 
-        double compactionThreadBusy = (double) 
map.get(COMPACTION_THREAD_BUSY).getValue();
-        double compactionAvrgTime = (double) 
map.get(AVG_COMPACTION_TIME).getValue();
+        double compactionThreadBusy = (double) 
gaugeMap.get(COMPACTION_THREAD_BUSY).getValue();
+        double compactionAvgTime = (double) 
gaugeMap.get(AVG_COMPACTION_TIME).getValue();
+        long compactionsCompletedCount = 
counterMap.get(COMPACTION_COMPLETED_COUNT).getCount();
+        long compactionsQueuedCount = 
counterMap.get(COMPACTION_QUEUED_COUNT).getCount();
 
         
Assertions.assertThat(compactionThreadBusy).isGreaterThan(45).isLessThan(55);
-        
Assertions.assertThat(compactionAvrgTime).isGreaterThan(120).isLessThan(140);
+        
Assertions.assertThat(compactionAvgTime).isGreaterThan(120).isLessThan(140);
+        Assertions.assertThat(compactionsCompletedCount).isEqualTo(320L);
+        Assertions.assertThat(compactionsQueuedCount).isEqualTo(0L);
     }
 
     protected Catalog getCatalog() {

Reply via email to