Skip to content

Commit 93b4799

Browse files
author
Lucas
committed
add trace metric envelope type
1 parent dba088c commit 93b4799

File tree

8 files changed

+44
-1
lines changed

8 files changed

+44
-1
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Internal
6+
7+
- Support `metric` envelope item type ([#X](https://github.com/getsentry/sentry-java/pull/X))
8+
39
## 8.28.0
410

511
### Features

sentry/api/sentry.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3138,6 +3138,7 @@ public final class io/sentry/SentryItemType : java/lang/Enum, io/sentry/JsonSeri
31383138
public static final field ReplayVideo Lio/sentry/SentryItemType;
31393139
public static final field Session Lio/sentry/SentryItemType;
31403140
public static final field Span Lio/sentry/SentryItemType;
3141+
public static final field TraceMetric Lio/sentry/SentryItemType;
31413142
public static final field Transaction Lio/sentry/SentryItemType;
31423143
public static final field Unknown Lio/sentry/SentryItemType;
31433144
public static final field UserFeedback Lio/sentry/SentryItemType;

sentry/src/main/java/io/sentry/DataCategory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public enum DataCategory {
1111
Attachment("attachment"),
1212
LogItem("log_item"),
1313
LogByte("log_byte"),
14+
TraceMetric("trace_metric"),
1415
Monitor("monitor"),
1516
Profile("profile"),
1617
ProfileChunkUi("profile_chunk_ui"),

sentry/src/main/java/io/sentry/SentryItemType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public enum SentryItemType implements JsonSerializable {
2323
CheckIn("check_in"),
2424
Feedback("feedback"),
2525
Log("log"),
26+
TraceMetric("trace_metric"),
2627
Span("span"),
2728
Unknown("__unknown__"); // DataCategory.Unknown
2829

sentry/src/main/java/io/sentry/clientreport/ClientReportRecorder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,10 @@ private DataCategory categoryFromItemType(SentryItemType itemType) {
218218
if (SentryItemType.Span.equals(itemType)) {
219219
return DataCategory.Span;
220220
}
221-
221+
if (SentryItemType.TraceMetric.equals(itemType)) {
222+
return DataCategory.TraceMetric;
223+
}
224+
222225
return DataCategory.Default;
223226
}
224227
}

sentry/src/main/java/io/sentry/transport/RateLimiter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ private boolean isRetryAfter(final @NotNull String itemType) {
215215
return Collections.singletonList(DataCategory.LogItem);
216216
case "span":
217217
return Collections.singletonList(DataCategory.Span);
218+
case "trace_metric":
219+
return Collections.singletonList(DataCategory.TraceMetric);
218220
default:
219221
return Collections.singletonList(DataCategory.Unknown);
220222
}

sentry/src/test/java/io/sentry/protocol/SentryItemTypeSerializationTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class SentryItemTypeSerializationTest {
3333
assertEquals(serialize(SentryItemType.CheckIn), json("check_in"))
3434
assertEquals(serialize(SentryItemType.Feedback), json("feedback"))
3535
assertEquals(serialize(SentryItemType.Span), json("span"))
36+
assertEquals(serialize(SentryItemType.TraceMetric), json("trace_metric"))
3637
}
3738

3839
@Test
@@ -51,6 +52,7 @@ class SentryItemTypeSerializationTest {
5152
assertEquals(deserialize(json("check_in")), SentryItemType.CheckIn)
5253
assertEquals(deserialize(json("feedback")), SentryItemType.Feedback)
5354
assertEquals(deserialize(json("span")), SentryItemType.Span)
55+
assertEquals(deserialize(json("trace_metric"), SentryItemType.TraceMetric)
5456
}
5557

5658
private fun json(type: String): String = "{\"type\":\"${type}\"}"

sentry/src/test/java/io/sentry/transport/RateLimiterTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,33 @@ class RateLimiterTest {
563563
verifyNoMoreInteractions(fixture.clientReportRecorder)
564564
}
565565

566+
@Test
567+
fun `drop trace metric items as lost`() {
568+
val rateLimiter = fixture.getSUT()
569+
570+
// There is no span API yet so we'll create the envelope manually using EnvelopeReader
571+
// This mimics how hybrid SDKs would send trace_metric envelope items
572+
val spanPayload = """{"items":[]}"""
573+
val metricItemHeader =
574+
"""{"type":"trace_metric","length":${spanPayload.length},"content_type":"application/vnd.sentry.items.trace-metric+json","item_count":1}"""
575+
val envelopeHeader = """{}"""
576+
val rawEnvelope = "$envelopeHeader\n$metricItemHeader\n$spanPayload"
577+
578+
val options = SentryOptions()
579+
val envelopeReader = EnvelopeReader(JsonSerializer(options))
580+
val metricEnvelope = envelopeReader.read(rawEnvelope.byteInputStream())!!
581+
val metricItem = metricEnvelope.items.first()
582+
583+
rateLimiter.updateRetryAfterLimits("60:span:key", null, 1)
584+
val result = rateLimiter.filter(metricEnvelope, Hint())
585+
586+
assertNull(result)
587+
588+
verify(fixture.clientReportRecorder, times(1))
589+
.recordLostEnvelopeItem(eq(DiscardReason.RATELIMIT_BACKOFF), same(metricItem))
590+
verifyNoMoreInteractions(fixture.clientReportRecorder)
591+
}
592+
566593
@Test
567594
fun `apply rate limits notifies observers`() {
568595
val rateLimiter = fixture.getSUT()

0 commit comments

Comments
 (0)