/** * Call this before one of the {@code executeAsyncHttpRequest(...)} methods in order to get a request builder you * can populate with query params, headers, body, etc. If you want to specify a custom circuit breaker (or disable * circuit breaking entirely) for this call then use {@link #getRequestBuilder(String, HttpMethod, Optional, * boolean)} instead. This method tells the HTTP client to use a default circuit breaker based on the host being * called. */ public RequestBuilderWrapper getRequestBuilder(String url, HttpMethod method) { return getRequestBuilder(url, method, Optional.empty(), false); }
@Nullable @Override public String getRequestUrl(@Nullable RequestBuilderWrapper request) { if (request == null) { return null; } return request.getUrl(); }
@Nullable @Override public String getRequestHttpMethod(@Nullable RequestBuilderWrapper request) { if (request == null) { return null; } return request.getHttpMethod(); }
@Test public void getCircuitBreaker_returns_empty_if_disableCircuitBreaker_is_true() { // given RequestBuilderWrapper rbw = new RequestBuilderWrapper( "foo", "bar", mock(AsyncHttpClient.BoundRequestBuilder.class), Optional.of(mock(CircuitBreaker.class)), true); // when Optional<CircuitBreaker<Response>> result = helperSpy.getCircuitBreaker(rbw); // then assertThat(result).isEmpty(); }
private Pair<ObjectHolder<Span>, ObjectHolder<Span>> setupBeforeAndAfterSpanCaptureForOnCompleted() throws Throwable { ObjectHolder<Span> before = new ObjectHolder<>(); ObjectHolder<Span> after = new ObjectHolder<>(); doAnswer(invocation -> { before.setObj(Tracer.getInstance().getCurrentSpan()); return null; }).when(circuitBreakerManualTaskMock).handleEvent(responseMock); doAnswer(invocation -> { after.setObj(Tracer.getInstance().getCurrentSpan()); return responseHandlerResult; }).when(responseHandlerFunctionMock).handleResponse(responseMock); return Pair.of(before, after); }
@Test public void getRequestUrl_works_as_expected() { // given String expectedResult = UUID.randomUUID().toString(); doReturn(expectedResult).when(requestMock).getUrl(); // when String result = adapterSpy.getRequestUrl(requestMock); // then assertThat(result).isEqualTo(expectedResult); }
@Test public void getRequestHttpMethod_works_as_expected() { // given String expectedResult = UUID.randomUUID().toString(); doReturn(expectedResult).when(requestMock).getHttpMethod(); // when String result = adapterSpy.getRequestHttpMethod(requestMock); // then assertThat(result).isEqualTo(expectedResult); }
@Test public void default_constructor_creates_instance_using_default_ZipkinHttpTagStrategy_and_AsyncHttpClientHelperTagAdapter() { // when DefaultAsyncHttpClientHelperSpanNamingAndTaggingStrategy instance = new DefaultAsyncHttpClientHelperSpanNamingAndTaggingStrategy(); // then assertThat(instance.tagAndNamingStrategy).isSameAs(ZipkinHttpTagStrategy.getDefaultInstance()); assertThat(instance.tagAndNamingAdapter).isSameAs(AsyncHttpClientHelperTagAdapter.getDefaultInstance()); }
@Test public void getDefaultInstance_returns_DEFAULT_INSTANCE() { // when DefaultAsyncHttpClientHelperSpanNamingAndTaggingStrategy instance = DefaultAsyncHttpClientHelperSpanNamingAndTaggingStrategy.getDefaultInstance(); // then assertThat(instance) .isSameAs(DefaultAsyncHttpClientHelperSpanNamingAndTaggingStrategy.DEFAULT_INSTANCE); assertThat(instance.tagAndNamingStrategy).isSameAs(ZipkinHttpTagStrategy.getDefaultInstance()); assertThat(instance.tagAndNamingAdapter).isSameAs(AsyncHttpClientHelperTagAdapter.getDefaultInstance()); }
@Test public void default_constructor_creates_instance_with_default_values() { // when AsyncHttpClientHelper instance = new AsyncHttpClientHelper(); // then assertThat(instance.performSubSpanAroundDownstreamCalls).isTrue(); verifyDefaultUnderlyingClientConfig(instance); }
/** * Call this before one of the {@code executeAsyncHttpRequest(...)} methods in order to get a request builder you * can populate with query params, headers, body, etc. Pass in a non-empty {@code customCircuitBreaker} argument to * specify the exact circuit breaker you want to use, pass in an empty {@code customCircuitBreaker} if you want the * HTTP client to use a default one based on the host being called, and pass in true for the {@code * disableCircuitBreaker} argument if you want to disable circuit breaking entirely for this call. */ public RequestBuilderWrapper getRequestBuilder(String url, HttpMethod method, Optional<CircuitBreaker<Response>> customCircuitBreaker, boolean disableCircuitBreaker) { RequestBuilderWrapper wrapper = generateRequestBuilderWrapper( url, method, customCircuitBreaker, disableCircuitBreaker ); // The AsyncHttpClient doesn't properly split traffic when a DNS has multiple IP addresses associated with it, // so we have to hack it ourselves. wrapper.requestBuilder.setNameResolver(getMultiIpAwareNameResolver()); return wrapper; }
/** * Creates a new instance that uses {@link ZipkinHttpTagStrategy#getDefaultInstance()} and {@link * AsyncHttpClientHelperTagAdapter#getDefaultInstance()} to do the work of span naming and tagging. */ public DefaultAsyncHttpClientHelperSpanNamingAndTaggingStrategy() { this(ZipkinHttpTagStrategy.getDefaultInstance(), AsyncHttpClientHelperTagAdapter.getDefaultInstance()); }
@Test public void setSpanNamingAndTaggingStrategy_throws_IllegalArgumentException_if_passed_null() { // given AsyncHttpClientHelper instance = new AsyncHttpClientHelper(false); // when Throwable ex = catchThrowable(() -> instance.setSpanNamingAndTaggingStrategy(null)); // then assertThat(ex) .isInstanceOf(IllegalArgumentException.class) .hasMessage("spanNamingAndTaggingStrategy cannot be null"); }
@After public void afterMethod() { resetTracingAndMdc(); }
@After public void afterMethod() { resetTracingAndMdc(); }
@Before public void setup() { adapterSpy = spy(new AsyncHttpClientHelperTagAdapter()); requestMock = mock(RequestBuilderWrapper.class); responseMock = mock(Response.class); }
@Test public void getSpanHandlerTagValue_returns_expected_value() { // expect assertThat(adapterSpy.getSpanHandlerTagValue(requestMock, responseMock)) .isEqualTo("riposte.ningasynchttpclienthelper"); } }
@Test public void getRequestHttpMethod_returns_null_if_passed_null() { // expect assertThat(adapterSpy.getRequestHttpMethod(null)).isNull(); }
@Test public void getCircuitBreaker_returns_custom_circuit_breaker_if_disableCircuitBreaker_is_false_and_customCircuitBreaker_exists() { // given Optional<CircuitBreaker<Response>> customCb = Optional.of(mock(CircuitBreaker.class)); RequestBuilderWrapper rbw = new RequestBuilderWrapper( "foo", "bar", mock(AsyncHttpClient.BoundRequestBuilder.class), customCb, false); // when Optional<CircuitBreaker<Response>> result = helperSpy.getCircuitBreaker(rbw); // then assertThat(result).isSameAs(customCb); }
@DataProvider(value = { "true", "false" }, splitBy = "\\|") @Test public void constructor_with_subspan_opt_works_as_expected(boolean performSubspan) { // when AsyncHttpClientHelper instance = new AsyncHttpClientHelper(performSubspan); // then assertThat(instance.performSubSpanAroundDownstreamCalls).isEqualTo(performSubspan); verifyDefaultUnderlyingClientConfig(instance); }