This release includes several new features in addition to general maintenance and bug fixes.
- The config page now has a "Create New Slack App" button that will generate a Slack app manifest pre-filled with GoAlert config
- Alert notifications after the first will be broadcast to the channel from a thread reply (#1566)
- Alerts will now have status updates posted in-thread to the original notification message (#1785)
Webhook as a Contact Method
Users may now add webhooks as contact methods. They can be used similarly to email, SMS, and voice. More information can be found under "Using Webhooks" under
/docs within the GoAlert application.
Must be enabled in the Admin -> Config page.
User Management UI
Based on feedback in our community slack channel, we implemented some in-app user management solutions:
- Admins can create a user from the user list (#1536)
- Admins can edit a user's role from the user profile (#1506)
- Admins can delete a user from the user profile (#1493)
A new experimental gRPC API server is now included (disabled by default).
--listen-sysapi string (Experimental) Listen address:port for the system API (gRPC). --sysapi-ca-file string (Experimental) Specifies a path to a PEM-encoded certificate(s) to authorize connections from plugin services. --sysapi-cert-file string (Experimental) Specifies a path to a PEM-encoded certificate to use when connecting to plugin services. --sysapi-key-file string (Experimental) Specifies a path to a PEM-encoded private key file use when connecting to plugin services.
Currently supported API methods are
DeleteUser allowing an external tool to enumerate and delete/cleanup users. (e.g., compare OIDC users with an Active Directory server).
Protobuf definition and certificate information can be found under
- Application Name can now be set to change the page title, in the future this will be applied to messaging as well (like SMS) (#1803)
- Escalation policies can now be favorited (#1567)
- Rotations in which a user participates more than once can now be re-ordered safely (#1478)
- GraphQL v1 endpoint is now disabled by default (#1584)
- Removed a race condition that allowed for duplicate overrides (#1594)
- Accessibility: screen reader will no longer stutter on "Quick Links" (#1618)
- Safari: fixed an issue rendering a user's contact method list (#1500)
- Fixed an issue where searching by phone number could return duplicate user results (#1646)
- Fixed an issue with the service label dialog form validation (#1635)
- Querying for an integration key that doesn't exist would return an "unexpected error". It now returns null (#1640)
- Many React class components converted to hooks
- Began removing Material UI v4 deprecated props in anticipation of v5
This release has a lot of long-anticipated awesome new features and improvements! Most of the work of this release was done under the covers to enable these as well as new features currently in the pipeline.
Temporary schedules allow replacing the entire on-call schedule for a fixed timeframe. It should help situations where a team requires fine-grained control of on-call responsibility for a few days (e.g. peak week).
Email (SMTP) as an User Contact Method
Prioritize Schedules on Escalation Policies
Schedules now appear at the top of the Edit Step dialog. Many users had trouble with overrides before realizing a rotation was used instead of schedule. This change was found to encourage users to use schedules (instead of rotations) when configuring a policy.
You can now enable Prometheus metrics at startup. This allows for monitoring some of the internals and health of GoAlert.
To enable, set the
--listen-prometheus flag or the
GOALERT_LISTEN_PROMETHEUS environment variable.
A new endpoint at
<listen_address>/metrics will include:
- Total number of created alerts
- Number of in-flight HTTP server requests
- Total number of requests by status code
- Duration of outgoing HTTP requests
- Number of active outgoing HTTP requests
- Number of engine cycles
- Engine cycle duration by module
- GraphQL resolver method statistics
- Sent notifications by contact method type and message type
- Received response count by destination and response (e.g. ack, close, stop, start)
Contact Method Throttling
GoAlert now implements bucketed throttling of notifications, per contact method. This is to avoid spamming devices due to misconfiguration or a noisy/broken healthcheck.
For reference, new rules are:
|Message Type||Contact Method Type||Rules|
|All||All||1 per minute|
|Status||All||1 per 3 minutes
3 per 20 minutes (burst)
8 per 2 hours
|Alert||SMS||5 per 15 minutes (burst)
11 per 1 hour
21 per 3 hours
|Alert||Voice||3 per 15 minutes (burst)
7 per 1 hour
15 per 3 hours
- Updated GoAlert in-app documentation at
/docs: Now supports rendering multiple markdown documents.
- ui/schedules: monthly views are fixed to include the correct out-of-bounds shifts when viewing the schedule calendar.
- ui/forms: fixed an issue where the schedule rule weekday filter couldn't be edited
- Golang 1.15.3 -> 1.16.4
- Postgres 11 -> 13
- Typescript 3.9.7 -> 4.0.3
- Apollo 3.1.5 -> 3.3.15
- Webpack 4.44.2 to 5.13.0
This release has a lot of bug fixes, cool new features, and hardening in prep for the peak season!
New Version Toast
A version check has now been added to GoAlert's UI that will display a persistent snackbar notification when a new version is detected.
Prometheus Alertmanager Support
User Session Management
Users may now manage active login sessions from the profile page, including the ability to easily end/cleanup ones no longer used.
(Admin note: Initial last access time will start as the time of your deployment when introducing this feature.)
Full timestamps on Alerts List Page
A toggle was added to the alerts list filter to switch between displaying the duration since created or the full timestamp when created.
Phone Number in Use Enhancement
When adding a new contact method with a number that is already in-use, users will now have more helpful messaging with a link to the existing users' profile.
Alert Log Message Status
The alert log status entries will now indicate failures for things like provider "Twilio" is disabled.
Support for Warnings/Notices
A new notices API has been added within the GraphQL schema for a Notice. Currently, a notice will be displayed if an escalation policy is unused, in the future, this will be expanded to other common issues.
Test Message Delivery Status
A new status dialog has been added that displays real-time delivery details and the status of test notifications.
Other Improvements/ Bug Fixes:
- Updated to Go 1.15.3, which adds the ability to embed TZ information as well as new vet rules
- Updated Cypress to 5.5.0, which adds built-in test retries
- User session cleanup - user sessions greater than 30 days are removed from the database
- Arm Support was added, making it possible to build and publish multi-platform docker images for GoAlert.
- Fix for an issue with RequireConfig where integration keys using Mailgun were always display as disabled, even if Mailgun is enabled.
- Address validation fix for mailgun invalid recipient address would cause a 500 response instead of expected 406.
- Updated gqlgen to 0.13.0 and error handling (e.g. validation error responses fixed)
goimportscommand in Makefile so that using go run ... will automatically pull the tool, as well as using the correct version, rather than requiring the user to install it manually.
- Updated Makefile and Dockerfile to use embedded TZ data instead of relying on the system package. This was to resolve an issue where DST values were no longer calculated properly in TZ versions 2020b onwards (e.g. latest in the alpine build). This should help to ensure that binaries and container images are more consistent with regard to calculated times.
- Added a section of recommended tools for development to the docs.
- Updated the admin config page to use accordions for the individual sections.
- Extended the alerts query by adding fields to AlertSearchOptions that allows for querying alerts by date.
- Bug fix for Schedules > Shifts > Filter > Time Limit > Specify, now has the capability to backspace numerical values along with a conditional check defaulting users input values between 1-30 appropriately.
This release primarily focused on stability & refactor work, however there have been a number of welcome improvements and helpful new features too!
/v1 endpoints have been deprecated for awhile, there is now a switch in the admin config to allow disabling the old
/v1/graphql endpoint. It will be disabled by default in a future version, and removed completely in a yet further version.
On wide displays, links have been moved to the side to better use available screen space.
Carrier Lookup Tool
There is now a
Toolbox page under Admin with a tool that will allow looking up carrier information about a phone number by an admin.
This is part of a collection of tools added to handle infrequent, but problematic, carrier filtering of SMS messages.
Send SMS Tool
The Send SMS tool can be used to test sending messages from alternate numbers, with or without URLs, etc.. in order to detect if carrier filtering is taking place, and available workarounds (like disabling URLs in SMS messages, or using an alternate From number).
From Number Override
Admins now have the ability to override the From number for SMS messages per-carrier. This is helpful in the case that a specific carrier is blocking SMS message delivery and can be used as a temporary workaround without a new deployment or code change.
System Limits Configuration
A new admin page was added to allow configuring and viewing current system limits.
Live Alert Log Updates
The alert log has been enhanced to show current status of message delivery.
Issues like failures to send, or disabled contact methods, will also show up in the log.
Additionally, things like having nobody on call, or users without immediate rules, will be reflected in the log.
It is now possible for users to subscribe to their own shifts via a calendar subscription. This allows viewing when you're on call for a schedule from apps like Google Calendar or iCalendar
Subscriptions may be accessed from your Profile page, additionally they can be created from any schedule's details page.
The create alert dialog has been reworked allowing for creating identical alerts across multiple services. This is intended to help operations teams that may need to notify multiple teams about a wide-impact incident.
- Added a new
sendittool that is similar to
ngrokthat can be self hosted.
postgresql://support to the
- The alerts list will now show any alerts you have been notified for, in addition to favorite services.
- All valid SMS START/STOP commands are now handled appropriately and logged.
- Alert log timestamps should now render in the same format as the rest of the application.
- GoAlert can now be run with a URL path prefix.
- Quicker details page loading from list pages.
- Data refetch -- fixed a lot of issues with page data being out-of-date after editing.
- Lots of refactor/stabilization work.
- Fixed behavior of search select clearing.
- Fixed various gotchas in the switchover shell code.
This hotfix release fixes a critical bug in the rotation/schedule calculation code that could cause an infinite loop (more context here).
Additionally, when trying to create an override that conflicts with an existing one, users will now receive a descriptive error, indicating the conflicting user, instead of a generic "unexpected error" message.
Getting Ready For Peak
This release has a lot of bug fixes, features, and hardening in prep for the peak season!
No more SMS/call per-second during alert storms!!
When you have more than 1 scheduled message for a given contact method (e.g. 5 alerts pending for SMS)
you will now get an SMS reading "Svc: 'foobar' has 5 unacked alerts" with an option to ack or close all. This also works for voice and Slack!
Additionally, you will only ever receive up to 1 message per 60-seconds for an individual contact method (confirmation/replies excluded).
You can enable bundling from the Admin page under the
Short URL Support
GoAlert now supports generating shorter URLs, optionally from an alternate domain.
You can enable ShortURL in the Admin page under the
You can now have GoAlert automatically cleanup closed alerts that are older than a configurable amount of days.
This can be enabled by setting a non-zero value for
Alert Cleanup Days in the
Maintenance section of the Admin page.
New Database Driver
We switched to the
github.com/jackc/pgx driver to solve a swath of bugs and issues (e.g. where context deadlines were not respected) we ran into with the old driver. We also put a lot of work in to handle DB/connection hiccups more gracefully. In most cases, this means even if the DB is restarted, no requests will fail (assuming it comes back within a reasonable time).
More importantly, network edge cases that could cause a connection or query to hang (sometimes indefinitely) will now properly terminate and respect context deadlines using the new driver.
Heartbeat monitors are a new feature that will generate an Alert if they do not receive a POST request within the specified time period. This means you can have a cronjob checking in hourly, and if it fails, fails to run, or loses network access, GoAlert will still create an alert once the timeout is reached.
You can find the link on the Service Details page to manage these.
We've introduced a default set of system limits for things like max rules on a schedule, max unacked alerts per service, etc.. These are intended to give some type of bounds or upper-limit on different resources.
They can be tweaked in the
config_limits table. A page will be added to the Admin panel in a future version.
The logic around prioritizing messages has been replaced with a version that is unit-testable and flexible. Services that have not received any notifications will have their first notification prioritized above all else for example.
Priority is also re-calculated per-message making it fairer during alert storms.
Misc Other Changes
Fix all the things!
This release primarily focused on fixing bugs and barriers that were reported in v0.22.0.
High Level Changes
- Validation for things like Slack and Mailgun keys has been adjusted to allow all valid keys
- Favorite support for rotations and schedules
goalert/goalertdocker container now listens on the wildcard address by default
- All valid country codes should now be supported for contact methods
- DB switchover code has been cleaned up, hardened, and tested more info here
- A bunch of accessibility improvements
- Verification and opt-out/opt-in flow for new and disabled contact methods
- Dependency updates
- Lots of bug fixes
- build: Dockerfile update (#66)
- search: focus fix (#65)
- dialogs: fix cases where errors were not displayed (#64)
- profile: contact method management fixes (#63)
- contact methods: hide reactivate button on mobile/always have option within other actions (#60)
- add key to elements rendered from a map (#59)
- contact methods: allow all country codes and return formatted numbers (#53)
- contact methods: disable and require verification after creating or editing (#54)
- dev: change
- return fragments in favor of arrays (#57)
- update tab title (#56)
- profile: show warning and option to reactivate when contact method is disabled (#28)
- ui: accessibility upgrades
- http: request queue and timeouts (#48)
- ui dependencies: upgrade lodash-es to 4.17.14 (#50)
- app: don't sanitize search param for list pages (#49)
- Search: update validation for search strings containing spaces (#47)
- config: loosen key validation & guide updates (#44)
- schedules: add user favorites support (#26)
- allow 10-digit sections in slack tokens (#41)
- dev: easily run integration tests by cli (#39)
- alerts: add
- rotations: add user favorites support (#27)
- ep step: allow user selection when Slack is disabled (#36)
- alertlog: graphql2 endpoint (#16)
- switchover: hardening & refactor instrumentation (#23)
- services: favorites test code improvements (#31)
- make fake slack creds look more fake (#32)
- ui-dependencies: organize package.json dependencies (#20)
- contactmethod: allow UK (+44) numbers (#22)
- ui dependencies: non-breaking change package updates (#18)
- docker: fix default listen address in container (#17)
- ui dependencies: material-ui-pickers update to @material-ui/pickers v3.1.0 (#14)
- ui dependencies: upgrade material-ui and react (#13)
- ui dependencies: webpack-dev-server upgrade to stable version (#11)
- chore: update Go dependencies (#12)