Skip to content

Commit 8d29d97

Browse files
authored
Add API for sending checkins (CRONS) manually (#2935)
1 parent 6c21863 commit 8d29d97

File tree

28 files changed

+1388
-3
lines changed

28 files changed

+1388
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
- Add `sendModules` option for disable sending modules ([#2926](https://github.com/getsentry/sentry-java/pull/2926))
88
- Send `db.system` and `db.name` in span data for androidx.sqlite spans ([#2928](https://github.com/getsentry/sentry-java/pull/2928))
9+
- Add API for sending checkins (CRONS) manually ([#2935](https://github.com/getsentry/sentry-java/pull/2935))
910

1011
### Fixes
1112

sentry-android-core/src/test/java/io/sentry/android/core/SessionTrackingIntegrationTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.lifecycle.Lifecycle.Event.ON_STOP
66
import androidx.lifecycle.LifecycleRegistry
77
import androidx.test.core.app.ApplicationProvider
88
import androidx.test.ext.junit.runners.AndroidJUnit4
9+
import io.sentry.CheckIn
910
import io.sentry.Hint
1011
import io.sentry.ISentryClient
1112
import io.sentry.ProfilingTraceData
@@ -162,5 +163,9 @@ class SessionTrackingIntegrationTest {
162163
): SentryId {
163164
TODO("Not yet implemented")
164165
}
166+
167+
override fun captureCheckIn(checkIn: CheckIn, scope: Scope?, hint: Hint?): SentryId {
168+
TODO("Not yet implemented")
169+
}
165170
}
166171
}

sentry-samples/sentry-samples-spring-boot-jakarta/src/main/java/io/sentry/samples/spring/boot/jakarta/CustomJob.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package io.sentry.samples.spring.boot.jakarta;
22

3+
import io.sentry.CheckIn;
4+
import io.sentry.CheckInStatus;
5+
import io.sentry.DateUtils;
6+
import io.sentry.Sentry;
7+
import io.sentry.protocol.SentryId;
38
import io.sentry.spring.jakarta.tracing.SentryTransaction;
9+
import org.jetbrains.annotations.NotNull;
410
import org.slf4j.Logger;
511
import org.slf4j.LoggerFactory;
612
import org.springframework.scheduling.annotation.Scheduled;
@@ -16,9 +22,24 @@ public class CustomJob {
1622

1723
private static final Logger LOGGER = LoggerFactory.getLogger(CustomJob.class);
1824

19-
@Scheduled(fixedRate = 3 * 1000L)
25+
@Scheduled(fixedRate = 3 * 60 * 1000L)
2026
void execute() throws InterruptedException {
21-
LOGGER.info("Executing scheduled job");
22-
Thread.sleep(2000L);
27+
final @NotNull SentryId checkInId =
28+
Sentry.captureCheckIn(new CheckIn("my_monitor_slug", CheckInStatus.IN_PROGRESS));
29+
final long startTime = System.currentTimeMillis();
30+
boolean didError = false;
31+
try {
32+
LOGGER.info("Executing scheduled job");
33+
Thread.sleep(2000L);
34+
Sentry.captureCheckIn(new CheckIn(checkInId, "my_monitor_slug", CheckInStatus.OK));
35+
} catch (Throwable t) {
36+
didError = true;
37+
throw t;
38+
} finally {
39+
final @NotNull CheckInStatus status = didError ? CheckInStatus.ERROR : CheckInStatus.OK;
40+
CheckIn checkIn = new CheckIn(checkInId, "my_monitor_slug", status);
41+
checkIn.setDuration(DateUtils.millisToSeconds(System.currentTimeMillis() - startTime));
42+
Sentry.captureCheckIn(checkIn);
43+
}
2344
}
2445
}

sentry/api/sentry.api

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,57 @@ public final class io/sentry/BuildConfig {
155155
public static final field VERSION_NAME Ljava/lang/String;
156156
}
157157

158+
public final class io/sentry/CheckIn : io/sentry/JsonSerializable, io/sentry/JsonUnknown {
159+
public fun <init> (Lio/sentry/protocol/SentryId;Ljava/lang/String;Lio/sentry/CheckInStatus;)V
160+
public fun <init> (Lio/sentry/protocol/SentryId;Ljava/lang/String;Ljava/lang/String;)V
161+
public fun <init> (Ljava/lang/String;Lio/sentry/CheckInStatus;)V
162+
public fun getCheckInId ()Lio/sentry/protocol/SentryId;
163+
public fun getContexts ()Lio/sentry/MonitorContexts;
164+
public fun getDuration ()Ljava/lang/Double;
165+
public fun getEnvironment ()Ljava/lang/String;
166+
public fun getMonitorConfig ()Lio/sentry/MonitorConfig;
167+
public fun getMonitorSlug ()Ljava/lang/String;
168+
public fun getRelease ()Ljava/lang/String;
169+
public fun getStatus ()Ljava/lang/String;
170+
public fun getUnknown ()Ljava/util/Map;
171+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
172+
public fun setDuration (Ljava/lang/Double;)V
173+
public fun setEnvironment (Ljava/lang/String;)V
174+
public fun setMonitorConfig (Lio/sentry/MonitorConfig;)V
175+
public fun setMonitorSlug (Ljava/lang/String;)V
176+
public fun setRelease (Ljava/lang/String;)V
177+
public fun setStatus (Lio/sentry/CheckInStatus;)V
178+
public fun setStatus (Ljava/lang/String;)V
179+
public fun setUnknown (Ljava/util/Map;)V
180+
}
181+
182+
public final class io/sentry/CheckIn$Deserializer : io/sentry/JsonDeserializer {
183+
public fun <init> ()V
184+
public fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/CheckIn;
185+
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
186+
}
187+
188+
public final class io/sentry/CheckIn$JsonKeys {
189+
public static final field CHECK_IN_ID Ljava/lang/String;
190+
public static final field CONTEXTS Ljava/lang/String;
191+
public static final field DURATION Ljava/lang/String;
192+
public static final field ENVIRONMENT Ljava/lang/String;
193+
public static final field MONITOR_CONFIG Ljava/lang/String;
194+
public static final field MONITOR_SLUG Ljava/lang/String;
195+
public static final field RELEASE Ljava/lang/String;
196+
public static final field STATUS Ljava/lang/String;
197+
public fun <init> ()V
198+
}
199+
200+
public final class io/sentry/CheckInStatus : java/lang/Enum {
201+
public static final field ERROR Lio/sentry/CheckInStatus;
202+
public static final field IN_PROGRESS Lio/sentry/CheckInStatus;
203+
public static final field OK Lio/sentry/CheckInStatus;
204+
public fun apiName ()Ljava/lang/String;
205+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/CheckInStatus;
206+
public static fun values ()[Lio/sentry/CheckInStatus;
207+
}
208+
158209
public final class io/sentry/CpuCollectionData {
159210
public fun <init> (JD)V
160211
public fun getCpuUsagePercentage ()D
@@ -354,6 +405,7 @@ public final class io/sentry/Hub : io/sentry/IHub {
354405
public fun <init> (Lio/sentry/SentryOptions;)V
355406
public fun addBreadcrumb (Lio/sentry/Breadcrumb;Lio/sentry/Hint;)V
356407
public fun bindClient (Lio/sentry/ISentryClient;)V
408+
public fun captureCheckIn (Lio/sentry/CheckIn;)Lio/sentry/protocol/SentryId;
357409
public fun captureEnvelope (Lio/sentry/SentryEnvelope;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
358410
public fun captureEvent (Lio/sentry/SentryEvent;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
359411
public fun captureEvent (Lio/sentry/SentryEvent;Lio/sentry/Hint;Lio/sentry/ScopeCallback;)Lio/sentry/protocol/SentryId;
@@ -400,6 +452,7 @@ public final class io/sentry/Hub : io/sentry/IHub {
400452
public final class io/sentry/HubAdapter : io/sentry/IHub {
401453
public fun addBreadcrumb (Lio/sentry/Breadcrumb;Lio/sentry/Hint;)V
402454
public fun bindClient (Lio/sentry/ISentryClient;)V
455+
public fun captureCheckIn (Lio/sentry/CheckIn;)Lio/sentry/protocol/SentryId;
403456
public fun captureEnvelope (Lio/sentry/SentryEnvelope;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
404457
public fun captureEvent (Lio/sentry/SentryEvent;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
405458
public fun captureEvent (Lio/sentry/SentryEvent;Lio/sentry/Hint;Lio/sentry/ScopeCallback;)Lio/sentry/protocol/SentryId;
@@ -464,6 +517,7 @@ public abstract interface class io/sentry/IHub {
464517
public fun addBreadcrumb (Ljava/lang/String;)V
465518
public fun addBreadcrumb (Ljava/lang/String;Ljava/lang/String;)V
466519
public abstract fun bindClient (Lio/sentry/ISentryClient;)V
520+
public abstract fun captureCheckIn (Lio/sentry/CheckIn;)Lio/sentry/protocol/SentryId;
467521
public fun captureEnvelope (Lio/sentry/SentryEnvelope;)Lio/sentry/protocol/SentryId;
468522
public abstract fun captureEnvelope (Lio/sentry/SentryEnvelope;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
469523
public fun captureEvent (Lio/sentry/SentryEvent;)Lio/sentry/protocol/SentryId;
@@ -563,6 +617,7 @@ public abstract interface class io/sentry/IScopeObserver {
563617
}
564618

565619
public abstract interface class io/sentry/ISentryClient {
620+
public abstract fun captureCheckIn (Lio/sentry/CheckIn;Lio/sentry/Scope;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
566621
public fun captureEnvelope (Lio/sentry/SentryEnvelope;)Lio/sentry/protocol/SentryId;
567622
public abstract fun captureEnvelope (Lio/sentry/SentryEnvelope;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
568623
public fun captureEvent (Lio/sentry/SentryEvent;)Lio/sentry/protocol/SentryId;
@@ -850,6 +905,99 @@ public final class io/sentry/MemoryCollectionData {
850905
public fun getUsedNativeMemory ()J
851906
}
852907

908+
public final class io/sentry/MonitorConfig : io/sentry/JsonSerializable, io/sentry/JsonUnknown {
909+
public fun <init> (Lio/sentry/MonitorSchedule;)V
910+
public fun getCheckinMargin ()Ljava/lang/Long;
911+
public fun getMaxRuntime ()Ljava/lang/Long;
912+
public fun getSchedule ()Lio/sentry/MonitorSchedule;
913+
public fun getTimezone ()Ljava/lang/String;
914+
public fun getUnknown ()Ljava/util/Map;
915+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
916+
public fun setCheckinMargin (Ljava/lang/Long;)V
917+
public fun setMaxRuntime (Ljava/lang/Long;)V
918+
public fun setSchedule (Lio/sentry/MonitorSchedule;)V
919+
public fun setTimezone (Ljava/lang/String;)V
920+
public fun setUnknown (Ljava/util/Map;)V
921+
}
922+
923+
public final class io/sentry/MonitorConfig$Deserializer : io/sentry/JsonDeserializer {
924+
public fun <init> ()V
925+
public fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/MonitorConfig;
926+
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
927+
}
928+
929+
public final class io/sentry/MonitorConfig$JsonKeys {
930+
public static final field CHECKIN_MARGIN Ljava/lang/String;
931+
public static final field MAX_RUNTIME Ljava/lang/String;
932+
public static final field SCHEDULE Ljava/lang/String;
933+
public static final field TIMEZONE Ljava/lang/String;
934+
public fun <init> ()V
935+
}
936+
937+
public final class io/sentry/MonitorContexts : java/util/concurrent/ConcurrentHashMap, io/sentry/JsonSerializable {
938+
public fun <init> ()V
939+
public fun <init> (Lio/sentry/MonitorContexts;)V
940+
public fun getTrace ()Lio/sentry/SpanContext;
941+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
942+
public fun setTrace (Lio/sentry/SpanContext;)V
943+
}
944+
945+
public final class io/sentry/MonitorContexts$Deserializer : io/sentry/JsonDeserializer {
946+
public fun <init> ()V
947+
public fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/MonitorContexts;
948+
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
949+
}
950+
951+
public final class io/sentry/MonitorSchedule : io/sentry/JsonSerializable, io/sentry/JsonUnknown {
952+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
953+
public static fun crontab (Ljava/lang/String;)Lio/sentry/MonitorSchedule;
954+
public fun getType ()Ljava/lang/String;
955+
public fun getUnit ()Ljava/lang/String;
956+
public fun getUnknown ()Ljava/util/Map;
957+
public fun getValue ()Ljava/lang/String;
958+
public static fun interval (Ljava/lang/Integer;Lio/sentry/MonitorScheduleUnit;)Lio/sentry/MonitorSchedule;
959+
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
960+
public fun setType (Ljava/lang/String;)V
961+
public fun setUnit (Lio/sentry/MonitorScheduleUnit;)V
962+
public fun setUnit (Ljava/lang/String;)V
963+
public fun setUnknown (Ljava/util/Map;)V
964+
public fun setValue (Ljava/lang/Integer;)V
965+
public fun setValue (Ljava/lang/String;)V
966+
}
967+
968+
public final class io/sentry/MonitorSchedule$Deserializer : io/sentry/JsonDeserializer {
969+
public fun <init> ()V
970+
public fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/MonitorSchedule;
971+
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
972+
}
973+
974+
public final class io/sentry/MonitorSchedule$JsonKeys {
975+
public static final field TYPE Ljava/lang/String;
976+
public static final field UNIT Ljava/lang/String;
977+
public static final field VALUE Ljava/lang/String;
978+
public fun <init> ()V
979+
}
980+
981+
public final class io/sentry/MonitorScheduleType : java/lang/Enum {
982+
public static final field CRONTAB Lio/sentry/MonitorScheduleType;
983+
public static final field INTERVAL Lio/sentry/MonitorScheduleType;
984+
public fun apiName ()Ljava/lang/String;
985+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/MonitorScheduleType;
986+
public static fun values ()[Lio/sentry/MonitorScheduleType;
987+
}
988+
989+
public final class io/sentry/MonitorScheduleUnit : java/lang/Enum {
990+
public static final field DAY Lio/sentry/MonitorScheduleUnit;
991+
public static final field HOUR Lio/sentry/MonitorScheduleUnit;
992+
public static final field MINUTE Lio/sentry/MonitorScheduleUnit;
993+
public static final field MONTH Lio/sentry/MonitorScheduleUnit;
994+
public static final field WEEK Lio/sentry/MonitorScheduleUnit;
995+
public static final field YEAR Lio/sentry/MonitorScheduleUnit;
996+
public fun apiName ()Ljava/lang/String;
997+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/MonitorScheduleUnit;
998+
public static fun values ()[Lio/sentry/MonitorScheduleUnit;
999+
}
1000+
8531001
public final class io/sentry/NoOpEnvelopeReader : io/sentry/IEnvelopeReader {
8541002
public static fun getInstance ()Lio/sentry/NoOpEnvelopeReader;
8551003
public fun read (Ljava/io/InputStream;)Lio/sentry/SentryEnvelope;
@@ -858,6 +1006,7 @@ public final class io/sentry/NoOpEnvelopeReader : io/sentry/IEnvelopeReader {
8581006
public final class io/sentry/NoOpHub : io/sentry/IHub {
8591007
public fun addBreadcrumb (Lio/sentry/Breadcrumb;Lio/sentry/Hint;)V
8601008
public fun bindClient (Lio/sentry/ISentryClient;)V
1009+
public fun captureCheckIn (Lio/sentry/CheckIn;)Lio/sentry/protocol/SentryId;
8611010
public fun captureEnvelope (Lio/sentry/SentryEnvelope;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
8621011
public fun captureEvent (Lio/sentry/SentryEvent;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
8631012
public fun captureEvent (Lio/sentry/SentryEvent;Lio/sentry/Hint;Lio/sentry/ScopeCallback;)Lio/sentry/protocol/SentryId;
@@ -1310,6 +1459,7 @@ public final class io/sentry/Sentry {
13101459
public static fun addBreadcrumb (Ljava/lang/String;)V
13111460
public static fun addBreadcrumb (Ljava/lang/String;Ljava/lang/String;)V
13121461
public static fun bindClient (Lio/sentry/ISentryClient;)V
1462+
public static fun captureCheckIn (Lio/sentry/CheckIn;)Lio/sentry/protocol/SentryId;
13131463
public static fun captureEvent (Lio/sentry/SentryEvent;)Lio/sentry/protocol/SentryId;
13141464
public static fun captureEvent (Lio/sentry/SentryEvent;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
13151465
public static fun captureEvent (Lio/sentry/SentryEvent;Lio/sentry/Hint;Lio/sentry/ScopeCallback;)Lio/sentry/protocol/SentryId;
@@ -1456,6 +1606,7 @@ public final class io/sentry/SentryBaseEvent$Serializer {
14561606
}
14571607

14581608
public final class io/sentry/SentryClient : io/sentry/ISentryClient {
1609+
public fun captureCheckIn (Lio/sentry/CheckIn;Lio/sentry/Scope;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
14591610
public fun captureEnvelope (Lio/sentry/SentryEnvelope;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
14601611
public fun captureEvent (Lio/sentry/SentryEvent;Lio/sentry/Scope;Lio/sentry/Hint;)Lio/sentry/protocol/SentryId;
14611612
public fun captureSession (Lio/sentry/Session;Lio/sentry/Hint;)V
@@ -1530,6 +1681,7 @@ public final class io/sentry/SentryEnvelopeHeader$JsonKeys {
15301681

15311682
public final class io/sentry/SentryEnvelopeItem {
15321683
public static fun fromAttachment (Lio/sentry/ISerializer;Lio/sentry/ILogger;Lio/sentry/Attachment;J)Lio/sentry/SentryEnvelopeItem;
1684+
public static fun fromCheckIn (Lio/sentry/ISerializer;Lio/sentry/CheckIn;)Lio/sentry/SentryEnvelopeItem;
15331685
public static fun fromClientReport (Lio/sentry/ISerializer;Lio/sentry/clientreport/ClientReport;)Lio/sentry/SentryEnvelopeItem;
15341686
public static fun fromEvent (Lio/sentry/ISerializer;Lio/sentry/SentryBaseEvent;)Lio/sentry/SentryEnvelopeItem;
15351687
public static fun fromProfilingTrace (Lio/sentry/ProfilingTraceData;JLio/sentry/ISerializer;)Lio/sentry/SentryEnvelopeItem;
@@ -1648,6 +1800,7 @@ public final class io/sentry/SentryIntegrationPackageStorage {
16481800

16491801
public final class io/sentry/SentryItemType : java/lang/Enum, io/sentry/JsonSerializable {
16501802
public static final field Attachment Lio/sentry/SentryItemType;
1803+
public static final field CheckIn Lio/sentry/SentryItemType;
16511804
public static final field ClientReport Lio/sentry/SentryItemType;
16521805
public static final field Event Lio/sentry/SentryItemType;
16531806
public static final field Profile Lio/sentry/SentryItemType;

0 commit comments

Comments
 (0)