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

jshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 87a68758f7 [#8076] Add connection pool metrics for jdbc catalog (#9119)
87a68758f7 is described below

commit 87a68758f79460b8b97c00c6668a17626c816a71
Author: qbhan <[email protected]>
AuthorDate: Wed Nov 26 11:30:14 2025 +0800

    [#8076] Add connection pool metrics for jdbc catalog (#9119)
    
    ### What changes were proposed in this pull request?
    Support metrics for jdbc catalog connection pool
    
    ### Why are the changes needed?
    Fix: #8076
    
    ### Does this PR introduce _any_ user-facing change?
    No
    
    ### How was this patch tested?
    local test
---
 .../catalog/jdbc/JdbcCatalogOperations.java        | 19 ++++++++++
 .../metrics/source/JdbcCatalogMetricsSource.java   | 42 ++++++++++++++++++++++
 docs/metrics.md                                    | 12 ++++++-
 3 files changed, 72 insertions(+), 1 deletion(-)

diff --git 
a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/JdbcCatalogOperations.java
 
b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/JdbcCatalogOperations.java
index 130af8c695..6974797cc3 100644
--- 
a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/JdbcCatalogOperations.java
+++ 
b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/JdbcCatalogOperations.java
@@ -39,6 +39,7 @@ import java.util.stream.Stream;
 import javax.sql.DataSource;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.gravitino.Catalog;
+import org.apache.gravitino.GravitinoEnv;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.SchemaChange;
@@ -64,6 +65,8 @@ import 
org.apache.gravitino.exceptions.NonEmptySchemaException;
 import org.apache.gravitino.exceptions.SchemaAlreadyExistsException;
 import org.apache.gravitino.exceptions.TableAlreadyExistsException;
 import org.apache.gravitino.meta.AuditInfo;
+import org.apache.gravitino.metrics.MetricsSystem;
+import org.apache.gravitino.metrics.source.JdbcCatalogMetricsSource;
 import org.apache.gravitino.rel.Column;
 import org.apache.gravitino.rel.Table;
 import org.apache.gravitino.rel.TableCatalog;
@@ -102,6 +105,8 @@ public class JdbcCatalogOperations implements 
CatalogOperations, SupportsSchemas
 
   private final JdbcColumnDefaultValueConverter columnDefaultValueConverter;
 
+  private JdbcCatalogMetricsSource catalogMetricsSource;
+
   public static class JDBCDriverInfo {
     public String name;
     public String version;
@@ -174,11 +179,25 @@ public class JdbcCatalogOperations implements 
CatalogOperations, SupportsSchemas
     if (tableOperation instanceof RequireDatabaseOperation) {
       ((RequireDatabaseOperation) 
tableOperation).setDatabaseOperation(databaseOperation);
     }
+
+    MetricsSystem metricsSystem = GravitinoEnv.getInstance().metricsSystem();
+    // Metrics System could be null in UT.
+    if (metricsSystem != null) {
+      this.catalogMetricsSource =
+          new JdbcCatalogMetricsSource(info.namespace().toString(), 
info.name());
+      catalogMetricsSource.registerDatasourceMetrics(dataSource);
+      metricsSystem.register(catalogMetricsSource);
+    }
   }
 
   /** Closes the Jdbc catalog and releases the associated client pool. */
   @Override
   public void close() {
+    // Metrics System could be null in UT.
+    MetricsSystem metricsSystem = GravitinoEnv.getInstance().metricsSystem();
+    if (metricsSystem != null) {
+      metricsSystem.unregister(catalogMetricsSource);
+    }
     DataSourceUtils.closeDataSource(dataSource);
   }
 
diff --git 
a/core/src/main/java/org/apache/gravitino/metrics/source/JdbcCatalogMetricsSource.java
 
b/core/src/main/java/org/apache/gravitino/metrics/source/JdbcCatalogMetricsSource.java
new file mode 100644
index 0000000000..92a40d22da
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/metrics/source/JdbcCatalogMetricsSource.java
@@ -0,0 +1,42 @@
+/*
+ * 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.gravitino.metrics.source;
+
+import com.codahale.metrics.Gauge;
+import javax.sql.DataSource;
+import org.apache.commons.dbcp2.BasicDataSource;
+import org.apache.gravitino.metrics.MetricNames;
+
+public class JdbcCatalogMetricsSource extends CatalogMetricsSource {
+
+  public JdbcCatalogMetricsSource(String metalakeName, String catalogName) {
+    super("jdbc", metalakeName, catalogName);
+  }
+
+  public void registerDatasourceMetrics(DataSource dataSource) {
+    BasicDataSource basicDataSource = (BasicDataSource) dataSource;
+    registerGauge(
+        MetricNames.DATASOURCE_ACTIVE_CONNECTIONS, (Gauge<Integer>) 
basicDataSource::getNumActive);
+    registerGauge(
+        MetricNames.DATASOURCE_IDLE_CONNECTIONS, (Gauge<Integer>) 
basicDataSource::getNumIdle);
+    registerGauge(
+        MetricNames.DATASOURCE_MAX_CONNECTIONS, (Gauge<Integer>) 
basicDataSource::getMaxTotal);
+  }
+}
diff --git a/docs/metrics.md b/docs/metrics.md
index 5833ed164c..e982c9cb6d 100644
--- a/docs/metrics.md
+++ b/docs/metrics.md
@@ -55,9 +55,19 @@ These metrics start with the `jvm` prefix, like 
`jvm.heap.used` in JSON format,
 Catalog metrics provide the metrics from different catalog instances.
 All the catalog metrics start with the `gravitino-catalog` prefix in 
Prometheus format and with labels `provider`, `metalake`, and `catalog` to 
distinguish different catalog instances.
 
-For example, you can get Prometheus metrics for a fileset catalog named 
`test_catalog` under a metalake named `test_metalake` in the Gravitino server 
as follows:
+Currently, Catalog metrics only support Fileset catalog and JDBC catalog. 
+
+You can get Prometheus metrics for a Fileset catalog named `test_catalog` 
under a metalake named `test_metalake` in the Gravitino server as follows:
 
 ```text
 
gravitino_catalog_filesystem_cache_hits{provider="fileset",metalake="test_metalake",catalog="test_catalog",}
 0.0
 
gravitino_catalog_filesystem_cache_misses{provider="fileset",metalake="test_metalake",catalog="test_catalog",}
 0.0
 ```
+
+You can get Prometheus metrics for a JDBC catalog named `test_catalog` under a 
metalake named `test_metalake` in the Gravitino server as follows:
+
+```text
+gravitino_catalog_datasource_idle_connections{provider="jdbc",metalake="test_metalake",catalog="test_catalog",}
 1.0
+gravitino_catalog_datasource_active_connections{provider="jdbc",metalake="test_metalake",catalog="test_catalog",}
 0.0
+gravitino_catalog_datasource_max_connections{provider="jdbc",metalake="test_metalake",catalog="test_catalog",}
 10.0
+```

Reply via email to