diff --git a/packages/dart/lib/src/http_client/tracing_client.dart b/packages/dart/lib/src/http_client/tracing_client.dart index 8086d13a16..5133641b10 100644 --- a/packages/dart/lib/src/http_client/tracing_client.dart +++ b/packages/dart/lib/src/http_client/tracing_client.dart @@ -4,7 +4,7 @@ import '../hub.dart'; import '../hub_adapter.dart'; import '../protocol.dart'; import '../sentry_trace_origins.dart'; -import '../tracing.dart'; +import '../tracing/instrumentation/instrumentation.dart'; import '../utils/http_sanitizer.dart'; import '../utils/tracing_utils.dart'; @@ -19,6 +19,7 @@ class TracingClient extends BaseClient { TracingClient({Client? client, Hub? hub}) : _hub = hub ?? HubAdapter(), _client = client ?? Client() { + _spanFactory = _hub.options.spanFactory; if (_hub.options.isTracingEnabled()) { _hub.options.sdk.addIntegration(integrationName); } @@ -26,6 +27,7 @@ class TracingClient extends BaseClient { final Client _client; final Hub _hub; + late final InstrumentationSpanFactory _spanFactory; @override Future send(BaseRequest request) async { @@ -37,40 +39,44 @@ class TracingClient extends BaseClient { description += ' ${urlDetails.urlOrFallback}'; } - final currentSpan = _hub.getSpan(); - var span = currentSpan?.startChild( + final parentSpan = _spanFactory.getSpan(_hub); + final instrumentationSpan = _spanFactory.createSpan( + parentSpan, 'http.client', description: description, ); - if (span is NoOpSentrySpan) { - span = null; - } - // Regardless whether tracing is enabled or not, we always want to attach // Sentry trace headers (tracing without performance). if (containsTargetOrMatchesRegExp( _hub.options.tracePropagationTargets, request.url.toString())) { - addTracingHeadersToHttpHeader(request.headers, _hub, span: span); + addTracingHeadersToHttpHeader( + request.headers, + _hub, + span: instrumentationSpan, + ); } - span?.origin = SentryTraceOrigins.autoHttpHttp; - span?.setData('http.request.method', request.method); - urlDetails?.applyToSpan(span); + instrumentationSpan?.origin = SentryTraceOrigins.autoHttpHttp; + instrumentationSpan?.setData('http.request.method', request.method); + urlDetails?.applyToSpan(instrumentationSpan); StreamedResponse? response; try { response = await _client.send(request); - span?.setData('http.response.status_code', response.statusCode); - span?.setData('http.response_content_length', response.contentLength); - span?.status = SpanStatus.fromHttpStatusCode(response.statusCode); + instrumentationSpan?.setData( + 'http.response.status_code', response.statusCode); + instrumentationSpan?.setData( + 'http.response_content_length', response.contentLength); + instrumentationSpan?.status = + SpanStatus.fromHttpStatusCode(response.statusCode); } catch (exception) { - span?.throwable = exception; - span?.status = SpanStatus.internalError(); + instrumentationSpan?.throwable = exception; + instrumentationSpan?.status = SpanStatus.internalError(); rethrow; } finally { - await span?.finish(); + await instrumentationSpan?.finish(); } return response; } diff --git a/packages/dart/lib/src/sentry_baggage.dart b/packages/dart/lib/src/sentry_baggage.dart index 7baecc5309..37232aa4d9 100644 --- a/packages/dart/lib/src/sentry_baggage.dart +++ b/packages/dart/lib/src/sentry_baggage.dart @@ -3,6 +3,7 @@ import 'package:meta/meta.dart'; import 'protocol.dart'; import 'scope.dart'; import 'sentry_options.dart'; +import 'utils/internal_logger.dart'; class SentryBaggage { static const String _sampleRateKeyName = 'sentry-sample_rate'; @@ -11,13 +12,9 @@ class SentryBaggage { static const int _maxChars = 8192; static const int _maxListMember = 64; - SentryBaggage( - this._keyValues, { - this.log, - }); + SentryBaggage(this._keyValues); final Map _keyValues; - final SdkLogCallback? log; String toHeaderString() { final buffer = StringBuffer(); @@ -26,9 +23,8 @@ class SentryBaggage { for (final entry in _keyValues.entries) { if (listMemberCount >= _maxListMember) { - log?.call( - SentryLevel.info, - 'Baggage key ${entry.key} dropped because of max list member.', + internalLogger.info( + () => 'Baggage key ${entry.key} dropped because of max list member.', ); break; } @@ -40,9 +36,9 @@ class SentryBaggage { final totalLengthIfValueAdded = buffer.length + encodedKeyValue.length; if (totalLengthIfValueAdded >= _maxChars) { - log?.call( - SentryLevel.info, - 'Baggage key ${entry.key} dropped because of max baggage chars.', + internalLogger.info( + () => + 'Baggage key ${entry.key} dropped because of max baggage chars.', ); continue; } @@ -51,10 +47,9 @@ class SentryBaggage { buffer.write(encodedKeyValue); separator = ','; } catch (exception, stackTrace) { - log?.call( - SentryLevel.error, - 'Failed to parse the baggage key ${entry.key}.', - exception: exception, + internalLogger.error( + () => 'Failed to parse the baggage key ${entry.key}.', + error: exception, stackTrace: stackTrace, ); // TODO rethrow in options.automatedTestMode (currently not available here to check) @@ -64,33 +59,25 @@ class SentryBaggage { return buffer.toString(); } - factory SentryBaggage.fromHeaderList( - List headerValues, { - SdkLogCallback? log, - }) { + factory SentryBaggage.fromHeaderList(List headerValues) { final keyValues = {}; for (final headerValue in headerValues) { final keyValuesToAdd = _extractKeyValuesFromBaggageString( headerValue, - log: log, ); keyValues.addAll(keyValuesToAdd); } - return SentryBaggage(keyValues, log: log); + return SentryBaggage(keyValues); } - factory SentryBaggage.fromHeader( - String headerValue, { - SdkLogCallback? log, - }) { + factory SentryBaggage.fromHeader(String headerValue) { final keyValues = _extractKeyValuesFromBaggageString( headerValue, - log: log, ); - return SentryBaggage(keyValues, log: log); + return SentryBaggage(keyValues); } @internal @@ -113,9 +100,7 @@ class SentryBaggage { } static Map _extractKeyValuesFromBaggageString( - String headerValue, { - SdkLogCallback? log, - }) { + String headerValue) { final keyValues = {}; final keyValueStrings = headerValue.split(','); @@ -130,10 +115,9 @@ class SentryBaggage { final value = _urlDecode(keyAndValue.last.trim()); keyValues[key] = value; } catch (exception, stackTrace) { - log?.call( - SentryLevel.error, - 'Failed to parse the baggage entry $keyAndValue.', - exception: exception, + internalLogger.error( + () => 'Failed to parse the baggage entry $keyAndValue.', + error: exception, stackTrace: stackTrace, ); } diff --git a/packages/dart/lib/src/sentry_client.dart b/packages/dart/lib/src/sentry_client.dart index af9850f847..38c686ba9d 100644 --- a/packages/dart/lib/src/sentry_client.dart +++ b/packages/dart/lib/src/sentry_client.dart @@ -190,9 +190,8 @@ class SentryClient { var traceContext = scope?.span?.traceContext(); if (traceContext == null) { if (scope != null) { - scope.propagationContext.baggage ??= - SentryBaggage({}, log: _options.log) - ..setValuesFromScope(scope, _options); + scope.propagationContext.baggage ??= SentryBaggage({}) + ..setValuesFromScope(scope, _options); traceContext = SentryTraceContextHeader.fromBaggage( scope.propagationContext.baggage!); } diff --git a/packages/dart/lib/src/sentry_trace_context_header.dart b/packages/dart/lib/src/sentry_trace_context_header.dart index f94f772dc7..7d5d5d79ec 100644 --- a/packages/dart/lib/src/sentry_trace_context_header.dart +++ b/packages/dart/lib/src/sentry_trace_context_header.dart @@ -3,7 +3,6 @@ import 'package:meta/meta.dart'; import 'protocol/access_aware_map.dart'; import 'protocol/sentry_id.dart'; import 'sentry_baggage.dart'; -import 'sentry_options.dart'; class SentryTraceContextHeader { SentryTraceContextHeader( @@ -70,10 +69,8 @@ class SentryTraceContextHeader { }; } - SentryBaggage toBaggage({ - SdkLogCallback? log, - }) { - final baggage = SentryBaggage({}, log: log); + SentryBaggage toBaggage() { + final baggage = SentryBaggage({}); baggage.setTraceId(traceId.toString()); baggage.setPublicKey(publicKey); diff --git a/packages/dart/lib/src/sentry_tracer.dart b/packages/dart/lib/src/sentry_tracer.dart index 10132bbb58..0b8e5468db 100644 --- a/packages/dart/lib/src/sentry_tracer.dart +++ b/packages/dart/lib/src/sentry_tracer.dart @@ -367,7 +367,7 @@ class SentryTracer extends ISentrySpan { final context = traceContext(); if (context != null) { - final baggage = context.toBaggage(log: _hub.options.log); + final baggage = context.toBaggage(); return SentryBaggageHeader.fromBaggage(baggage); } return null; diff --git a/packages/dart/lib/src/tracing/instrumentation/instrumentation_span.dart b/packages/dart/lib/src/tracing/instrumentation/instrumentation_span.dart index 37439ff9ea..265b3900b2 100644 --- a/packages/dart/lib/src/tracing/instrumentation/instrumentation_span.dart +++ b/packages/dart/lib/src/tracing/instrumentation/instrumentation_span.dart @@ -15,6 +15,8 @@ abstract class InstrumentationSpan { String? get origin; set origin(String? origin); Future finish({SpanStatus? status, DateTime? endTimestamp}); + SentryTraceHeader toSentryTrace(); + SentryBaggageHeader? toBaggageHeader(); } /// [InstrumentationSpan] implementation wrapping [ISentrySpan]. @@ -57,4 +59,10 @@ class LegacyInstrumentationSpan implements InstrumentationSpan { DateTime? endTimestamp, }) => _span.finish(status: status, endTimestamp: endTimestamp); + + @override + SentryTraceHeader toSentryTrace() => _span.toSentryTrace(); + + @override + SentryBaggageHeader? toBaggageHeader() => _span.toBaggageHeader(); } diff --git a/packages/dart/lib/src/utils/tracing_utils.dart b/packages/dart/lib/src/utils/tracing_utils.dart index 30595fc4f6..e89ab3a92d 100644 --- a/packages/dart/lib/src/utils/tracing_utils.dart +++ b/packages/dart/lib/src/utils/tracing_utils.dart @@ -7,8 +7,11 @@ SentryTraceHeader generateSentryTraceHeader( return SentryTraceHeader(traceId, spanId, sampled: sampled); } -void addTracingHeadersToHttpHeader(Map headers, Hub hub, - {ISentrySpan? span}) { +void addTracingHeadersToHttpHeader( + Map headers, + Hub hub, { + InstrumentationSpan? span, +}) { if (span != null) { if (hub.options.propagateTraceparent) { addW3CHeaderFromSpan(span, headers); @@ -17,14 +20,13 @@ void addTracingHeadersToHttpHeader(Map headers, Hub hub, addBaggageHeaderFromSpan( span, headers, - log: hub.options.log, ); } else { if (hub.options.propagateTraceparent) { addW3CHeaderFromScope(hub.scope, headers); } addSentryTraceHeaderFromScope(hub.scope, headers); - addBaggageHeaderFromScope(hub.scope, headers, log: hub.options.log); + addBaggageHeaderFromScope(hub.scope, headers); } } @@ -35,7 +37,7 @@ void addSentryTraceHeaderFromScope(Scope scope, Map headers) { } void addSentryTraceHeaderFromSpan( - ISentrySpan span, Map headers) { + InstrumentationSpan span, Map headers) { final traceHeader = span.toSentryTrace(); headers[traceHeader.name] = traceHeader.value; } @@ -45,7 +47,8 @@ void addSentryTraceHeader( headers[traceHeader.name] = traceHeader.value; } -void addW3CHeaderFromSpan(ISentrySpan span, Map headers) { +void addW3CHeaderFromSpan( + InstrumentationSpan span, Map headers) { final traceHeader = span.toSentryTrace(); _addW3CHeaderFromSentryTrace(traceHeader, headers); } @@ -67,42 +70,30 @@ String formatAsW3CHeader(SentryTraceHeader traceHeader) { return '00-${traceHeader.traceId}-${traceHeader.spanId}-$sampledBit'; } -void addBaggageHeaderFromScope( - Scope scope, - Map headers, { - SdkLogCallback? log, -}) { +void addBaggageHeaderFromScope(Scope scope, Map headers) { final baggageHeader = scope.propagationContext.toBaggageHeader(); if (baggageHeader != null) { - addBaggageHeader(baggageHeader, headers, log: log); + addBaggageHeader(baggageHeader, headers); } } void addBaggageHeaderFromSpan( - ISentrySpan span, - Map headers, { - SdkLogCallback? log, -}) { + InstrumentationSpan span, Map headers) { final baggage = span.toBaggageHeader(); if (baggage != null) { - addBaggageHeader(baggage, headers, log: log); + addBaggageHeader(baggage, headers); } } void addBaggageHeader( - SentryBaggageHeader baggage, - Map headers, { - SdkLogCallback? log, -}) { + SentryBaggageHeader baggage, Map headers) { final currentValue = headers[baggage.name] as String? ?? ''; final currentBaggage = SentryBaggage.fromHeader( currentValue, - log: log, ); final sentryBaggage = SentryBaggage.fromHeader( baggage.value, - log: log, ); // overwrite sentry's keys https://develop.sentry.dev/sdk/performance/dynamic-sampling-context/#baggage @@ -114,7 +105,7 @@ void addBaggageHeader( ...sentryBaggage.keyValues, }; - final newBaggage = SentryBaggage(mergedBaggage, log: log); + final newBaggage = SentryBaggage(mergedBaggage); headers[baggage.name] = newBaggage.toHeaderString(); } diff --git a/packages/dart/lib/src/utils/url_details.dart b/packages/dart/lib/src/utils/url_details.dart index 4cc47510a6..1835a916e6 100644 --- a/packages/dart/lib/src/utils/url_details.dart +++ b/packages/dart/lib/src/utils/url_details.dart @@ -15,7 +15,7 @@ class UrlDetails { late final urlOrFallback = Uri.tryParse(url ?? _unknown)?.toString() ?? _unknown; - void applyToSpan(ISentrySpan? span) { + void applyToSpan(InstrumentationSpan? span) { if (span == null) { return; } diff --git a/packages/dart/test/mocks/mock_span.dart b/packages/dart/test/mocks/mock_span.dart new file mode 100644 index 0000000000..32f44dd95d --- /dev/null +++ b/packages/dart/test/mocks/mock_span.dart @@ -0,0 +1,8 @@ +import 'package:mockito/mockito.dart'; +import 'package:sentry/sentry.dart'; + +class MockSpan extends Mock implements SentrySpan { + final SentrySpanContext _context = SentrySpanContext(operation: 'test'); + @override + SentrySpanContext get context => _context; +} diff --git a/packages/dart/test/sentry_client_lifecycle_test.dart b/packages/dart/test/sentry_client_lifecycle_test.dart index 9e94217e6c..4d04d5a8c2 100644 --- a/packages/dart/test/sentry_client_lifecycle_test.dart +++ b/packages/dart/test/sentry_client_lifecycle_test.dart @@ -4,11 +4,11 @@ import 'package:sentry/src/sentry_tracer.dart'; import 'package:test/test.dart'; import 'mocks/mock_client_report_recorder.dart'; +import 'mocks/mock_span.dart'; import 'mocks/mock_telemetry_processor.dart'; import 'mocks/mock_transport.dart'; import 'sentry_client_test.dart'; import 'test_utils.dart'; -import 'utils/url_details_test.dart'; void main() { group('SDK lifecycle callbacks', () { diff --git a/packages/dart/test/sentry_client_sdk_lifecycle_test.dart b/packages/dart/test/sentry_client_sdk_lifecycle_test.dart index 9de1f753c7..487b1dfff9 100644 --- a/packages/dart/test/sentry_client_sdk_lifecycle_test.dart +++ b/packages/dart/test/sentry_client_sdk_lifecycle_test.dart @@ -4,11 +4,11 @@ import 'package:sentry/src/sentry_tracer.dart'; import 'package:test/test.dart'; import 'mocks/mock_client_report_recorder.dart'; +import 'mocks/mock_span.dart'; import 'mocks/mock_telemetry_processor.dart'; import 'mocks/mock_transport.dart'; import 'sentry_client_test.dart'; import 'test_utils.dart'; -import 'utils/url_details_test.dart'; void main() { group('SDK lifecycle callbacks', () { diff --git a/packages/dart/test/utils/tracing_utils_test.dart b/packages/dart/test/utils/tracing_utils_test.dart index 36587ea904..b630e6e239 100644 --- a/packages/dart/test/utils/tracing_utils_test.dart +++ b/packages/dart/test/utils/tracing_utils_test.dart @@ -58,7 +58,7 @@ void main() { final sut = fixture.getSut(); final sentryHeader = sut.toSentryTrace(); - addSentryTraceHeaderFromSpan(sut, headers); + addSentryTraceHeaderFromSpan(LegacyInstrumentationSpan(sut), headers); expect(headers[sentryHeader.name], sentryHeader.value); }); @@ -92,7 +92,7 @@ void main() { final headers = {}; final sut = fixture.getSut(); - addW3CHeaderFromSpan(sut, headers); + addW3CHeaderFromSpan(LegacyInstrumentationSpan(sut), headers); expect(headers[headerName], '00-${fixture._context.traceId}-${fixture._context.spanId}-01'); @@ -134,7 +134,7 @@ void main() { final sut = fixture.getSut(); final baggage = sut.toBaggageHeader(); - addBaggageHeaderFromSpan(sut, headers); + addBaggageHeaderFromSpan(LegacyInstrumentationSpan(sut), headers); expect(headers[baggage!.name], baggage.value); }); @@ -149,7 +149,7 @@ void main() { final newValue = '$oldValue,${baggage!.value}'; - addBaggageHeaderFromSpan(sut, headers); + addBaggageHeaderFromSpan(LegacyInstrumentationSpan(sut), headers); expect(headers[baggage.name], newValue); }); @@ -164,7 +164,7 @@ void main() { final sut = fixture.getSut(); final baggage = sut.toBaggageHeader(); - addBaggageHeaderFromSpan(sut, headers); + addBaggageHeaderFromSpan(LegacyInstrumentationSpan(sut), headers); expect(headers[baggage!.name], 'other-vendor-value=foo,sentry-trace_id=${sut.context.traceId},sentry-public_key=public,sentry-release=release,sentry-environment=environment,sentry-transaction=name,sentry-sample_rate=1,sentry-sampled=true'); @@ -262,7 +262,8 @@ void main() { final span = fixture.getSut(); hub.options.propagateTraceparent = true; - addTracingHeadersToHttpHeader(headers, hub, span: span); + addTracingHeadersToHttpHeader(headers, hub, + span: LegacyInstrumentationSpan(span)); expect(headers['traceparent'], '00-${fixture._context.traceId}-${fixture._context.spanId}-01'); @@ -316,7 +317,8 @@ void main() { final hub = fixture._hub; final span = fixture.getSut(); - addTracingHeadersToHttpHeader(headers, hub, span: span); + addTracingHeadersToHttpHeader(headers, hub, + span: LegacyInstrumentationSpan(span)); final traceHeader = SentryTraceHeader.fromTraceHeader(headers['sentry-trace']); diff --git a/packages/dart/test/utils/url_details_test.dart b/packages/dart/test/utils/url_details_test.dart index 673d4452da..cd1a8a731b 100644 --- a/packages/dart/test/utils/url_details_test.dart +++ b/packages/dart/test/utils/url_details_test.dart @@ -12,7 +12,7 @@ void main() { test('applies all to span', () { final urlDetails = UrlDetails(url: "https://sentry.io/api", query: "q=1", fragment: "top"); - final span = MockSpan(); + final span = MockInstrumentationSpan(); urlDetails.applyToSpan(span); verify(span.setData("url", "https://sentry.io/api")); @@ -22,7 +22,7 @@ void main() { test('applies only url to span', () { final urlDetails = UrlDetails(url: "https://sentry.io/api"); - final span = MockSpan(); + final span = MockInstrumentationSpan(); urlDetails.applyToSpan(span); verify(span.setData("url", "https://sentry.io/api")); @@ -31,7 +31,7 @@ void main() { test('applies only query to span', () { final urlDetails = UrlDetails(query: "q=1"); - final span = MockSpan(); + final span = MockInstrumentationSpan(); urlDetails.applyToSpan(span); verify(span.setData("http.query", "q=1")); @@ -40,7 +40,7 @@ void main() { test('applies only fragment to span', () { final urlDetails = UrlDetails(fragment: "top"); - final span = MockSpan(); + final span = MockInstrumentationSpan(); urlDetails.applyToSpan(span); verify(span.setData("http.fragment", "top")); @@ -86,8 +86,4 @@ void main() { }); } -class MockSpan extends Mock implements SentrySpan { - final SentrySpanContext _context = SentrySpanContext(operation: 'test'); - @override - SentrySpanContext get context => _context; -} +class MockInstrumentationSpan extends Mock implements InstrumentationSpan {} diff --git a/packages/dio/lib/src/sentry_transformer.dart b/packages/dio/lib/src/sentry_transformer.dart index f5fb7c8ac4..e39f088fe8 100644 --- a/packages/dio/lib/src/sentry_transformer.dart +++ b/packages/dio/lib/src/sentry_transformer.dart @@ -1,3 +1,5 @@ +// ignore_for_file: invalid_use_of_internal_member + import 'package:dio/dio.dart'; import 'package:sentry/sentry.dart'; @@ -8,27 +10,30 @@ class SentryTransformer implements Transformer { // ignore: public_member_api_docs SentryTransformer({required Transformer transformer, Hub? hub}) : _hub = hub ?? HubAdapter(), - _transformer = transformer; + _transformer = transformer { + _spanFactory = _hub.options.spanFactory; + } final Transformer _transformer; final Hub _hub; + late final InstrumentationSpanFactory _spanFactory; @override Future transformRequest(RequestOptions options) async { - // ignore: invalid_use_of_internal_member final urlDetails = HttpSanitizer.sanitizeUrl(options.uri.toString()); var description = options.method; if (urlDetails != null) { description += ' ${urlDetails.urlOrFallback}'; } - final span = _hub.getSpan()?.startChild( - _serializeOp, - description: description, - ); + final parentSpan = _spanFactory.getSpan(_hub); + final span = _spanFactory.createSpan( + parentSpan, + _serializeOp, + description: description, + ); span?.setData('http.request.method', options.method); - // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoHttpDioTransformer; urlDetails?.applyToSpan(span); @@ -53,20 +58,20 @@ class SentryTransformer implements Transformer { RequestOptions options, ResponseBody response, ) async { - // ignore: invalid_use_of_internal_member final urlDetails = HttpSanitizer.sanitizeUrl(options.uri.toString()); var description = options.method; if (urlDetails != null) { description += ' ${urlDetails.urlOrFallback}'; } - final span = _hub.getSpan()?.startChild( - _serializeOp, - description: description, - ); + final parentSpan = _spanFactory.getSpan(_hub); + final span = _spanFactory.createSpan( + parentSpan, + _serializeOp, + description: description, + ); span?.setData('http.request.method', options.method); - // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoHttpDioTransformer; urlDetails?.applyToSpan(span); diff --git a/packages/dio/lib/src/tracing_client_adapter.dart b/packages/dio/lib/src/tracing_client_adapter.dart index 438f51f185..a056075f51 100644 --- a/packages/dio/lib/src/tracing_client_adapter.dart +++ b/packages/dio/lib/src/tracing_client_adapter.dart @@ -18,6 +18,7 @@ class TracingClientAdapter implements HttpClientAdapter { TracingClientAdapter({required HttpClientAdapter client, Hub? hub}) : _hub = hub ?? HubAdapter(), _client = client { + _spanFactory = _hub.options.spanFactory; if (_hub.options.isTracingEnabled()) { _hub.options.sdk.addIntegration(integrationName); } @@ -25,6 +26,7 @@ class TracingClientAdapter implements HttpClientAdapter { final HttpClientAdapter _client; final Hub _hub; + late final InstrumentationSpanFactory _spanFactory; @override Future fetch( @@ -40,46 +42,55 @@ class TracingClientAdapter implements HttpClientAdapter { } // see https://develop.sentry.dev/sdk/performance/#header-sentry-trace - final currentSpan = _hub.getSpan(); - var span = currentSpan?.startChild( + final parentSpan = _spanFactory.getSpan(_hub); + final instrumentationSpan = _spanFactory.createSpan( + parentSpan, 'http.client', description: description, ); - if (span is NoOpSentrySpan) { - span = null; - } - // Regardless whether tracing is enabled or not, we always want to attach // Sentry trace headers (tracing without performance). if (containsTargetOrMatchesRegExp( _hub.options.tracePropagationTargets, options.uri.toString(), )) { - addTracingHeadersToHttpHeader(options.headers, _hub, span: span); + addTracingHeadersToHttpHeader( + options.headers, + _hub, + span: instrumentationSpan, + ); } - span?.origin = SentryTraceOrigins.autoHttpDioHttpClientAdapter; - span?.setData('http.request.method', options.method); - urlDetails?.applyToSpan(span); + instrumentationSpan?.origin = + SentryTraceOrigins.autoHttpDioHttpClientAdapter; + instrumentationSpan?.setData('http.request.method', options.method); + urlDetails?.applyToSpan(instrumentationSpan); ResponseBody? response; try { response = await _client.fetch(options, requestStream, cancelFuture); - span?.status = SpanStatus.fromHttpStatusCode(response.statusCode); - span?.setData('http.response.status_code', response.statusCode); + instrumentationSpan?.status = + SpanStatus.fromHttpStatusCode(response.statusCode); + instrumentationSpan?.setData( + 'http.response.status_code', + response.statusCode, + ); final contentLengthHeader = HttpHeaderUtils.getContentLength(response.headers); if (contentLengthHeader != null) { - span?.setData('http.response_content_length', contentLengthHeader); + instrumentationSpan?.setData( + 'http.response_content_length', + contentLengthHeader, + ); } } catch (exception) { - span?.throwable = exception; - span?.status = const SpanStatus.internalError(); + instrumentationSpan?.throwable = exception; + instrumentationSpan?.status = const SpanStatus.internalError(); rethrow; } finally { - await span?.finish(); + await instrumentationSpan?.finish(); } return response; }