Heroku suele reiniciar en forma automática los dynos de la aplicación una vez al día, o ante eventos conocidos y/o actualizaciones en el hardware o software donde corren los procesos.
La otra forma de reiniciarlos es manualmente a través del comando heroku restart [dyno] -a <nombre-de-la-app> o a través del dashboard web.
Pero ¿qué pasa si necesitamos automatizar el restart? Por ejemplo, como contingencia ante un error irrecuperable tal como una condición de deadlock.
Hoy aprendí como hacerlo mediante el uso de la gema platform-api:
# This snippet can be included in ApplicationController.rb | if Rails.env.production? | rescue_from StandardError do |error| | # if it is an unrecoverable error, send a signal to heroku | # to restart the infrastructure | if error.message =~ /deadlock; recursive locking/ | hclient = PlatformAPI.connect_oauth(ENV["HEROKU_API_TOKEN"]) | heroku_app, dyno = "name-of-your-app", hclient.dyno | # avoid sending the signal more than once | if dyno.list(heroku_app).dig(0, "state") === "up" | heroku_app.restart_all(heroku_app) | end | end | server_error | end | end | | def server_error | render "common/500", status: :internal_server_error | end
La variable de ambiente HEROKU_API_TOKEN contiene el token de auth para el uso de la API y la puedes encontrar en tu cuenta o crear una mediante el comando heroku authorizations:create.
En este caso este fragmento de código asegura un fresh start ante un error del cual la aplicación difícilmente se va recuperar, pero seguramente por ahí le encuentras algún otro uso 🙂.