Skip Navigation
Show nav
Heroku Dev Center Dev Center
  • Get Started
  • Documentation
  • Changelog
  • Search
Heroku Dev Center Dev Center
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • Documentation
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log in or Sign up
View categories

Categories

  • Heroku Architecture
    • Compute (Dynos)
      • Dyno Management
      • Dyno Concepts
      • Dyno Behavior
      • Dyno Reference
      • Dyno Troubleshooting
    • Stacks (operating system images)
    • Networking & DNS
    • Platform Policies
    • Platform Principles
    • Buildpacks
  • Developer Tools
    • Command Line
    • Heroku VS Code Extension
  • Deployment
    • Deploying with Git
    • Deploying with Docker
    • Deployment Integrations
  • Continuous Delivery & Integration (Heroku Flow)
    • Continuous Integration
  • Language Support
    • Node.js
      • Troubleshooting Node.js Apps
      • Working with Node.js
      • Node.js Behavior in Heroku
    • Ruby
      • Rails Support
        • Working with Rails
      • Working with Bundler
      • Working with Ruby
      • Ruby Behavior in Heroku
      • Troubleshooting Ruby Apps
    • Python
      • Working with Python
      • Background Jobs in Python
      • Python Behavior in Heroku
      • Working with Django
    • Java
      • Java Behavior in Heroku
      • Working with Java
      • Working with Maven
      • Working with Spring Boot
      • Troubleshooting Java Apps
    • PHP
      • PHP Behavior in Heroku
      • Working with PHP
    • Go
      • Go Dependency Management
    • Scala
    • Clojure
    • .NET
      • Working with .NET
  • Databases & Data Management
    • Heroku Postgres
      • Postgres Basics
      • Postgres Getting Started
      • Postgres Performance
      • Postgres Data Transfer & Preservation
      • Postgres Availability
      • Postgres Special Topics
      • Migrating to Heroku Postgres
    • Heroku Key-Value Store
    • Apache Kafka on Heroku
    • Other Data Stores
  • AI
    • Working with AI
    • Heroku Inference
      • Heroku Inference Quick Start Guides
      • Inference API
      • AI Models
      • Inference Essentials
    • Tool Use
    • Vector Database
    • AI Integrations
  • Monitoring & Metrics
    • Logging
  • App Performance
  • Add-ons
    • All Add-ons
  • Collaboration
  • Security
    • App Security
    • Identities & Authentication
      • Single Sign-on (SSO)
    • Private Spaces
      • Infrastructure Networking
    • Compliance
  • Heroku Enterprise
    • Enterprise Accounts
    • Enterprise Teams
  • Patterns & Best Practices
  • Extending Heroku
    • Platform API
    • App Webhooks
    • Heroku Labs
    • Building Add-ons
      • Add-on Development Tasks
      • Add-on APIs
      • Add-on Guidelines & Requirements
    • Building CLI Plugins
    • Developing Buildpacks
    • Dev Center
  • Accounts & Billing
  • Troubleshooting & Support
  • Integrating with Salesforce
    • Heroku AppLink
      • Working with Heroku AppLink
      • Heroku AppLink Reference
      • Getting Started with Heroku AppLink
    • Heroku Connect (Salesforce sync)
      • Heroku Connect Administration
      • Heroku Connect Reference
      • Heroku Connect Troubleshooting
    • Other Salesforce Integrations
  • Add-ons
  • All Add-ons
  • Scheduler Monitor

Scheduler Monitor

Table of Contents [expand]

  • Provisioning the Add-on
  • Dashboard
  • Monitors and Threshold Alerting
  • Migrating Between Plans
  • Troubleshooting One-Off Dyno Issues
  • Removing the Add-on
  • Support

Last updated November 11, 2025

The Scheduler Monitor add-on is currently in beta.

Scheduler Monitor

This add-on is operated by MISC CO BV

Powerful monitoring and metrics for Heroku Scheduler.

The Scheduler Monitor add-on allows you to natively monitor and investigate Heroku Scheduler jobs. Consult different types of metrics to diagnose issues on one-off dynos started by Heroku Scheduler.

This service is an extension of the existing Application Metrics provided in the Heroku Dashboard. You can configure threshold alerting to actively monitor one-off dyno-related issues. In addition to raw metrics and alerts, Scheduler Monitor provides guidance and recommendations on how to correct specific one-off dyno problems.

Scheduler Monitor is language-agnostic, so it can integrate with apps in any programming language. All features are accessible from the Scheduler Monitor Dashboard.

Scheduler Monitor only considers metrics from detached scheduler one-off dynos started by Heroku Scheduler. It doesn’t include any other one-off dynos started by a user, for example via the Heroku Console.

 

Alert email notifications sent by Scheduler Monitor contain the one-off dyno’s command. Don’t put sensitive data directly in the command. Use config vars instead.

Provisioning the Add-on

Attach Scheduler Monitor to a Heroku application via the CLI:

See a list of all plans available here.

$ heroku addons:create scheduler-monitor
Creating one-off-metrics on sharp-mountain-4005... free
Your add-on has been provisioned successfully

After installing Scheduler Monitor, it’s fully integrated and configured. Scheduler Monitor doesn’t require or set any config vars. It picks up all relevant data automatically from your app.

Dashboard

The Scheduler Monitor dashboard allows you to investigate Heroku Scheduler jobs running in your Heroku app’s environment as one-off dynos using different types of metrics. In addition, you can create and manage the monitors for your Heroku Scheduler jobs.

You can access the dashboard via the CLI:

$ heroku addons:open scheduler-monitor
Opening scheduler-monitor for sharp-mountain-4005

or by visiting the Heroku Dashboard and selecting the application in question. Select Scheduler Monitor from the Add-ons menu.

Gathered Metrics

Scheduler Monitor Gathered Metrics

Events

The Event plot displays one-off dyno lifecycle events per specific one-off dyno.

Execution Time

The Execution Time plot displays summary metrics for one-off dyno execution times.

Throughput

The throughput plot displays the number of one-off dynos broken down by exit status (0, null, or anything greater than 0).

  • One-off dynos that result in a null status code are considered to have been interrupted.
  • One-off dynos that result in anything greater than 0 (zero) are considered to have failed.
  • One-off dynos that result in a 0 (zero) status code are considered to have succeeded.

Concurrency

The concurrency plot displays summary metrics of the number of one-off dynos running at the same time.

Data Resolution

There are 4 levels of data resolution in Scheduler Monitor:

  • 1 minute (Past 3 hrs)
  • 10 minutes (72-48 hrs ago, 48-24 hrs ago, and past 24 hrs)
  • 30 minutes (Past 72 hrs)
  • 1 hour (Past 7 days)

Data Filter

Scheduler Monitor enables you to analyze the metrics data of a subset of your one-off dynos by filtering based on one-off dyno attributes.

Either filter only by command by providing part of the applicable command, or explicitly filter based on one or more specific attributes by using the attribute:value syntax.

Filtering through the input field in the Dashboard applies to all plots at once. This ability allows you to correlate metrics data of different plots.

Attributes

Name Description Example
command command used to start this process "python scrape.py"
state current status of process (either: running, succeeded, failed, or interrupted) "interrupted"
name the name of this process on this dyno "scheduler.4321"
size dyno size (either: free, hobby, standard-1X, standard-2X, performance-m, performance-l, private-s, private-m or private-l) "performance-l"

You can use 2 different match types, an exact match, or a partial match. Exact matches include double quotes. For example, "standard-1X" only matches if it’s exactly equal to the test string. Partial matches, e.g standard, don’t include double quotes and match if the test string contains the filter value.

Prepend - to exclude metrics data containing a certain test string e.g. -type:release, -state:succeeded, or -command:"python scrape.py"

Real-World Examples

To only get metrics data related to one-off dynos running command echo “Hello World!”:

echo "Hello World!"

To filter out one-off dynos running a command containing Hello World:

-Hello World

To only get metrics data related to one-off dynos running command echo “Hello World!” that either failed or were interrupted:

command:echo "Hello World!" state:failed state:interrupted

To only get metrics data related to one-off dynos running command echo “Hello World!” that did not succeed:

command:echo "Hello World!" -state:succeeded

To only get metrics data related to one-off dynos of size Performance-L that are currently running:

state:running size:performance-l

To only get metrics data related to one-off dynos that succeeded:

state:succeeded

To only get metrics data related to a one-off dyno with a specific name:

name:scheduler.1234

Alternatively, filter metrics data in a specific plot by using the plot’s legend buttons. Doing so doesn’t affect the metrics data displayed in the other plots.

Monitors and Threshold Alerting

Scheduler Monitor allows you to create different types of monitors that check specific aspects of one-off dynos and open alerts based on various settings.

Alert email notifications contain the one-off dyno’s command. Don’t put sensitive data directly in the command. Use config vars instead.

Types of Monitors

Heroku Scheduler Job Failure

Monitor the one-off dyno exit status. Given a sensitivity setting of 1, this type of monitor opens an alert whenever a one-off dyno fails to successfully execute a specific command. An exit status greater than 0 (zero) is considered a failure.

Heroku Scheduler Job Interruption

Monitor whether a one-off dyno fails to exit on its own. Given a sensitivity setting of 1, this type of monitor opens an alert whenever something forces a one-off dyno executing a specific command to exit.

Heroku Scheduler Job Execution Time

Monitor the one-off dyno execution time. Given a sensitivity setting of 1, this type of monitor opens an alert whenever a one-off dyno takes longer to execute a specific command than your threshold setting.

Heroku Scheduler Job Concurrency

Monitor the number of one-off dynos started by specific Heroku Scheduler job. Given a sensitivity setting of 1, this type of monitor opens an alert whenever the number of concurrent one-off dynos is at or exceeds your threshold setting.

Heroku Scheduler Concurrency

Monitor the total number of scheduler one-off dynos running inside of your Heroku app’s environment. Given a sensitivity setting of 1, this type of monitor opens an alert whenever the total number of concurrent one-off dynos is at or exceeds your threshold setting.

Monitors exist independently from one another. A single one-off dyno can meet the alert conditions of different monitors, setting off multiple alerts.

Sensitivity Setting

You can configure a sensitivity setting for every monitor. This setting determines how many consecutive times a monitor must meet the alert conditions before actually opening an alert.

Alert Notifications

By default, the distribution for email notifications is to all app owners and collaborators for non-team accounts, and admins for people in a Heroku team. Alternatively, you can add additional email addresses, such as for email-based PagerDuty integration.

Although Scheduler Monitor supports multiple additional addresses, the preferred approach is to use your email platform to create an alias. You can manage group membership outside of the alert notification framework.

Migrating Between Plans

Application owners must carefully manage the migration timing to ensure proper application function during the migration process.

Use the heroku addons:upgrade command to migrate to a new plan.

$ heroku addons:upgrade scheduler-monitor:newplan
-----> Upgrading scheduler-monitor:newplan to sharp-mountain-4005... done, v18 ($49/mo)
       Your plan has been updated to: scheduler-monitor:newplan

Troubleshooting One-Off Dyno Issues

Scheduler Monitor lets you monitor one-off dynos used by Heroku Scheduler to run your scheduled jobs. One-off dynos are dynos that run a specific command until it exits. They run alongside other dynos, exactly like the app’s web, worker, and other formation dynos. One-off dynos are ideal for performing one-off administrative or maintenance tasks for your Heroku app.

The following sections covers troubleshooting the most common issues with working with one-off dynos.

One-Off Dyno Failures

Whenever a one-off dyno exits with an exit status greater than 0 (zero), it’s considered to have failed. There can be several reasons why the one-off dyno exited with an error code:

  • Issues can occur during the provisioning of the one-off dyno. Check your one-off dyno’s app logs for any information, as these issues get logged most of the time.
  • command not found in your one-off dyno’s app logs indicates that the command provided for the one-off dyno doesn’t exist. Try investigating why. Did you make a typo or forget to push your changes to your Heroku app’s environment?
  • Check for application-level errors. Review your one-off dyno’s app logs for any errors, warnings, or additional information. Try to reproduce it locally and start debugging from there.

One-Off Dyno Interruptions

Whenever something forces a one-off dyno to exit instead of exiting on its own, it’s considered to have been interrupted. Sometimes this forced exit is harmless, for example, when a user kills the one-off dyno using the Heroku CLI.

A forced exit can also mean that your one-off dyno keeps running indefinitely until it reached its TTL (Time-To-Live). Upon creation, a one-off dyno gets a TTL value assigned in seconds. Heroku automatically kills the dyno after the number of seconds passes.

The following example shows what appears in your one-off dyno’s app logs when Heroku kills a dyno in this way :

Cycling
State changed from up to complete
Stopping all processes with SIGTERM
Process exited with status 143

The one-off dyno’s command either took longer to run than its TTL, or it failed to exit on its own after performing the required actions. Test your command locally and make sure it exits properly before running it using a one-off dyno.

When using the Heroku Scheduler add-on, it creates a one-off dyno with a TTL value that is equal to the job’s interval. For example, for a job executed every 10 minutes, it creates one-off dynos with a TTL value of 600 seconds (10 minutes).

Removing the Add-on

You can remove Scheduler Monitor via the CLI:

This action destroys all associated data and can’t be undone!

$ heroku addons:destroy scheduler-monitor
-----> Removing scheduler-monitor from sharp-mountain-4005... done, v20 (free)

Support

Submit all Scheduler Monitor support and runtime issues via one of the Heroku Support channels. Any non-support issues or product feedback is welcome at support@schedulermonitor.com.

Keep Reading

  • Papertrail
  • Heroku Scheduler
  • Cron To Go Scheduler - Scheduler as a Service
  • Expedited WAF
  • Advanced Scheduler

Or explore the All Add-ons category.

Feedback

Log in to submit feedback.

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2025 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices