@@ -5,14 +5,18 @@ import io.sentry.DataCategory
5
5
import io.sentry.DateUtils
6
6
import io.sentry.EventProcessor
7
7
import io.sentry.Hint
8
+ import io.sentry.IHub
8
9
import io.sentry.NoOpLogger
10
+ import io.sentry.ProfilingTraceData
9
11
import io.sentry.Sentry
10
12
import io.sentry.SentryEnvelope
11
13
import io.sentry.SentryEnvelopeHeader
12
14
import io.sentry.SentryEnvelopeItem
13
15
import io.sentry.SentryEvent
14
16
import io.sentry.SentryOptions
17
+ import io.sentry.SentryTracer
15
18
import io.sentry.Session
19
+ import io.sentry.TransactionContext
16
20
import io.sentry.UncaughtExceptionHandlerIntegration.UncaughtExceptionHint
17
21
import io.sentry.UserFeedback
18
22
import io.sentry.dsnString
@@ -21,6 +25,9 @@ import io.sentry.protocol.SentryId
21
25
import io.sentry.protocol.SentryTransaction
22
26
import io.sentry.protocol.User
23
27
import io.sentry.util.HintUtils
28
+ import org.mockito.kotlin.mock
29
+ import org.mockito.kotlin.whenever
30
+ import java.io.File
24
31
import java.time.LocalDateTime
25
32
import java.time.ZoneId
26
33
import java.time.temporal.ChronoUnit
@@ -38,6 +45,9 @@ class ClientReportTest {
38
45
@Test
39
46
fun `lost envelope can be recorded` () {
40
47
givenClientReportRecorder()
48
+ val hub = mock<IHub >()
49
+ whenever(hub.options).thenReturn(opts)
50
+ val transaction = SentryTracer (TransactionContext (" name" , " op" ), hub)
41
51
42
52
val lostClientReport = ClientReport (
43
53
DateUtils .getCurrentDateTime(),
@@ -53,20 +63,22 @@ class ClientReportTest {
53
63
SentryEnvelopeItem .fromEvent(opts.serializer, SentryEvent ()),
54
64
SentryEnvelopeItem .fromSession(opts.serializer, Session (" dis" , User (), " env" , " 0.0.1" )),
55
65
SentryEnvelopeItem .fromUserFeedback(opts.serializer, UserFeedback (SentryId (UUID .randomUUID()))),
56
- SentryEnvelopeItem .fromAttachment(opts.serializer, NoOpLogger .getInstance(), Attachment (" { \" number\" : 10 }" .toByteArray(), " log.json" ), 1000 )
66
+ SentryEnvelopeItem .fromAttachment(opts.serializer, NoOpLogger .getInstance(), Attachment (" { \" number\" : 10 }" .toByteArray(), " log.json" ), 1000 ),
67
+ SentryEnvelopeItem .fromProfilingTrace(ProfilingTraceData (File (" " ), transaction), 1000 , opts.serializer)
57
68
)
58
69
59
70
clientReportRecorder.recordLostEnvelope(DiscardReason .NETWORK_ERROR , envelope)
60
71
61
72
val clientReportAtEnd = clientReportRecorder.resetCountsAndGenerateClientReport()
62
- testHelper.assertTotalCount(10 , clientReportAtEnd)
73
+ testHelper.assertTotalCount(11 , clientReportAtEnd)
63
74
testHelper.assertCountFor(DiscardReason .SAMPLE_RATE , DataCategory .Error , 3 , clientReportAtEnd)
64
75
testHelper.assertCountFor(DiscardReason .BEFORE_SEND , DataCategory .Error , 2 , clientReportAtEnd)
65
76
testHelper.assertCountFor(DiscardReason .QUEUE_OVERFLOW , DataCategory .Transaction , 1 , clientReportAtEnd)
66
77
testHelper.assertCountFor(DiscardReason .NETWORK_ERROR , DataCategory .Error , 1 , clientReportAtEnd)
67
78
testHelper.assertCountFor(DiscardReason .NETWORK_ERROR , DataCategory .UserReport , 1 , clientReportAtEnd)
68
79
testHelper.assertCountFor(DiscardReason .NETWORK_ERROR , DataCategory .Session , 1 , clientReportAtEnd)
69
80
testHelper.assertCountFor(DiscardReason .NETWORK_ERROR , DataCategory .Attachment , 1 , clientReportAtEnd)
81
+ testHelper.assertCountFor(DiscardReason .NETWORK_ERROR , DataCategory .Profile , 1 , clientReportAtEnd)
70
82
}
71
83
72
84
@Test
@@ -89,7 +101,8 @@ class ClientReportTest {
89
101
listOf (
90
102
DiscardedEvent (DiscardReason .SAMPLE_RATE .reason, DataCategory .Error .category, 3 ),
91
103
DiscardedEvent (DiscardReason .BEFORE_SEND .reason, DataCategory .Error .category, 2 ),
92
- DiscardedEvent (DiscardReason .QUEUE_OVERFLOW .reason, DataCategory .Transaction .category, 1 )
104
+ DiscardedEvent (DiscardReason .QUEUE_OVERFLOW .reason, DataCategory .Transaction .category, 1 ),
105
+ DiscardedEvent (DiscardReason .SAMPLE_RATE .reason, DataCategory .Profile .category, 2 )
93
106
)
94
107
)
95
108
@@ -98,10 +111,11 @@ class ClientReportTest {
98
111
clientReportRecorder.recordLostEnvelopeItem(DiscardReason .NETWORK_ERROR , envelopeItem)
99
112
100
113
val clientReportAtEnd = clientReportRecorder.resetCountsAndGenerateClientReport()
101
- testHelper.assertTotalCount(6 , clientReportAtEnd)
114
+ testHelper.assertTotalCount(8 , clientReportAtEnd)
102
115
testHelper.assertCountFor(DiscardReason .SAMPLE_RATE , DataCategory .Error , 3 , clientReportAtEnd)
103
116
testHelper.assertCountFor(DiscardReason .BEFORE_SEND , DataCategory .Error , 2 , clientReportAtEnd)
104
117
testHelper.assertCountFor(DiscardReason .QUEUE_OVERFLOW , DataCategory .Transaction , 1 , clientReportAtEnd)
118
+ testHelper.assertCountFor(DiscardReason .SAMPLE_RATE , DataCategory .Profile , 2 , clientReportAtEnd)
105
119
}
106
120
107
121
@Test
@@ -112,16 +126,18 @@ class ClientReportTest {
112
126
clientReportRecorder.recordLostEvent(DiscardReason .CACHE_OVERFLOW , DataCategory .Attachment )
113
127
clientReportRecorder.recordLostEvent(DiscardReason .RATELIMIT_BACKOFF , DataCategory .Error )
114
128
clientReportRecorder.recordLostEvent(DiscardReason .QUEUE_OVERFLOW , DataCategory .Error )
129
+ clientReportRecorder.recordLostEvent(DiscardReason .BEFORE_SEND , DataCategory .Profile )
115
130
116
131
val envelope = clientReportRecorder.attachReportToEnvelope(testHelper.newEnvelope())
117
132
118
133
testHelper.assertTotalCount(0 , clientReportRecorder.resetCountsAndGenerateClientReport())
119
134
120
135
val envelopeReport = envelope.items.first().getClientReport(opts.serializer)!!
121
- assertEquals(3 , envelopeReport.discardedEvents.size)
136
+ assertEquals(4 , envelopeReport.discardedEvents.size)
122
137
assertEquals(2 , envelopeReport.discardedEvents.first { it.reason == DiscardReason .CACHE_OVERFLOW .reason && it.category == DataCategory .Attachment .category }.quantity)
123
138
assertEquals(1 , envelopeReport.discardedEvents.first { it.reason == DiscardReason .RATELIMIT_BACKOFF .reason && it.category == DataCategory .Error .category }.quantity)
124
139
assertEquals(1 , envelopeReport.discardedEvents.first { it.reason == DiscardReason .QUEUE_OVERFLOW .reason && it.category == DataCategory .Error .category }.quantity)
140
+ assertEquals(1 , envelopeReport.discardedEvents.first { it.reason == DiscardReason .BEFORE_SEND .reason && it.category == DataCategory .Profile .category }.quantity)
125
141
assertTrue(
126
142
ChronoUnit .MILLIS .between(
127
143
LocalDateTime .now(),
0 commit comments