diff --git a/CHANGELOG.md b/CHANGELOG.md index 7854b9a98a..d7dd1e9d5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Features - Publish Gradle module metadata ([#3422](https://github.com/getsentry/sentry-java/pull/3422)) +- Add data fetching environment hint to breadcrumb for GraphQL (#3413) ([#3431](https://github.com/getsentry/sentry-java/pull/3431)) ### Fixes diff --git a/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java b/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java index c122ff5b9a..2de9b82f75 100644 --- a/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java +++ b/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java @@ -18,12 +18,14 @@ import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLOutputType; import io.sentry.Breadcrumb; +import io.sentry.Hint; import io.sentry.IScopes; import io.sentry.ISpan; import io.sentry.NoOpScopes; import io.sentry.Sentry; import io.sentry.SentryIntegrationPackageStorage; import io.sentry.SpanStatus; +import io.sentry.TypeCheckHint; import io.sentry.util.StringUtils; import java.util.ArrayList; import java.util.Arrays; @@ -300,13 +302,16 @@ private boolean isIgnored(final @Nullable String errorType) { return environment -> { final @Nullable ExecutionStepInfo executionStepInfo = environment.getExecutionStepInfo(); if (executionStepInfo != null) { + Hint hint = new Hint(); + hint.set(TypeCheckHint.GRAPHQL_DATA_FETCHING_ENVIRONMENT, environment); scopesFromContext(parameters.getExecutionContext().getGraphQLContext()) .addBreadcrumb( Breadcrumb.graphqlDataFetcher( StringUtils.toString(executionStepInfo.getPath()), GraphqlStringUtils.fieldToString(executionStepInfo.getField()), GraphqlStringUtils.typeToString(executionStepInfo.getType()), - GraphqlStringUtils.objectTypeToString(executionStepInfo.getObjectType()))); + GraphqlStringUtils.objectTypeToString(executionStepInfo.getObjectType())), + hint); } final TracingState tracingState = parameters.getInstrumentationState(); final ISpan transaction = tracingState.getTransaction(); diff --git a/sentry-graphql/src/test/kotlin/io/sentry/graphql/SentryInstrumentationAnotherTest.kt b/sentry-graphql/src/test/kotlin/io/sentry/graphql/SentryInstrumentationAnotherTest.kt index 6309155929..7b673a66a8 100644 --- a/sentry-graphql/src/test/kotlin/io/sentry/graphql/SentryInstrumentationAnotherTest.kt +++ b/sentry-graphql/src/test/kotlin/io/sentry/graphql/SentryInstrumentationAnotherTest.kt @@ -28,11 +28,13 @@ import graphql.schema.GraphQLObjectType import graphql.schema.GraphQLScalarType import graphql.schema.GraphQLSchema import io.sentry.Breadcrumb +import io.sentry.Hint import io.sentry.IScopes import io.sentry.Sentry import io.sentry.SentryOptions import io.sentry.SentryTracer import io.sentry.TransactionContext +import io.sentry.TypeCheckHint import io.sentry.graphql.ExceptionReporter.ExceptionDetails import io.sentry.graphql.SentryInstrumentation.SENTRY_EXCEPTIONS_CONTEXT_KEY import io.sentry.graphql.SentryInstrumentation.TracingState @@ -245,6 +247,10 @@ class SentryInstrumentationAnotherTest { assertEquals("myFieldName", breadcrumb.data["field"]) assertEquals("MyResponseType", breadcrumb.data["type"]) assertEquals("QUERY", breadcrumb.data["object_type"]) + }, + org.mockito.kotlin.check { hint -> + val environment = hint.getAs(TypeCheckHint.GRAPHQL_DATA_FETCHING_ENVIRONMENT, DataFetchingEnvironment::class.java) + assertNotNull(environment) } ) } diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index dc0c3ebd5e..ef46c29c62 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -3343,6 +3343,7 @@ public final class io/sentry/TypeCheckHint { public static final field ANDROID_VIEW Ljava/lang/String; public static final field APOLLO_REQUEST Ljava/lang/String; public static final field APOLLO_RESPONSE Ljava/lang/String; + public static final field GRAPHQL_DATA_FETCHING_ENVIRONMENT Ljava/lang/String; public static final field GRAPHQL_HANDLER_PARAMETERS Ljava/lang/String; public static final field JUL_LOG_RECORD Ljava/lang/String; public static final field LOG4J_LOG_EVENT Ljava/lang/String; diff --git a/sentry/src/main/java/io/sentry/TypeCheckHint.java b/sentry/src/main/java/io/sentry/TypeCheckHint.java index e9d219c385..cbe784db5b 100644 --- a/sentry/src/main/java/io/sentry/TypeCheckHint.java +++ b/sentry/src/main/java/io/sentry/TypeCheckHint.java @@ -55,6 +55,9 @@ public final class TypeCheckHint { /** Used for GraphQl handler exceptions. */ public static final String GRAPHQL_HANDLER_PARAMETERS = "graphql:handlerParameters"; + /** Used for GraphQl data fetcher breadcrumbs. */ + public static final String GRAPHQL_DATA_FETCHING_ENVIRONMENT = "graphql:dataFetchingEnvironment"; + /** Used for JUL breadcrumbs. */ public static final String JUL_LOG_RECORD = "jul:logRecord";