---
title: "Crons"
description: "Sentry Crons allows you to monitor the uptime and performance of any scheduled, recurring job in your application."
url: https://docs.sentry.io/platforms/java/guides/logback/crons/
---

# Set Up Crons | Sentry for Logback

Once implemented, it'll allow you to get alerts and metrics to help you solve errors, detect timeouts, and prevent disruptions to your service.

## [Requirements](https://docs.sentry.io/platforms/java/guides/logback/crons.md#requirements)

* Use our [getting started](https://docs.sentry.io/platforms/java/guides/logback.md) guide to install and configure the Sentry Java SDK (min 6.30.0) for your recurring job.

- [Create and configure](https://sentry.io/issues/alerts/new/crons/) your first Monitor.

If you are using [Quartz](http://www.quartz-scheduler.org/), please see [our Quartz integration](https://docs.sentry.io/platforms/java/guides/logback/integrations/quartz.md). If you are using Spring Boot with `@Scheduled` tasks, see [our Spring Boot integration](https://docs.sentry.io/platforms/java/guides/spring-boot/crons.md).

## [Check-Ins (Recommended)](https://docs.sentry.io/platforms/java/guides/logback/crons.md#check-ins-recommended)

Check-in monitoring allows you to track a job's progress by completing two check-ins: one at the start of your job and another at the end of your job. This two-step process allows Sentry to notify you if your job didn't start when expected (missed) or if it exceeded its maximum runtime (failed).

### [Wrapper](https://docs.sentry.io/platforms/java/guides/logback/crons.md#wrapper)

The Sentry Java SDK offers a helper that takes care of wrapping your code and sending a check-in at the start and one at the end. It checks for exceptions and sets the status of the check-in accordingly.

```java
import io.sentry.util.CheckInUtils;

String result = CheckInUtils.withCheckIn("<monitor-slug>", () -> {
    // Execute your scheduled task here...
    return "computed result";
});
```

You may also send a `MonitorConfig` with a `MonitorSchedule` so the monitor is created or updated (upsert) automatically.

```java
import io.sentry.MonitorConfig;
import io.sentry.MonitorSchedule;
import io.sentry.MonitorScheduleUnit;
import io.sentry.util.CheckInUtils;

MonitorConfig monitorConfig = new MonitorConfig(MonitorSchedule.interval(3, MonitorScheduleUnit.MINUTE));

String result = CheckInUtils.withCheckIn("<monitor-slug>", monitorConfig, () -> {
    // Execute your scheduled task here...
    return "computed result";
});
```

You can also check-in to a specific environment.

```java
import io.sentry.MonitorSchedule;
import io.sentry.MonitorScheduleUnit;
import io.sentry.util.CheckInUtils;

String result = CheckInUtils.withCheckIn("<monitor-slug>", "<environment-name>", () -> {
    // Execute your scheduled task here...
    return "computed result";
});
```

### [Manually sending check-ins](https://docs.sentry.io/platforms/java/guides/logback/crons.md#manually-sending-check-ins)

It is also possible to manually send check-ins.

```java
import io.sentry.CheckIn;
import io.sentry.CheckInStatus;
import io.sentry.Sentry;
import io.sentry.protocol.SentryId;

// 🟡 Notify Sentry your job is running:
SentryId checkInId = Sentry.captureCheckIn(
    new CheckIn(
        "<monitor-slug>",
        CheckInStatus.IN_PROGRESS
    )
);

// Execute your scheduled task here...

// 🟢 Notify Sentry your job has completed successfully:
Sentry.captureCheckIn(
    new CheckIn(
        checkInId,
        "<monitor-slug>",
        CheckInStatus.OK
    )
);
```

If your job execution fails, you can notify Sentry about the failure:

```java
// 🔴 Notify Sentry your job has failed:
Sentry.captureCheckIn(
    new CheckIn(
        checkInId,
        "<monitor-slug>",
        CheckInStatus.ERROR
    )
);
```

## [Heartbeat](https://docs.sentry.io/platforms/java/guides/logback/crons.md#heartbeat)

Heartbeat monitoring notifies Sentry of a job's status through one check-in. This setup will only notify you if your job didn't start when expected (missed). If you need to track a job to see if it exceeded its maximum runtime (failed), use check-ins instead.

```java
import io.sentry.CheckIn;
import io.sentry.CheckInStatus;
import io.sentry.Sentry;
import io.sentry.protocol.SentryId;

// Execute your scheduled task...

// 🟢 Notify Sentry your job completed successfully:
CheckIn checkIn = new CheckIn(
    "<monitor-slug>",
    CheckInStatus.OK
);
checkIn.setDuration(10.0);
Sentry.captureCheckIn(checkIn);
```

If your job execution fails, you can:

```java
import io.sentry.CheckIn;
import io.sentry.CheckInStatus;
import io.sentry.Sentry;
import io.sentry.protocol.SentryId;

// 🔴 Notify Sentry your job has failed:
CheckIn checkIn = new CheckIn(
    "<monitor-slug>",
    CheckInStatus.ERROR
);
checkIn.setDuration(10.0);
Sentry.captureCheckIn(checkIn);
```

## [Upserting Cron Monitors](https://docs.sentry.io/platforms/java/guides/logback/crons.md#upserting-cron-monitors)

You can create and update your Monitors programmatically with code rather than [creating and configuring them in Sentry.io](https://sentry.io/issues/alerts/new/crons/).

```java
import io.sentry.MonitorSchedule;
import io.sentry.MonitorScheduleUnit;

// Create a crontab schedule object (every 10 minutes)
MonitorSchedule monitorSchedule = MonitorSchedule.crontab("*/10 * * * *");

// Or create an interval schedule object (every 10 minutes)
MonitorSchedule monitorSchedule = MonitorSchedule.interval(10, MonitorScheduleUnit.MINUTE);
```

Supported units are:

* `MonitorScheduleUnit.MINUTE`
* `MonitorScheduleUnit.HOUR`
* `MonitorScheduleUnit.DAY`
* `MonitorScheduleUnit.WEEK`
* `MonitorScheduleUnit.MONTH`
* `MonitorScheduleUnit.YEAR`

```java
import io.sentry.MonitorConfig;

// Create a config object
MonitorConfig monitorConfig = new MonitorConfig(monitorSchedule);
monitorConfig.setTimezone("Europe/Vienna"); // Optional timezone
monitorConfig.setCheckinMargin(5L); // Optional check-in margin in minutes
monitorConfig.setMaxRuntime(15L); // Optional max runtime in minutes
monitorConfig.setFailureIssueThreshold(2L); //Optional failure issue threshold
monitorConfig.setRecoveryThreshold(5L); // Optional recovery threshold

// 🟡 Notify Sentry your job is running:
CheckIn checkIn = new CheckIn(
    "<monitor-slug>",
    CheckInStatus.IN_PROGRESS
);
checkIn.setMonitorConfig(monitorConfig);
SentryId checkInId = Sentry.captureCheckIn(checkIn);

// Execute your scheduled task here...

// 🟢 Notify Sentry your job has completed successfully:
Sentry.captureCheckIn(
    new CheckIn(
        checkInId,
        "<monitor-slug>",
        CheckInStatus.OK
    )
);
```

## [Alerts](https://docs.sentry.io/platforms/java/guides/logback/crons.md#alerts)

When your recurring job fails to check in (missed), runs beyond its configured maximum runtime (failed), or manually reports a failure, Sentry will create an error event with a tag to your monitor.

To receive alerts about these events:

1. Navigate to **Alerts** in the sidebar.
2. Create a new alert and select "Issues" under "Errors" as the alert type.
3. Configure your alert and define a filter match to use: `The event's tags match {key} {match} {value}`.

Example: `The event's tags match monitor.slug equals my-monitor-slug-here`

Learn more in [Issue Alert Configuration](https://docs.sentry.io/product/alerts/create-alerts/issue-alert-config.md).

## [Rate Limits](https://docs.sentry.io/platforms/java/guides/logback/crons.md#rate-limits)

To prevent abuse and resource overuse, Crons limits check-ins to **6 per minute for each monitor environment**.

For example, if you have a monitor called "database-backup" with two environments:

* `database-backup` in environment `production` can send up to 6 check-ins per minute
* `database-backup` in environment `staging` can also send up to 6 check-ins per minute
* Combined, they can send up to 12 check-ins per minute

You can verify if any check-ins are being dropped by visiting the [Usage Stats](https://docs.sentry.io/product/stats.md#usage-stats) page. To avoid dropped check-ins, ensure your monitors don't exceed the rate limit.

## Pages in this section

- [Troubleshooting](https://docs.sentry.io/platforms/java/guides/logback/crons/troubleshooting.md)
