Skip to content

Commit 4c237f8

Browse files
authored
Add sampled to Dynamic Sampling Context (#2869)
1 parent 4bf202b commit 4c237f8

File tree

10 files changed

+76
-14
lines changed

10 files changed

+76
-14
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22

33
## Unreleased
44

5-
- propagate okhttp status to parent spans ([#2872](https://github.com/getsentry/sentry-java/pull/2872))
5+
### Features
6+
7+
- Add `sampled` to Dynamic Sampling Context ([#2869](https://github.com/getsentry/sentry-java/pull/2869))
68

79
### Fixes
810

11+
- Propagate OkHttp status to parent spans ([#2872](https://github.com/getsentry/sentry-java/pull/2872))
12+
913
## 6.27.0
1014

1115
### Features

sentry/api/sentry.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public final class io/sentry/Baggage {
4747
public fun getRelease ()Ljava/lang/String;
4848
public fun getSampleRate ()Ljava/lang/String;
4949
public fun getSampleRateDouble ()Ljava/lang/Double;
50+
public fun getSampled ()Ljava/lang/String;
5051
public fun getThirdPartyHeader ()Ljava/lang/String;
5152
public fun getTraceId ()Ljava/lang/String;
5253
public fun getTransaction ()Ljava/lang/String;
@@ -59,6 +60,7 @@ public final class io/sentry/Baggage {
5960
public fun setPublicKey (Ljava/lang/String;)V
6061
public fun setRelease (Ljava/lang/String;)V
6162
public fun setSampleRate (Ljava/lang/String;)V
63+
public fun setSampled (Ljava/lang/String;)V
6264
public fun setTraceId (Ljava/lang/String;)V
6365
public fun setTransaction (Ljava/lang/String;)V
6466
public fun setUserId (Ljava/lang/String;)V
@@ -74,6 +76,7 @@ public final class io/sentry/Baggage$DSCKeys {
7476
public static final field ENVIRONMENT Ljava/lang/String;
7577
public static final field PUBLIC_KEY Ljava/lang/String;
7678
public static final field RELEASE Ljava/lang/String;
79+
public static final field SAMPLED Ljava/lang/String;
7780
public static final field SAMPLE_RATE Ljava/lang/String;
7881
public static final field TRACE_ID Ljava/lang/String;
7982
public static final field TRANSACTION Ljava/lang/String;
@@ -2293,6 +2296,7 @@ public final class io/sentry/TraceContext : io/sentry/JsonSerializable, io/sentr
22932296
public fun getPublicKey ()Ljava/lang/String;
22942297
public fun getRelease ()Ljava/lang/String;
22952298
public fun getSampleRate ()Ljava/lang/String;
2299+
public fun getSampled ()Ljava/lang/String;
22962300
public fun getTraceId ()Lio/sentry/protocol/SentryId;
22972301
public fun getTransaction ()Ljava/lang/String;
22982302
public fun getUnknown ()Ljava/util/Map;
@@ -2312,6 +2316,7 @@ public final class io/sentry/TraceContext$JsonKeys {
23122316
public static final field ENVIRONMENT Ljava/lang/String;
23132317
public static final field PUBLIC_KEY Ljava/lang/String;
23142318
public static final field RELEASE Ljava/lang/String;
2319+
public static final field SAMPLED Ljava/lang/String;
23152320
public static final field SAMPLE_RATE Ljava/lang/String;
23162321
public static final field TRACE_ID Ljava/lang/String;
23172322
public static final field TRANSACTION Ljava/lang/String;
@@ -4305,6 +4310,7 @@ public final class io/sentry/util/StringUtils {
43054310
public static fun join (Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;
43064311
public static fun normalizeUUID (Ljava/lang/String;)Ljava/lang/String;
43074312
public static fun removeSurrounding (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
4313+
public static fun toString (Ljava/lang/Object;)Ljava/lang/String;
43084314
}
43094315

43104316
public final class io/sentry/util/TracingUtils {

sentry/src/main/java/io/sentry/Baggage.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public static Baggage fromEvent(
140140
baggage.setTransaction(event.getTransaction());
141141
// we don't persist sample rate
142142
baggage.setSampleRate(null);
143+
baggage.setSampled(null);
143144
baggage.freeze();
144145
return baggage;
145146
}
@@ -329,11 +330,21 @@ public void setTransaction(final @Nullable String transaction) {
329330
return get(DSCKeys.SAMPLE_RATE);
330331
}
331332

333+
@ApiStatus.Internal
334+
public @Nullable String getSampled() {
335+
return get(DSCKeys.SAMPLED);
336+
}
337+
332338
@ApiStatus.Internal
333339
public void setSampleRate(final @Nullable String sampleRate) {
334340
set(DSCKeys.SAMPLE_RATE, sampleRate);
335341
}
336342

343+
@ApiStatus.Internal
344+
public void setSampled(final @Nullable String sampled) {
345+
set(DSCKeys.SAMPLED, sampled);
346+
}
347+
337348
@ApiStatus.Internal
338349
public void set(final @NotNull String key, final @Nullable String value) {
339350
if (mutable) {
@@ -374,6 +385,7 @@ public void setValuesFromTransaction(
374385
? transaction.getName()
375386
: null);
376387
setSampleRate(sampleRateToString(sampleRate(samplingDecision)));
388+
setSampled(StringUtils.toString(sampled(samplingDecision)));
377389
}
378390

379391
@ApiStatus.Internal
@@ -387,6 +399,7 @@ public void setValuesFromScope(final @NotNull Scope scope, final @NotNull Sentry
387399
setUserSegment(user != null ? getSegment(user) : null);
388400
setTransaction(null);
389401
setSampleRate(null);
402+
setSampled(null);
390403
}
391404

392405
private static @Nullable String getSegment(final @NotNull User user) {
@@ -420,6 +433,14 @@ public void setValuesFromScope(final @NotNull Scope scope, final @NotNull Sentry
420433
return df.format(sampleRateAsDouble);
421434
}
422435

436+
private static @Nullable Boolean sampled(@Nullable TracesSamplingDecision samplingDecision) {
437+
if (samplingDecision == null) {
438+
return null;
439+
}
440+
441+
return samplingDecision.getSampled();
442+
}
443+
423444
private static boolean isHighQualityTransactionName(
424445
@Nullable TransactionNameSource transactionNameSource) {
425446
return transactionNameSource != null
@@ -458,7 +479,8 @@ public TraceContext toTraceContext() {
458479
getUserId(),
459480
getUserSegment(),
460481
getTransaction(),
461-
getSampleRate());
482+
getSampleRate(),
483+
getSampled());
462484
traceContext.setUnknown(getUnknown());
463485
return traceContext;
464486
} else {
@@ -476,6 +498,7 @@ public static final class DSCKeys {
476498
public static final String USER_SEGMENT = "sentry-user_segment";
477499
public static final String TRANSACTION = "sentry-transaction";
478500
public static final String SAMPLE_RATE = "sentry-sample_rate";
501+
public static final String SAMPLED = "sentry-sampled";
479502

480503
public static final List<String> ALL =
481504
Arrays.asList(
@@ -486,6 +509,7 @@ public static final class DSCKeys {
486509
ENVIRONMENT,
487510
USER_SEGMENT,
488511
TRANSACTION,
489-
SAMPLE_RATE);
512+
SAMPLE_RATE,
513+
SAMPLED);
490514
}
491515
}

sentry/src/main/java/io/sentry/TraceContext.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@ public final class TraceContext implements JsonUnknown, JsonSerializable {
2020
private final @Nullable String userSegment;
2121
private final @Nullable String transaction;
2222
private final @Nullable String sampleRate;
23+
private final @Nullable String sampled;
2324

2425
@SuppressWarnings("unused")
2526
private @Nullable Map<String, @NotNull Object> unknown;
2627

2728
TraceContext(@NotNull SentryId traceId, @NotNull String publicKey) {
28-
this(traceId, publicKey, null, null, null, null, null, null);
29+
this(traceId, publicKey, null, null, null, null, null, null, null);
2930
}
3031

3132
TraceContext(
@@ -36,7 +37,8 @@ public final class TraceContext implements JsonUnknown, JsonSerializable {
3637
@Nullable String userId,
3738
@Nullable String userSegment,
3839
@Nullable String transaction,
39-
@Nullable String sampleRate) {
40+
@Nullable String sampleRate,
41+
@Nullable String sampled) {
4042
this.traceId = traceId;
4143
this.publicKey = publicKey;
4244
this.release = release;
@@ -45,6 +47,7 @@ public final class TraceContext implements JsonUnknown, JsonSerializable {
4547
this.userSegment = userSegment;
4648
this.transaction = transaction;
4749
this.sampleRate = sampleRate;
50+
this.sampled = sampled;
4851
}
4952

5053
@SuppressWarnings("UnusedMethod")
@@ -89,6 +92,10 @@ public final class TraceContext implements JsonUnknown, JsonSerializable {
8992
return sampleRate;
9093
}
9194

95+
public @Nullable String getSampled() {
96+
return sampled;
97+
}
98+
9299
/**
93100
* @deprecated only here to support parsing legacy JSON with non flattened user
94101
*/
@@ -190,6 +197,7 @@ public static final class JsonKeys {
190197
public static final String USER_SEGMENT = "user_segment";
191198
public static final String TRANSACTION = "transaction";
192199
public static final String SAMPLE_RATE = "sample_rate";
200+
public static final String SAMPLED = "sampled";
193201
}
194202

195203
@Override
@@ -216,6 +224,9 @@ public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger
216224
if (sampleRate != null) {
217225
writer.name(TraceContext.JsonKeys.SAMPLE_RATE).value(sampleRate);
218226
}
227+
if (sampled != null) {
228+
writer.name(TraceContext.JsonKeys.SAMPLED).value(sampled);
229+
}
219230
if (unknown != null) {
220231
for (String key : unknown.keySet()) {
221232
Object value = unknown.get(key);
@@ -241,6 +252,7 @@ public static final class Deserializer implements JsonDeserializer<TraceContext>
241252
String userSegment = null;
242253
String transaction = null;
243254
String sampleRate = null;
255+
String sampled = null;
244256

245257
Map<String, Object> unknown = null;
246258
while (reader.peek() == JsonToken.NAME) {
@@ -273,6 +285,9 @@ public static final class Deserializer implements JsonDeserializer<TraceContext>
273285
case TraceContext.JsonKeys.SAMPLE_RATE:
274286
sampleRate = reader.nextStringOrNull();
275287
break;
288+
case TraceContext.JsonKeys.SAMPLED:
289+
sampled = reader.nextStringOrNull();
290+
break;
276291
default:
277292
if (unknown == null) {
278293
unknown = new ConcurrentHashMap<>();
@@ -304,7 +319,8 @@ public static final class Deserializer implements JsonDeserializer<TraceContext>
304319
userId,
305320
userSegment,
306321
transaction,
307-
sampleRate);
322+
sampleRate,
323+
sampled);
308324
traceContext.setUnknown(unknown);
309325
reader.endObject();
310326
return traceContext;

sentry/src/main/java/io/sentry/util/StringUtils.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,12 @@ public static String join(
181181

182182
return stringBuilder.toString();
183183
}
184+
185+
public static @Nullable String toString(final @Nullable Object object) {
186+
if (object == null) {
187+
return null;
188+
}
189+
190+
return object.toString();
191+
}
184192
}

sentry/src/test/java/io/sentry/BaggageTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,9 @@ class BaggageTest {
319319
baggage.setUserId(userId)
320320
baggage.setUserSegment("segmentA")
321321
baggage.setSampleRate((1.0 / 3.0).toString())
322+
baggage.setSampled("true")
322323

323-
assertEquals("sentry-environment=production,sentry-public_key=$publicKey,sentry-release=1.0-rc.1,sentry-sample_rate=0.3333333333333333,sentry-trace_id=$traceId,sentry-transaction=TX,sentry-user_id=$userId,sentry-user_segment=segmentA", baggage.toHeaderString(null))
324+
assertEquals("sentry-environment=production,sentry-public_key=$publicKey,sentry-release=1.0-rc.1,sentry-sample_rate=0.3333333333333333,sentry-sampled=true,sentry-trace_id=$traceId,sentry-transaction=TX,sentry-user_id=$userId,sentry-user_segment=segmentA", baggage.toHeaderString(null))
324325
}
325326

326327
@Test

sentry/src/test/java/io/sentry/JsonSerializerTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -437,16 +437,16 @@ class JsonSerializerTest {
437437

438438
@Test
439439
fun `serializes trace context`() {
440-
val traceContext = SentryEnvelopeHeader(null, null, TraceContext(SentryId("3367f5196c494acaae85bbbd535379ac"), "key", "release", "environment", "userId", "segment", "transaction", "0.5"))
441-
val expected = """{"trace":{"trace_id":"3367f5196c494acaae85bbbd535379ac","public_key":"key","release":"release","environment":"environment","user_id":"userId","user_segment":"segment","transaction":"transaction","sample_rate":"0.5"}}"""
440+
val traceContext = SentryEnvelopeHeader(null, null, TraceContext(SentryId("3367f5196c494acaae85bbbd535379ac"), "key", "release", "environment", "userId", "segment", "transaction", "0.5", "true"))
441+
val expected = """{"trace":{"trace_id":"3367f5196c494acaae85bbbd535379ac","public_key":"key","release":"release","environment":"environment","user_id":"userId","user_segment":"segment","transaction":"transaction","sample_rate":"0.5","sampled":"true"}}"""
442442
val json = serializeToString(traceContext)
443443
assertEquals(expected, json)
444444
}
445445

446446
@Test
447447
fun `serializes trace context with user having null id and segment`() {
448-
val traceContext = SentryEnvelopeHeader(null, null, TraceContext(SentryId("3367f5196c494acaae85bbbd535379ac"), "key", "release", "environment", null, null, "transaction", "0.6"))
449-
val expected = """{"trace":{"trace_id":"3367f5196c494acaae85bbbd535379ac","public_key":"key","release":"release","environment":"environment","transaction":"transaction","sample_rate":"0.6"}}"""
448+
val traceContext = SentryEnvelopeHeader(null, null, TraceContext(SentryId("3367f5196c494acaae85bbbd535379ac"), "key", "release", "environment", null, null, "transaction", "0.6", "false"))
449+
val expected = """{"trace":{"trace_id":"3367f5196c494acaae85bbbd535379ac","public_key":"key","release":"release","environment":"environment","transaction":"transaction","sample_rate":"0.6","sampled":"false"}}"""
450450
val json = serializeToString(traceContext)
451451
assertEquals(expected, json)
452452
}

sentry/src/test/java/io/sentry/TraceContextSerializationTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ class TraceContextSerializationTest {
2323
"c052c566-6619-45f5-a61f-172802afa39a",
2424
"f7d8662b-5551-4ef8-b6a8-090f0561a530",
2525
"0252ec25-cd0a-4230-bd2f-936a4585637e",
26-
"0.00000021"
26+
"0.00000021",
27+
"true"
2728
)
2829
}
2930
private val fixture = Fixture()

sentry/src/test/resources/json/sentry_envelope_header.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
"user_id": "c052c566-6619-45f5-a61f-172802afa39a",
2727
"user_segment": "f7d8662b-5551-4ef8-b6a8-090f0561a530",
2828
"transaction": "0252ec25-cd0a-4230-bd2f-936a4585637e",
29-
"sample_rate": "0.00000021"
29+
"sample_rate": "0.00000021",
30+
"sampled": "true"
3031
},
3132
"sent_at": "2020-02-07T14:16:00.000Z"
3233
}

sentry/src/test/resources/json/trace_state.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
"user_id": "c052c566-6619-45f5-a61f-172802afa39a",
77
"user_segment": "f7d8662b-5551-4ef8-b6a8-090f0561a530",
88
"transaction": "0252ec25-cd0a-4230-bd2f-936a4585637e",
9-
"sample_rate": "0.00000021"
9+
"sample_rate": "0.00000021",
10+
"sampled": "true"
1011
}

0 commit comments

Comments
 (0)