Intern db info (#4263)

This commit is contained in:
Lauri Tulmin 2021-10-04 05:47:40 +03:00 committed by GitHub
parent 39a1604dd2
commit 95651a4f1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 2 deletions

View File

@ -58,7 +58,7 @@ public class DriverInstrumentation implements TypeInstrumentation {
return; return;
} }
DbInfo dbInfo = JdbcConnectionUrlParser.parse(url, props); DbInfo dbInfo = JdbcConnectionUrlParser.parse(url, props);
JdbcData.connectionInfo.set(connection, dbInfo); JdbcData.connectionInfo.set(connection, JdbcData.intern(dbInfo));
} }
} }
} }

View File

@ -6,16 +6,42 @@
package io.opentelemetry.instrumentation.jdbc.internal; package io.opentelemetry.instrumentation.jdbc.internal;
import io.opentelemetry.instrumentation.api.field.VirtualField; import io.opentelemetry.instrumentation.api.field.VirtualField;
import java.lang.ref.WeakReference;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.util.Map;
import java.util.WeakHashMap;
/** Holds info associated with JDBC connections and prepared statements. */ /** Holds info associated with JDBC connections and prepared statements. */
public final class JdbcData { public final class JdbcData {
private static final Map<DbInfo, WeakReference<DbInfo>> dbInfos = new WeakHashMap<>();
public static VirtualField<Connection, DbInfo> connectionInfo = public static VirtualField<Connection, DbInfo> connectionInfo =
VirtualField.find(Connection.class, DbInfo.class); VirtualField.find(Connection.class, DbInfo.class);
public static VirtualField<PreparedStatement, String> preparedStatement = public static VirtualField<PreparedStatement, String> preparedStatement =
VirtualField.find(PreparedStatement.class, String.class); VirtualField.find(PreparedStatement.class, String.class);
private JdbcData() {} private JdbcData() {}
/**
* Returns canonical representation of db info.
*
* @param dbInfo db info to canonicalize
* @return db info with same content as input db info. If two equal inputs are given to this
* method, both calls will return the same instance. This method may return one instance now
* and a different instance later if the original interned instance was garbage collected.
*/
public static DbInfo intern(DbInfo dbInfo) {
synchronized (dbInfos) {
WeakReference<DbInfo> reference = dbInfos.get(dbInfo);
if (reference != null) {
DbInfo result = reference.get();
if (result != null) {
return result;
}
}
dbInfos.put(dbInfo, new WeakReference<>(dbInfo));
return dbInfo;
}
}
} }

View File

@ -72,7 +72,7 @@ public final class JdbcUtils {
DbInfo dbInfo = JdbcData.connectionInfo.get(connection); DbInfo dbInfo = JdbcData.connectionInfo.get(connection);
if (dbInfo == null) { if (dbInfo == null) {
dbInfo = computeDbInfo(connection); dbInfo = computeDbInfo(connection);
JdbcData.connectionInfo.set(connection, dbInfo); JdbcData.connectionInfo.set(connection, JdbcData.intern(dbInfo));
} }
return dbInfo; return dbInfo;
} }