opentelemetry-java-instrume.../dd-java-agent/instrumentation/hystrix-1.4/src/test/groovy/HystrixTest.groovy

168 lines
4.6 KiB
Groovy

import com.netflix.hystrix.HystrixCommand
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.api.Trace
import io.opentracing.tag.Tags
import java.util.concurrent.BlockingQueue
import java.util.concurrent.LinkedBlockingQueue
import static com.netflix.hystrix.HystrixCommandGroupKey.Factory.asKey
import static datadog.trace.agent.test.TestUtils.runUnderTrace
class HystrixTest extends AgentTestRunner {
// Uncomment for debugging:
// static {
// System.setProperty("hystrix.command.default.execution.timeout.enabled", "false")
// }
def "test command #action"() {
setup:
def command = new HystrixCommand(asKey("ExampleGroup")) {
@Override
protected Object run() throws Exception {
return tracedMethod()
}
@Trace
private String tracedMethod() {
return "Hello!"
}
}
def result = runUnderTrace("parent") {
operation(command)
}
expect:
TRANSFORMED_CLASSES.contains("com.netflix.hystrix.strategy.concurrency.HystrixContextScheduler\$ThreadPoolWorker")
TRANSFORMED_CLASSES.contains("HystrixTest\$1")
result == "Hello!"
assertTraces(1) {
trace(0, 3) {
span(0) {
serviceName "unnamed-java-app"
operationName "parent"
resourceName "parent"
spanType null
parent()
errored false
tags {
defaultTags()
}
}
span(1) {
serviceName "unnamed-java-app"
operationName "HystrixTest\$1.run"
resourceName "HystrixTest\$1.run"
spanType null
childOf span(0)
errored false
tags {
"$Tags.COMPONENT.key" "hystrix"
defaultTags()
}
}
span(2) {
serviceName "unnamed-java-app"
operationName "HystrixTest\$1.tracedMethod"
resourceName "HystrixTest\$1.tracedMethod"
spanType null
childOf span(1)
errored false
tags {
"$Tags.COMPONENT.key" "trace"
defaultTags()
}
}
}
}
where:
action | operation
"execute" | { HystrixCommand cmd -> cmd.execute() }
"queue" | { HystrixCommand cmd -> cmd.queue().get() }
"observe" | { HystrixCommand cmd -> cmd.observe().toBlocking().first() }
"observe block" | { HystrixCommand cmd ->
BlockingQueue queue = new LinkedBlockingQueue()
cmd.observe().subscribe { next ->
queue.put(next)
}
queue.take()
}
}
def "test command #action fallback"() {
setup:
def command = new HystrixCommand(asKey("ExampleGroup")) {
@Override
protected Object run() throws Exception {
throw new IllegalArgumentException()
}
protected String getFallback() {
return "Fallback!"
}
}
def result = runUnderTrace("parent") {
operation(command)
}
expect:
TRANSFORMED_CLASSES.contains("com.netflix.hystrix.strategy.concurrency.HystrixContextScheduler\$ThreadPoolWorker")
TRANSFORMED_CLASSES.contains("HystrixTest\$2")
result == "Fallback!"
assertTraces(1) {
trace(0, 3) {
span(0) {
serviceName "unnamed-java-app"
operationName "parent"
resourceName "parent"
spanType null
parent()
errored false
tags {
defaultTags()
}
}
span(1) {
serviceName "unnamed-java-app"
operationName "HystrixTest\$2.getFallback"
resourceName "HystrixTest\$2.getFallback"
spanType null
childOf span(0)
errored false
tags {
"$Tags.COMPONENT.key" "hystrix"
defaultTags()
}
}
span(2) {
serviceName "unnamed-java-app"
operationName "HystrixTest\$2.run"
resourceName "HystrixTest\$2.run"
spanType null
childOf span(0)
errored true
tags {
"$Tags.COMPONENT.key" "hystrix"
errorTags(IllegalArgumentException)
defaultTags()
}
}
}
}
where:
action | operation
"execute" | { HystrixCommand cmd -> cmd.execute() }
"queue" | { HystrixCommand cmd -> cmd.queue().get() }
"observe" | { HystrixCommand cmd -> cmd.observe().toBlocking().first() }
"observe block" | { HystrixCommand cmd ->
BlockingQueue queue = new LinkedBlockingQueue()
cmd.observe().subscribe { next ->
queue.put(next)
}
queue.take()
}
}
}