diff --git a/CHANGELOG.md b/CHANGELOG.md index 1abf8b80a1..95bd346ce7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Enhancements +- Add Sampling Decision to Trace Envelope Header ([#1639](https://github.com/getsentry/sentry-dart/pull/1639)) - Add http.request.method attribute to http spans data ([#1633](https://github.com/getsentry/sentry-dart/pull/1633)) - Add db.system and db.name attributes to db spans data ([#1629](https://github.com/getsentry/sentry-dart/pull/1629)) - Log SDK errors to the console if the log level is `fatal` even if `debug` is disabled ([#1635](https://github.com/getsentry/sentry-dart/pull/1635)) diff --git a/dart/lib/src/sentry_baggage.dart b/dart/lib/src/sentry_baggage.dart index 60ac395648..25aab900f4 100644 --- a/dart/lib/src/sentry_baggage.dart +++ b/dart/lib/src/sentry_baggage.dart @@ -188,6 +188,10 @@ class SentryBaggage { set(_sampleRateKeyName, value); } + void setSampled(String value) { + set('sentry-sampled', value); + } + double? getSampleRate() { final sampleRate = get(_sampleRateKeyName); if (sampleRate == null) { diff --git a/dart/lib/src/sentry_trace_context_header.dart b/dart/lib/src/sentry_trace_context_header.dart index 68208a7096..bcb1d0b1bb 100644 --- a/dart/lib/src/sentry_trace_context_header.dart +++ b/dart/lib/src/sentry_trace_context_header.dart @@ -12,6 +12,7 @@ class SentryTraceContextHeader { this.userSegment, this.transaction, this.sampleRate, + this.sampled, }); final SentryId traceId; @@ -22,6 +23,7 @@ class SentryTraceContextHeader { final String? userSegment; final String? transaction; final String? sampleRate; + final String? sampled; /// Deserializes a [SentryTraceContextHeader] from JSON [Map]. factory SentryTraceContextHeader.fromJson(Map json) { @@ -34,6 +36,7 @@ class SentryTraceContextHeader { userSegment: json['user_segment'], transaction: json['transaction'], sampleRate: json['sample_rate'], + sampled: json['sampled'], ); } @@ -48,6 +51,7 @@ class SentryTraceContextHeader { if (userSegment != null) 'user_segment': userSegment, if (transaction != null) 'transaction': transaction, if (sampleRate != null) 'sample_rate': sampleRate, + if (sampled != null) 'sampled': sampled, }; } @@ -76,7 +80,9 @@ class SentryTraceContextHeader { if (sampleRate != null) { baggage.setSampleRate(sampleRate!); } - + if (sampled != null) { + baggage.setSampled(sampled!); + } return baggage; } diff --git a/dart/lib/src/sentry_tracer.dart b/dart/lib/src/sentry_tracer.dart index 2ca82a91ca..46edb2bccb 100644 --- a/dart/lib/src/sentry_tracer.dart +++ b/dart/lib/src/sentry_tracer.dart @@ -346,6 +346,7 @@ class SentryTracer extends ISentrySpan { transaction: _isHighQualityTransactionName(transactionNameSource) ? name : null, sampleRate: _sampleRateToString(_rootSpan.samplingDecision?.sampleRate), + sampled: _rootSpan.samplingDecision?.sampled.toString(), ); return _sentryTraceContextHeader; diff --git a/dart/test/protocol/sentry_baggage_header_test.dart b/dart/test/protocol/sentry_baggage_header_test.dart index 4fdb6a13d4..38428be41a 100644 --- a/dart/test/protocol/sentry_baggage_header_test.dart +++ b/dart/test/protocol/sentry_baggage_header_test.dart @@ -20,11 +20,12 @@ void main() { baggage.setUserSegment('userSegment'); baggage.setTransaction('transaction'); baggage.setSampleRate('1.0'); + baggage.setSampled('false'); final baggageHeader = SentryBaggageHeader.fromBaggage(baggage); expect(baggageHeader.value, - 'sentry-trace_id=$id,sentry-public_key=publicKey,sentry-release=release,sentry-environment=environment,sentry-user_id=userId,sentry-user_segment=userSegment,sentry-transaction=transaction,sentry-sample_rate=1.0'); + 'sentry-trace_id=$id,sentry-public_key=publicKey,sentry-release=release,sentry-environment=environment,sentry-user_id=userId,sentry-user_segment=userSegment,sentry-transaction=transaction,sentry-sample_rate=1.0,sentry-sampled=false'); }); }); } diff --git a/dart/test/sentry_trace_context_header_test.dart b/dart/test/sentry_trace_context_header_test.dart index 8de346c943..6ba6d93bc2 100644 --- a/dart/test/sentry_trace_context_header_test.dart +++ b/dart/test/sentry_trace_context_header_test.dart @@ -14,6 +14,7 @@ void main() { 'user_segment': 'user_segment', 'transaction': 'transaction', 'sample_rate': '1.0', + 'sampled': 'false' }; final context = SentryTraceContextHeader.fromJson(mapJson); @@ -26,6 +27,7 @@ void main() { expect(context.userSegment, 'user_segment'); expect(context.transaction, 'transaction'); expect(context.sampleRate, '1.0'); + expect(context.sampled, 'false'); }); test('toJson', () { @@ -38,7 +40,7 @@ void main() { final baggage = context.toBaggage(); expect(baggage.toHeaderString(), - 'sentry-trace_id=${id.toString()},sentry-public_key=123,sentry-release=release,sentry-environment=environment,sentry-user_id=user_id,sentry-user_segment=user_segment,sentry-transaction=transaction,sentry-sample_rate=1.0'); + 'sentry-trace_id=${id.toString()},sentry-public_key=123,sentry-release=release,sentry-environment=environment,sentry-user_id=user_id,sentry-user_segment=user_segment,sentry-transaction=transaction,sentry-sample_rate=1.0,sentry-sampled=false'); }); }); } diff --git a/dart/test/sentry_tracer_test.dart b/dart/test/sentry_tracer_test.dart index cb9f72fdfc..48ff011e82 100644 --- a/dart/test/sentry_tracer_test.dart +++ b/dart/test/sentry_tracer_test.dart @@ -489,6 +489,7 @@ void main() { expect(newBaggage.get('sentry-user_segment'), 'segment'); expect(newBaggage.get('sentry-transaction'), 'name'); expect(newBaggage.get('sentry-sample_rate'), '1'); + expect(newBaggage.get('sentry-sampled'), 'true'); }); test('skip transaction name if low cardinality', () { @@ -562,6 +563,7 @@ void main() { expect(context.userSegment, 'segment'); expect(context.transaction, 'name'); expect(context.sampleRate, '1'); + expect(context.sampled, 'true'); }); }); } diff --git a/dart/test/utils/tracing_utils_test.dart b/dart/test/utils/tracing_utils_test.dart index 3dd47c3186..96b26b55b1 100644 --- a/dart/test/utils/tracing_utils_test.dart +++ b/dart/test/utils/tracing_utils_test.dart @@ -125,7 +125,7 @@ void main() { addBaggageHeaderFromSpan(sut, headers); expect(headers[baggage!.name], - 'other-vendor-value=foo,sentry-trace_id=${sut.context.traceId},sentry-public_key=abc,sentry-release=release,sentry-environment=environment,sentry-user_segment=segment,sentry-transaction=name,sentry-sample_rate=1'); + 'other-vendor-value=foo,sentry-trace_id=${sut.context.traceId},sentry-public_key=abc,sentry-release=release,sentry-environment=environment,sentry-user_segment=segment,sentry-transaction=name,sentry-sample_rate=1,sentry-sampled=true'); }); });