Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

### Internal

- Support `metric` envelope item type ([#4956](https://github.com/getsentry/sentry-java/pull/4956))

## 8.28.0

### Features
Expand Down
1 change: 1 addition & 0 deletions sentry/api/sentry.api
Original file line number Diff line number Diff line change
Expand Up @@ -3138,6 +3138,7 @@ public final class io/sentry/SentryItemType : java/lang/Enum, io/sentry/JsonSeri
public static final field ReplayVideo Lio/sentry/SentryItemType;
public static final field Session Lio/sentry/SentryItemType;
public static final field Span Lio/sentry/SentryItemType;
public static final field TraceMetric Lio/sentry/SentryItemType;
public static final field Transaction Lio/sentry/SentryItemType;
public static final field Unknown Lio/sentry/SentryItemType;
public static final field UserFeedback Lio/sentry/SentryItemType;
Expand Down
1 change: 1 addition & 0 deletions sentry/src/main/java/io/sentry/DataCategory.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public enum DataCategory {
Attachment("attachment"),
LogItem("log_item"),
LogByte("log_byte"),
TraceMetric("trace_metric"),
Monitor("monitor"),
Profile("profile"),
ProfileChunkUi("profile_chunk_ui"),
Expand Down
1 change: 1 addition & 0 deletions sentry/src/main/java/io/sentry/SentryItemType.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public enum SentryItemType implements JsonSerializable {
CheckIn("check_in"),
Feedback("feedback"),
Log("log"),
TraceMetric("trace_metric"),
Span("span"),
Unknown("__unknown__"); // DataCategory.Unknown

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,9 @@ private DataCategory categoryFromItemType(SentryItemType itemType) {
if (SentryItemType.Span.equals(itemType)) {
return DataCategory.Span;
}
if (SentryItemType.TraceMetric.equals(itemType)) {
return DataCategory.TraceMetric;
}

return DataCategory.Default;
}
Expand Down
2 changes: 2 additions & 0 deletions sentry/src/main/java/io/sentry/transport/RateLimiter.java
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@ private boolean isRetryAfter(final @NotNull String itemType) {
return Collections.singletonList(DataCategory.LogItem);
case "span":
return Collections.singletonList(DataCategory.Span);
case "trace_metric":
return Collections.singletonList(DataCategory.TraceMetric);
default:
return Collections.singletonList(DataCategory.Unknown);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class SentryItemTypeSerializationTest {
assertEquals(serialize(SentryItemType.CheckIn), json("check_in"))
assertEquals(serialize(SentryItemType.Feedback), json("feedback"))
assertEquals(serialize(SentryItemType.Span), json("span"))
assertEquals(serialize(SentryItemType.TraceMetric), json("trace_metric"))
}

@Test
Expand All @@ -51,6 +52,7 @@ class SentryItemTypeSerializationTest {
assertEquals(deserialize(json("check_in")), SentryItemType.CheckIn)
assertEquals(deserialize(json("feedback")), SentryItemType.Feedback)
assertEquals(deserialize(json("span")), SentryItemType.Span)
assertEquals(deserialize(json("trace_metric")), SentryItemType.TraceMetric)
}

private fun json(type: String): String = "{\"type\":\"${type}\"}"
Expand Down
27 changes: 27 additions & 0 deletions sentry/src/test/java/io/sentry/transport/RateLimiterTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -563,6 +563,33 @@ class RateLimiterTest {
verifyNoMoreInteractions(fixture.clientReportRecorder)
}

@Test
fun `drop trace metric items as lost`() {
val rateLimiter = fixture.getSUT()

// There is no span API yet so we'll create the envelope manually using EnvelopeReader
// This mimics how hybrid SDKs would send trace_metric envelope items
val spanPayload = """{"items":[]}"""
val metricItemHeader =
"""{"type":"trace_metric","length":${spanPayload.length},"content_type":"application/vnd.sentry.items.trace-metric+json","item_count":1}"""
val envelopeHeader = """{}"""
val rawEnvelope = "$envelopeHeader\n$metricItemHeader\n$spanPayload"

val options = SentryOptions()
val envelopeReader = EnvelopeReader(JsonSerializer(options))
val metricEnvelope = envelopeReader.read(rawEnvelope.byteInputStream())!!
val metricItem = metricEnvelope.items.first()

rateLimiter.updateRetryAfterLimits("60:span:key", null, 1)
Comment thread
cursor[bot] marked this conversation as resolved.
Outdated
val result = rateLimiter.filter(metricEnvelope, Hint())

assertNull(result)

verify(fixture.clientReportRecorder, times(1))
.recordLostEnvelopeItem(eq(DiscardReason.RATELIMIT_BACKOFF), same(metricItem))
verifyNoMoreInteractions(fixture.clientReportRecorder)
}

@Test
fun `apply rate limits notifies observers`() {
val rateLimiter = fixture.getSUT()
Expand Down
Loading