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

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


The following commit(s) were added to refs/heads/master by this push:
     new 168800087 [AMORO-1766] Implement table optimizing metrics collection. 
(#2674)
168800087 is described below

commit 168800087886c17df3d6081ec8d4cb5522b26174
Author: baiyangtx <[email protected]>
AuthorDate: Wed Apr 24 15:36:43 2024 +0800

    [AMORO-1766] Implement table optimizing metrics collection. (#2674)
    
    * table optimizing metrics
    
    * review comments
    
    * review comments
    
    * fix reviews
    
    * fix reviews
    
    * fix reviews
    
    * fix merge conflict
    
    ---------
    
    Co-authored-by: ZhouJinsong <[email protected]>
---
 .../amoro/server/optimizing/OptimizingQueue.java   |   3 +
 .../apache/amoro/server/table/TableMetrics.java    | 180 -----------
 .../amoro/server/table/TableOptimizingMetrics.java | 353 +++++++++++++++++++++
 .../apache/amoro/server/table/TableRuntime.java    |  22 +-
 .../server/optimizing/TestOptimizingQueue.java     |   4 -
 5 files changed, 368 insertions(+), 194 deletions(-)

diff --git 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/optimizing/OptimizingQueue.java
 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/optimizing/OptimizingQueue.java
index eaa7bb316..a1c1842a9 100644
--- 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/optimizing/OptimizingQueue.java
+++ 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/optimizing/OptimizingQueue.java
@@ -414,6 +414,9 @@ public class OptimizingQueue extends PersistentBase {
     public void close() {
       lock.lock();
       try {
+        if (this.status != Status.RUNNING) {
+          return;
+        }
         this.status = OptimizingProcess.Status.CLOSED;
         this.endTime = System.currentTimeMillis();
         persistProcessCompleted(false);
diff --git 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableMetrics.java
 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableMetrics.java
deleted file mode 100644
index e547159ec..000000000
--- 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableMetrics.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.amoro.server.table;
-
-import static org.apache.amoro.api.metrics.MetricDefine.defineGauge;
-
-import org.apache.amoro.api.ServerTableIdentifier;
-import org.apache.amoro.api.metrics.Gauge;
-import org.apache.amoro.api.metrics.Metric;
-import org.apache.amoro.api.metrics.MetricDefine;
-import org.apache.amoro.api.metrics.MetricKey;
-import org.apache.amoro.server.metrics.MetricRegistry;
-import org.apache.amoro.server.optimizing.OptimizingStatus;
-import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
-import org.apache.iceberg.relocated.com.google.common.collect.Lists;
-
-import java.util.List;
-
-public class TableMetrics {
-  /** Table is no need optimizing. */
-  public static final String STATE_IDLE = "idle";
-
-  /** Table is need optimizing, but waiting for resource */
-  public static final String STATE_PENDING = "pending";
-
-  /** Table is doing optimizing process planing. */
-  public static final String STATE_PLANING = "planing";
-
-  /** Table is executing optimizing process */
-  public static final String STATE_EXECUTING = "executing";
-
-  /** All optimizing process task is done, and process is committing. */
-  public static final String STATE_COMMITTING = "committing";
-
-  // table optimizing status duration metrics
-  public static final MetricDefine TABLE_OPTIMIZING_STATE_IDLE_DURATION =
-      defineGauge("table_optimizing_status_idle_duration_mills")
-          .withDescription("Duration in seconds after table be in idle state")
-          .withTags("catalog", "database", "table")
-          .build();
-
-  public static final MetricDefine TABLE_OPTIMIZING_STATE_PENDING_DURATION =
-      defineGauge("table_optimizing_status_pending_duration_mills")
-          .withDescription("Duration in seconds after table be in pending 
state")
-          .withTags("catalog", "database", "table")
-          .build();
-
-  public static final MetricDefine TABLE_OPTIMIZING_STATE_PLANNING_DURATION =
-      defineGauge("table_optimizing_status_planning_duration_mills")
-          .withDescription("Duration in seconds after table be in planning 
state")
-          .withTags("catalog", "database", "table")
-          .build();
-
-  public static final MetricDefine TABLE_OPTIMIZING_STATE_EXECUTING_DURATION =
-      defineGauge("table_optimizing_status_executing_duration_mills")
-          .withDescription("Duration in seconds after table be in executing 
state")
-          .withTags("catalog", "database", "table")
-          .build();
-
-  public static final MetricDefine TABLE_OPTIMIZING_STATE_COMMITTING_DURATION =
-      defineGauge("table_optimizing_status_committing_duration_mills")
-          .withDescription("Duration in seconds after table be in committing 
state")
-          .withTags("catalog", "database", "table")
-          .build();
-
-  private final ServerTableIdentifier identifier;
-
-  private OptimizingStatus optimizingStatus;
-  private long stateSetTimestamp = System.currentTimeMillis();
-  private final List<MetricKey> registeredMetricKeys = Lists.newArrayList();
-  private MetricRegistry globalRegistry;
-
-  public TableMetrics(ServerTableIdentifier identifier) {
-    this.identifier = identifier;
-  }
-
-  private void registerMetric(MetricRegistry registry, MetricDefine define, 
Metric metric) {
-    MetricKey key =
-        registry.register(
-            define,
-            ImmutableMap.of(
-                "catalog",
-                identifier.getCatalog(),
-                "database",
-                identifier.getDatabase(),
-                "table",
-                identifier.getTableName()),
-            metric);
-    registeredMetricKeys.add(key);
-  }
-
-  public void register(MetricRegistry registry) {
-    if (globalRegistry == null) {
-      registerMetric(
-          registry, TABLE_OPTIMIZING_STATE_IDLE_DURATION, new 
StateDurationGauge(STATE_IDLE));
-      registerMetric(
-          registry, TABLE_OPTIMIZING_STATE_PENDING_DURATION, new 
StateDurationGauge(STATE_PENDING));
-      registerMetric(
-          registry,
-          TABLE_OPTIMIZING_STATE_PLANNING_DURATION,
-          new StateDurationGauge(STATE_PLANING));
-      registerMetric(
-          registry,
-          TABLE_OPTIMIZING_STATE_EXECUTING_DURATION,
-          new StateDurationGauge(STATE_EXECUTING));
-      registerMetric(
-          registry,
-          TABLE_OPTIMIZING_STATE_COMMITTING_DURATION,
-          new StateDurationGauge(STATE_COMMITTING));
-      globalRegistry = registry;
-    }
-  }
-
-  public void unregister() {
-    registeredMetricKeys.forEach(globalRegistry::unregister);
-    registeredMetricKeys.clear();
-    globalRegistry = null;
-  }
-
-  public void stateChanged(OptimizingStatus optimizingStatus, long 
stateSetTimestamp) {
-    this.optimizingStatus = optimizingStatus;
-    this.stateSetTimestamp = stateSetTimestamp;
-  }
-
-  class StateDurationGauge implements Gauge<Long> {
-    final String targetState;
-
-    StateDurationGauge(String targetState) {
-      this.targetState = targetState;
-    }
-
-    @Override
-    public Long getValue() {
-      String state = optimizingStatusToMetricState(optimizingStatus);
-      if (targetState.equals(state)) {
-        return stateDuration();
-      }
-      return 0L;
-    }
-
-    private String optimizingStatusToMetricState(OptimizingStatus status) {
-      switch (status) {
-        case IDLE:
-          return STATE_IDLE;
-        case PENDING:
-          return STATE_PENDING;
-        case PLANNING:
-          return STATE_PLANING;
-        case FULL_OPTIMIZING:
-        case MAJOR_OPTIMIZING:
-        case MINOR_OPTIMIZING:
-          return STATE_EXECUTING;
-        case COMMITTING:
-          return STATE_COMMITTING;
-        default:
-          return status.name();
-      }
-    }
-
-    private Long stateDuration() {
-      return System.currentTimeMillis() - stateSetTimestamp;
-    }
-  }
-}
diff --git 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableOptimizingMetrics.java
 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableOptimizingMetrics.java
new file mode 100644
index 000000000..6ee04c5cc
--- /dev/null
+++ 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableOptimizingMetrics.java
@@ -0,0 +1,353 @@
+/*
+ * 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.amoro.server.table;
+
+import static org.apache.amoro.api.metrics.MetricDefine.defineCounter;
+import static org.apache.amoro.api.metrics.MetricDefine.defineGauge;
+
+import org.apache.amoro.api.ServerTableIdentifier;
+import org.apache.amoro.api.metrics.Counter;
+import org.apache.amoro.api.metrics.Gauge;
+import org.apache.amoro.api.metrics.Metric;
+import org.apache.amoro.api.metrics.MetricDefine;
+import org.apache.amoro.api.metrics.MetricKey;
+import org.apache.amoro.server.metrics.MetricRegistry;
+import org.apache.amoro.server.optimizing.OptimizingStatus;
+import org.apache.amoro.server.optimizing.OptimizingType;
+import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
+import org.apache.iceberg.relocated.com.google.common.collect.Lists;
+
+import java.util.List;
+
+/** Table self optimizing metrics */
+public class TableOptimizingMetrics {
+  /** Table is no need optimizing. */
+  public static final String STATUS_IDLE = "idle";
+
+  /** Table is need optimizing, but waiting for resource */
+  public static final String STATUS_PENDING = "pending";
+
+  /** Table is doing optimizing process planing. */
+  public static final String STATUS_PLANING = "planing";
+
+  /** Table is executing optimizing process */
+  public static final String STATUS_EXECUTING = "executing";
+
+  /** All optimizing process task is done, and process is committing. */
+  public static final String STATUS_COMMITTING = "committing";
+
+  // table optimizing status duration metrics
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_IDLE_DURATION =
+      defineGauge("table_optimizing_status_idle_duration_mills")
+          .withDescription("Duration in seconds after table be in idle status")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_PENDING_DURATION =
+      defineGauge("table_optimizing_status_pending_duration_mills")
+          .withDescription("Duration in seconds after table be in pending 
status")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_PLANNING_DURATION =
+      defineGauge("table_optimizing_status_planning_duration_mills")
+          .withDescription("Duration in seconds after table be in planning 
status")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_EXECUTING_DURATION =
+      defineGauge("table_optimizing_status_executing_duration_mills")
+          .withDescription("Duration in seconds after table be in executing 
status")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_COMMITTING_DURATION 
=
+      defineGauge("table_optimizing_status_committing_duration_mills")
+          .withDescription("Duration in seconds after table be in committing 
status")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  // table optimizing process count metrics
+  public static final MetricDefine TABLE_OPTIMIZING_PROCESS_TOTAL_COUNT =
+      defineCounter("table_optimizing_process_total_count")
+          .withDescription("Count of all process since ams started")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_PROCESS_FAILED_COUNT =
+      defineCounter("table_optimizing_process_failed_count")
+          .withDescription("Count of failed process since ams started")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_MINOR_TOTAL_COUNT =
+      defineCounter("table_optimizing_minor_total_count")
+          .withDescription("Count of minor process since ams started")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_MINOR_FAILED_COUNT =
+      defineCounter("table_optimizing_minor_failed_count")
+          .withDescription("Count of failed minor process since ams started")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_MAJOR_TOTAL_COUNT =
+      defineCounter("table_optimizing_major_total_count")
+          .withDescription("Count of major process since ams started")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_MAJOR_FAILED_COUNT =
+      defineCounter("table_optimizing_major_failed_count")
+          .withDescription("Count of failed major process since ams started")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_FULL_TOTAL_COUNT =
+      defineCounter("table_optimizing_full_total_count")
+          .withDescription("Count of full process since ams started")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_FULL_FAILED_COUNT =
+      defineCounter("table_optimizing_full_failed_count")
+          .withDescription("Count of failed full process since ams started")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  // table optimizing process status metrics
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_IN_IDLE =
+      defineGauge("table_optimizing_status_in_idle")
+          .withDescription("If currently table is in status idle")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_IN_PENDING =
+      defineGauge("table_optimizing_status_in_pending")
+          .withDescription("If currently table is in status pending")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_IN_PLANNING =
+      defineGauge("table_optimizing_status_in_planning")
+          .withDescription("If currently table is in status planning")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_IN_EXECUTING =
+      defineGauge("table_optimizing_status_in_executing")
+          .withDescription("If currently table is in status executing")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  public static final MetricDefine TABLE_OPTIMIZING_STATUS_IN_COMMITTING =
+      defineGauge("table_optimizing_status_in_committing")
+          .withDescription("If currently table is in status committing")
+          .withTags("catalog", "database", "table")
+          .build();
+
+  private final Counter processTotalCount = new Counter();
+  private final Counter processFailedCount = new Counter();
+  private final Counter minorTotalCount = new Counter();
+  private final Counter minorFailedCount = new Counter();
+  private final Counter majorTotalCount = new Counter();
+  private final Counter majorFailedCount = new Counter();
+  private final Counter fullTotalCount = new Counter();
+  private final Counter fullFailedCount = new Counter();
+
+  private final ServerTableIdentifier identifier;
+
+  private OptimizingStatus optimizingStatus;
+  private long stateSetTimestamp = System.currentTimeMillis();
+  private final List<MetricKey> registeredMetricKeys = Lists.newArrayList();
+  private MetricRegistry globalRegistry;
+
+  public TableOptimizingMetrics(ServerTableIdentifier identifier) {
+    this.identifier = identifier;
+  }
+
+  private void registerMetric(MetricRegistry registry, MetricDefine define, 
Metric metric) {
+    MetricKey key =
+        registry.register(
+            define,
+            ImmutableMap.of(
+                "catalog",
+                identifier.getCatalog(),
+                "database",
+                identifier.getDatabase(),
+                "table",
+                identifier.getTableName()),
+            metric);
+    registeredMetricKeys.add(key);
+  }
+
+  public void register(MetricRegistry registry) {
+    if (globalRegistry == null) {
+      // register state duration metrics
+      registerMetric(
+          registry, TABLE_OPTIMIZING_STATUS_IDLE_DURATION, new 
StatusDurationGauge(STATUS_IDLE));
+      registerMetric(
+          registry,
+          TABLE_OPTIMIZING_STATUS_PENDING_DURATION,
+          new StatusDurationGauge(STATUS_PENDING));
+      registerMetric(
+          registry,
+          TABLE_OPTIMIZING_STATUS_PLANNING_DURATION,
+          new StatusDurationGauge(STATUS_PLANING));
+      registerMetric(
+          registry,
+          TABLE_OPTIMIZING_STATUS_EXECUTING_DURATION,
+          new StatusDurationGauge(STATUS_EXECUTING));
+      registerMetric(
+          registry,
+          TABLE_OPTIMIZING_STATUS_COMMITTING_DURATION,
+          new StatusDurationGauge(STATUS_COMMITTING));
+
+      // register table in status metrics
+      registerMetric(registry, TABLE_OPTIMIZING_STATUS_IN_IDLE, new 
IsInStatusGauge(STATUS_IDLE));
+      registerMetric(
+          registry, TABLE_OPTIMIZING_STATUS_IN_PENDING, new 
IsInStatusGauge(STATUS_PENDING));
+      registerMetric(
+          registry, TABLE_OPTIMIZING_STATUS_IN_PLANNING, new 
IsInStatusGauge(STATUS_PLANING));
+      registerMetric(
+          registry, TABLE_OPTIMIZING_STATUS_IN_EXECUTING, new 
IsInStatusGauge(STATUS_EXECUTING));
+      registerMetric(
+          registry, TABLE_OPTIMIZING_STATUS_IN_COMMITTING, new 
IsInStatusGauge(STATUS_COMMITTING));
+
+      // register table process count metrics
+      registerMetric(registry, TABLE_OPTIMIZING_PROCESS_TOTAL_COUNT, 
processTotalCount);
+      registerMetric(registry, TABLE_OPTIMIZING_PROCESS_FAILED_COUNT, 
processFailedCount);
+      registerMetric(registry, TABLE_OPTIMIZING_MINOR_TOTAL_COUNT, 
minorTotalCount);
+      registerMetric(registry, TABLE_OPTIMIZING_MINOR_FAILED_COUNT, 
minorFailedCount);
+      registerMetric(registry, TABLE_OPTIMIZING_MAJOR_TOTAL_COUNT, 
majorTotalCount);
+      registerMetric(registry, TABLE_OPTIMIZING_MAJOR_FAILED_COUNT, 
majorFailedCount);
+      registerMetric(registry, TABLE_OPTIMIZING_FULL_TOTAL_COUNT, 
fullTotalCount);
+      registerMetric(registry, TABLE_OPTIMIZING_FULL_FAILED_COUNT, 
fullFailedCount);
+
+      globalRegistry = registry;
+    }
+  }
+
+  public void unregister() {
+    registeredMetricKeys.forEach(globalRegistry::unregister);
+    registeredMetricKeys.clear();
+    globalRegistry = null;
+  }
+
+  /**
+   * Handle table self optimizing state change event.
+   *
+   * @param optimizingStatus new optimizing status
+   * @param stateSetTimestamp timestamp of status changed.
+   */
+  public void statusChanged(OptimizingStatus optimizingStatus, long 
stateSetTimestamp) {
+    this.optimizingStatus = optimizingStatus;
+    this.stateSetTimestamp = stateSetTimestamp;
+  }
+
+  /**
+   * Handle table self optimizing process completed event.
+   *
+   * @param processType optimizing process type.
+   * @param success is optimizing process success.
+   */
+  public void processComplete(OptimizingType processType, boolean success) {
+    processTotalCount.inc();
+    Counter totalCounter = null;
+    Counter failedCounter = null;
+    switch (processType) {
+      case MINOR:
+        totalCounter = minorTotalCount;
+        failedCounter = minorFailedCount;
+        break;
+      case MAJOR:
+        totalCounter = majorTotalCount;
+        failedCounter = majorFailedCount;
+        break;
+      case FULL:
+        totalCounter = fullTotalCount;
+        failedCounter = fullFailedCount;
+        break;
+    }
+    if (totalCounter != null) {
+      totalCounter.inc();
+    }
+    if (!success && failedCounter != null) {
+      failedCounter.inc();
+    }
+  }
+
+  private String getOptimizingStatusDesc(OptimizingStatus status) {
+    switch (status) {
+      case IDLE:
+        return STATUS_IDLE;
+      case PENDING:
+        return STATUS_PENDING;
+      case PLANNING:
+        return STATUS_PLANING;
+      case FULL_OPTIMIZING:
+      case MAJOR_OPTIMIZING:
+      case MINOR_OPTIMIZING:
+        return STATUS_EXECUTING;
+      case COMMITTING:
+        return STATUS_COMMITTING;
+      default:
+        return status.name();
+    }
+  }
+
+  class StatusDurationGauge implements Gauge<Long> {
+    final String targetStatus;
+
+    StatusDurationGauge(String targetStatus) {
+      this.targetStatus = targetStatus;
+    }
+
+    @Override
+    public Long getValue() {
+      String state = getOptimizingStatusDesc(optimizingStatus);
+      if (targetStatus.equals(state)) {
+        return stateDuration();
+      }
+      return 0L;
+    }
+
+    private Long stateDuration() {
+      return System.currentTimeMillis() - stateSetTimestamp;
+    }
+  }
+
+  class IsInStatusGauge implements Gauge<Long> {
+    final String targetStatus;
+
+    IsInStatusGauge(String targetStatus) {
+      this.targetStatus = targetStatus;
+    }
+
+    @Override
+    public Long getValue() {
+      String state = getOptimizingStatusDesc(optimizingStatus);
+      if (targetStatus.equals(state)) {
+        return 1L;
+      }
+      return 0L;
+    }
+  }
+}
diff --git 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableRuntime.java
 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableRuntime.java
index 29f902cb9..9e6e3507b 100644
--- 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableRuntime.java
+++ 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/table/TableRuntime.java
@@ -94,7 +94,7 @@ public class TableRuntime extends StatedPersistentBase {
   @StateField private volatile long processId;
   @StateField private volatile OptimizingEvaluator.PendingInput pendingInput;
   private volatile long lastPlanTime;
-  private final TableMetrics metrics;
+  private final TableOptimizingMetrics optimizingMetrics;
   private final ReentrantLock blockerLock = new ReentrantLock();
 
   protected TableRuntime(
@@ -107,7 +107,7 @@ public class TableRuntime extends StatedPersistentBase {
     this.tableConfiguration = TableConfiguration.parseConfig(properties);
     this.optimizerGroup = 
tableConfiguration.getOptimizingConfig().getOptimizerGroup();
     persistTableRuntime();
-    metrics = new TableMetrics(tableIdentifier);
+    optimizingMetrics = new TableOptimizingMetrics(tableIdentifier);
   }
 
   protected TableRuntime(TableRuntimeMeta tableRuntimeMeta, 
TableRuntimeHandler tableHandler) {
@@ -136,8 +136,8 @@ public class TableRuntime extends StatedPersistentBase {
             ? OptimizingStatus.PENDING
             : tableRuntimeMeta.getTableStatus();
     this.pendingInput = tableRuntimeMeta.getPendingInput();
-    metrics = new TableMetrics(tableIdentifier);
-    metrics.stateChanged(optimizingStatus, this.currentStatusStartTime);
+    optimizingMetrics = new TableOptimizingMetrics(tableIdentifier);
+    optimizingMetrics.statusChanged(optimizingStatus, 
this.currentStatusStartTime);
   }
 
   public void recover(OptimizingProcess optimizingProcess) {
@@ -149,7 +149,7 @@ public class TableRuntime extends StatedPersistentBase {
   }
 
   public void registerMetric(MetricRegistry metricRegistry) {
-    this.metrics.register(metricRegistry);
+    this.optimizingMetrics.register(metricRegistry);
   }
 
   public void dispose() {
@@ -162,7 +162,7 @@ public class TableRuntime extends StatedPersistentBase {
                       TableMetaMapper.class,
                       mapper -> 
mapper.deleteOptimizingRuntime(tableIdentifier.getId())));
         });
-    metrics.unregister();
+    optimizingMetrics.unregister();
   }
 
   public void beginPlanning() {
@@ -273,20 +273,22 @@ public class TableRuntime extends StatedPersistentBase {
     invokeConsistency(
         () -> {
           OptimizingStatus originalStatus = optimizingStatus;
+          OptimizingType processType = optimizingProcess.getOptimizingType();
           if (success) {
             lastOptimizedSnapshotId = optimizingProcess.getTargetSnapshotId();
             lastOptimizedChangeSnapshotId = 
optimizingProcess.getTargetChangeSnapshotId();
-            if (optimizingProcess.getOptimizingType() == OptimizingType.MINOR) 
{
+            if (processType == OptimizingType.MINOR) {
               lastMinorOptimizingTime = optimizingProcess.getPlanTime();
-            } else if (optimizingProcess.getOptimizingType() == 
OptimizingType.MAJOR) {
+            } else if (processType == OptimizingType.MAJOR) {
               lastMajorOptimizingTime = optimizingProcess.getPlanTime();
-            } else if (optimizingProcess.getOptimizingType() == 
OptimizingType.FULL) {
+            } else if (processType == OptimizingType.FULL) {
               lastFullOptimizingTime = optimizingProcess.getPlanTime();
             }
           }
           updateOptimizingStatus(OptimizingStatus.IDLE);
           optimizingProcess = null;
           persistUpdatingRuntime();
+          optimizingMetrics.processComplete(processType, success);
           tableHandler.handleTableChanged(this, originalStatus);
         });
   }
@@ -294,7 +296,7 @@ public class TableRuntime extends StatedPersistentBase {
   private void updateOptimizingStatus(OptimizingStatus status) {
     this.optimizingStatus = status;
     this.currentStatusStartTime = System.currentTimeMillis();
-    this.metrics.stateChanged(status, currentStatusStartTime);
+    this.optimizingMetrics.statusChanged(status, currentStatusStartTime);
   }
 
   private boolean refreshSnapshots(AmoroTable<?> amoroTable) {
diff --git 
a/amoro-ams/amoro-ams-server/src/test/java/org/apache/amoro/server/optimizing/TestOptimizingQueue.java
 
b/amoro-ams/amoro-ams-server/src/test/java/org/apache/amoro/server/optimizing/TestOptimizingQueue.java
index e63475f65..c24236308 100644
--- 
a/amoro-ams/amoro-ams-server/src/test/java/org/apache/amoro/server/optimizing/TestOptimizingQueue.java
+++ 
b/amoro-ams/amoro-ams-server/src/test/java/org/apache/amoro/server/optimizing/TestOptimizingQueue.java
@@ -226,10 +226,6 @@ public class TestOptimizingQueue extends AMSTableTestBase {
     Assert.assertThrows(IllegalStateException.class, 
optimizingProcess::commit);
     Assert.assertEquals(OptimizingProcess.Status.SUCCESS, 
optimizingProcess.getStatus());
 
-    // 9.close
-    optimizingProcess.close();
-    Assert.assertEquals(OptimizingProcess.Status.CLOSED, 
optimizingProcess.getStatus());
-
     Assert.assertEquals(0, queue.collectTasks().size());
     queue.dispose();
   }

Reply via email to