Skip to content

feat(node): Add nodeCronIntegration to monitor node-cron tasks - #25473

Draft
wedamija wants to merge 4 commits into
developfrom
danf/node-cron-monitor-jobs
Draft

wedamija wants to merge 4 commits into
developfrom
danf/node-cron-monitor-jobs

Conversation

@wedamija

Copy link
Copy Markdown
Member

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.

Description

Adds nodeCronIntegration, which sends check-ins for every named node-cron task (3.x and 4.x) without wrapping the module in Sentry.cron.instrumentNodeCron. It hooks createTask through the orchestrion channel injection, like the other server-utils integrations. Adding the integration is the opt-in; it is not a default integration.

Sentry.init({
  dsn: '...',
  integrations: [Sentry.nodeCronIntegration({ excludeJobs: ['cleanup', /^debug-/] })],
});

cron.schedule('0 9 * * 1-5', sendReport, { name: 'daily-report', timezone: 'Europe/Vienna' });

The slug is the task's name. Tasks without a name get a random one from node-cron, so they are not monitored. excludeJobs matches names exactly or by regex. Errors are captured and still reach node-cron as before.

The schedule and time zone (the server's time zone when timezone isn't set) are sent as the monitor config. A six-field expression is sent without its seconds field when that field is a single number. Schedules that can't be expressed in the Crons schedule format (for example, a task that runs every 10 seconds), restricted day-of-month and day-of-week together (node-cron requires both, Sentry either), L/?/#, and fixed UTC offsets check in without a config.

Tasks already wrapped by instrumentNodeCron are skipped, so using both doesn't send duplicate check-ins.

Testing

Unit tests for the schedule conversion (verified against cronsim) and a node integration test with real node-cron 4 in ESM and CJS.

wedamija and others added 2 commits October 16, 2026 17:46
Sends check-ins for every named node-cron task through the orchestrion
createTask channel, with the task's schedule and time zone as monitor
config when Sentry reads it the same way. Tasks without a name, and
tasks wrapped by Sentry.cron.instrumentNodeCron, are skipped.

Co-Authored-By: Claude <noreply@anthropic.com>
Prepares for other scheduler integrations; the helper also handles
schedulers that run on either day field (cron-parser, cron).

Co-Authored-By: Claude <noreply@anthropic.com>
The error event and the error check-in can arrive in either order.

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

size-limit report 📦

Path Size % Change Change
@sentry/browser 29.88 kB - -
@sentry/browser - with treeshaking flags 28.02 kB - -
@sentry/browser - with treeshaking flags tracing without tracing 27.92 kB - -
@sentry/browser (incl. Tracing) 52.07 kB - -
@sentry/browser (incl. Tracing + Span Streaming) 52.07 kB - -
@sentry/browser (incl. Tracing, Profiling) 55.02 kB - -
@sentry/browser (incl. Tracing, Replay) 91.82 kB - -
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags 80.68 kB - -
@sentry/browser (incl. Tracing, Replay with Canvas) 96.55 kB - -
@sentry/browser (incl. Tracing, Replay, Feedback) 109.49 kB - -
@sentry/browser (incl. Feedback) 47.4 kB - -
@sentry/browser (incl. sendFeedback) 34.94 kB - -
@sentry/browser (incl. FeedbackAsync) 40.05 kB - -
@sentry/browser (incl. Metrics) 30.9 kB - -
@sentry/browser (incl. Logs) 31.18 kB - -
@sentry/browser (incl. Metrics & Logs) 31.81 kB - -
@sentry/react 31.7 kB - -
@sentry/react (incl. Tracing) 54.39 kB - -
@sentry/vue 38.04 kB - -
@sentry/vue (incl. Tracing) 55.01 kB - -
@sentry/svelte 29.9 kB - -
@sentry/remix (Remix 3 client bundle) 57.08 kB - -
CDN Bundle 31.64 kB - -
CDN Bundle (incl. Tracing) 52.58 kB - -
CDN Bundle (incl. Logs, Metrics) 33.84 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) 54.52 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) 74.77 kB - -
CDN Bundle (incl. Tracing, Replay) 90.25 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) 92.18 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) 96.4 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) 98.34 kB - -
CDN Bundle - uncompressed 93.18 kB - -
CDN Bundle (incl. Tracing) - uncompressed 156.03 kB - -
CDN Bundle (incl. Logs, Metrics) - uncompressed 99.72 kB - -
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed 161.99 kB - -
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed 229.76 kB - -
CDN Bundle (incl. Tracing, Replay) - uncompressed 276.2 kB - -
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed 282.14 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed 289.9 kB - -
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed 295.84 kB - -
@sentry/nextjs (client) 56.8 kB - -
@sentry/sveltekit (client) 52.45 kB - -
@sentry/core/server 41.12 kB - -
@sentry/core/browser 13.81 kB - -
@sentry/node 153.19 kB +0.08% +111 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection) 84.1 kB +0.08% +63 B 🔺
@sentry/node - without tracing 94.94 kB +0.08% +67 B 🔺
@sentry/node - without channel injection 131.22 kB +0.06% +73 B 🔺
@sentry/aws-serverless 103.11 kB +0.07% +72 B 🔺
@sentry/cloudflare (withSentry) - minified 210.6 kB - -
@sentry/cloudflare (withSentry) 522.53 kB - -
@sentry/nextjs/cloudflare (withSentry) - minified 228.27 kB - -

View base workflow run

…-in modules

`bun run` can't inject channels into libraries. nodeCronIntegration is
opt-in, so it has no lazy channel-integration definition.

Co-Authored-By: Claude <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant