PlayWsClientTest.groovy 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * Copyright The OpenTelemetry Authors
  3. * SPDX-License-Identifier: Apache-2.0
  4. */
  5. package client
  6. import io.opentelemetry.api.common.AttributeKey
  7. import io.opentelemetry.instrumentation.test.AgentTestTrait
  8. import io.opentelemetry.instrumentation.test.base.HttpClientTest
  9. import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest
  10. import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection
  11. import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
  12. import play.libs.ws.WS
  13. import play.libs.ws.WSRequest
  14. import play.libs.ws.WSResponse
  15. import spock.lang.AutoCleanup
  16. import spock.lang.Shared
  17. import spock.lang.Subject
  18. import java.util.concurrent.CompletionStage
  19. // Play 2.6+ uses a separately versioned client that shades the underlying dependency
  20. // This means our built in instrumentation won't work.
  21. class PlayWsClientTest extends HttpClientTest<WSRequest> implements AgentTestTrait {
  22. @Subject
  23. @Shared
  24. @AutoCleanup
  25. def client = WS.newClient(-1)
  26. @Override
  27. WSRequest buildRequest(String method, URI uri, Map<String, String> headers) {
  28. def request = client.url(uri.toString())
  29. headers.entrySet().each {
  30. request.setHeader(it.key, it.value)
  31. }
  32. return request
  33. }
  34. @Override
  35. int sendRequest(WSRequest request, String method, URI uri, Map<String, String> headers) {
  36. return internalSendRequest(request, method).toCompletableFuture().get().status
  37. }
  38. @Override
  39. void sendRequestWithCallback(WSRequest request, String method, URI uri, Map<String, String> headers, AbstractHttpClientTest.RequestResult requestResult) {
  40. internalSendRequest(request, method).whenComplete { response, throwable ->
  41. requestResult.complete({ response.status }, throwable)
  42. }
  43. }
  44. private static CompletionStage<WSResponse> internalSendRequest(WSRequest request, String method) {
  45. return request.execute(method)
  46. }
  47. //TODO see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/2347
  48. // @Override
  49. // String userAgent() {
  50. // return "AHC"
  51. // }
  52. @Override
  53. boolean testRedirects() {
  54. false
  55. }
  56. @Override
  57. Set<AttributeKey<?>> httpAttributes(URI uri) {
  58. Set<AttributeKey<?>> extra = [
  59. SemanticAttributes.HTTP_SCHEME,
  60. SemanticAttributes.HTTP_TARGET
  61. ]
  62. super.httpAttributes(uri) + extra
  63. }
  64. @Override
  65. SingleConnection createSingleConnection(String host, int port) {
  66. // Play HTTP client uses AsyncHttpClient internally which does not support HTTP 1.1 pipelining
  67. // nor waiting for connection pool slots to free up. Therefore making a single connection test
  68. // would require manually sequencing the connections, which is not meaningful for a high
  69. // concurrency test.
  70. return null
  71. }
  72. }