diff --git a/CHANGELOG.md b/CHANGELOG.md index 234172de53d..7bf8dda1d32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # CHANGELOG # Version 2.4.0 (Unreleased) +- Fixed [#749](https://github.com/Microsoft/ApplicationInsights-Java/issues/749) introduce support for postgresql jdbc4 prepared statements. - Introduced support for Manual Async and Explicit Multithreading correlation. - Introduced `setRequestTelemetryContext` API in `WebTelemetryModule` Interface. - Introduced experimental API's `AIHttpServletListner`, `HttpServerHandler`, `ApplicationInsightsServletExtractor` diff --git a/agent/src/main/java/com/microsoft/applicationinsights/agent/internal/agent/sql/PreparedStatementClassDataProvider.java b/agent/src/main/java/com/microsoft/applicationinsights/agent/internal/agent/sql/PreparedStatementClassDataProvider.java index 17b8d5c1a4a..99a5727d95d 100644 --- a/agent/src/main/java/com/microsoft/applicationinsights/agent/internal/agent/sql/PreparedStatementClassDataProvider.java +++ b/agent/src/main/java/com/microsoft/applicationinsights/agent/internal/agent/sql/PreparedStatementClassDataProvider.java @@ -33,6 +33,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; @@ -41,6 +42,10 @@ * Created by gupele on 8/3/2015. */ public final class PreparedStatementClassDataProvider { + + public static final String POSTGRESQL_JDBC2_STATEMENT = "org/postgresql/jdbc2/AbstractJdbc2Statement"; + public static final String POSTGRESQL_JDBC4_STATEMENT = "org/postgresql/jdbc/PgPreparedStatement"; + private final Map classesToInstrument; public PreparedStatementClassDataProvider(Map classesToInstrument) { @@ -59,8 +64,10 @@ public void add() { factory = classFactoryForMySql(); doAdd(factory, "com/mysql/jdbc/PreparedStatement"); - factory = classFactoryForPostgreSql(); - doAdd(factory, "org/postgresql/jdbc2/AbstractJdbc2Statement"); + factory = classFactoryForJdbc2PostgreSql(); + doAdd(factory, POSTGRESQL_JDBC2_STATEMENT); + factory = classFactoryForJdbc4PostgreSql(); + doAdd(factory, POSTGRESQL_JDBC4_STATEMENT); factory = classFactoryForOracle(); doAdd(factory, "oracle/jdbc/driver/OraclePreparedStatement"); @@ -218,20 +225,30 @@ public ClassVisitor create(ClassInstrumentationData classInstrumentationData, Cl return classVisitorFactory; } - private ClassVisitorFactory classFactoryForPostgreSql() { - - ClassVisitorFactory classVisitorFactory = new ClassVisitorFactory() { + private ClassVisitorFactory classFactoryForJdbc2PostgreSql() { + return new ClassVisitorFactory() { @Override public ClassVisitor create(ClassInstrumentationData classInstrumentationData, ClassWriter classWriter) { - HashSet ctorSignatures = new HashSet(); + Set ctorSignatures = new HashSet(); ctorSignatures.add("(Lorg/postgresql/jdbc2/AbstractJdbc2Connection;Ljava/lang/String;ZII)V"); final PreparedStatementMetaData metaData1 = new PreparedStatementMetaData(ctorSignatures); metaData1.sqlStringInCtor = 2; return new PreparedStatementClassVisitor(classInstrumentationData, classWriter, metaData1); } }; + } - return classVisitorFactory; + private ClassVisitorFactory classFactoryForJdbc4PostgreSql() { + return new ClassVisitorFactory() { + @Override + public ClassVisitor create(ClassInstrumentationData classInstrumentationData, ClassWriter classWriter) { + Set ctorSignatures = new HashSet(); + ctorSignatures.add("(Lorg/postgresql/jdbc/PgConnection;Ljava/lang/String;III)V"); + final PreparedStatementMetaData metaData1 = new PreparedStatementMetaData(ctorSignatures); + metaData1.sqlStringInCtor = 2; + return new PreparedStatementClassVisitor(classInstrumentationData, classWriter, metaData1); + } + }; } private ClassVisitorFactory classFactoryForOracle() {