opentelemetry-java-instrume.../dd-java-agent/instrumentation/elasticsearch/rest-6.4/src/latestDepTest/groovy/Elasticsearch6RestClientTes...

131 lines
4.0 KiB
Groovy

import com.anotherchrisberry.spock.extensions.retry.RetryOnFailure
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.utils.PortUtils
import datadog.trace.api.DDSpanTypes
import groovy.json.JsonSlurper
import io.opentracing.tag.Tags
import org.apache.http.HttpHost
import org.apache.http.client.config.RequestConfig
import org.apache.http.util.EntityUtils
import org.elasticsearch.client.Request
import org.elasticsearch.client.Response
import org.elasticsearch.client.RestClient
import org.elasticsearch.client.RestClientBuilder
import org.elasticsearch.common.io.FileSystemUtils
import org.elasticsearch.common.settings.Settings
import org.elasticsearch.env.Environment
import org.elasticsearch.node.InternalSettingsPreparer
import org.elasticsearch.node.Node
import org.elasticsearch.plugins.Plugin
import org.elasticsearch.transport.Netty4Plugin
import spock.lang.Shared
@RetryOnFailure(times = 3, delaySeconds = 1)
class Elasticsearch6RestClientTest extends AgentTestRunner {
@Shared
int httpPort
@Shared
int tcpPort
@Shared
Node testNode
@Shared
File esWorkingDir
@Shared
RestClient client
def setupSpec() {
httpPort = PortUtils.randomOpenPort()
tcpPort = PortUtils.randomOpenPort()
esWorkingDir = File.createTempDir("test-es-working-dir-", "")
esWorkingDir.deleteOnExit()
println "ES work dir: $esWorkingDir"
def settings = Settings.builder()
.put("path.home", esWorkingDir.path)
.put("http.port", httpPort)
.put("transport.tcp.port", tcpPort)
.put("cluster.name", "test-cluster")
.build()
testNode = new TestNode(InternalSettingsPreparer.prepareEnvironment(settings, null), [Netty4Plugin])
testNode.start()
client = RestClient.builder(new HttpHost("localhost", httpPort))
.setMaxRetryTimeoutMillis(Integer.MAX_VALUE)
.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
return builder.setConnectTimeout(Integer.MAX_VALUE).setSocketTimeout(Integer.MAX_VALUE)
}
})
.build()
}
def cleanupSpec() {
testNode?.close()
if (esWorkingDir != null) {
FileSystemUtils.deleteSubDirectories(esWorkingDir.toPath())
esWorkingDir.delete()
}
}
def "test elasticsearch status"() {
setup:
Request request = new Request("GET", "_cluster/health")
Response response = client.performRequest(request)
Map result = new JsonSlurper().parseText(EntityUtils.toString(response.entity))
expect:
result.status == "green"
assertTraces(1) {
trace(0, 2) {
span(0) {
serviceName "elasticsearch"
resourceName "GET _cluster/health"
operationName "elasticsearch.rest.query"
spanType DDSpanTypes.ELASTICSEARCH
parent()
tags {
"$Tags.COMPONENT.key" "elasticsearch-java"
"$Tags.DB_TYPE.key" "elasticsearch"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
"$Tags.HTTP_METHOD.key" "GET"
"$Tags.HTTP_URL.key" "_cluster/health"
"$Tags.PEER_HOSTNAME.key" "localhost"
"$Tags.PEER_PORT.key" httpPort
defaultTags()
}
}
span(1) {
serviceName "elasticsearch"
resourceName "GET _cluster/health"
operationName "http.request"
spanType DDSpanTypes.HTTP_CLIENT
childOf span(0)
tags {
"$Tags.COMPONENT.key" "apache-httpasyncclient"
"$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT
"$Tags.HTTP_METHOD.key" "GET"
"$Tags.HTTP_URL.key" "_cluster/health"
"$Tags.HTTP_STATUS.key" 200
defaultTags()
}
}
}
}
}
static class TestNode extends Node {
TestNode(Environment environment, Collection<Class<? extends Plugin>> classpathPlugins) {
super(environment, classpathPlugins, false)
}
@Override
protected void registerDerivedNodeNameWithLogger(String nodeName) {}
}
}