@@ -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:trace_metric: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