Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,12 @@ public void parse(String jdbcUrl, ParseContext ctx) {
instanceName = urlParams.get("instance");
}

// If no path, use databasename param as fallback for database
if (ctx.databaseName() == null && urlParams.containsKey("databasename")) {
ctx.databaseName(urlParams.get("databasename"));
// If no path, use databasename or database param as fallback for database
if (ctx.databaseName() == null) {
String databaseName = UrlParsingUtils.getDatabaseNameParam(urlParams);
if (databaseName != null) {
ctx.databaseName(databaseName);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package io.opentelemetry.instrumentation.jdbc.internal.parser;

import io.opentelemetry.instrumentation.jdbc.internal.parser.UrlParsingUtils.HostPort;
import java.util.Map;

/**
* Parser for Microsoft SQL Server JDBC URLs.
Expand Down Expand Up @@ -53,7 +54,11 @@ public void parse(String jdbcUrl, ParseContext ctx) {
}

// Layer 3: URL params (SQL Server-specific: servername)
ctx.applyCommonParams(jdbcUrl, ";", ";");
// Parse semicolon-delimited parameters once and apply both standard and
// MSSQL-specific properties from the same map to avoid re-parsing the URL.
Map<String, String> urlParams = UrlParsingUtils.extractSemicolonParams(jdbcUrl);
ctx.applyCommonParams(urlParams);
applyDatabaseAliasParam(ctx, urlParams);

// Layer 4: Parse URL structure (host:port/path)
String instanceName = parseUrlWithInstance(jdbcUrl, ctx);
Expand Down Expand Up @@ -143,6 +148,20 @@ private static String parseUrlWithInstance(String jdbcUrl, ParseContext ctx) {
return instanceName;
}

/**
* Apply the {@code database} URL parameter alias when {@code databasename} has not already been
* set by {@link ParseContext#applyCommonParams(Map)}.
*/
private static void applyDatabaseAliasParam(ParseContext ctx, Map<String, String> params) {
if (ctx.databaseName() != null) {
return;
}
String databaseName = UrlParsingUtils.getDatabaseNameParam(params);
if (databaseName != null) {
ctx.databaseName(databaseName);
}
}

/**
* Sets the namespace after parsing completes.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,9 +177,17 @@ public Properties props() {
* @param splitSeparator the separator between individual parameters (";" or "&amp;")
*/
public void applyCommonParams(String jdbcUrl, String startDelimiter, String splitSeparator) {
Map<String, String> params =
UrlParsingUtils.extractParams(jdbcUrl, startDelimiter, splitSeparator);
applyCommonParams(UrlParsingUtils.extractParams(jdbcUrl, startDelimiter, splitSeparator));
}

/**
* Apply common parameters from a pre-parsed parameter map. Equivalent to {@link
* #applyCommonParams(String, String, String)} but avoids re-parsing the URL when the caller has
* already extracted the parameters.
*
* @param params the parameter map (keys must be lowercase)
*/
public void applyCommonParams(Map<String, String> params) {
if (params.isEmpty()) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,22 @@ public static HostPort extractHostPort(String serverName) {
return new HostPort(serverName, port, ipv6Address);
}

/**
* Resolve the database name from URL parameters, trying {@code databasename} first and falling
* back to {@code database}. Returns {@code null} if neither key has a non-empty value.
*
* @param params the URL parameter map (keys must be lowercase)
* @return the resolved database name, or {@code null}
*/
@Nullable
public static String getDatabaseNameParam(Map<String, String> params) {
String databaseName = params.get("databasename");
if (databaseName == null || databaseName.isEmpty()) {
databaseName = params.get("database");
}
return databaseName == null || databaseName.isEmpty() ? null : databaseName;
}

/**
* Lightweight wrapper for URL parameters that provides cleaner access patterns.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,25 @@ private static Stream<Arguments> sqlServerArguments() {
.setPort(1433)
.setName("ssdb")
.build(),
// database= alias (shorthand for databaseName)
arg("jdbc:sqlserver://ss.host;database=ssdb;")
.setShortUrl("sqlserver://ss.host:1433")
.setSystem("microsoft.sql_server")
.setOldSystem("mssql")
.setHost("ss.host")
.setPort(1433)
.setName("ssdb")
.build(),
arg("jdbc:sqlserver://ss.host\\ssinstance:44;database=ssdb;user=ssuser")
.setShortUrl("sqlserver://ss.host:44")
.setSystem("microsoft.sql_server")
.setOldSystem("mssql")
.setUser("ssuser")
.setHost("ss.host")
.setPort(44)
.setNamespace("ssinstance|ssdb")
.setName("ssinstance")
.build(),
arg("jdbc:microsoft:sqlserver://ss.host:44;DatabaseName=ssdb;user=ssuser;password=pw;user=ssuser2;")
.setShortUrl("microsoft:sqlserver://ss.host:44")
.setSystem("microsoft.sql_server")
Expand Down Expand Up @@ -659,6 +678,28 @@ private static Stream<Arguments> sqlServerArguments() {
.setNamespace("ssinstance")
.setName("ssinstance")
.build(),
// database= alias (shorthand for databaseName) in jTDS URLs
arg("jdbc:jtds:sqlserver://ss.host/ssdb;instance=ssinstance;database=otherdb")
.setShortUrl("jtds:sqlserver://ss.host:1433")
.setSystem("microsoft.sql_server")
.setOldSystem("mssql")
.setSubtype("sqlserver")
.setHost("ss.host")
.setPort(1433)
.setNamespace("ssinstance|ssdb")
.setName("ssinstance")
.build(),
// database= param provides database name when there's no URL path
arg("jdbc:jtds:sqlserver://ss.host;instance=ssinstance;database=ssdb")
.setShortUrl("jtds:sqlserver://ss.host:1433")
.setSystem("microsoft.sql_server")
.setOldSystem("mssql")
.setSubtype("sqlserver")
.setHost("ss.host")
.setPort(1433)
.setNamespace("ssinstance|ssdb")
.setName("ssinstance")
.build(),
Comment thread
hwxy233 marked this conversation as resolved.
arg("jdbc:jtds:sqlserver://ss.host:1444/urldb")
.setProperties(stdProps())
.setShortUrl("jtds:sqlserver://stdServerName:9999")
Expand Down
Loading