Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# vNext

* Fix: Set current thread only if theres no exceptions
* Enhancement: Set transaction name on events and transactions sent using Spring integration (#1067)
* Fix: Set current thread only if there are no exceptions

# 4.0.0-alpha.1

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import io.sentry.SpanContext;
import io.sentry.exception.ExceptionMechanismException;
import io.sentry.protocol.Mechanism;
import io.sentry.spring.tracing.TransactionNameProvider;
import io.sentry.util.Objects;
import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.http.HttpServletRequest;
Expand All @@ -27,8 +26,6 @@
@Open
public class SentryExceptionResolver implements HandlerExceptionResolver, Ordered {
private final @NotNull IHub hub;
private final @NotNull TransactionNameProvider transactionNameProvider =
new TransactionNameProvider();
private final int order;

public SentryExceptionResolver(final @NotNull IHub hub, final int order) {
Expand All @@ -49,15 +46,14 @@ public SentryExceptionResolver(final @NotNull IHub hub, final int order) {
new ExceptionMechanismException(mechanism, ex, Thread.currentThread());
final SentryEvent event = new SentryEvent(throwable);
event.setLevel(SentryLevel.FATAL);

final SentryTransaction sentryTransaction = resolveActiveTransaction();
if (sentryTransaction != null) {
final SpanContext spanContext = sentryTransaction.getSpanContext(ex);
if (spanContext != null) {
// connects the event with a span
event.getContexts().setTrace(spanContext);
}
// connects the event with transaction
event.setTransaction(transactionNameProvider.provideTransactionName(request));
}
hub.captureEvent(event);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.jakewharton.nopen.annotation.Open;
import io.sentry.EventProcessor;
import io.sentry.SentryEvent;
import io.sentry.spring.tracing.TransactionNameProvider;
import io.sentry.util.Objects;
import javax.servlet.http.HttpServletRequest;
import org.jetbrains.annotations.NotNull;
Expand All @@ -13,6 +14,8 @@
public class SentryRequestHttpServletRequestProcessor implements EventProcessor {
private final @NotNull HttpServletRequest request;
private final @NotNull SentryRequestResolver sentryRequestResolver;
private final @NotNull TransactionNameProvider transactionNameProvider =
new TransactionNameProvider();

public SentryRequestHttpServletRequestProcessor(
final @NotNull HttpServletRequest request,
Expand All @@ -26,6 +29,9 @@ public SentryRequestHttpServletRequestProcessor(
public @NotNull SentryEvent process(
final @NotNull SentryEvent event, final @Nullable Object hint) {
event.setRequest(sentryRequestResolver.resolveSentryRequest(request));
if (event.getTransaction() == null) {
event.setTransaction(transactionNameProvider.provideTransactionName(request));
}
return event;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ import java.net.URI
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertNotNull
import kotlin.test.assertNull
import kotlin.test.assertTrue
import org.springframework.http.MediaType
import org.springframework.mock.web.MockServletContext
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.web.servlet.HandlerMapping

class SentryRequestHttpServletRequestProcessorTest {

Expand Down Expand Up @@ -108,4 +110,35 @@ class SentryRequestHttpServletRequestProcessorTest {
assertFalse(event.request.headers.containsKey("Cookie"))
assertTrue(event.request.headers.containsKey("some-header"))
}

@Test
fun `when event does not have transaction name, sets the transaction name from the current request`() {
val request = MockMvcRequestBuilders
.get(URI.create("http://example.com?param1=xyz"))
.requestAttr(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE, "/some-path")
.buildRequest(MockServletContext())
val eventProcessor = SentryRequestHttpServletRequestProcessor(request, SentryRequestResolver(SentryOptions()))
val event = SentryEvent()

eventProcessor.process(event, null)

assertNotNull(event.transaction)
assertEquals("GET /some-path", event.transaction)
}

@Test
fun `when event has transaction name set, does not overwrite transaction name with value from the current request`() {
val request = MockMvcRequestBuilders
.get(URI.create("http://example.com?param1=xyz"))
.requestAttr(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE, "/some-path")
.buildRequest(MockServletContext())
val eventProcessor = SentryRequestHttpServletRequestProcessor(request, SentryRequestResolver(SentryOptions()))
val event = SentryEvent()
event.transaction = "some-transaction"

eventProcessor.process(event, null)

assertNotNull(event.transaction)
assertEquals("some-transaction", event.transaction)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,19 @@ class SentrySpringIntegrationTest {
}
}

@Test
fun `attaches transaction name to events`() {
val restTemplate = TestRestTemplate().withBasicAuth("user", "password")

restTemplate.getForEntity("http://localhost:$port/throws", String::class.java)

await.untilAsserted {
verify(transport).send(checkEvent { event ->
assertThat(event.transaction).isEqualTo("GET /throws")
})
}
}

@Test
fun `does not send events for handled exceptions`() {
val restTemplate = TestRestTemplate().withBasicAuth("user", "password")
Expand Down