/** * Stops the stored span if it has not been stopped already and adds the tags from the provider * to the span. The method is null-safe. * * @param tagsProvidingAdapter * Provides map of tags to add before finishing the span. Must not be * <code>null</code>. * @return Returns <code>true</code> if the span could have been stopped. */ public boolean finishSpan(TagsProvidingAdapter tagsProvidingAdapter) { if ((span != null) && !span.isFinished()) { // add all tags Map<String, String> tags = tagsProvidingAdapter.getTags(); if (MapUtils.isNotEmpty(tags)) { for (Map.Entry<String, String> tagEntry : tags.entrySet()) { span.setTag(tagEntry.getKey(), tagEntry.getValue()); } } // then finish span.finish(); return true; } return false; }
@Test public void happyPath() throws IOException { IOException ex = new IOException(); proxy.onConnectionFailed(ex); ArgumentCaptor<TagsProvidingAdapter> captor = ArgumentCaptor.forClass(TagsProvidingAdapter.class); verify(spanStore).finishSpan(captor.capture()); TagsProvidingAdapter adapter = captor.getValue(); assertThat(adapter, is(instanceOf(ThrowableAwareResponseAdapter.class))); assertThat(adapter.getTags(), hasEntry(Tags.ERROR.getKey(), String.valueOf(true))); assertThat(adapter.getTags(), hasEntry(ExtraTags.THROWABLE_TYPE, ex.getClass().getSimpleName())); } }
@Test public void tagsAlreadyFinished() { when(adapter.getTags()).thenReturn(Collections.singletonMap("key", "value")); when(span.isFinished()).thenReturn(true); boolean result = spanStore.finishSpan(adapter); assertThat(result, is(false)); verify(span).isFinished(); verifyNoMoreInteractions(span); }
@Test public void tagsSpanIsNull() { when(adapter.getTags()).thenReturn(Collections.singletonMap("key", "value")); spanStore.storeSpan(null); boolean result = spanStore.finishSpan(adapter); assertThat(result, is(false)); verifyZeroInteractions(span); } }
@Test public void happyPath() throws IOException { IOException ex = new IOException(); proxy.onException(ex); ArgumentCaptor<TagsProvidingAdapter> captor = ArgumentCaptor.forClass(TagsProvidingAdapter.class); verify(spanStore).finishSpan(captor.capture()); TagsProvidingAdapter adapter = captor.getValue(); assertThat(adapter, is(instanceOf(ThrowableAwareResponseAdapter.class))); assertThat(adapter.getTags(), hasEntry(Tags.ERROR.getKey(), String.valueOf(true))); assertThat(adapter.getTags(), hasEntry(ExtraTags.THROWABLE_TYPE, ex.getClass().getSimpleName())); } }
@Test public void tagsNullSuccessful() { when(adapter.getTags()).thenReturn(null); when(span.isFinished()).thenReturn(false); boolean result = spanStore.finishSpan(adapter); assertThat(result, is(true)); verify(span).finish(); verify(span).isFinished(); verifyNoMoreInteractions(span); }
@Test public void tagsSuccessful() { when(adapter.getTags()).thenReturn(Collections.singletonMap("key", "value")); when(span.isFinished()).thenReturn(false); boolean result = spanStore.finishSpan(adapter); assertThat(result, is(true)); verify(span).finish(); verify(span).isFinished(); verify(span).setTag("key", "value"); verifyNoMoreInteractions(span); }
@Test public void successful() throws Exception { when(spanStoreAdapter.getSpanStore()).thenReturn(spanStore); proxy.cancelled(); ArgumentCaptor<TagsProvidingAdapter> captor = ArgumentCaptor.forClass(TagsProvidingAdapter.class); verify(spanStoreAdapter).getSpanStore(); verify(spanStore).finishSpan(captor.capture()); verify(originalCallback).cancelled(); verifyNoMoreInteractions(spanStore, spanStoreAdapter, originalCallback); assertThat(captor.getValue().getTags(), hasKey(SpanStoreAdapter.Constants.CANCEL)); }
@Test public void happyPath() throws IOException { int status = 200; proxy.onResponseStatus("version", status, "reason"); // can not be called before status reporting proxy.onResponseComplete(); ArgumentCaptor<TagsProvidingAdapter> captor = ArgumentCaptor.forClass(TagsProvidingAdapter.class); verify(spanStore).finishSpan(captor.capture()); TagsProvidingAdapter adapter = captor.getValue(); assertThat(adapter, is(instanceOf(HttpResponseAdapter.class))); assertThat(adapter.getTags(), hasEntry(Tags.HTTP_STATUS.getKey(), String.valueOf(status))); } }