sentry_link 0.1.0 sentry_link: ^0.1.0 copied to clipboard
Automatic capture of exceptions and GraphQL errors for the gql eco-system, like graphql and ferry
Sentry Link (GraphQL) #
Integration for the gql_link
package to collect error reports for GraphQL requests. This is used by a wide variety of GraphQL libraries like ferry
or graphql
.
Usage #
Just add SentryLink.link()
and/or SentryTracingLink
to your links.
final link = Link.from([
AuthLink(getToken: () async => 'Bearer $personalAccessToken'),
// SentryLink records exceptions
SentryLink.link(),
// SentryTracingLink adds performance tracing with Sentry
SentryTracingLink(shouldStartTransaction: true),
HttpLink('https://api.github.com/graphql'),
]);
In addition to that, you can add GqlEventProcessor
to Sentry's event processor, to improve support for nested LinkExceptions
.
A GraphQL error will be reported like the following screenshot:
SentryResponseParser
and SentryRequestSerializer
#
The SentryResponseParser
and SentryRequestSerializer
classes can be used to trace the serialization process.
Both classes work with HttpLink
and DioLink
.
When using the HttpLink
, you can additionally use the sentryResponseDecoder
function.
import 'package:sentry_link/sentry_link.dart';
final link = Link.from([
SentryLink.link(),
AuthLink(getToken: () async => 'Bearer $personalAccessToken'),
SentryTracingLink(shouldStartTransaction: true),
HttpLink(
'https://api.github.com/graphql',
httpClient: SentryHttpClient(networkTracing: true),
serializer: SentryRequestSerializer(),
parser: SentryResponseParser(),
),
]);
final client = GraphQLClient(
cache: GraphQLCache(),
link: link,
);
HttpLink
Bonus HttpLink
tracing #
import 'dart:async';
import 'dart:convert';
import 'package:sentry/sentry.dart';
import 'package:http/http.dart' as http;
import 'package:sentry_link/sentry_link.dart';
final link = Link.from([
SentryLink.link(),
AuthLink(getToken: () async => 'Bearer $personalAccessToken'),
SentryTracingLink(shouldStartTransaction: true),
HttpLink(
'https://api.github.com/graphql',
httpClient: SentryHttpClient(networkTracing: true),
serializer: SentryRequestSerializer(),
parser: SentryResponseParser(),
httpResponseDecoder: sentryResponseDecoder,
),
]);
final client = GraphQLClient(
cache: GraphQLCache(),
link: link,
);
Map<String, dynamic>? sentryResponseDecoder(
http.Response response, {
Hub? hub,
}) {
final currentHub = hub ?? HubAdapter();
final span = currentHub.getSpan()?.startChild(
'serialize.http.client',
description: 'http response deserialization',
);
Map<String, dynamic>? result;
try {
result = _defaultHttpResponseDecoder(response);
span?.status = const SpanStatus.ok();
} catch (e) {
span?.status = const SpanStatus.unknownError();
span?.throwable = e;
rethrow;
} finally {
unawaited(span?.finish());
}
return result;
}
Map<String, dynamic>? _defaultHttpResponseDecoder(http.Response httpResponse) {
return json.decode(utf8.decode(httpResponse.bodyBytes))
as Map<String, dynamic>?;
}