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

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-java.git


The following commit(s) were added to refs/heads/main by this push:
     new 6c74815fdf Add support for dameng(DM) JDBC URL format in URLParser 
(#758)
6c74815fdf is described below

commit 6c74815fdf5facd958faf95de52ee5327da66119
Author: saber-wang <45062099+saber-w...@users.noreply.github.com>
AuthorDate: Tue Jun 10 11:59:05 2025 +0800

    Add support for dameng(DM) JDBC URL format in URLParser (#758)
    
    * [Feature] Add URLParser for dameng(DM)
---
 CHANGES.md                                         |   1 +
 .../network/trace/component/ComponentsDefine.java  |   3 +
 .../jdbc/connectionurl/parser/DMURLParser.java     | 112 +++++++++++++++++++++
 .../jdbc/connectionurl/parser/URLParser.java       |   4 +
 .../jdbc/connectionurl/parser/URLParserTest.java   |  45 +++++++++
 .../service-agent/java-agent/Supported-list.md     |   1 +
 6 files changed, 166 insertions(+)

diff --git a/CHANGES.md b/CHANGES.md
index 8e58c3459d..eea1320db7 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -12,6 +12,7 @@ Release Notes.
   initialization. Delay so11y metrics#build when the services are not ready to 
avoid MeterService status is not
   initialized.
 * Fix retransform failure when enhancing both parent and child classes.
+* Add support for `dameng(DM)` JDBC url format in `URLParser`.
 
 All issues and pull requests are 
[here](https://github.com/apache/skywalking/milestone/236?closed=1)
 
diff --git 
a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
 
b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
index d81ba8c136..fa62c91239 100755
--- 
a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
+++ 
b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
@@ -262,4 +262,7 @@ public class ComponentsDefine {
     public static final OfficialComponent CAFFEINE = new 
OfficialComponent(160, "Caffeine");
 
     public static final OfficialComponent THREAD_PER_TASK_EXECUTOR = new 
OfficialComponent(161, "ThreadPerTask-executor");
+
+    public static final OfficialComponent DMDB_JDBC_DRIVER = new 
OfficialComponent(163, "Dmdb-jdbc-driver");
+
 }
diff --git 
a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/DMURLParser.java
 
b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/DMURLParser.java
new file mode 100644
index 0000000000..2cb4c1c4c0
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/DMURLParser.java
@@ -0,0 +1,112 @@
+/*
+ * 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.skywalking.apm.plugin.jdbc.connectionurl.parser;
+
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+import org.apache.skywalking.apm.plugin.jdbc.trace.ConnectionInfo;
+
+public class DMURLParser extends AbstractURLParser {
+    private static final int DEFAULT_PORT = 5236;
+    private static final String DB_TYPE = "DM";
+    private static final String URL_PARAMS_HOST_KEY = "host";
+    private static final String URL_PARAMS_PORT_KEY = "port";
+    private static final String URL_PARAMS_SCHEMA_KEY = "schema";
+
+    public DMURLParser(String url) {
+        super(url);
+    }
+
+    @Override
+    protected URLLocation fetchDatabaseHostsIndexRange() {
+        int hostLabelStartIndex = url.indexOf("//");
+        if (hostLabelStartIndex == -1) {
+            return new URLLocation(0, 0);
+        }
+        int hostLabelEndIndex = url.indexOf("?", hostLabelStartIndex + 2);
+        if (hostLabelEndIndex == -1) {
+            hostLabelEndIndex = url.length();
+        }
+        return new URLLocation(hostLabelStartIndex + 2, hostLabelEndIndex);
+    }
+
+    @Override
+    protected URLLocation fetchDatabaseNameIndexRange() {
+        return new URLLocation(0, 0);
+    }
+
+    @Override
+    public ConnectionInfo parse() {
+        URLLocation location = fetchDatabaseHostsIndexRange();
+        String hostPortSegment = "";
+        if (location.endIndex() > location.startIndex()) {
+            hostPortSegment = url.substring(location.startIndex(), 
location.endIndex());
+        }
+
+        String host = "";
+        String port = "";
+
+        if (!hostPortSegment.isEmpty()) {
+            String[] parts = hostPortSegment.split(":");
+            if (parts.length >= 1) {
+                host = parts[0];
+            }
+            if (parts.length == 2) {
+                port = parts[1];
+            }
+        }
+
+        if (host.isEmpty()) {
+            host = fetchFromUrlParams(URL_PARAMS_HOST_KEY);
+        }
+        if (port == null || port.isEmpty()) {
+            port = fetchFromUrlParams(URL_PARAMS_PORT_KEY);
+        }
+
+        if (port == null || port.isEmpty()) {
+            port = String.valueOf(DEFAULT_PORT);
+        }
+
+        String schema = fetchFromUrlParams(URL_PARAMS_SCHEMA_KEY);
+
+        return new ConnectionInfo(
+                ComponentsDefine.DMDB_JDBC_DRIVER,
+                DB_TYPE,
+                host,
+                Integer.parseInt(port),
+                schema == null ? "" : schema
+        );
+    }
+
+    private String fetchFromUrlParams(String key) {
+        int paramIndex = url.indexOf("?");
+        if (paramIndex == -1) {
+            return null;
+        }
+        String[] params = url.substring(paramIndex + 1).split("&");
+        for (String pair : params) {
+            if (pair.startsWith(key + "=")) {
+                String[] segments = pair.split("=", 2);
+                if (segments.length == 2) {
+                    return segments[1];
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParser.java
 
b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParser.java
index cb79d58b0c..83afcf9efa 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParser.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParser.java
@@ -41,6 +41,7 @@ public class URLParser {
     private static final String DB2_JDBC_URL_PREFIIX = "jdbc:db2:";
     private static final String SYBASE_JDBC_URL_PREFIX = "jdbc:sybase:tds:";
     private static final String OCEANBASE_JDBC_URL_PREFIX = "jdbc:oceanbase:";
+    private static final String DM_JDBC_URL_PREFIX = "jdbc:dm:";
 
     public static ConnectionInfo parser(String url) {
         ConnectionURLParser parser = null;
@@ -75,7 +76,10 @@ public class URLParser {
             parser = new SybaseURLParser(url);
         } else if (lowerCaseUrl.startsWith(OCEANBASE_JDBC_URL_PREFIX)) {
             parser = new OceanBaseURLParser(url);
+        } else if (lowerCaseUrl.startsWith(DM_JDBC_URL_PREFIX)) {
+            parser = new DMURLParser(url);
         }
+
         return parser.parse();
     }
 }
diff --git 
a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/test/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParserTest.java
 
b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/test/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParserTest.java
index 2a0e87e315..a9a38450e0 100644
--- 
a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/test/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParserTest.java
+++ 
b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/test/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParserTest.java
@@ -415,4 +415,49 @@ public class URLParserTest {
         assertThat(connectionInfo.getDatabaseName(), is("mydb"));
         assertThat(connectionInfo.getDatabasePeer(), is("localhost:5000"));
     }
+
+    @Test
+    public void testParseDMJDBCURLWithNamedParams()
+    {
+        ConnectionInfo connectionInfo = 
URLParser.parser("jdbc:dm://?host=localhost&port=5236");
+        assertThat(connectionInfo.getDBType(), is("DM"));
+        assertThat(connectionInfo.getDatabaseName(), is(""));
+        assertThat(connectionInfo.getDatabasePeer(), is("localhost:5236"));
+    }
+
+    @Test
+    public void testParseDMJDBCURLWithNamedParamsAndScheme()
+    {
+        ConnectionInfo connectionInfo = 
URLParser.parser("jdbc:dm://?host=localhost&port=5236&schema=dm");
+        assertThat(connectionInfo.getDBType(), is("DM"));
+        assertThat(connectionInfo.getDatabaseName(), is("dm"));
+        assertThat(connectionInfo.getDatabasePeer(), is("localhost:5236"));
+    }
+
+    @Test
+    public void testParseDMJDBCURLWithoutHost()
+    {
+        ConnectionInfo connectionInfo = 
URLParser.parser("jdbc:dm://localhost");
+        assertThat(connectionInfo.getDBType(), is("DM"));
+        assertThat(connectionInfo.getDatabaseName(), is(""));
+        assertThat(connectionInfo.getDatabasePeer(), is("localhost:5236"));
+    }
+
+    @Test
+    public void testParseDMJDBCURLWithoutHostAndScheme()
+    {
+        ConnectionInfo connectionInfo = 
URLParser.parser("jdbc:dm://localhost?schema=dm");
+        assertThat(connectionInfo.getDBType(), is("DM"));
+        assertThat(connectionInfo.getDatabaseName(), is("dm"));
+        assertThat(connectionInfo.getDatabasePeer(), is("localhost:5236"));
+    }
+
+    @Test
+    public void testParseDMJDBCURLWithoutHostPort()
+    {
+        ConnectionInfo connectionInfo = 
URLParser.parser("jdbc:dm://localhost:5237?schema=dm");
+        assertThat(connectionInfo.getDBType(), is("DM"));
+        assertThat(connectionInfo.getDatabaseName(), is("dm"));
+        assertThat(connectionInfo.getDatabasePeer(), is("localhost:5237"));
+    }
 }
diff --git a/docs/en/setup/service-agent/java-agent/Supported-list.md 
b/docs/en/setup/service-agent/java-agent/Supported-list.md
index cd51b8d2ce..caf406d960 100644
--- a/docs/en/setup/service-agent/java-agent/Supported-list.md
+++ b/docs/en/setup/service-agent/java-agent/Supported-list.md
@@ -185,6 +185,7 @@ The meter plugin provides the advanced metrics collections, 
which are not a part
     * [DB2](https://www.ibm.com/products/db2/database)
     * Sybase
     * [OceanBase](https://www.oceanbase.com/)
+    * [DaMeng(DM)](https://www.dameng.com/)
   * Supported Connection Pool Frameworks
     * [Apache Commons DBCP](https://github.com/apache/commons-dbcp) 2.x
     * [Alibaba Druid](https://github.com/alibaba/druid) 1.x

Reply via email to