JAX-RS RestEasy single connection test, comment on others where not applicable (#3187)
This commit is contained in:
parent
d4e64990fc
commit
b277fd96c5
|
@ -12,6 +12,7 @@ import com.ning.http.client.Response
|
||||||
import com.ning.http.client.uri.Uri
|
import com.ning.http.client.uri.Uri
|
||||||
import io.opentelemetry.instrumentation.test.AgentTestTrait
|
import io.opentelemetry.instrumentation.test.AgentTestTrait
|
||||||
import io.opentelemetry.instrumentation.test.base.HttpClientTest
|
import io.opentelemetry.instrumentation.test.base.HttpClientTest
|
||||||
|
import io.opentelemetry.instrumentation.test.base.SingleConnection
|
||||||
import spock.lang.AutoCleanup
|
import spock.lang.AutoCleanup
|
||||||
import spock.lang.Shared
|
import spock.lang.Shared
|
||||||
|
|
||||||
|
@ -63,6 +64,15 @@ class AsyncHttpClientTest extends HttpClientTest<Request> implements AgentTestTr
|
||||||
boolean testHttps() {
|
boolean testHttps() {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
SingleConnection createSingleConnection(String host, int port) {
|
||||||
|
// AsyncHttpClient does not support HTTP 1.1 pipelining nor waiting for connection pool slots to
|
||||||
|
// free up (it immediately throws "Too many connections" IOException). Therefore making a single
|
||||||
|
// connection test would require manually sequencing the connections, which is not meaningful
|
||||||
|
// for a high concurrency test.
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.NetTr
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.test.AgentTestTrait
|
import io.opentelemetry.instrumentation.test.AgentTestTrait
|
||||||
import io.opentelemetry.instrumentation.test.base.HttpClientTest
|
import io.opentelemetry.instrumentation.test.base.HttpClientTest
|
||||||
|
import io.opentelemetry.instrumentation.test.base.SingleConnection
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import javax.ws.rs.ProcessingException
|
import javax.ws.rs.ProcessingException
|
||||||
|
@ -128,6 +129,15 @@ class JerseyClientTest extends JaxRsClientTest {
|
||||||
int maxRedirects() {
|
int maxRedirects() {
|
||||||
20
|
20
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
SingleConnection createSingleConnection(String host, int port) {
|
||||||
|
// Jersey JAX-RS client uses HttpURLConnection internally, which does not support pipelining nor
|
||||||
|
// waiting for a connection in the pool to become available. Therefore a high concurrency test
|
||||||
|
// would require manually doing requests one after another which is not meaningful for a high
|
||||||
|
// concurrency test.
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ResteasyClientTest extends JaxRsClientTest {
|
class ResteasyClientTest extends JaxRsClientTest {
|
||||||
|
@ -141,6 +151,11 @@ class ResteasyClientTest extends JaxRsClientTest {
|
||||||
boolean testRedirects() {
|
boolean testRedirects() {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
SingleConnection createSingleConnection(String host, int port) {
|
||||||
|
return new ResteasySingleConnection(host, port)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CxfClientTest extends JaxRsClientTest {
|
class CxfClientTest extends JaxRsClientTest {
|
||||||
|
@ -154,4 +169,13 @@ class CxfClientTest extends JaxRsClientTest {
|
||||||
boolean testRedirects() {
|
boolean testRedirects() {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
SingleConnection createSingleConnection(String host, int port) {
|
||||||
|
// CXF JAX-RS client uses HttpURLConnection internally, which does not support pipelining nor
|
||||||
|
// waiting for a connection in the pool to become available. Therefore a high concurrency test
|
||||||
|
// would require manually doing requests one after another which is not meaningful for a high
|
||||||
|
// concurrency test.
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import io.opentelemetry.instrumentation.test.base.SingleConnection
|
||||||
|
import java.util.concurrent.ExecutionException
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
import java.util.concurrent.TimeoutException
|
||||||
|
import javax.ws.rs.core.MediaType
|
||||||
|
import org.apache.http.client.params.ClientPNames
|
||||||
|
import org.jboss.resteasy.client.jaxrs.ResteasyClient
|
||||||
|
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder
|
||||||
|
import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine
|
||||||
|
|
||||||
|
class ResteasySingleConnection implements SingleConnection {
|
||||||
|
private final ResteasyClient client
|
||||||
|
private final String host
|
||||||
|
private final int port
|
||||||
|
|
||||||
|
ResteasySingleConnection(String host, int port) {
|
||||||
|
this.host = host
|
||||||
|
this.port = port
|
||||||
|
this.client = new ResteasyClientBuilder()
|
||||||
|
.establishConnectionTimeout(5000, TimeUnit.MILLISECONDS)
|
||||||
|
.connectionPoolSize(1)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
((ApacheHttpClient4Engine) client.httpEngine()).httpClient.params
|
||||||
|
.setParameter(ClientPNames.CONN_MANAGER_TIMEOUT, 20000L)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
int doRequest(String path, Map<String, String> headers) throws ExecutionException, InterruptedException, TimeoutException {
|
||||||
|
String requestId = Objects.requireNonNull(headers.get(REQUEST_ID_HEADER))
|
||||||
|
|
||||||
|
URI uri
|
||||||
|
try {
|
||||||
|
uri = new URL("http", host, port, path).toURI()
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
throw new ExecutionException(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
def requestBuilder = client.target(uri).request(MediaType.TEXT_PLAIN)
|
||||||
|
headers.each { requestBuilder.header(it.key, it.value) }
|
||||||
|
|
||||||
|
def response = requestBuilder.buildGet().invoke()
|
||||||
|
response.close()
|
||||||
|
|
||||||
|
String responseId = response.getHeaderString(REQUEST_ID_HEADER)
|
||||||
|
if (requestId != responseId) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
String.format("Received response with id %s, expected %s", responseId, requestId))
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.getStatus()
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,8 @@ package client
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.test.AgentTestTrait
|
import io.opentelemetry.instrumentation.test.AgentTestTrait
|
||||||
import io.opentelemetry.instrumentation.test.base.HttpClientTest
|
import io.opentelemetry.instrumentation.test.base.HttpClientTest
|
||||||
|
import io.opentelemetry.instrumentation.test.base.SingleConnection
|
||||||
|
|
||||||
import java.util.concurrent.CompletionStage
|
import java.util.concurrent.CompletionStage
|
||||||
import play.libs.ws.WS
|
import play.libs.ws.WS
|
||||||
import play.libs.ws.WSRequest
|
import play.libs.ws.WSRequest
|
||||||
|
@ -63,4 +65,13 @@ class PlayWsClientTest extends HttpClientTest<WSRequest> implements AgentTestTra
|
||||||
boolean testHttps() {
|
boolean testHttps() {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue