diff --git a/dd-java-agent/instrumentation/hibernate/core-3.5/core-3.5.gradle b/dd-java-agent/instrumentation/hibernate/core-3.5/core-3.5.gradle index 8429e233cb..b73fdb7b08 100644 --- a/dd-java-agent/instrumentation/hibernate/core-3.5/core-3.5.gradle +++ b/dd-java-agent/instrumentation/hibernate/core-3.5/core-3.5.gradle @@ -16,7 +16,8 @@ muzzle { pass { group = "org.hibernate" module = "hibernate-core" - versions = "[3.5.0-Final,4.0.0.Final)" + versions = "[3.3.2.GA,4.0.0.Final)" + assertInverse = true } } @@ -31,7 +32,7 @@ testSets { } dependencies { - compileOnly group: 'org.hibernate', name: 'hibernate-core', version: '3.5.0-Final' + compileOnly group: 'org.hibernate', name: 'hibernate-core', version: '3.3.2.GA' compile project(':dd-java-agent:agent-tooling') compile project(':dd-java-agent:instrumentation:hibernate') @@ -44,7 +45,7 @@ dependencies { testCompile project(':dd-java-agent:testing') testCompile project(':dd-java-agent:instrumentation:jdbc') - testCompile group: 'org.hibernate', name: 'hibernate-core', version: '3.5.0-Final' + testCompile group: 'org.hibernate', name: 'hibernate-core', version: '3.3.2.GA' testCompile group: 'org.hibernate', name: 'hibernate-annotations', version: '+' testCompile group: 'javassist', name: 'javassist', version: '+' testCompile group: 'com.h2database', name: 'h2', version: '1.4.197' diff --git a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/AbstractHibernateInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/AbstractHibernateInstrumentation.java index 58a859748a..38e26cbec9 100644 --- a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/AbstractHibernateInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/AbstractHibernateInstrumentation.java @@ -1,10 +1,8 @@ package datadog.trace.instrumentation.hibernate.core.v3_5; -import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses; -import static net.bytebuddy.matcher.ElementMatchers.not; - import datadog.trace.agent.tooling.Instrumenter; -import net.bytebuddy.matcher.ElementMatcher; +import org.hibernate.EntityNameResolver; +import org.hibernate.classic.Validatable; public abstract class AbstractHibernateInstrumentation extends Instrumenter.Default { @@ -22,12 +20,23 @@ public abstract class AbstractHibernateInstrumentation extends Instrumenter.Defa "datadog.trace.agent.decorator.DatabaseClientDecorator", "datadog.trace.agent.decorator.OrmClientDecorator", "datadog.trace.instrumentation.hibernate.HibernateDecorator", + packageName + ".AbstractHibernateInstrumentation$V3Advice", }; } - @Override - public ElementMatcher classLoaderMatcher() { - return not(classLoaderHasClasses("org.hibernate.SharedSessionContract")) - .and(classLoaderHasClasses("org.hibernate.EntityNameResolver")); + public abstract static class V3Advice { + + /** + * Some cases of instrumentation will match more broadly than others, so this unused method + * allows all instrumentation to uniformly match versions of Hibernate between 3.5 and 4. + */ + public static void muzzleCheck( + // Not in 4.0 + final Validatable validatable, + // Not before 3.2.0.GA (Can't find anything not before 3.5) + final EntityNameResolver resolver) { + validatable.validate(); + resolver.resolveEntityName(null); + } } } diff --git a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/CriteriaInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/CriteriaInstrumentation.java index de3cfb6564..fcd4760fce 100644 --- a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/CriteriaInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/CriteriaInstrumentation.java @@ -41,7 +41,7 @@ public class CriteriaInstrumentation extends AbstractHibernateInstrumentation { CriteriaMethodAdvice.class.getName()); } - public static class CriteriaMethodAdvice { + public static class CriteriaMethodAdvice extends V3Advice { @Advice.OnMethodEnter(suppress = Throwable.class) public static SessionState startMethod( diff --git a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/QueryInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/QueryInstrumentation.java index 8d8d2ccbb2..8d15c747e0 100644 --- a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/QueryInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/QueryInstrumentation.java @@ -48,7 +48,7 @@ public class QueryInstrumentation extends AbstractHibernateInstrumentation { QueryMethodAdvice.class.getName()); } - public static class QueryMethodAdvice { + public static class QueryMethodAdvice extends V3Advice { @Advice.OnMethodEnter(suppress = Throwable.class) public static SessionState startMethod( diff --git a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/SessionFactoryInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/SessionFactoryInstrumentation.java index e18c01f0c7..8c1ab3d38b 100644 --- a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/SessionFactoryInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/SessionFactoryInstrumentation.java @@ -57,7 +57,7 @@ public class SessionFactoryInstrumentation extends AbstractHibernateInstrumentat SessionFactoryAdvice.class.getName()); } - public static class SessionFactoryAdvice { + public static class SessionFactoryAdvice extends V3Advice { @Advice.OnMethodExit(suppress = Throwable.class) public static void openSession(@Advice.Return final Object session) { diff --git a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/SessionInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/SessionInstrumentation.java index f99b01138b..4ce8e71b89 100644 --- a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/SessionInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/SessionInstrumentation.java @@ -107,7 +107,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { return transformers; } - public static class SessionCloseAdvice { + public static class SessionCloseAdvice extends V3Advice { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void closeSession( @@ -138,7 +138,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { } } - public static class SessionMethodAdvice { + public static class SessionMethodAdvice extends V3Advice { @Advice.OnMethodEnter(suppress = Throwable.class) public static SessionState startMethod( @@ -171,7 +171,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { } } - public static class GetQueryAdvice { + public static class GetQueryAdvice extends V3Advice { @Advice.OnMethodExit(suppress = Throwable.class) public static void getQuery( @@ -193,7 +193,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { } } - public static class GetTransactionAdvice { + public static class GetTransactionAdvice extends V3Advice { @Advice.OnMethodExit(suppress = Throwable.class) public static void getTransaction( @@ -216,7 +216,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { } } - public static class GetCriteriaAdvice { + public static class GetCriteriaAdvice extends V3Advice { @Advice.OnMethodExit(suppress = Throwable.class) public static void getCriteria( diff --git a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/TransactionInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/TransactionInstrumentation.java index 7014290974..bbba00ae66 100644 --- a/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/TransactionInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-3.5/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_5/TransactionInstrumentation.java @@ -41,7 +41,7 @@ public class TransactionInstrumentation extends AbstractHibernateInstrumentation TransactionCommitAdvice.class.getName()); } - public static class TransactionCommitAdvice { + public static class TransactionCommitAdvice extends V3Advice { @Advice.OnMethodEnter(suppress = Throwable.class) public static SessionState startCommit(@Advice.This final Transaction transaction) { diff --git a/dd-java-agent/instrumentation/hibernate/core-4.0/core-4.0.gradle b/dd-java-agent/instrumentation/hibernate/core-4.0/core-4.0.gradle index 9cec52d893..459aceec7e 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.0/core-4.0.gradle +++ b/dd-java-agent/instrumentation/hibernate/core-4.0/core-4.0.gradle @@ -10,6 +10,7 @@ muzzle { group = "org.hibernate" module = "hibernate-core" versions = "[4.0.0.Final,)" + assertInverse = true } } diff --git a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java index 9e69ca72df..0fb53bcf53 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java @@ -1,9 +1,7 @@ package datadog.trace.instrumentation.hibernate.core.v4_0; -import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses; - import datadog.trace.agent.tooling.Instrumenter; -import net.bytebuddy.matcher.ElementMatcher; +import org.hibernate.SharedSessionContract; public abstract class AbstractHibernateInstrumentation extends Instrumenter.Default { @@ -21,11 +19,18 @@ public abstract class AbstractHibernateInstrumentation extends Instrumenter.Defa "datadog.trace.agent.decorator.DatabaseClientDecorator", "datadog.trace.agent.decorator.OrmClientDecorator", "datadog.trace.instrumentation.hibernate.HibernateDecorator", + packageName + ".AbstractHibernateInstrumentation$V4Advice", }; } - @Override - public ElementMatcher classLoaderMatcher() { - return classLoaderHasClasses("org.hibernate.SharedSessionContract"); + public abstract static class V4Advice { + + /** + * Some cases of instrumentation will match more broadly than others, so this unused method + * allows all instrumentation to uniformly match versions of Hibernate starting at 4.0. + */ + public static void muzzleCheck(final SharedSessionContract contract) { + contract.createCriteria(""); + } } } diff --git a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/CriteriaInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/CriteriaInstrumentation.java index be83988555..9578d909ea 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/CriteriaInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/CriteriaInstrumentation.java @@ -41,7 +41,7 @@ public class CriteriaInstrumentation extends AbstractHibernateInstrumentation { CriteriaMethodAdvice.class.getName()); } - public static class CriteriaMethodAdvice { + public static class CriteriaMethodAdvice extends V4Advice { @Advice.OnMethodEnter(suppress = Throwable.class) public static SessionState startMethod( diff --git a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/QueryInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/QueryInstrumentation.java index c955d18b00..e01bfa6f2f 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/QueryInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/QueryInstrumentation.java @@ -48,7 +48,7 @@ public class QueryInstrumentation extends AbstractHibernateInstrumentation { QueryMethodAdvice.class.getName()); } - public static class QueryMethodAdvice { + public static class QueryMethodAdvice extends V4Advice { @Advice.OnMethodEnter(suppress = Throwable.class) public static SessionState startMethod( diff --git a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionFactoryInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionFactoryInstrumentation.java index 5dabfaca50..fd294eb3f6 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionFactoryInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionFactoryInstrumentation.java @@ -49,7 +49,7 @@ public class SessionFactoryInstrumentation extends AbstractHibernateInstrumentat SessionFactoryAdvice.class.getName()); } - public static class SessionFactoryAdvice { + public static class SessionFactoryAdvice extends V4Advice { @Advice.OnMethodExit(suppress = Throwable.class) public static void openSession(@Advice.Return final SharedSessionContract session) { diff --git a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionInstrumentation.java index 3c276843ab..35bfc8957a 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionInstrumentation.java @@ -102,7 +102,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { return transformers; } - public static class SessionCloseAdvice { + public static class SessionCloseAdvice extends V4Advice { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void closeSession( @@ -126,7 +126,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { } } - public static class SessionMethodAdvice { + public static class SessionMethodAdvice extends V4Advice { @Advice.OnMethodEnter(suppress = Throwable.class) public static SessionState startMethod( @@ -152,7 +152,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { } } - public static class GetQueryAdvice { + public static class GetQueryAdvice extends V4Advice { @Advice.OnMethodExit(suppress = Throwable.class) public static void getQuery( @@ -168,7 +168,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { } } - public static class GetTransactionAdvice { + public static class GetTransactionAdvice extends V4Advice { @Advice.OnMethodExit(suppress = Throwable.class) public static void getTransaction( @@ -185,7 +185,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation { } } - public static class GetCriteriaAdvice { + public static class GetCriteriaAdvice extends V4Advice { @Advice.OnMethodExit(suppress = Throwable.class) public static void getCriteria( diff --git a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/TransactionInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/TransactionInstrumentation.java index 48936a9bc4..28e7bc72d1 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/TransactionInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/TransactionInstrumentation.java @@ -41,7 +41,7 @@ public class TransactionInstrumentation extends AbstractHibernateInstrumentation TransactionCommitAdvice.class.getName()); } - public static class TransactionCommitAdvice { + public static class TransactionCommitAdvice extends V4Advice { @Advice.OnMethodEnter(suppress = Throwable.class) public static SessionState startCommit(@Advice.This final Transaction transaction) {