From 3052a5dd0d6b509908835321266d1bf229386e84 Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Fri, 2 Oct 2026 12:41:24 -0700 Subject: [PATCH 1/7] docs(java): Document Quartz monitor config upsert --- docs/platforms/java/common/integrations/quartz.mdx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/platforms/java/common/integrations/quartz.mdx b/docs/platforms/java/common/integrations/quartz.mdx index 306141d22fb6b..7afa25c7c416d 100644 --- a/docs/platforms/java/common/integrations/quartz.mdx +++ b/docs/platforms/java/common/integrations/quartz.mdx @@ -79,3 +79,12 @@ Setting the monitor slug on the `Trigger` will override what is set on the `JobD Setting a global job listener using a `SchedulerFactoryBeanCustomizer` in Spring Boot, will override the listener set by Sentry. For Sentry to work properly, you need to add a new `SentryJobListener` instance to the global job listeners. + +## Monitor Config + +Starting with the next SDK release, `SentryJobListener` sends a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code: + +- `CronTrigger`: the cron expression and the trigger's time zone. The seconds field must be a fixed number, and the year field, if set, must be `*`. +- `SimpleTrigger` that repeats: the repeat interval, if it's a whole number of minutes. + +Other triggers send no monitor config. To turn it off for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `false` in the job data map. From 1f6afe852e0925463eea62906e59251aadc5668e Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Fri, 2 Oct 2026 13:00:22 -0700 Subject: [PATCH 2/7] docs(java): Make Quartz monitor config upsert opt-in Co-Authored-By: Claude Opus 5.5 --- docs/platforms/java/common/integrations/quartz.mdx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/platforms/java/common/integrations/quartz.mdx b/docs/platforms/java/common/integrations/quartz.mdx index 7afa25c7c416d..ad2e8fd7a1433 100644 --- a/docs/platforms/java/common/integrations/quartz.mdx +++ b/docs/platforms/java/common/integrations/quartz.mdx @@ -82,9 +82,19 @@ Setting a global job listener using a `SchedulerFactoryBeanCustomizer` in Spring ## Monitor Config -Starting with the next SDK release, `SentryJobListener` sends a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code: +Starting with the next SDK release, `SentryJobListener` can send a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code. To turn it on for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `true` in the job data map: + +```java +JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean(); +jobDetailFactory.setJobDataAsMap( + Map.of( + SentryJobListener.SENTRY_SLUG_KEY, "", + SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY, true)); +``` + +The config is derived like this: - `CronTrigger`: the cron expression and the trigger's time zone. The seconds field must be a fixed number, and the year field, if set, must be `*`. - `SimpleTrigger` that repeats: the repeat interval, if it's a whole number of minutes. -Other triggers send no monitor config. To turn it off for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `false` in the job data map. +Other triggers send no monitor config. Without the key, or for triggers that send no config, create the monitor in Sentry first. From 8990e6884c7fe52d499745a9c8c8cff129e190c4 Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Fri, 2 Oct 2026 13:44:43 -0700 Subject: [PATCH 3/7] docs(java): Note Quartz schedules that send no monitor config --- docs/platforms/java/common/integrations/quartz.mdx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/platforms/java/common/integrations/quartz.mdx b/docs/platforms/java/common/integrations/quartz.mdx index ad2e8fd7a1433..d2296d1e8f4a1 100644 --- a/docs/platforms/java/common/integrations/quartz.mdx +++ b/docs/platforms/java/common/integrations/quartz.mdx @@ -82,19 +82,17 @@ Setting a global job listener using a `SchedulerFactoryBeanCustomizer` in Spring ## Monitor Config -Starting with the next SDK release, `SentryJobListener` can send a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code. To turn it on for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `true` in the job data map: +Starting with the next SDK release, `SentryJobListener` can send a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code. To turn it on for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `true` in the job data map, next to the monitor slug. Like the slug, it also works in the trigger's job data map: ```java JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean(); -jobDetailFactory.setJobDataAsMap( - Map.of( - SentryJobListener.SENTRY_SLUG_KEY, "", - SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY, true)); +jobDetailFactory.setJobDataAsMap(Collections.singletonMap(SentryJobListener.SENTRY_SLUG_KEY, "")); +jobDetailFactory.setJobDataAsMap(Collections.singletonMap(SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY, true)); ``` The config is derived like this: - `CronTrigger`: the cron expression and the trigger's time zone. The seconds field must be a fixed number, and the year field, if set, must be `*`. -- `SimpleTrigger` that repeats: the repeat interval, if it's a whole number of minutes. +- `SimpleTrigger` that repeats forever: the repeat interval, if it's a whole number of minutes. -Other triggers send no monitor config. Without the key, or for triggers that send no config, create the monitor in Sentry first. +Other triggers send no monitor config, and neither do cron expressions with syntax Sentry doesn't support (such as `15W`, `L-3`, or wrap-around ranges like `FRI-MON`) or time zones that aren't IANA time zone IDs (whole-hour offsets such as `GMT+2` are sent as `Etc/GMT-2`). Without the key, or for triggers that send no config, create the monitor in Sentry first. From 3aa7c09f4703b2de8bd5c383d863a779cdf86066 Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Fri, 2 Oct 2026 17:01:04 -0700 Subject: [PATCH 4/7] docs(java): Use one job data map and list name steps and calendars --- docs/platforms/java/common/integrations/quartz.mdx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/platforms/java/common/integrations/quartz.mdx b/docs/platforms/java/common/integrations/quartz.mdx index d2296d1e8f4a1..4c6e471155718 100644 --- a/docs/platforms/java/common/integrations/quartz.mdx +++ b/docs/platforms/java/common/integrations/quartz.mdx @@ -82,12 +82,15 @@ Setting a global job listener using a `SchedulerFactoryBeanCustomizer` in Spring ## Monitor Config -Starting with the next SDK release, `SentryJobListener` can send a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code. To turn it on for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `true` in the job data map, next to the monitor slug. Like the slug, it also works in the trigger's job data map: +From the next Sentry Java SDK release (after `8.59.0`), `SentryJobListener` can send a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code. To turn it on for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `true` in the job data map, next to the monitor slug. Like the slug, it also works in the trigger's job data map: ```java +Map jobData = new HashMap<>(); +jobData.put(SentryJobListener.SENTRY_SLUG_KEY, ""); +jobData.put(SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY, true); + JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean(); -jobDetailFactory.setJobDataAsMap(Collections.singletonMap(SentryJobListener.SENTRY_SLUG_KEY, "")); -jobDetailFactory.setJobDataAsMap(Collections.singletonMap(SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY, true)); +jobDetailFactory.setJobDataAsMap(jobData); ``` The config is derived like this: @@ -95,4 +98,4 @@ The config is derived like this: - `CronTrigger`: the cron expression and the trigger's time zone. The seconds field must be a fixed number, and the year field, if set, must be `*`. - `SimpleTrigger` that repeats forever: the repeat interval, if it's a whole number of minutes. -Other triggers send no monitor config, and neither do cron expressions with syntax Sentry doesn't support (such as `15W`, `L-3`, or wrap-around ranges like `FRI-MON`) or time zones that aren't IANA time zone IDs (whole-hour offsets such as `GMT+2` are sent as `Etc/GMT-2`). Without the key, or for triggers that send no config, create the monitor in Sentry first. +Other triggers send no monitor config, and neither do triggers with a `Calendar`, cron expressions with syntax Sentry doesn't support (such as `15W`, `L-3`, or wrap-around ranges like `FRI-MON`), a step after a day or month name (such as `MON/2`, which Quartz runs every Monday), or time zones that aren't IANA time zone IDs (whole-hour offsets such as `GMT+2` are sent as `Etc/GMT-2`). Without the key, or for triggers that send no config, create the monitor in Sentry first. From dd296ddb2e3371689c2e84a08c75b5e44f195251 Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Mon, 5 Oct 2026 12:24:02 -0700 Subject: [PATCH 5/7] docs(java): Set the Quartz upsert key as a String A JDBC job store with useProperties only accepts String values. Co-Authored-By: Claude --- docs/platforms/java/common/integrations/quartz.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/platforms/java/common/integrations/quartz.mdx b/docs/platforms/java/common/integrations/quartz.mdx index 4c6e471155718..62895e69e240d 100644 --- a/docs/platforms/java/common/integrations/quartz.mdx +++ b/docs/platforms/java/common/integrations/quartz.mdx @@ -82,12 +82,12 @@ Setting a global job listener using a `SchedulerFactoryBeanCustomizer` in Spring ## Monitor Config -From the next Sentry Java SDK release (after `8.59.0`), `SentryJobListener` can send a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code. To turn it on for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `true` in the job data map, next to the monitor slug. Like the slug, it also works in the trigger's job data map: +From the next Sentry Java SDK release (after `8.59.0`), `SentryJobListener` can send a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code. To turn it on for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `"true"` in the job data map, next to the monitor slug. Like the slug, it also works in the trigger's job data map: ```java Map jobData = new HashMap<>(); jobData.put(SentryJobListener.SENTRY_SLUG_KEY, ""); -jobData.put(SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY, true); +jobData.put(SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY, "true"); JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean(); jobDetailFactory.setJobDataAsMap(jobData); From 246eab13894baae311c221de03b798f551654183 Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Mon, 5 Oct 2026 16:10:10 -0700 Subject: [PATCH 6/7] docs(java): Quartz monitor config is on by default Co-Authored-By: Claude --- .../java/common/integrations/quartz.mdx | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/docs/platforms/java/common/integrations/quartz.mdx b/docs/platforms/java/common/integrations/quartz.mdx index 62895e69e240d..e9a10ec827755 100644 --- a/docs/platforms/java/common/integrations/quartz.mdx +++ b/docs/platforms/java/common/integrations/quartz.mdx @@ -82,20 +82,28 @@ Setting a global job listener using a `SchedulerFactoryBeanCustomizer` in Spring ## Monitor Config -From the next Sentry Java SDK release (after `8.59.0`), `SentryJobListener` can send a monitor config derived from the job's trigger, so Sentry creates the monitor (or updates its schedule) from your code. To turn it on for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to `"true"` in the job data map, next to the monitor slug. Like the slug, it also works in the trigger's job data map: +From the next Sentry Java SDK release (after `8.59.0`), `SentryJobListener` sends a monitor config derived from the job's trigger with each check-in, so Sentry creates the monitor (or updates its schedule) from your code. This is on by default for every job that has a monitor slug. + +The config is derived like this: + +- `CronTrigger`: the cron expression and the trigger's time zone. The seconds field must be a fixed number, and the year field, if set, must be `*`. +- `SimpleTrigger` that repeats forever: the repeat interval, if it's a whole number of minutes. + +Other triggers send no monitor config, and neither do triggers with a `Calendar`, jobs with more than one trigger, cron expressions with syntax Sentry doesn't support (such as `15W`, `L-3`, or wrap-around ranges like `FRI-MON`), a step after a day or month name (such as `MON/2`, which Quartz runs every Monday), or time zones that aren't IANA time zone IDs (whole-hour offsets such as `GMT+2` are sent as `Etc/GMT-2`). For these, create the monitor in Sentry first. + + + +When you upgrade, monitors you created in Sentry take their schedule and time zone from the trigger. To keep managing a monitor's schedule in Sentry, turn the monitor config off for that job. + + + +To turn it off for a job, set `SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY` to the string `"false"` in the job data map, next to the monitor slug. Like the slug, it also works in the trigger's job data map: ```java Map jobData = new HashMap<>(); jobData.put(SentryJobListener.SENTRY_SLUG_KEY, ""); -jobData.put(SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY, "true"); +jobData.put(SentryJobListener.SENTRY_UPSERT_MONITOR_CONFIG_KEY, "false"); JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean(); jobDetailFactory.setJobDataAsMap(jobData); ``` - -The config is derived like this: - -- `CronTrigger`: the cron expression and the trigger's time zone. The seconds field must be a fixed number, and the year field, if set, must be `*`. -- `SimpleTrigger` that repeats forever: the repeat interval, if it's a whole number of minutes. - -Other triggers send no monitor config, and neither do triggers with a `Calendar`, cron expressions with syntax Sentry doesn't support (such as `15W`, `L-3`, or wrap-around ranges like `FRI-MON`), a step after a day or month name (such as `MON/2`, which Quartz runs every Monday), or time zones that aren't IANA time zone IDs (whole-hour offsets such as `GMT+2` are sent as `Etc/GMT-2`). Without the key, or for triggers that send no config, create the monitor in Sentry first. From 972655b5a96c2216025bb8b83ffd4816eab7407f Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Mon, 5 Oct 2026 17:45:22 -0700 Subject: [PATCH 7/7] docs(java): Clarify which Quartz time zones send a monitor config Co-Authored-By: Claude --- docs/platforms/java/common/integrations/quartz.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/platforms/java/common/integrations/quartz.mdx b/docs/platforms/java/common/integrations/quartz.mdx index e9a10ec827755..70af8734918f0 100644 --- a/docs/platforms/java/common/integrations/quartz.mdx +++ b/docs/platforms/java/common/integrations/quartz.mdx @@ -89,7 +89,7 @@ The config is derived like this: - `CronTrigger`: the cron expression and the trigger's time zone. The seconds field must be a fixed number, and the year field, if set, must be `*`. - `SimpleTrigger` that repeats forever: the repeat interval, if it's a whole number of minutes. -Other triggers send no monitor config, and neither do triggers with a `Calendar`, jobs with more than one trigger, cron expressions with syntax Sentry doesn't support (such as `15W`, `L-3`, or wrap-around ranges like `FRI-MON`), a step after a day or month name (such as `MON/2`, which Quartz runs every Monday), or time zones that aren't IANA time zone IDs (whole-hour offsets such as `GMT+2` are sent as `Etc/GMT-2`). For these, create the monitor in Sentry first. +Other triggers send no monitor config, and neither do triggers with a `Calendar`, jobs with more than one trigger, cron expressions with syntax Sentry doesn't support (such as `15W`, `L-3`, or wrap-around ranges like `FRI-MON`), a step after a day or month name (such as `MON/2`, which Quartz runs every Monday), or time zones that aren't IANA time zone IDs. For these, create the monitor in Sentry first. Whole-hour offsets such as `GMT+2` aren't affected: they're sent as `Etc/GMT-2`.