Introduced lazy proxy around DocRepository
To shift the set-up timing without adding a lot of ugly code (as I did previously), I introduced a lazy dynamic proxy around the repository. I'm not really happy with this, but I consider it better than the prior approach. There is also probably a more "groovy" way to do this. As before, this change is itself non-functional. The subsequent test will enable spring-data instrumentation and alter the test.
This commit is contained in:
parent
85240a95ae
commit
78f203638e
|
@ -4,19 +4,44 @@ import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
|
||||||
import datadog.trace.agent.test.AgentTestRunner
|
import datadog.trace.agent.test.AgentTestRunner
|
||||||
import datadog.trace.api.DDSpanTypes
|
import datadog.trace.api.DDSpanTypes
|
||||||
import io.opentracing.tag.Tags
|
import io.opentracing.tag.Tags
|
||||||
import org.springframework.context.ApplicationContext
|
|
||||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext
|
||||||
import spock.lang.Shared
|
import spock.lang.Shared
|
||||||
|
import java.lang.reflect.Proxy
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationHandler
|
||||||
|
import java.lang.reflect.Method
|
||||||
|
|
||||||
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
|
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
|
||||||
|
|
||||||
@RetryOnFailure(times = 3, delaySeconds = 1)
|
@RetryOnFailure(times = 3, delaySeconds = 1)
|
||||||
class Elasticsearch53SpringRepositoryTest extends AgentTestRunner {
|
class Elasticsearch53SpringRepositoryTest extends AgentTestRunner {
|
||||||
@Shared
|
// Setting up appContext & repo with @Shared doesn't allow
|
||||||
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config)
|
// spring-data instrumentation to applied.
|
||||||
|
// To change the timing without adding ugly checks everywhere -
|
||||||
|
// use a dynamic proxy. There's probably a more "groovy" way to do this.
|
||||||
|
|
||||||
@Shared
|
@Shared
|
||||||
DocRepository repo = applicationContext.getBean(DocRepository)
|
DocRepository repo = Proxy.newProxyInstance(
|
||||||
|
getClass().getClassLoader(),
|
||||||
|
[DocRepository] as Class[],
|
||||||
|
new LazyProxyInvoker());
|
||||||
|
|
||||||
|
static class LazyProxyInvoker implements InvocationHandler {
|
||||||
|
def repo;
|
||||||
|
|
||||||
|
DocRepository getOrCreateRepository() {
|
||||||
|
if ( repo != null ) return repo;
|
||||||
|
|
||||||
|
def applicationContext = new AnnotationConfigApplicationContext(Config)
|
||||||
|
repo = applicationContext.getBean(DocRepository)
|
||||||
|
return repo
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||||
|
return method.invoke(getOrCreateRepository(), args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
def setup() {
|
def setup() {
|
||||||
TEST_WRITER.clear()
|
TEST_WRITER.clear()
|
||||||
|
|
|
@ -35,6 +35,7 @@ dependencies {
|
||||||
|
|
||||||
testCompile project(':dd-java-agent:instrumentation:apache-httpasyncclient-4')
|
testCompile project(':dd-java-agent:instrumentation:apache-httpasyncclient-4')
|
||||||
testCompile project(':dd-java-agent:instrumentation:netty-4.1')
|
testCompile project(':dd-java-agent:instrumentation:netty-4.1')
|
||||||
|
// testCompile project(':dd-java-agent:instrumentation:spring-data-1.9')
|
||||||
|
|
||||||
testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0'
|
testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0'
|
||||||
testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0'
|
testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0'
|
||||||
|
|
Loading…
Reference in New Issue