Skip to content

Commit 2ad4e0d

Browse files
tsushanthromtsnclaude
authored
feat: add trace_metric_byte to DataCategory enum (#5626)
* feat: add trace_metric_byte to DataCategory enum * chore: regenerate API dump with TraceMetricByte in DataCategory * feat: record TraceMetricByte in client reports when trace metrics are discarded Mirrors the LogByte pattern: records byte-level data category alongside the item-level one when trace metrics are dropped by beforeSendMetrics, queue overflow, or envelope discard. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * changelog: add trace_metric_byte data category entry Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: apply spotless formatting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Roman Zavarnitsyn <rom4ek93@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 83277d1 commit 2ad4e0d

9 files changed

Lines changed: 44 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Features
6+
7+
- Add `trace_metric_byte` data category and record byte-level client reports when trace metrics are discarded ([#5626](https://github.com/getsentry/sentry-java/pull/5626))
8+
59
### Fixes
610

711
- Name the device-info caching thread `SentryDeviceInfoCache` so all threads spawned by the SDK are identifiable ([#5684](https://github.com/getsentry/sentry-java/pull/5684))

sentry/api/sentry.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ public final class io/sentry/DataCategory : java/lang/Enum {
373373
public static final field Session Lio/sentry/DataCategory;
374374
public static final field Span Lio/sentry/DataCategory;
375375
public static final field TraceMetric Lio/sentry/DataCategory;
376+
public static final field TraceMetricByte Lio/sentry/DataCategory;
376377
public static final field Transaction Lio/sentry/DataCategory;
377378
public static final field Unknown Lio/sentry/DataCategory;
378379
public static final field UserReport Lio/sentry/DataCategory;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public enum DataCategory {
1212
LogItem("log_item"),
1313
LogByte("log_byte"),
1414
TraceMetric("trace_metric"),
15+
TraceMetricByte("trace_metric_byte"),
1516
Monitor("monitor"),
1617
Profile("profile"),
1718
ProfileChunkUi("profile_chunk_ui"),

sentry/src/main/java/io/sentry/SentryClient.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,7 @@ public void captureMetric(
13361336
}
13371337

13381338
if (metricsEvent != null) {
1339+
final @NotNull SentryMetricsEvent tmpMetricsEvent = metricsEvent;
13391340
metricsEvent = executeBeforeSendMetric(metricsEvent, hint);
13401341

13411342
if (metricsEvent == null) {
@@ -1345,6 +1346,13 @@ public void captureMetric(
13451346
options
13461347
.getClientReportRecorder()
13471348
.recordLostEvent(DiscardReason.BEFORE_SEND, DataCategory.TraceMetric);
1349+
final long metricsEventNumberOfBytes =
1350+
JsonSerializationUtils.byteSizeOf(
1351+
options.getSerializer(), options.getLogger(), tmpMetricsEvent);
1352+
options
1353+
.getClientReportRecorder()
1354+
.recordLostEvent(
1355+
DiscardReason.BEFORE_SEND, DataCategory.TraceMetricByte, metricsEventNumberOfBytes);
13481356
return;
13491357
}
13501358

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ public void recordLostEnvelopeItem(
124124
final @NotNull List<SentryMetricsEvent> items = metrics.getItems();
125125
final long count = items.size();
126126
recordLostEventInternal(reason.getReason(), itemCategory.getCategory(), count);
127+
final long metricBytes = envelopeItem.getData().length;
128+
recordLostEventInternal(
129+
reason.getReason(), DataCategory.TraceMetricByte.getCategory(), metricBytes);
127130
executeOnDiscard(reason, itemCategory, count);
128131
} else {
129132
options

sentry/src/main/java/io/sentry/metrics/MetricsBatchProcessor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.sentry.clientreport.DiscardReason;
1414
import io.sentry.transport.ReusableCountLatch;
1515
import io.sentry.util.AutoClosableReentrantLock;
16+
import io.sentry.util.JsonSerializationUtils;
1617
import java.util.ArrayList;
1718
import java.util.List;
1819
import java.util.Queue;
@@ -58,6 +59,12 @@ public void add(final @NotNull SentryMetricsEvent metricsEvent) {
5859
options
5960
.getClientReportRecorder()
6061
.recordLostEvent(DiscardReason.QUEUE_OVERFLOW, DataCategory.TraceMetric);
62+
final long lostBytes =
63+
JsonSerializationUtils.byteSizeOf(
64+
options.getSerializer(), options.getLogger(), metricsEvent);
65+
options
66+
.getClientReportRecorder()
67+
.recordLostEvent(DiscardReason.QUEUE_OVERFLOW, DataCategory.TraceMetricByte, lostBytes);
6168
return;
6269
}
6370
pendingCount.increment();

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,10 @@ class SentryClientTest {
388388

389389
assertClientReport(
390390
fixture.sentryOptions.clientReportRecorder,
391-
listOf(DiscardedEvent(DiscardReason.BEFORE_SEND.reason, DataCategory.TraceMetric.category, 1)),
391+
listOf(
392+
DiscardedEvent(DiscardReason.BEFORE_SEND.reason, DataCategory.TraceMetric.category, 1),
393+
DiscardedEvent(DiscardReason.BEFORE_SEND.reason, DataCategory.TraceMetricByte.category, 120),
394+
),
392395
)
393396
}
394397

@@ -408,7 +411,10 @@ class SentryClientTest {
408411

409412
assertClientReport(
410413
fixture.sentryOptions.clientReportRecorder,
411-
listOf(DiscardedEvent(DiscardReason.BEFORE_SEND.reason, DataCategory.TraceMetric.category, 1)),
414+
listOf(
415+
DiscardedEvent(DiscardReason.BEFORE_SEND.reason, DataCategory.TraceMetric.category, 1),
416+
DiscardedEvent(DiscardReason.BEFORE_SEND.reason, DataCategory.TraceMetricByte.category, 120),
417+
),
412418
)
413419
}
414420

sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,9 @@ class ClientReportTest {
412412
val metricItem =
413413
clientReport!!.discardedEvents!!.first { it.category == DataCategory.TraceMetric.category }
414414
assertEquals(3, metricItem.quantity)
415+
val metricByteItem =
416+
clientReport.discardedEvents!!.first { it.category == DataCategory.TraceMetricByte.category }
417+
assertEquals(envelope.items.first().data.size.toLong(), metricByteItem.quantity)
415418
}
416419

417420
private fun givenClientReportRecorder(

sentry/src/test/java/io/sentry/metrics/MetricsBatchProcessorTest.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import io.sentry.clientreport.DiscardedEvent
1212
import io.sentry.protocol.SentryId
1313
import io.sentry.test.DeferredExecutorService
1414
import io.sentry.test.injectForField
15+
import io.sentry.util.JsonSerializationUtils
1516
import kotlin.test.Test
1617
import kotlin.test.assertEquals
1718
import kotlin.test.assertFalse
@@ -80,9 +81,16 @@ class MetricsBatchProcessorTest {
8081
processor.add(droppedMetricsEvent)
8182

8283
// verify that a client report was recorded for the dropped metrics item
84+
val droppedBytes =
85+
JsonSerializationUtils.byteSizeOf(options.serializer, options.logger, droppedMetricsEvent)
8386
val expectedEvents =
8487
mutableListOf(
85-
DiscardedEvent(DiscardReason.QUEUE_OVERFLOW.reason, DataCategory.TraceMetric.category, 1)
88+
DiscardedEvent(DiscardReason.QUEUE_OVERFLOW.reason, DataCategory.TraceMetric.category, 1),
89+
DiscardedEvent(
90+
DiscardReason.QUEUE_OVERFLOW.reason,
91+
DataCategory.TraceMetricByte.category,
92+
droppedBytes,
93+
),
8694
)
8795

8896
ClientReportTestHelper.assertClientReport(options.clientReportRecorder, expectedEvents)

0 commit comments

Comments
 (0)