Repository navigation
feat(nestjs): Derive SentryCron monitor config from @Cron - #25013
Conversation
When `@SentryCron` is used without a monitor config, read the schedule and time zone from the `@Cron()` decorator of `@nestjs/schedule` on the same method. Check-ins then carry a monitor config, so Sentry creates the monitor on the first run instead of dropping the check-ins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Only read the `@Cron()` schedule when `@SentryCron` gets
`{ fromCronDecorator: true }`, so existing usage keeps sending check-ins
without a monitor config. Other monitor settings passed alongside the flag
are kept.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`@SentryCron` now sends the schedule of the method's `@Cron()` decorator unless it gets a monitor config with a schedule. Other monitor settings can still be passed and are merged in, and `fromCronDecorator: false` turns this off. When `@Cron()` has no `timeZone`, the job runs in the server's local time zone, so that zone is sent instead of leaving Sentry to assume UTC. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`@Cron()` presets are now sent: the ones Sentry accepts as is, and `@midnight`, `@minutely`, `@weekdays` and `@weekends` as crontabs. When no schedule can be derived but monitor settings were passed, a debug warning says no monitor config is sent. The settings type now rejects `schedule` and `timezone`, and a full monitor config rejects `fromCronDecorator`, so mixed objects no longer drop fields silently. Adds an E2E case for a disabled `@Cron()` job triggered through an endpoint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Skip numeric months (cron 2.x counts from 0), day-of-month/day-of-week combinations Sentry would AND, and time zones Sentry rejects. Clarify the warning when fromCronDecorator is false. Co-Authored-By: Claude <noreply@anthropic.com>
Allow month steps like */3 (CronExpression.EVERY_QUARTER), still skipping month numbers. Drop the @midnight and @annually presets, which cron rejects. Skip full day ranges like 1-31 when the other day field is set, and send the canonical time zone name. Co-Authored-By: Claude <noreply@anthropic.com>
5d88d04 to
8cd5e98
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 8cd5e98. Configure here.
Co-Authored-By: Claude <noreply@anthropic.com>
|
👋 @chargome, @nicohrubec — Please review this PR when you get a chance! |
2 similar comments
|
👋 @chargome, @nicohrubec — Please review this PR when you get a chance! |
|
👋 @chargome, @nicohrubec — Please review this PR when you get a chance! |
Co-Authored-By: Claude <noreply@anthropic.com>
|
👋 @chargome, @nicohrubec — Please review this PR when you get a chance! |
1 similar comment
|
👋 @chargome, @nicohrubec — Please review this PR when you get a chance! |
size-limit report 📦Compared: b167dcc (PR test merge using develop at 30cfb4c) Against: 30cfb4c (develop) · base run #64245 ✅ Baseline matches: this diff contains only this PR's changes.
|
isaacs
left a comment
There was a problem hiding this comment.
A few things below I'd like to confirm and/or fix before landing, but this looks good. Does what it says on the tin :)
…s on @nestjs/schedule 4+ A day field that covers every day (like sun-sat or 0,1,2,3,4,5,6) is ignored by cron but ORed by Sentry, so those schedules are now found by counting the expanded values. Numeric months are sent when the @Cron() instrumentation saw @nestjs/schedule 4 or later, where cron counts months from 1.
Optional E2E testsAll optional checks were successful. 1 successful. See the run. Successful checks
|
isaacs
left a comment
There was a problem hiding this comment.
All my concerns addressed. Looks good to me!

Part of a series adding automatic Crons monitoring for the most-used job schedulers in each SDK. Check-ins for a monitor that doesn't exist yet are dropped, so today each monitor has to be created by hand with its schedule copied from the code. Sending the job's schedule as the monitor config lets Sentry create the monitor and keep it in sync.
@SentryCronnow sends the schedule and time zone of the method's@Cron()decorator with its check-ins, so Sentry creates the monitor on the first run. It's on by default; passfromCronDecorator: falseto send no config. A config with its ownscheduleis used as is. Monitors created this way are billed, and their schedule and time zone are overwritten from@Cron()on each check-in.Without a
timeZone, the server's local time zone is sent. Schedules Sentry would read differently from@nestjs/schedule(sub-minute, numeric months, some day-field combinations, fixed UTC offsets) check in without a config.Docs: getsentry/sentry-docs#19782