opentelemetry-java-instrume.../instrumentation/play/play-2.4/javaagent/src/test/groovy/client/PlayWsClientTest.groovy

84 lines
2.7 KiB
Groovy

/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package client
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.instrumentation.test.AgentTestTrait
import io.opentelemetry.instrumentation.test.base.HttpClientTest
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest
import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
import java.util.concurrent.CompletionStage
import play.libs.ws.WS
import play.libs.ws.WSRequest
import play.libs.ws.WSResponse
import spock.lang.AutoCleanup
import spock.lang.Shared
import spock.lang.Subject
// Play 2.6+ uses a separately versioned client that shades the underlying dependency
// This means our built in instrumentation won't work.
class PlayWsClientTest extends HttpClientTest<WSRequest> implements AgentTestTrait {
@Subject
@Shared
@AutoCleanup
def client = WS.newClient(-1)
@Override
WSRequest buildRequest(String method, URI uri, Map<String, String> headers) {
def request = client.url(uri.toString())
headers.entrySet().each {
request.setHeader(it.key, it.value)
}
return request
}
@Override
int sendRequest(WSRequest request, String method, URI uri, Map<String, String> headers) {
return internalSendRequest(request, method).toCompletableFuture().get().status
}
@Override
void sendRequestWithCallback(WSRequest request, String method, URI uri, Map<String, String> headers, AbstractHttpClientTest.RequestResult requestResult) {
internalSendRequest(request, method).whenComplete { response, throwable ->
requestResult.complete({ response.status }, throwable)
}
}
private static CompletionStage<WSResponse> internalSendRequest(WSRequest request, String method) {
return request.execute(method)
}
//TODO see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/2347
// @Override
// String userAgent() {
// return "AHC"
// }
@Override
boolean testRedirects() {
false
}
@Override
Set<AttributeKey<?>> httpAttributes(URI uri) {
Set<AttributeKey<?>> extra = [
SemanticAttributes.HTTP_SCHEME,
SemanticAttributes.HTTP_TARGET
]
super.httpAttributes(uri) + extra
}
@Override
SingleConnection createSingleConnection(String host, int port) {
// Play HTTP client uses AsyncHttpClient internally which does not support HTTP 1.1 pipelining
// nor waiting for connection pool slots to free up. Therefore making a single connection test
// would require manually sequencing the connections, which is not meaningful for a high
// concurrency test.
return null
}
}