Skip to content

Commit 04c7e0b

Browse files
committed
initial seed propagation impl
1 parent 9a0bac7 commit 04c7e0b

File tree

6 files changed

+44
-14
lines changed

6 files changed

+44
-14
lines changed

dart/lib/src/sentry_baggage.dart

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import 'package:meta/meta.dart';
2-
import 'scope.dart';
3-
import 'protocol.dart';
42

3+
import 'protocol.dart';
4+
import 'scope.dart';
55
import 'sentry_options.dart';
66

77
class SentryBaggage {
88
static const String _sampleRateKeyName = 'sentry-sample_rate';
9+
static const String _sampleRandKeyName = 'sentry-sample_rand';
10+
911
static const int _maxChars = 8192;
1012
static const int _maxListMember = 64;
1113

@@ -194,6 +196,10 @@ class SentryBaggage {
194196
set(_sampleRateKeyName, value);
195197
}
196198

199+
void setSampleRand(String value) {
200+
set(_sampleRandKeyName, value);
201+
}
202+
197203
void setSampled(String value) {
198204
set('sentry-sampled', value);
199205
}
@@ -207,6 +213,15 @@ class SentryBaggage {
207213
return double.tryParse(sampleRate);
208214
}
209215

216+
double? getSampleRand() {
217+
final sampleRand = get(_sampleRandKeyName);
218+
if (sampleRand == null) {
219+
return null;
220+
}
221+
222+
return double.tryParse(sampleRand);
223+
}
224+
210225
void setReplayId(String value) => set('sentry-replay_id', value);
211226

212227
SentryId? getReplayId() {

dart/lib/src/sentry_trace_context_header.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:meta/meta.dart';
22

3-
import 'protocol/sentry_id.dart';
43
import 'protocol/access_aware_map.dart';
4+
import 'protocol/sentry_id.dart';
55
import 'sentry_baggage.dart';
66
import 'sentry_options.dart';
77

@@ -15,6 +15,7 @@ class SentryTraceContextHeader {
1515
this.userSegment,
1616
this.transaction,
1717
this.sampleRate,
18+
this.sampleRand,
1819
this.sampled,
1920
this.unknown,
2021
this.replayId,
@@ -30,6 +31,7 @@ class SentryTraceContextHeader {
3031
final String? userSegment;
3132
final String? transaction;
3233
final String? sampleRate;
34+
final String? sampleRand;
3335
final String? sampled;
3436

3537
@internal
@@ -102,6 +104,9 @@ class SentryTraceContextHeader {
102104
if (sampleRate != null) {
103105
baggage.setSampleRate(sampleRate!);
104106
}
107+
if (sampleRand != null) {
108+
baggage.setSampleRate(sampleRand!);
109+
}
105110
if (sampled != null) {
106111
baggage.setSampled(sampled!);
107112
}

dart/lib/src/sentry_tracer.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ class SentryTracer extends ISentrySpan {
385385
transaction:
386386
_isHighQualityTransactionName(transactionNameSource) ? name : null,
387387
sampleRate: _sampleRateToString(_rootSpan.samplingDecision?.sampleRate),
388+
sampleRand: _sampleRateToString(_rootSpan.samplingDecision?.sampleRand),
388389
sampled: _rootSpan.samplingDecision?.sampled.toString(),
389390
);
390391

dart/lib/src/sentry_traces_sampler.dart

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@ class SentryTracesSampler {
3333
try {
3434
final result = tracesSampler(samplingContext);
3535
if (result != null) {
36-
return SentryTracesSamplingDecision(
37-
_sample(result),
38-
sampleRate: result,
39-
);
36+
return _sample2(result);
4037
}
4138
} catch (exception, stackTrace) {
4239
_options.logger(
@@ -64,10 +61,7 @@ class SentryTracesSampler {
6461
double? optionsOrDefaultRate = optionsRate ?? defaultRate;
6562

6663
if (optionsOrDefaultRate != null) {
67-
return SentryTracesSamplingDecision(
68-
_sample(optionsOrDefaultRate),
69-
sampleRate: optionsOrDefaultRate,
70-
);
64+
return _sample2(optionsOrDefaultRate);
7165
}
7266

7367
return SentryTracesSamplingDecision(false);
@@ -78,8 +72,19 @@ class SentryTracesSampler {
7872
if (optionsRate == null || !tracesSamplingDecision.sampled) {
7973
return false;
8074
}
81-
return _sample(optionsRate);
75+
return _shouldSample(optionsRate);
8276
}
8377

84-
bool _sample(double result) => !(result < _random.nextDouble());
78+
SentryTracesSamplingDecision _sample2(double sampleRate) {
79+
final sampleRand = _random.nextDouble();
80+
return SentryTracesSamplingDecision(
81+
_shouldSample(sampleRate, sampleRand: sampleRand),
82+
sampleRate: sampleRate,
83+
sampleRand: sampleRand);
84+
}
85+
86+
bool _shouldSample(double sampleRate, {double? sampleRand}) {
87+
final rand = sampleRand ?? _random.nextDouble();
88+
return rand <= sampleRate;
89+
}
8590
}

dart/lib/src/sentry_traces_sampling_decision.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ class SentryTracesSamplingDecision {
22
SentryTracesSamplingDecision(
33
this.sampled, {
44
this.sampleRate,
5+
this.sampleRand,
56
});
67

78
final bool sampled;
89
final double? sampleRate;
10+
final double? sampleRand;
911
}

dart/lib/src/sentry_transaction_context.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import 'package:meta/meta.dart';
2-
import 'sentry_trace_origins.dart';
32

43
import 'protocol.dart';
54
import 'sentry_baggage.dart';
5+
import 'sentry_trace_origins.dart';
66
import 'tracing.dart';
77

88
@immutable
@@ -35,6 +35,7 @@ class SentryTransactionContext extends SentrySpanContext {
3535
SentryBaggage? baggage,
3636
}) {
3737
final sampleRate = baggage?.getSampleRate();
38+
final sampleRand = baggage?.getSampleRand();
3839
return SentryTransactionContext(
3940
name,
4041
operation,
@@ -44,6 +45,7 @@ class SentryTransactionContext extends SentrySpanContext {
4445
? SentryTracesSamplingDecision(
4546
traceHeader.sampled!,
4647
sampleRate: sampleRate,
48+
sampleRand: sampleRand,
4749
)
4850
: null,
4951
transactionNameSource:

0 commit comments

Comments
 (0)